LoginSignup
13
10

More than 5 years have passed since last update.

Monitoring Agent を使って Zabbix で Fluentd を監視する

Posted at

はじめに

この記事の内容は、fluentdの効果的な活用例と安定運用のポイント (3/3)を参考にしています。ありがとうございます。

Fluentd で Monitoring Agent 機能を利用する

Fluentd には、現在のバッファサイズ、キュー長、リトライ回数を取得するためのMonitoring Agent機能があります。これは、バッファサイズなどの情報を取得したい Fluentd プロセスの設定ファイルに下記の設定を追加した上で、http://host:24220/api/plugins にアクセスすることで情報を取得できるようになる機能です。

<source>
  type monitor_agent
  bind 0.0.0.0
  port 24220
</source>
plugin_id:object:ff44c0 plugin_category:input   type:monitor_agent  output_plugin:false retry_count:
...
plugin_id:object:f9ec64 plugin_category:output  type:   output_plugin:true  buffer_queue_length:0   buffer_total_queued_size:0  retry_count:0
plugin_id:object:10883f0    plugin_category:output  type:   output_plugin:true  buffer_queue_length:0   buffer_total_queued_size:0  retry_count:0

Monitoring Agent 機能は、URI の拡張子を json にする (http://host:24220/api/plugins.json) ことで json 形式でも情報を取得できるため、この json を処理するスクリプトを書けば、機械的にバッファサイズやリトライ回数を監視することが可能になります。

Zabbix で Monitoring Agent 機能を利用する

Zabbix には、Zabbixサーバにスクリプトまたはバイナリを実行してチェックさせる外部チェックという方法があります。これは、/usr/local/share/zabbix/externalscripts (デフォルト値) にスクリプトを設置した上で、Zabbix のアイテム作成時、タイプを 外部チェック、キーを script_file_name[<parameter1>,<parameter2>,...] にすることでスクリプトを定期実行させ、その結果を格納させる方法です。

つまり、Monitoring Agent 機能から Zabbix に情報を渡すスクリプトを作成し、外部チェックで格納させれば、キュー長やリトライ回数を視覚化し、異常を検知し、通知することができるようになります。

MonitoringAgent機能からZabbixに情報を渡すスクリプト
#!/usr/bin/env python
# coding=utf-8

import json
import sys
import urllib2

host, port, plugin_id, metric = sys.argv[1:]
response = urllib2.urlopen("http://%s:%s/api/plugins.json" % (host, port))
body = json.loads(response.read())
for plugin in body['plugins']:
    if plugin['plugin_id'] == plugin_id:
        print plugin[metric]
        break

ただ、 注意すべきことがあります。Monitoring Agent 機能で返されるプラグインの ID はデフォルトで Ruby のオブジェクトの ID である (plugin_id:object:fad6ec) ため、プラグイン毎のバッファサイズを得ることが困難です。

この問題を解決するために、Fluentd の Common Plugin Parameter@id パラメータを使用します。これを使用するとプラグインの ID は @id hoge で指定した hoge になるため、Fluentd プロセスを再起動させたとしても継続して監視を続けることが可能になります。人間が読めるという意味でも非常に便利です。

しかし、それでも fluent-plugin-forest といったマルチスレッディングさせるプラグインを使用した場合は対応することができません。この場合は、全てのプラグインの最大値を取得し、その最大値で監視するなどすれば、ある程度上手くいくでしょう。

MonitoringAgent機能からZabbixに情報を渡すスクリプト(最大値を渡す場合)
#!/usr/bin/env python
# coding=utf-8

import json
import sys
import urllib2

host, port, metric = sys.argv[1:]
response = urllib2.urlopen("http://%s:%s/api/plugins.json" % (host, port))
body = json.loads(response.read())
maximum_value = 0
for plugin in body['plugins']:
    if plugin.get(metric, 0) > maximum_value:
        maximum_value = plugin.get(metric)
print maximum_value

まとめ

この記事は、fluentdの効果的な活用例と安定運用のポイント (3/3)の内容に、外部チェックと Common Plugin Parameter まわりの内容を加えて説明していきました。また、スクリプトも Python に書き換え、Zabbix だけをインストールした環境でも動作するように意識しました。

この記事だけでなくリンク先も参考にして頂き、より安心して Fluentd を運用して頂ければ幸いです。

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10