A Lua plugin for the Nginx web server that automatically collects and submits several important Nginx metrics to Graphite.
Go to file
cn 9af8e8990e Improve docs regarding ngx.shared.DICT thread-safety 2018-11-05 13:34:43 +01:00
LICENSE Add license 2016-11-23 19:43:56 +01:00
README.md Add support for multiple carbon hosts 2017-03-01 23:10:09 +01:00
metrics_graphite.lua Improve docs regarding ngx.shared.DICT thread-safety 2018-11-05 13:34:43 +01:00

README.md

nginx-metrics-graphite

This is a Lua plugin for the Nginx web server that automatically collects and submits several important Nginx metrics to Graphite suitable for visualisation with e.g. Grafana.

In constrast to commercial and proprietary solutions such as Luameter or NGINX Plus with it's ngx_http_status_module, this plugin is open source software while featuring more and additional metrics compared to those available via the open source ngx_http_stub_status_module. (Yea, other web servers deliver more information by default...)

This plugin takes inspiration from other Nginx metric libraries like nginx-lua-prometheus but differs fundamentally in the metrics submission handling by. In certain intervals it automatically pushes metrics to the configured Graphite (i.e. Carbon) host using pure Lua code instead of exposing them via a separate web page for polling.

The metrics collection happens on every request for which the user configures a suitable log_by_lua direcitve and towards server-wide global counters (finer granularity might be added later). The counters are realized using a single shared dictionary across all Nginx worker threads which has constant memory usage (128 KiB currently, may be reduced further).

Collected metrics in this prototype implementation:

  • numbers of requests (total, to upstream, using ssl, using gzip)
  • average request duration
  • accumulated request sizes over all requests
  • accumulated response sizes over all requests
  • HTTP status code classes (1xx, 2xx, 3xx, 4xx, 5xx)
  • HTTP methods (GET, HEAD, PUT, POST, DELETE, OPTIONS, others)
  • HTTP versions (0.9, 1.0, 1.1, 2.0)

Successfully tested with Nginx 1.6.2 and ngx_lua 0.9.12 on Debian Jessie.

Caveats

A short metric submission interval might cause blocking on the Nginx worker threads since the shared dictionary storing all counters has to be locked.

Intermittent network errors while communicating with Graphite might leed to permanent loss of metric information. The communication happens in clear text and thus needs a secure separate network or other means.

Install

  • Install nginx-extra (includes Lua support) on Debian Jessie

  • Clone the nginx-metrics-graphite repository to /opt/nginx-metrics-graphite

  • Add the following config to top-level http block (300 second submission interval):

    resolver x.y.z.w; # DNS resolver IP address needed
    
    lua_shared_dict metrics_graphite 128k;
    lua_package_path ";;/opt/nginx-metrics-graphite/?.lua";
    init_by_lua 'metrics_graphite = require("metrics_graphite").init({"graphite.example.net"}, 300, "my.node.prefix")';
    init_worker_by_lua 'metrics_graphite:worker()';
    
  • Instrument the http block or any server or location beneath it using log_by_lua 'metrics_graphite:log()';

Development

apt-get install luarocks # on Debian

luarocks --local install luacheck
luacheck --globals ngx -- metrics_graphite.lua

License

nginx-metrics-graphite is licensed under the Apache License, Version 2.0. See LICENSE for more information.