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経由などで上記スクリプトの結果を取得し、基準値と比較して必要なアラートをあげる。