kakakakakku blog

Weekly Tech Blog: Keep on Learning!

mackerel-plugin-fluentd を使うなら "[at]id" を指定するべし

タイトルに @id を書いておくと Twitter でメンションが飛んでしまうため [at]id に修正しました 🙇🏻

前置き

mackerel-plugin-fluentd を使うと,Fluentd のメトリクス(バッファサイズ/リトライカウントなど)を Mackerel のカスタムメトリックにポストすることができる.ログの流量が多い場合など,バッファサイズを監視できていると運用しやすいし,是非使っておきたいところ.

ちなみに Fluentd のメトリクスを取得するなら事前に monitor_agent を conf に含めておく必要がある.詳しくは Monitoring Fluentd | Fluentd に書いてある.

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

plugin_id のデフォルト値は Ruby の object_id になる

普通に match ディレクティブを書いた状態でメトリクスを取得すると,以下のように plugin_id に object:3fedbb59bfa8 といった値が入る.これは Ruby の object_id で,Fluentd を再起動してしまうと,別の object_id になってしまう.

$ curl http://localhost:24220/api/plugins
plugin_id:object:3fedbaffaae0   plugin_category:input   type:monitor_agent  output_plugin:false retry_count:
plugin_id:object:3fedbaffac34   plugin_category:input   type:forward    output_plugin:false retry_count:
plugin_id:object:3fedbaff8a88   plugin_category:input   type:debug_agent    output_plugin:false retry_count:
plugin_id:object:3fedbb59bfa8   plugin_category:output  type:aws-elasticsearch-service  output_plugin:true  buffer_queue_length:0   buffer_total_queued_size:0  retry_count:0
plugin_id:object:3fedbb579cdc   plugin_category:output  type:aws-elasticsearch-service  output_plugin:true  buffer_queue_length:0   buffer_total_queued_size:0  retry_count:0
plugin_id:object:3fedbaea404c   plugin_category:output  type:tdlog  output_plugin:true  buffer_queue_length:0   buffer_total_queued_size:0  retry_count:0
plugin_id:object:3fedbd16e1cc   plugin_category:output  type:stdout output_plugin:true  retry_count:

この状態で Mackerel のカスタムメトリックを見ると,以下のようになる.object_id を見ても,具体的にどの Output Plugin なのか判別できないし,Fluentd を再起動してしまうと,メトリクスを継続的に監視できないし,これじゃ運用に耐えない.

f:id:kakku22:20160926073426p:plain

match ディレクティブに @id を指定する

公式ドキュメントを読んでいたら @id という設定があることに気付き,探していたのはこれだ!!!となった.今まで知らなかった...!

Common plugin parameter @id: Specify plugin id. in_monitor_agent uses this value for plugin_id field http://docs.fluentd.org/articles/config-file

で,以下のように @id に任意の名前を設定してあげるだけで良い.

<match nginx.error>
    @id out_nginx_error
    @type aws-elasticsearch-service
    (中略)
</match>

この設定を適用してから Mackerel のカスタムメトリックを見ると,ちゃんと判別できるようになっていた.

(画像の例はシステムに関係するログの match ディレクティブだけに @id を指定しているので,まだ一部 object_id が残っているけど,実際に全てに設定すれば object_id は撲滅できる)

f:id:kakku22:20160926073434p:plain

参考

@id に気付いてから調べてみると,結構 @id を紹介した記事が見つかった.うおー!

qiita.com

まとめ

タイトル通りだけど,mackerel-plugin-fluentd を使うなら @id を指定して,plugin_id を識別できるようにしよう!