zabbixアクティブチェックがうまくいかない場合の確認

zabbixエージェントのアクティブチェックがうまくいかなくて苦労した時の対処方法を紹介しておきます。

ログ監視をアクティブチェックで行おうと思い、zabbixサーバ側には下記監視アイテムを登録しました。

タイプ→zabbixエージェント(アクティブ)
キー→log[/var/log/message,error,,]

この設定を入れて、しばらく待ったが全くの反応なし。
zabbix_agentdのログを確認しても特に何もなく。
zabbix_agentdを再起動した場合はactive_checks startのログが残されているので、実行しようとはしているよう。
これだけだとどこでどうエラーになっているのかわからないので、zabbix_agentd.confの設定を変更し、ログレベルを最大にして確認。

すると、zabbix_agentdの起動時にエラーが出力されていることが判明。

6904:20100922:164239.056 In collector_diskdevice_add("")
6908:20100922:164239.056 Get active checks error: bind() failed with error 99: Cannot assign requested address

6908:20100922:164239.056 In process_active_checks('zabbix_server',8081)

これを見ると、どうやらサーバへの接続エラーで止まっている模様。

zabbix_agentdの設定ファイルで下記内容が間違っていると失敗するよという記述は見つけたので確認。
http://www.zabbix.jp/modules/newbb/viewtopic.php?topic_id=174&forum=6&post_id=738

DisableActive、Hostname、ListenIP、LitenPort、Server、ServerPortは全部正しく設定されていました。
ということでよくわからず、とりあえずソースを確認。

view zabbix-1.8.3/src/zabbix_agent/active.c


略
static int      refresh_active_checks(const char *host, unsigned short port)
{
        zbx_sock_t      s;
        char            *buf;
        int             ret;
        struct zbx_json json;

        zabbix_log(LOG_LEVEL_DEBUG, "refresh_active_checks('%s',%u)", host, port);

        zbx_json_init(&json, ZBX_JSON_STAT_BUF_LEN);

        zbx_json_addstring(&json, ZBX_PROTO_TAG_REQUEST, ZBX_PROTO_VALUE_GET_ACTIVE_CHECKS, ZBX_JSON_TYPE_STRING);
        zbx_json_addstring(&json, ZBX_PROTO_TAG_HOST, CONFIG_HOSTNAME, ZBX_JSON_TYPE_STRING);

        if (SUCCEED == (ret = zbx_tcp_connect(&s, CONFIG_SOURCE_IP, host, port, CONFIG_TIMEOUT)))
        {
                zabbix_log(LOG_LEVEL_DEBUG, "Sending [%s]", json.buffer);                if (SUCCEED == (ret = zbx_tcp_send(&s, json.buffer)))
                {
                        zabbix_log(LOG_LEVEL_DEBUG, "Before read");

                        if (SUCCEED == (ret = zbx_tcp_recv_ext(&s, &buf, ZBX_TCP_READ_UNTIL_CLOSE, 0)))
                        {
                                zabbix_log(LOG_LEVEL_DEBUG, "Got [%s]", buf);
                                parse_list_of_checks(buf);
                        }
                }
                zbx_tcp_close(&s);
        }

        if (SUCCEED != ret)
                zabbix_log(LOG_LEVEL_DEBUG, "Get active checks error: %s", zbx_tcp_strerror());

        zbx_json_free(&json);

略

CONFIG_SOURCE_IPとhostとportとCONFIG_TIMEOUTの値を使って接続できるかを判断しているよう。
ということでSourceIPも正しく自分のIPを設定してあげないといけないらしいです。
SourceIPを正しく設定して、エージェントを再起動するとサーバから監視対象のアイテムリストが取ってこれて、
エージェント内でログの監視が始まりました。

ここで再び詰まる。
エージェントで監視がスタートして正しくログの変更のチェックが開始してもサーバ側の管理画面から見ると何も返ってこない・・・

zabbix_server.confを見てみると、こっちにもSourceIPの設定箇所があることが判明。
zabbix_server.confのSourceIPにサーバのIPを指定してあげると管理画面にも結果が反映されてきました。