Fluentdの監視項目

Fluentdの監視をしたい項目は四つ。

  1. port監視
  2. バッファーに蓄積されているキューの数が上限に達していないか
  3. バッファーに蓄積されている合計サイズが上限に達していないか
  4. 再送を試みた回数が上限に達していないか

1のport監視はTCP通信であればZabbixの「シンプルチェック」で簡単に確認できる。

net.tcp.service[tcp,,24224]

in_monitor_agentプラグイン

2, 3, 4を監視する方法として、in_monitor_agentプラグインを使用する。

https://docs.fluentd.org/v1.0/articles/in_monitor_agent

以下のようなsyslogからAmazon CloudWatch Logsにログを転送する設定があるとする。

<source>
  @type syslog
  port 5140
  bind 0.0.0.0
  tag syslog
  format none
</source>

<match syslog.**>
  @type cloudwatch_logs
  log_group_name my_log_group_name
  log_stream_name my_log_stream_name
  auto_create_stream true
  flush_interval 10
  message_keys message
  log_rejected_request true
</match>

この設定にin_monitor_agentを加える。

<source>
  @type monitor_agent
  bind 0.0.0.0
  port 24220
</source>

<source>
  @type syslog
  略

curl -s http://localhost:24220/api/pluginsでLTSVによるメトリクスがとれる。curl -s http://localhost:24220/api/plugins.jsonとすればJSONによるメトリクスがとれる。

$ curl -s http://localhost:24220/api/plugins
plugin_id:object:3fe08c6734bc   plugin_category:input   type:monitor_agent      output_plugin:false     retry_count:
plugin_id:object:3fe08dcbb490   plugin_category:input   type:syslog     output_plugin:false     retry_count:
plugin_id:object:3f9649728a20   plugin_category:output  type:cloudwatch_logs    output_plugin:true      buffer_queue_length:0   buffer_total_queued_size:3009   retry_count:0

in_monitor_agentでとれるメトリクス

参考

バッファーに蓄積されているキューの数が上限に達していないか

メトリクスのbuffer_queue_lengthをみる。buffer_queue_limitで設定した値を超えるとログデータがロストするので、例えばbuffer_queue_limitの80%に達したらアラートのような運用を考える。

https://docs.fluentd.org/v0.12/articles/buffer-plugin-overviewによるとデフォルトの値は256になっている。

バッファーに蓄積されている合計サイズが上限に達していないか

メトリクスのbuffer_total_queued_sizeをみる。buffer_queue_limit * buffer_chunk_limitを超えるとログデータがロストする。

buffer_chunk_limitのデフォルトは8MBなので、合計サイズのデフォルトは256 * 8MB / 1024 = 2GBとなる。

Fluentdのv1からtotal_limit_sizeという設定が導入され、これを超えないようにする必要がある。デフォルトは512MB (memory) / 64GB (file)

再送を試みた回数が上限に達していないか

メトリクスのretry_countをみる。retry_limitで設定した回数を超えるとバッファーがリセットされる。

デフォルトは17

@idを必ずつける

curl -s http://localhost:24220/api/pluginsでメトリクスを取得しても、Fluentdの<match>等の設定で@idによる名前を付けないと、plugin_id:object:3f9649728a20というようなハッシュ値が表示されてしまい、どのプラグイン設定に対するメトリクスか判断しづらい。

<match syslog.**>
  @type cloudwatch_logs
  @id cloudwatch_logs_my_id  # !!!HERE!!!
  log_group_name my_log_group_name
  log_stream_name my_log_stream_name
  auto_create_stream true
  flush_interval 10
  message_keys message
  log_rejected_request true
</match>

@id cloudwatch_logs_my_idと一意の名前を設定すると、curlの表示も見やすくなる。

$ curl -s http://localhost:24220/api/plugins
plugin_id:object:3fe08c6734bc   plugin_category:input   type:monitor_agent      output_plugin:false     retry_count:
plugin_id:object:3fe08dcbb490   plugin_category:input   type:syslog     output_plugin:false     retry_count:
plugin_id:cloudwatch_logs_my_id   plugin_category:output  type:cloudwatch_logs    output_plugin:true      buffer_queue_length:0   buffer_total_queued_size:3009   retry_count:0

grep等でメトリクスの値を取得する。

1プラグイン1行で出力されるのでシェルで扱いやすい。取得したいメトリクスをgrepやsed等で取得する。

$ curl -s http://localhost:24220/api/plugins | grep plugin_id:cloudwatch_logs_my_id | sed -r "s/.*buffer_total_queued_size:([0-9]+).*/\1/"
16261

ZabbixからはSNMP経由などで上記スクリプトの結果を取得し、基準値と比較して必要なアラートをあげる。