fluentdの0.10.33からin_monitor_agentという標準プラグインが追加され、これによりfluentdで使用しているpluginのmetrics情報が外部から取得できるようになりました。
◯設定
<source>
type monitor_agent
bind 0.0.0.0
port 24220
</source>
※参考:
http://docs.fluentd.org/articles/monitoring#monitoring-agent
◯確認
上記のように設定後、以下のように24220ポート経由でAPIに接続すると、metrics情報がjson形式で取得できます。
$ curl -s http://localhost:24220/api/plugins.json | jq "."
{
"plugins": [
{
"config": {
"type": "forward"
},
"output_plugin": false,
"type": "forward",
"plugin_id": "object:3ff71e700648"
},
{
"config": {
"port": "24220",
"type": "monitor_agent"
},
"output_plugin": false,
"type": "monitor_agent",
"plugin_id": "object:3ff71e6ffb30"
},
(snip.)
ここで確認できるのは基本的に以下になります。
- 登録されているpluginの一覧
- 各pluginの設定情報(上記monitor_agentで言えば port:24220)
- buffered output pluginのmetrics
このうち、運用者としては3が特に大事になります。大量のデータを取り扱うfluentdノードでは、buffer処理をするoutput pluginでbuffer領域のqueueを使い尽くし(queue size exceeds limit)てしまうことがあります。
そちらを事前に検知して強制的にflushをしたり、使用領域サイズをグラフにプロットしたり、という事が運用上必要となり、解決方法としてはmetrics pluginを使用する、というのが良い策になります。
具体的に、out_forwardのmetrics内容を見てみると以下の様な感じになっています。
{
"config": {
"type": "forward"
},
"retry_count": 0,
"buffer_total_queued_size": 0,
"buffer_queue_length": 0,
"output_plugin": true,
"type": "forward",
"plugin_id": "object:3ff7206ce948"
},
retry_count, buffer_total_queued_size, buffer_queue_lengthあたりが、ウォッチが必要な項目になりますね。
◯強制的なflush
たとえばmonitor_agentで取得したbuffer sizeの値が大きくなっていて手動でflushをしたい、といった場合、以下のようにsignalを送る事で強制flushができるようです。
pkill -USR1 -f fluentd
実際のところ、queueがあふれる理由は、トラフィックの急増やoutputの先にあるシステムの負荷高騰やキャパシティ低減が考えられるため、fluentdだけを強制的にflushしてもシステム全体のキャパシティは解決せず、解決することは少ない気もしますが、一応。
◯munin plugin
可視化側の施策の一つとして、monitor agentの値をグラフ化するmunin pluginを作成しました。
https://github.com/moaikids/munin-fluentd
muninについての説明はここでは割愛しますが、システムメトリクスのグラフ可視化ツールでは有名なものです。
上述のgithub内には以下の3種のmunin pluginが含まれています。
- fluentd_process : プロセス数の取得
- fluentd_resource : fluentdの使用メモリ量の取得
- fluentd_monitor_agent : monitor_agentから取得したbuffered output pluginの各種metricsの取得
設定、使い方は、多くのmunin pluginと同様に簡単です。
- munin ならびに munin-nodeのインストール
- python(<= 2.6)のインストール ※munin-fluentdのプラグインはpythonで書いてるので
- munin-nodeサーバーに、上記munin-fluentdのプラグインをインストール
- munin-nodeの設定ファイルに設定を記述
munin-fluentdのプラグインのインストールは以下のような形で。所定のplugins置き場に、pluginのシンボリックリンクを作成します。
git clone https://github.com/moaikids/munin-fluentd.git
cp munin-fluentd/plugins/fluentd/* /usr/share/munin/plugins/
chmod +x /usr/share/munin/plugins/fluentd_*
ln -s /usr/share/munin/plugins/fluentd_process /etc/munin/plugins/fluentd_process
ln -s /usr/share/munin/plugins/fluentd_resource /etc/munin/plugins/fluentd_resource
ln -s /usr/share/munin/plugins/fluentd_monitor_agent /etc/munin/plugins/fluentd_monitor_agent
また、設定ファイルに以下のような記述が必要です。
[fluentd*]
user munin
env.host localhost
env.port 24220
env.package td-agent #td-agentの場合はこちら、fluentdの場合は"fluentd"と指定
上記設定の上、munin-nodeを再起動すれば、muninのグラフに取得した数値が反映されるようになると思います。
なお、fluentd_monitor_agent では標準では三種の値(retry_count, buffer_total_queued_size, buffer_queue_length)を同一グラフで表示するようにしていますが、それぞれ数値の取りうる値の範囲に大きな差があるため正直見づらくなります。
ln -s /usr/share/munin/plugins/fluentd_monitor_agent /etc/munin/plugins/fluentd_monitor_agent_buffer_queue_length
ln -s /usr/share/munin/plugins/fluentd_monitor_agent /etc/munin/plugins/fluentd_monitor_agent_buffer_total_queued_size
ln -s /usr/share/munin/plugins/fluentd_monitor_agent /etc/munin/plugins/fluentd_monitor_agent_retry_count
上記のように、シンボリックリンクのファイル名のsuffixに各種metricsの値を指定すると、その値だけをグラフ化するグラフが作成できるようになります。
グラフ化した一例は以下のような感じ。