XUtils

logplex

Heroku log router.


Erlang Version Requirements

As of Logplex v93, Logplex requires Erlang 18. Logplex is currently tested againts OTP-18.1.3.

Prior versions of Logplex are designed to run on R16B03 and 17.x.

Development

Local development

build

$ ./rebar3 as public compile

develop

run

$ INSTANCE_NAME=`hostname` \
  LOGPLEX_CONFIG_REDIS_URL="redis://localhost:6379" \
  LOGPLEX_REDGRID_REDIS_URL="redis://localhost:6379" \
  LOCAL_IP="127.0.0.1" \
  LOGPLEX_COOKIE=123 \
  LOGPLEX_AUTH_KEY=123 \
  erl -name logplex@`hostname` -pa ebin -env ERL_LIBS deps -s logplex_app -setcookie ${LOGPLEX_COOKIE} -config sys

test

Given an empty local redis (v2.6ish):

$ ./rebar3 as public,test compile
$ INSTANCE_NAME=`hostname` \
  LOGPLEX_CONFIG_REDIS_URL="redis://localhost:6379" \
  LOGPLEX_SHARD_URLS="redis://localhost:6379" \
  LOGPLEX_REDGRID_REDIS_URL="redis://localhost:6379" \
  LOCAL_IP="127.0.0.1" \
  LOGPLEX_COOKIE=123 \
  ERL_LIBS=`pwd`/deps/:$ERL_LIBS \
  ct_run -spec logplex.spec -pa ebin

Runs the common test suite for logplex.

Docker development

test

docker-compose run test

Data setup

create creds

1> logplex_cred:store(logplex_cred:grant('full_api', logplex_cred:grant('any_channel', logplex_cred:rename(<<"Local-Test">>, logplex_cred:new(<<"local">>, <<"password">>))))).
ok

hit healthcheck

$ curl http://local:password@localhost:8001/healthcheck
{"status":"normal"}

create a channel

$ curl -d '{"tokens": ["app"]}' http://local:password@localhost:8001/channels
{"channel_id":1,"tokens":{"app":"t.feff49f1-4d55-4c9e-aee1-2d2b10e69b42"}}

post a log msg

$ curl -v \
-H "Content-Type: application/logplex-1" \
-H "Logplex-Msg-Count: 1" \
-d "116 <134>1 2012-12-10T03:00:48.123456Z erlang t.feff49f1-4d55-4c9e-aee1-2d2b10e69b42 console.1 - - Logsplat test message 1" \
http://local:password@localhost:8601/logs

create a log session

$ curl -d '{"channel_id": "1"}' http://local:password@localhost:8001/v2/sessions
{"url":"/sessions/9d53bf70-7964-4429-a589-aaa4df86fead"}

fetch logs for session

$ curl http://local:password@localhost:8001/sessions/9d53bf70-7964-4429-a589-aaa4df86fead
2012-12-10T03:00:48Z+00:00 app[console.1]: test message 1

Supervision Tree

logplex_app logplex_sup logplex_db
config_redis (redo)
logplex_drain_sup logplex_http_drain
logplex_tcpsyslog_drain
logplex_tlssyslog_drain
nsync
redgrid
logplex_realtime redo
logplex_stats
logplex_tail
logplex_redis_writer_sup (logplex_worker_sup) logplex_redis_writer
logplex_shard redo
logplex_api
logplex_syslog_sup tcp_proxy_sup tcp_proxy
logplex_logs_rest

Processes

logplex_db

Starts and supervises a number of ETS tables:

channels
tokens
drains
creds
sessions

config_redis

A redo redis client process connected to the logplex config redis.

logplex_drain_sup

An empty one_for_one supervisor. Supervises HTTP, TCP Syslog and TLS Syslog drain processes.

nsync

An nsync process connected to the logplex config redis. Callback module is nsync_callback.

Nsync is an Erlang redis replication client. It allows the logplex node to act as a redis slave and sync the logplex config redis data into memory.

redgrid

A redgrid process that registers the node in a central redis server to facilitate discovery by other nodes.

logplex_stats

Owns the logplex_stats ETS table. Prints channel, drain and system stats every 60 seconds.

logplex_tail

Maintains the logplex_tail ETS table that is used to register tail sessions.

logplex_redis_writer_sup

Starts a logplex_worker_sup process, registered as logplex_redis_writer_sup, that supervises logplex_redis_writer processes.

logplex_shard

Owns the logplex_shard_info ETS table. Starts a separate read and write redo client for each redis shard found in the logplex_shard_urls var.

logplex_api

Blocks waiting for nsync to finish replicating data into memory before starting a mochiweb acceptor that handles API requests for managing channels/tokens/drains/sessions.

logplex_syslog_sup

Supervises a tcp_proxy_sup process that supervises a tcp_proxy process that accepts syslog messages over TCP.

logplex_logs_rest

Starts a cowboy_tcp_transport process and serves as the callback for processing HTTP log input.

Realtime Metrics

Logplex can send realtime metrics to Redis via pubsub and to a drain channel as logs. The following metrics are currently logged in this fashion:

* `message_received`
* `message_processed`
* `drain_delivered`
* `drain_dropped`

To log these metrics to an internal drain channel, you’ll need to set the INTERNAL_METRICS_CHANNEL_ID environment variable to a drain token that has already been created.


Articles

  • coming soon...