Fluentdの監視項目
Fluentdの監視をしたい項目は四つ。
- port監視
- バッファーに蓄積されているキューの数が上限に達していないか
- バッファーに蓄積されている合計サイズが上限に達していないか
- 再送を試みた回数が上限に達していないか
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でとれるメトリクス
参考
- https://www.atmarkit.co.jp/ait/articles/1404/04/news004_3.html
- https://docs.fluentd.org/v1.0/articles/buffer-section
- fluentd 1.0 でログの欠損を防ぐ
バッファーに蓄積されているキューの数が上限に達していないか
メトリクスの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経由などで上記スクリプトの結果を取得し、基準値と比較して必要なアラートをあげる。