#popcorn erlang factory @sf_bay 2013

55
Saturday, March 23, 13

Upload: marc-campbell

Post on 30-Jun-2015

365 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: #Popcorn Erlang Factory @SF_Bay 2013

Saturday, March 23, 13

Page 2: #Popcorn Erlang Factory @SF_Bay 2013

Brought to You By

Martin HaldMarc Campbell

Thanks Fernanado!Saturday, March 23, 13

Page 3: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

2013-­‐03-­‐20  15:49:06.243  [info]  <0.2780.0>@tt_account:came_online:457        Account  came  online:  c2a8c653-­‐d4c2-­‐4d3d-­‐ad2s-­‐bd488cd9ec81/

               e5e752ef-­‐79ae-­‐4e26-­‐9b6b-­‐654e9926c56e

Saturday, March 23, 13

Page 4: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Live Demo

Saturday, March 23, 13

Page 5: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Concepts

Saturday, March 23, 13

Page 6: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Lager

Whats in a Log Entry?

• Timestamp• Severity• Log Text

• Module• Function• Line Number• Process ID

Saturday, March 23, 13

Page 7: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Lager

Whats in a Log Entry?

• Timestamp• Severity• Log Text

• Module• Function• Line Number• Process ID

• Role• Node• Version

• Caller Information • App Metrics• Env Metrics

Popcorn

Coming Soon

Saturday, March 23, 13

Page 8: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

 88  2013-­‐03-­‐16  08:29:46.781  [info]  <0.362.0>@avatar:req_handler:123  Starting  

avatar  rendering

Lager Log Messages

Saturday, March 23, 13

Page 9: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

 88  2013-­‐03-­‐16  08:29:46.781  [info]  <0.362.0>@avatar:req_handler:123  Starting  #customer_request  (avatar  rendering)  for  

@mhald

Popcorn Log Message

Saturday, March 23, 13

Page 10: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

LogMessage Alert

• Error• Warning• Critical• Crash• #identified_topic

From Log Entry to Alert

Saturday, March 23, 13

Page 11: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Alerts Groups Critical Log Entries

Alert

#login_failed for @fearing, returning #404

#login_failed for @ga, returning #404

#login_success for @bhatia, returning #200

Saturday, March 23, 13

Page 12: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Address Scheme

XMPP v2.0.15 user_auth : 54Role Version Module Line Number

Saturday, March 23, 13

Page 13: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

http_hander:404  Bad  request  <<“error”>>

http_hander:404  Bad  request  <<“api/v2”>>

http_hander:404  Bad  request  ********

0fc4cf26168b2a4b959d914682c10bc3

Crashes have no line number

Auto

Associa

tive

Memory

Saturday, March 23, 13

Page 14: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

• Identity

• Topic

Data Stream

• Role

• Node

• Version

• Severity

Structured Unstructured

Saturday, March 23, 13

Page 15: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Acme Calculators

Saturday, March 23, 13

Page 16: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Build Popcorngit  clone  [email protected]:marccampbell/popcorn.gitcd  popcorn./rebar  get-­‐deps./rebar  compile

lessc  apps/popcorn/priv/css/popcorn.less  >  \        apps/popcorn/priv/css/popcorn.css

./rebar  generate  -­‐f

Saturday, March 23, 13

Page 17: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Configure Popcorn

               {http_auth_users,      [{<<"admin">>,  <<"password">>}]},                {outbound_notifiers,  [                    {new_alert,  outbound_mailer,                        [{options,          [{retries,  3},  {relay,  "smtp.gmail.com"},                            {username,  "[email protected]"},                            {password,  "PASSWORD"}]},                        {from,                  "[email protected]"},                        {recipients,      ["[email protected]"]},                        {subject,            "New  Alert  at  {{product}}  {{version}}"}                ]},

app.config

Saturday, March 23, 13

Page 18: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

{deps,  [    ...    {lager_popcorn_backend,  ".*",  {git,  

"[email protected]:marccampbell/lager_popcorn_backend.git",  "master"  }}

   ...]}.

Calculator app rebar.config

Hook in Popcorn

Saturday, March 23, 13

Page 19: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

 %%  Lager  config  {lager,  [  {handlers,  [                        {lager_console_backend,  none},                        {lager_file_backend,  [  {"log/error.log",  

error,  104857600,  "$D0",  5}  ]},                        {lager_popcorn_backend,  [                                                                          {level,                debug},                                                                          {popcorn_host,  "127.0.0.1"},                                                                          {popcorn_port,  9125},                                                                          {node_role,        "Calculator"},                                                                          {node_version,  "1.0.7"}                                                                        ]}      ]}

Calculator application sys.config

Hook in Popcorn

Saturday, March 23, 13

Page 20: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

curl -v -X POST --data-urlencode "2 4 /" \http://calculator.logwithpopcorn.com/api/calculator

http://demo.logwithpopcorn.com/

DemoUsing the Calculator HTTP API

See and try Popcorn at

1 5 +9 3 /5 2 -2 2 *

(will cause crash)

Saturday, March 23, 13

Page 21: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Customers

Support

Saturday, March 23, 13

Page 22: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Customers

Support

Saturday, March 23, 13

Page 23: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Customers

Support

• Identify edge case bugs

• Real-time alerting

• Logs as data streams

Saturday, March 23, 13

Page 24: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Popcorn Design

Saturday, March 23, 13

Page 25: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Ingesting

Storage

Rendering

Saturday, March 23, 13

Page 26: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

UDP or TCP or ...

Connectionless Dropped packets

Quick No acknowledgements

Out of order

Saturday, March 23, 13

Page 27: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Ingesting Architecture

Client (lager)

Client (winston)

Client (log4j)

Client (...)

udp_listener (gen_server)

node_fsm

node_fsm

node_fsm

node_fsm (...)

Saturday, March 23, 13

Page 28: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Storage Architecture

popcorn_app (application)

storage_sup (supervisor)

storage_monitor (gen_server)

storage_worker (gen_server)

storage_worker (gen_server)

storage_worker (gen_server)

Saturday, March 23, 13

Page 29: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

init([])  /  init([worker])

gen_server:handle_call/3

gen_server:handle_cast/2

Storage gen_server behaviour

Saturday, March 23, 13

Page 30: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

handle_call{counter_value,  Count}{is_known_node,  Node_Name}{get_alert,  Key}{get_alerts,  Severity,  Sort}{get_alert_keys,  Type}{get_release_module_link,  Role,  Version,  Module}{search_messages,  {...}}{get_alert_timestamps,  Severities}

Saturday, March 23, 13

Page 31: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

handle_cast{expire_logs_matching,  Timestamp}{send_recent_log_lines_matching,  Pid,  Count,  Filters}{new_log_message,  #log_message}{new_release_scm,  Record}{new_alert,  Key,  #alert}{new_alert_timestamp,  Key,  Severity,  #alert}{new_alert_key,  Type,  Key}{new_release_scm_mapping,  Record}{delete_counter,  Counter}{increment_counter,  Counter,  Increment_By}{increment_counters,  Counters}{add_node,  #popcorn_node}

Saturday, March 23, 13

Page 32: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Server Sent Events

Browser ServerSSE

HTTP Post

alert: {key: “001A”, seen:10}

node: {key: “xmpp@con8”, log_msgs:324}

Saturday, March 23, 13

Page 33: #Popcorn Erlang Factory @SF_Bay 2013

SSE Events in JS $(function() { var streamSource = new EventSource("/dashboard/stream/{{stream_id}}");

streamSource.addEventListener( 'update_counters', function(event) { var counters = JSON.parse(event.data) // ... });

streamSource.addEventListener( 'new_node', function(event) { var counters = JSON.parse(event.data) // ... });

Saturday, March 23, 13

Page 34: #Popcorn Erlang Factory @SF_Bay 2013

SSE Erlang Designhttp_stream_handler.erl-behavior(cowboy_http_handler).

init

handle handlepath

nodeNew

Req

uest

Pro

cess

fsm

One FSM per SSE client

RegisterEvents

Wait in receive loop

Saturday, March 23, 13

Page 35: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

server  {   listen      80;   server_name  popcorn.logwithpopcorn.com;

  access_log  /var/log/nginx/popcorn_access.log;   error_log  /var/log/nginx/popcorn_error.log;

  location  /  {     proxy_pass    http://localhost:9125;     proxy_redirect  off;     proxy_buffering  off;     proxy_cache  off;     proxy_set_header  Host  $host;     proxy_set_header  X-­‐Real-­‐IP  $remote_addr;     proxy_set_header  X-­‐Forwarded-­‐For  $proxy_add_x_forwarded_for;     proxy_read_timeout  420;   }}

Saturday, March 23, 13

Page 36: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Wire ProtocolStandards & Efficiency

Saturday, March 23, 13

Page 37: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

       erlang:iolist_to_binary([                protobuffs:encode(1,  1,  uint32),      %%  Packet  version                protobuffs:encode(2,  atom_to_list(Node),  string),                protobuffs:encode(3,  Node_Role,  string),                protobuffs:encode(4,  Node_Version,  string),                protobuffs:encode(5,  lager_util:level_to_num(Severity),  uint32),                protobuffs:encode(6,  Message,  string),                protobuffs:encode(7,  opt(Module,  <<"">>),  string),                protobuffs:encode(8,  opt(Function,  <<"">>),  string),                protobuffs:encode(9,  opt(Line,  <<"">>),  string),                protobuffs:encode(10,  opt(Pid,  <<"">>),  string)        ]).

Protobuffs

Saturday, March 23, 13

Page 38: #Popcorn Erlang Factory @SF_Bay 2013

JSONencode_json_packet(Node)  -­‐>        jiffy:encode({[              {packet_version,  1},              {node,  list_to_binary(Node)},              {role,  <<"calculator">>},              {version,  <<"0.0.1">>},              {severity,  128},              {message,  <<"Calculator  request  5  *  4">>},              {module,  <<"http_calculator">>},              {function,  <<"rpn">>},              {line,  <<"58">>},              {pid,  <<"">>}        ]}).

Saturday, March 23, 13

Page 39: #Popcorn Erlang Factory @SF_Bay 2013

Bits and Bytes

^H^A^[email protected]^Zcalculator"^E0.0.1(^A2^XCalculator  request  5  *  4:^Ohttp_calculatorB^CrpnJ^B58R^@

{"packet_version":1,  "node":"[email protected]",  "role":"calculator",  "version":"0.0.1",  "severity":128,  "message":"Calculator  request  5  *  4",  "module":"http_calculator",  "function":"rpn","line":"58","pid":""}

Saturday, March 23, 13

Page 40: #Popcorn Erlang Factory @SF_Bay 2013

Processing TimeOver 1,000,000 Requests on Apple Air with R16B

0 us

3 us

6 us

9 us

12 us

Encoding Decoding

JSON Protobuffs

Saturday, March 23, 13

Page 41: #Popcorn Erlang Factory @SF_Bay 2013

Memory

0 bytes

100 bytes

200 bytes

300 bytes

400 bytes

Memory

JSON Protobuffs

3x Less Memory

Saturday, March 23, 13

Page 42: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Rendering Architecture

D3Crossfilter

Used only for grouping

streaming data, destroyed every

few seconds

Rendering

Plain Old Javascript

Store the grouped data from

Saturday, March 23, 13

Page 43: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

countsByPeriod

severitiesByPeriod rolesByPeriod nodesByPeriod

Saturday, March 23, 13

Page 44: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Scaling Popcorn

Saturday, March 23, 13

Page 45: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Scalability Goal

Handle n log messages per second

10 50 500 5000

Saturday, March 23, 13

Page 46: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Let’s Get Some Tools

Saturday, March 23, 13

Page 47: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

statsd & graphiterps (mhald)

Saturday, March 23, 13

Page 48: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

dtop statsd graphiteredbugChrome Activity Monitor

Saturday, March 23, 13

Page 49: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Mnesia

UDP Receiving

Client (Browser)

Saturday, March 23, 13

Page 50: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Issue: Mnesia

Saturday, March 23, 13

Page 51: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Saturday, March 23, 13

Page 52: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Saturday, March 23, 13

Page 53: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Saturday, March 23, 13

Page 54: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Saturday, March 23, 13

Page 55: #Popcorn Erlang Factory @SF_Bay 2013

#POPCORN ERLANG_FACTORY @SF_BAY - 2013

Issue: The Browser

Executing on the server (Erlang)

Executing in the browser (Javascript)vs

Saturday, March 23, 13