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.