September 19, 2015

NGINX Plus のライブモニタデータを収集する

NGIXN Plus にはリアルタイムに負荷とパフォーマンスメトリックを確認できるライブアクティビティモニタが含まれている。(具体的には ngx_http_status_module というモジュール)

詳しくは この辺り を見て欲しいのだけど、このモニタリング機能は小綺麗なダッシュボードだけがやたらスポットを浴びていてちょっと悲しい。

と言うのも、この機能の本質は RESTful な JSON のインターフェイスを提供していることであり、監視ツールや統計ツールに食わせるのに打って付けな情報を提供しているところじゃないかと思う。(おそらく小綺麗なダッシュボードも JavaScript でこの値を引っ張っているんじゃないかな)

jq コマンドあたりで中身を覗いてみる。

$ curl http://XX.XX.XX.XX/status | jq .

{
  "version": 6,
  "nginx_version": "1.9.4",
  "address": "XX.XX.XX.XX",
  "load_timestamp": 1442484744829,
  "timestamp": 1442541061476,
  "connections": {
    "accepted": 5321791,
    "dropped": 0,
    "active": 2,
    "idle": 28
  },
  "requests": {
    "total": 23046320,
    "current": 2
  },
  "server_zones": {
    "server_backend_80": {
      "processing": 0,
      "requests": 130705,
      "responses": {
        "1xx": 0,
        "2xx": 19970,
        "3xx": 109091,
        "4xx": 1590,
        "5xx": 0,
        "total": 130651
      },
      "received": 26431634,
      "sent": 448333914106
    },
~~ snip ~~

もう何となく結果が予想できると思うけど、JSON でアクティビティを出せると言うことは Fluentd (td-agent) などに簡単に突っ込める。

と言うわけで鉄板の、 Fluentd + ElasticSearch + Kibana な構成を超絶簡単に組める。

td-agent.conf の簡単なサンプルとしては以下のような感じか。command で引っ張って formatjson に指定するのが手軽。

<source>
  type exec
  tag nginx-plus.status
  command curl -q http://XX.XX.XX.XX/status
  format json
  run_interval 15s
</source>

<match nginx-plus.status>
  type elasticsearch
  host localhost
  port 9200
  type_name nginx-plus_status
  logstash_format true
</match>

勿論頭から全部取らず、 http://XX.XX.XX.XX/status/server_zones/hoge の様に欲しいところだけ取る事も出来る。

NGINX Plus, Fluentd, ElasticSearch and Kibana

というわけで、あとは煮るなり焼くなり・・・。

なお、このステータスモニタで取れるのは送信バイトやキャッシュパススルー量などの、あくまで “ステータス” であり、アクセスログが出てくるわけではないので注意。既存のログ解析が不要になるわけではない。

© Kazuhisa Hara 2014-2018