イベントログのソースを複数指定した除外

初めて投稿させていただきます。
お忙しいところ恐縮ですが、お知恵をお借り出来れば幸いです。

■環境
・zabbi version
zabbix-2.0.3

・zabbix server
CentOS 6.4

・zabbix agent
Windows Server 2008 R2 Standard SP1

■現象
zabbix-agent(Windowクライアント)を起動すると、
「ローカルコンピューターの Zabbix Agent サービスを開始できません。エラー 1067: プロセスを途中で強制終了しました。」と
ポップアップ表示され、起動できません。

色々と調査したところ、以下のような現象です。

・zabbix_agentd.conf の Hostnameをホスト名からIPアドレスに変更 ⇒zabbix-agent起動可能
・zabbix serverの対象ホストのホスト名欄をホスト名からIPアドレスに変更 ⇒zabbix-agent起動不可
・zabbix_agentd.conf の HostnameをIPアドレスからホスト名に変更 ⇒zabbix-agent起動可能
・zabbix serverの対象ホストのホスト名欄をIPアドレスからホスト名に変更 ⇒zabbix-agent起動不可

上記から、zabbix server側のホスト名とzabbix agent側のHostnameが一致するとzabbix-agentサービスが
起動出来ない状況かと推測しております。

イベントログの監視を行いたいのですが、イベントログの監視(アクティブ監視)を行うためには
zabbix_agentd.confのHostnameはzabbix server 側のホスト名と一致させる必要があると認識しております。

ところが、これを一致させるとzabbix-agentが起動不可となるため、対応に苦慮しております。

考えられる対応方法についてご教授いただいても宜しいでしょうか。

ちなみに、上記で「zabbix-agent起動可」となった場合、zabbix server 側で対象ホストの
エージェントの状態が「Z」が緑に変更されることを確認しております。

また、起動可能な場合と、起動不可の場合のdebug level4でログを抽出したものを添付いたします。

他に必要な情報がございましたら、提示させていただきます。

■補足

今回、イベントログのソースを複数除外設定したい(正規表現を使用したい)ため、
yumでパッケージインストールではなく、下記リンクのパッチを適用し、ソースから
コンパイルしたものを使用しております。

http://www.zabbix.jp/node/1746

Windowsエージェントのコンパイルは下記を参考にさせていただきました。

http://www.zabbix.jp/node/218
http://pastebin.com/WA2xwpe1

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー KAZ の写真

s_zbxさん

マニュアル読まれましたか?A(^^;

★Zabbixエージェントのconfの設定
■パラメータ
 Hostname

■必須
 (空白)

■範囲
 (空白)

■デフォルト値
system.uname

■説明
 一意なホスト名。
 アクティブチェックで使用され、Webインターフェースで設定したホスト名に一致する必要があります。

つまり…
Zabbixフロントエンドで登録する「ホスト名」とHostnameを一緒にする必要があります。
Zabbixサーバの指定はServerにIPアドレスで指定します。
Zabbixエージェントがデータを収集するアドレスはListenIPに設定します。(127.0.0.1とか固有IPとか)

1.8のマニュアルは日本語訳されている部分ありますので、参考にしてみてください。
https://www.zabbix.com/documentation/jp/1.8/manual/processes

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

マニュアルは参照させていただいており、
yumでインストールした別環境ではイベントログを検知出来ているので、
設定方法に問題はないのかと思っております。

以下に設定状況を回答させていただきますので、
お手数ですがご確認いただいても宜しいでしょうか。

>Zabbixフロントエンドで登録する「ホスト名」とHostnameを一緒にする必要があります。

一緒にするとzabbix-agentサービスが起動出来ない状況です。
(別なものにすると起動できます)

※例
server test-client
agent test-client
⇒zabbix-agentサービス起動不可

server test-client
agent 172.31.70.201
⇒zabbix-agentサービス起動可

>Zabbixサーバの指定はServerにIPアドレスで指定します。

指定しております。
Server=172.31.70.200

>Zabbixエージェントがデータを収集するアドレスはListenIPに設定します。(127.0.0.1とか固有IPとか)

デフォルトの0.0.0.0にしておりましたが、zabbixエージェントが持っているIPに変更しました。
ですが、状況は変わらずzabbix-agentが起動出来ません。

他に確認が必要な箇所はございますでしょうか。

ユーザー TNK の写真

zabbix-2.0.3-eventlog-source-regex-07.patch を拝見する限り
変数sourceの定義や初期化が削除されているようですが、
コンパイル時にエラーや警告はでませんでしたか?

ユーザー s_zbx の写真

TNK 様

ご返信ありがとうございます。

何度かエラーが出力されました。
都度修正を加え、エラーが出力されず、
コンパイル出来たため、そちらを使用しております。

コンパイルについては情報が見つけられず、
試行錯誤しながらなんとかエラーが出力されなくなった、という
程度なので、かなり手順に自信がありません。

実施したコンパイル手順を添付いたしますので、お手数ですがご指摘いただいても
宜しいでしょうか。

ユーザー KAZ の写真

s_zbxさん

Hostnameと言われているのは、zabbix_agentd.confのHostnameパラメータで良いでしょうか?
それならばそこにIPを指定することはない(はず)です。
test-clientがwebフロントエンドで登録したホスト名であれば、test-clientが正しいです。

↓ちなみにIP指定した方はactive checkを実行して「そんなホストないよ」とエラーになっています。
No active checks on server: host [172.31.70.201] not found

また、ログにはホスト名が「test-client1」となっています。「test-client」ではないです。
↓大丈夫ですか?

1256:20130807:160254.250 Sending [{
"request":"active checks",
"host":"test-client1"}]

もしかしてwebフロントエンドのホストにZabbixサーバのホストと監視対象ホストをそれぞれ書いてますか?
→それなら1つにしてください。

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

以下に回答させていただきます。
ご確認のほど宜しくお願いいたします。

>Hostnameと言われているのは、zabbix_agentd.confのHostnameパラメータで良いでしょうか?

その通りです。

>test-clientがwebフロントエンドで登録したホスト名であれば、test-clientが正しいです。

承知しました。ですが、何故かtest-client1にするとzabbix-agentサービスが起動できません。。

>また、ログにはホスト名が「test-client1」となっています。「test-client」ではないです。

大変失礼いたしました。誤記です。「test-client1」が正しい表記となります。

> もしかしてwebフロントエンドのホストにZabbixサーバのホストと監視対象ホストをそれぞれ書いてますか?
> →それなら1つにしてください。

以下の設定となっております。記載がない箇所は特に変更しておりません。

ホスト名:test-client1
表示名:空欄
エージェントのインタフェース:172.31.70.201
DNS名:test-client1
接続方法:IPアドレス
ポート:10050
.

ユーザー KAZ の写真

s_zbxさん

test-client1のホストの設定ですが、グループは選択していますか?
選択しているならwebフロントエンドの設定に問題はないと思います。

zabbix-agentサービスが起動できないとのことですが、ログを消した状態でサービス起動できない設定で起動するとログは出力されますか?
※:一番最初に添付された「zabbix-agent_starterror.txt」はZabbixエージェントが起動しているように見えます。

ログが出力されたらそのログとzabbix_agentd.confを見せて頂けますか?
※:debugレベルでお願いします。

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

> test-client1のホストの設定ですが、グループは選択していますか?
> 選択しているならwebフロントエンドの設定に問題はないと思います。

グループも選択しております。

> zabbix-agentサービスが起動できないとのことですが、ログを消した状態でサービス起動できない設定で起動するとログは出力されますか?
> ※:一番最初に添付された「zabbix-agent_starterror.txt」はZabbixエージェントが起動しているように見えます。

> ログが出力されたらそのログとzabbix_agentd.confを見せて頂けますか?
> ※:debugレベルでお願いします。

debugレベル4に設定しておりますが、ログが出力されます。
ログの内容は「zabbix-agent_starterror.txt」と同様です。

zabbix_agentd.logとzabbix_agentd.confを添付いたします。
ご確認のほどよろしくお願いいたします。

※本サイトへ.confや.logがアップロードできないため、_.txtを付与しております。

ユーザー KAZ の写真

s_zbxさん

添付頂いたZabbixエージェントのconf拝見しました。
私の処で稼働している2.0.6のconfと比べましたが、問題のあるような箇所はありませんでした。

ホストもZabbixエージェントのconfも問題ないとすると、Zabbixエージェントそのものに問題があると思われます。

下記はZabbix SIAのダウンロードサイトです。
ここの「Windows (All) Agents 2.0.3 i386,amd64」を持ってきて確認しましたが、私の環境では問題なく動きました。
※:確認したのはWindows7 64bitです。

Pre-compiled Zabbix 2.0.3 (stable) agents are available for selected platforms
http://www.zabbix.com/download2.php

まずは、これと差し替えてみて動作確認してみては如何でしょうか?

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

実は当初はご提示いただいたURLからダウンロードしたものをインストールしており、
問題なく動作しておりました。
しかし、冒頭に申し上げた「Windows イベントログのソースを複数指定した除外」を
実施するためには、パッチの適用が必要だと判明したため、ソースからコンパイルしたものを
使用してインストールしております。
(コンパイル手順はTNK様に返信させていただいた通りです)

念のためもう一度、

アンインストール
→Zabbix SIAのダウンロードサイトのzabbix_agents_2.0.3のzabbix_agentd.exeを使用してインストール
→zabbix-agentを起動

したところ、問題なく起動いたしました。(zabbix_agentd_confは全く同じものを使用しています)

また、パッチ未適用の状態でソースからコンパイルしたzabbix_agentd.exeを使用しても
問題なくzabbix-agentサービスが起動しました。

やはりパッチ適用後にコンパイルしたzabbix_agentd.exeに問題があるのではと思っておりますが、
コンパイルした手順に不備がないかご確認いただくことは可能でしょうか。

上書きしたactive.cを添付させていただきます。

ユーザー TNK の写真

735行あたりの、

char key_source[MAX_STRING_LEN], *source = NULL;

char key_source[MAX_STRING_LEN], str_source[32]; /* for `regex_match_ex' */;

に置換するところが問題だと思います。

char key_source[MAX_STRING_LEN], *source = NULL, str_source[32] /* for `regex_match_ex' */;

にしてみてはいかがでしょうか?
# セミコロンの位置や数などに注意

そうすることで、元のコードにあった変数「source」の定義と変数
の初期化を指定できるはずです。
コンパイル手順であった「&」の付加は削除して元に戻してくださ
い。
ご提示頂いたactive.cとの大きな違いは、変数sourceの型と初期化
しているかどうかが異なります。

ご確認ください。

ユーザー KAZ の写真

TNKさん

そうですね、そこで宣言しても良いですね。A(^^;

ちなみにchar *sourceですが、初期化しなくても大丈夫なようです。
呼ばれた先で初期化され、アドレスが返ってきます。(その為のダブルポインターっぽいですね。)

只、お作法的に初期化がかっこいいかなと思います。A(^^;

int process_eventlog(const char *source, zbx_uint64_t *lastlogsize, unsigned long *out_timestamp, char **out_source,
unsigned short *out_severity, char **out_message, unsigned long *out_eventid, unsigned char skip_old_data)
{
const char *__function_name = "process_eventlog";
int ret = FAIL;
HANDLE eventlog_handle;
long FirstID, LastID;
register long i;
LPTSTR wsource;

assert(NULL != lastlogsize);
assert(NULL != out_timestamp);
assert(NULL != out_source);
assert(NULL != out_severity);
assert(NULL != out_message);
assert(NULL != out_eventid);

zabbix_log(LOG_LEVEL_DEBUG, "In %s() source:'%s' lastlogsize:" ZBX_FS_UI64,
__function_name, source, *lastlogsize);

*out_timestamp = 0;
*out_source = NULL;

ユーザー s_zbx の写真

TNK 様
KAZ 様

ご返信ありがとうございます。

TNK 様にご教授いただきました通り、

char key_source[MAX_STRING_LEN], *source = NULL;

char key_source[MAX_STRING_LEN], *source = NULL, str_source[32] /* for `regex_match_ex' */;

にしたところ、エラーなくコンパイルされ、zabbix-agentを起動することが出来ました。
ありがとうございます。

その後、zabbixサーバへアイテムとトリガ、正規表現を設定し
検証してみたのですが、ソースの複数除外(正規表現)が有効になっていないように思われます。

設定パラメータを以下に記載いたしますので、
お忙しいところ何度も恐縮ですが、ご確認いただいても宜しいでしょうか。

■状況
イベントIDが正規表現(jogai_eventid)の条件式に含まれているものは検知されない。(アイテムのヒストリには表示される)
ソースが正規表現(jogai_source)の条件式に含まれているものが検知される。(当然アイテムのヒストリにも表示される)
⇒検知されないようにしたい。

■アイテム
名前    event_appl
タイプ   Zabbixエージェント(アクティブ)
キー    eventlog[Application,,"Error"]
データ型  ログ
更新間隔  1秒

■トリガー
1)
名前    event_appl1
条件式   {ABS_Windows:eventlog[Application,,"Error"].logeventid(@jogai_eventid)}=0

2)
名前    event_appl2
条件式   {ABS_Windows:eventlog[Application,,"Error"].logsource(@jogai_source)}=0

■正規表現
1)
名前    jogai_eventid
条件式   ^(999|998|997|996)$
期待値   結果が真

2)
名前    jogai_source
条件式   ^(EventCreate|EventCreate1|EventCreate2|EventCreate3)$
期待値   結果が真

ユーザー s_zbx の写真

TNK 様
KAZ 様

連投となり大変恐れいります。

zabbix server側もパッチを適用しソースをコンパイルしてインストールしているため、
情報を提示させていただきます。

・zabbix-serverコンパイル.txt
zabbix serverをインストールした手順です。make install後はyumでインストールした後と
あまり変わらない設定を実施しております。(必要であれば提示させていただきます)

・active.c_.txt
zabbix server のactive.cファイル(コンパイル後)です。

ユーザー KAZ の写真

s_zbxさん

確認です。

パッチが適用されるのは下記の2ファイルです。
src/zabbix_agent/active.c
src/zabbix_server/trapper/active.c

サーバ側もコンパイル(configure~make~make install)が必要です。

サーバ側もコンパイルされていますか?

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

入れ違いとなったようです。
サーバ側もコンパイルしております。
手順については一つ前のコメントに記載させていただきました

ユーザー KAZ の写真

s_zbx さん

↓アイテムのキーがこのように書けるようになるパッチだと思うのですが?
eventlog[System,,Error,@jogai_eventid]
eventlog[System,,Error,@jogai_source]

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

アイテム側に正規表現が使用できるパッチだったのですね。
失礼いたしました。

アイテムのキーでテストをしてみたのですが、
期待通りの結果が得られませんでした。

設定に誤りはございませんでしょうか。

【テスト1】
■アイテム
名前    event_appl
タイプ   Zabbixエージェント(アクティブ)
キー    eventlog[Application,,"Error",,@jogai_eventid]
データ型  ログ
更新間隔  1秒

■正規表現
1)
名前    jogai_eventid
条件式   ^(999|998|997|996)$
期待値   結果が偽

■結果
正規表現で指定したイベントID以外が検知される。

【テスト2】
■アイテム
名前    event_appl
タイプ   Zabbixエージェント(アクティブ)
キー    eventlog[Application,,"Error",@jogai_source]
データ型  ログ
更新間隔  1秒

■正規表現
名前    jogai_source
条件式   ^(EventCreate|EventCreate1|EventCreate2|EventCreate3)$
期待値   結果が偽

■結果
正規表現で指定したソースや指定していないソースに関係なく全て検知される。

※最新データのヒストリに表示された場合に「検知された」と判断しております。
※zabbix-agentd.confのRefreshActiveCheckがデフォルト(120)なので、設定変更後5分程度
 経過してからテストをしております。

ユーザー KAZ の写真

s_zbxさん

Zabbixサーバ/エージェントのdebugレベルのログは取得可能ですか?

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

私情で大変恐縮ですが、現在帰省中の為、
自宅へ戻り次第ログを提示させていただきます。

ユーザー s_zbx の写真

KAZ 様

遅くなり申し訳ございません。

先に記載させていただいた内容で再度テストを実施した際の
zabbix_agentd.log(debug 4)を添付させていただきます。

■環境
・zabbix-server
ホスト名 test-mgmt1
IPアドレス 172.31.70.200

・zabbix-agent
ホスト名 test-client1
IPアドレス 172.31.70.201

■イベントログ書き込み実時間
・jogai_source

18:24:48 999 EventCreate
18:24:58 999 EventCreate1
18:25:06 999 EventCreate2
18:25:09 999 EventCreate4

・jogai_eventid

18:29:16 999 EventCreate
18:29:29 998 EventCreate
18:29:34 995 EventCreate

※時間 イベントID ソース名

大変お手数ですがご確認いただいても宜しいでしょうか。

ユーザー KAZ の写真

s_zbxさん

ログ拝見しました。
-------------------------------------------------------------------
2364:20130817:182841.406 Got [{
"response":"success",
"data":[
{
"key":"eventlog[Application,,\"Error\",,@jogai_eventid]",
"delay":1,
"lastlogsize":23443,
"mtime":0}],
"regexp":[
{
"name":"jogai_eventid",
"expression":"^(999|998|997|996)$",
"expression_type":4,
"exp_delimiter":",",
"case_sensitive":0}]}]
-------------------------------------------------------------------
正規表現(regexp)の式(expression)に ^(999|998|997|996)$ が渡ってます。
これだと、999 / 998 / 997 /996とマッチします。
場外は [^(999|998|997|996)$] じゃないかと…

なので、下記で上手くいかないかと…

■正規表現
1)
名前    jogai_eventid
条件式   [^(999|998|997|996)$]
期待値   結果が真

2)
名前    jogai_source
条件式   [^(EventCreate|EventCreate1|EventCreate2|EventCreate3)$]
期待値   結果が真

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

念のためお伝えさせていただきますが、
イベントIDの部分で正規表現を使用した場合、想定通りの動きをします。
(正規表現jogai_eventidで指定したイベントIDが検知されない)

また、正規表現のテスト文字列の部分でテストした場合、
jogai_eventid、jogai_source双方で想定通りの動きをします。

ご指摘いただいた点ですが、期待値を「結果が偽」にしていたので
良いのかなと思っていたのですが、KAZ様にご提示いただいた方法でテストしてみました。

結果は
jogai_eventidは正規表現で指定したイベントIDのみ検知されない(想定通り)
jogai_sourceは正規表現で指定しているいないに関わらず、何も検知されない(想定外)
となりました。

同様の内容で設定しているにも関わらず、jogai_sourceのみ想定外の動きをするため
困っております。

今回のテストのログを取得しましたのでご確認いただいても宜しいでしょうか。

ユーザー KAZ の写真

s_zbxさん

トリガーの設定もお教え願えますか?

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

今回のテストについても「最新データのヒストリに表示された場合に『検知された』と判断しているため、
トリガーと連携はしておりませんが、提示が必要でしょうか。
申し訳ございませんが、現在サーバの設定を確認することが出来ない状況のため、
必要でしたら本日夜か明日には提示させていただきます。

設定以外に個人的に不安に思っているのは、サーバ側のソースコンパイルの部分です。
(エージェント側のコンパイルにも不備があり、ご指摘いただきましたので)

先に提示させていただいたように、configureの際にエラーが出力されたため、
以下の対応をしておりますが、対応に問題はないでしょうか。

--------------------------------------------------------------------------------------------
・エラー対処
sourceの宣言がないというエラーに見えるので、284行目辺りに「source[MAX_STRING_LEN],」を追加

# vi src/zabbix_server/trapper/active.c

char host[HOST_HOST_LEN_MAX], *name_esc, params[MAX_STRING_LEN],
pattern[MAX_STRING_LEN], tmp[32],key_severity[MAX_STRING_LEN], source[MAX_STRING_LEN], key_logeventid
[MAX_STRING_LEN],

--------------------------------------------------------------------------------------------
※active.cは先の返信で添付させていただいております。

ユーザー KAZ の写真

s_zbxさん


今回のテストについても「最新データのヒストリに表示された場合に『検知された』と判断しているため、
トリガーと連携はしておりませんが、提示が必要でしょうか。

問題ないと思うのですが、サーバ側でエラーが出ているサーバ側の処がトリガーの検知がサーバ側の処理と絡むのではないかと思っていて、関係が薄いと思ったのですが念のため当方の環境で試せるかなと…A(^^;


設定以外に個人的に不安に思っているのは、サーバ側のソースコンパイルの部分です。
(エージェント側のコンパイルにも不備があり、ご指摘いただきましたので)

先に提示させていただいたように、configureの際にエラーが出力されたため、以下の対応をしておりますが、対応に問題はないでしょうか。

問題ないと思っています。

■現在分かっていること
ログより値が取得できると以下のような流れとなります。

process_active_checksから呼ばれたprocess_eventlogでlastlogsize:23455(最後に取得したデータの位置)となっていますが、イベントログに出力があった場合は、zbx_open_eventlogで条件に合ったログが取得され(which:23456)、process_valueで新しいデータが取得され、send_bufferでZabbixサーバにデータが送信されています。
※:値が取得されない場合はprocess_valueが呼ばれません。

4100:20130817:211320.505 In process_active_checks('172.31.70.200',10051)
4100:20130817:211320.505 In process_eventlog() source:'Application' lastlogsize:23455
4100:20130817:211320.505 In zbx_open_eventlog()
4100:20130817:211320.505 zbx_open_eventlog() pNumRecords:23456 pLatestRecord:1
4100:20130817:211320.505 End of zbx_open_eventlog():SUCCEED
4100:20130817:211320.520 In zbx_get_eventlog_message() which:23456
4100:20130817:211320.520 End of zbx_get_eventlog_message():SUCCEED
4100:20130817:211320.520 End of process_eventlog():SUCCEED
4100:20130817:211320.520 In process_value() key:'test-client1:eventlog[Application,,"Error",,@jogai_eventid]' value:'zabbix_test_21:13:19.91'
4100:20130817:211320.520 In send_buffer() host:'172.31.70.200' port:10051 values:0/100
4100:20130817:211320.520 End of send_buffer():SUCCEED
4100:20130817:211320.520 buffer: new element 0
4100:20130817:211320.536 End of process_value():SUCCEED
4100:20130817:211320.536 In process_eventlog() source:'Application' lastlogsize:23456
4100:20130817:211320.536 In zbx_open_eventlog()
4100:20130817:211320.536 zbx_open_eventlog() pNumRecords:23456 pLatestRecord:1
4100:20130817:211320.536 End of zbx_open_eventlog():SUCCEED
4100:20130817:211320.536 End of process_eventlog():SUCCEED
4100:20130817:211320.536 End of process_active_checks()
4100:20130817:211320.551 In get_min_nextcheck()
4100:20130817:211320.551 Sleeping for 1 second(s)
1184:20130817:211320.801 In collect_perfstat()
4100:20130817:211321.551 In send_buffer() host:'172.31.70.200' port:10051 values:1/100
4100:20130817:211321.551 JSON before sending [{
"request":"agent data",
"data":[
{
"host":"test-client1",
"key":"eventlog[Application,,\"Error\",,@jogai_eventid]",
"value":"zabbix_test_21:13:19.91",
"lastlogsize":23456,
"timestamp":1376741599,
"source":"EventCreate",
"severity":4,
"eventid":995,
"clock":1376741600,
"ns":125971965}],
"clock":1376741601,
"ns":142177146}]
4100:20130817:211321.551 JSON back [{
"response":"success",
"info":"Processed 1 Failed 0 Total 1 Seconds spent 0.000065"}]
4100:20130817:211321.551 In check_response() response:'{
"response":"success",
"info":"Processed 1 Failed 0 Total 1 Seconds spent 0.000065"}'
4100:20130817:211321.551 Info from server: Processed 1 Failed 0 Total 1 Seconds spent 0.000065
4100:20130817:211321.551 End of check_response():SUCCEED
4100:20130817:211321.551 OK
4100:20130817:211321.567 End of send_buffer():SUCCEED

jogai_sourceでもこの流れになればデータが想定通り取得できると思うのですが…

尚、「期待値:結果が真」「期待値:結果が偽」について

expression_type:3 EXPRESSION_TYPE_TRUE(結果が真)
expression_type:4 EXPRESSION_TYPE_FALSE(結果が偽)

下記ソースの様な条件で分岐していて問題ないように見えるのですが、下記の条件で上手くいかない原因が分からない状態です、すいません。

条件式 : ^(999|998|997|996)$
期待値 : 結果が偽

zabbix-2.0.3\src\libs\zbxcommon\regexp.cの191行目辺り(regexp_match_ex関数)

case EXPRESSION_TYPE_TRUE:
switch (regexps[i].case_sensitive)
{
case ZBX_CASE_SENSITIVE:
if (NULL != zbx_regexp_match(string, regexps[i].expression, NULL))
res = SUCCEED;
break;
case ZBX_IGNORE_CASE:
if (NULL != zbx_iregexp_match(string, regexps[i].expression, NULL))
res = SUCCEED;
break;
}
break;
case EXPRESSION_TYPE_FALSE:
switch (regexps[i].case_sensitive)
{
case ZBX_CASE_SENSITIVE:
if (NULL == zbx_regexp_match(string, regexps[i].expression, NULL))
res = SUCCEED;
break;
case ZBX_IGNORE_CASE:
if (NULL == zbx_iregexp_match(string, regexps[i].expression, NULL))
res = SUCCEED;
break;
}
break;

ユーザー s_zbx の写真

KAZ 様

ご返信ありがとうございます。

トリガーの設定は下記の通りとなります。

{test-client1:eventlog[Application,,"Error",,@jogai_eventid].logseverity()}>2
(ソースの場合、アイテムの部分がeventlog[Application,,"Error",@jogai_sourceに変わります)

イベントログを検知する際のzabbixの動作について
ご教授ありがとうございます。
ソースで除外指定した場合、確かにvalueが呼ばれていないようです。
パッチの適用がうまくいっていないということなのでしょうか。。
ご存知でしたら教えていただきたいのですが、本パッチでイベントログのソース複数除外(正規表現)が
うまく動作した実績はあるのでしょうか。

私のソースからのインストール手順に不備がある可能性もございますので、
念のためソースからインストールした際の手順を添付させていただきます。

ユーザー KAZ の写真

s_zbxさん


トリガーの設定は下記の通りとなります。

{test-client1:eventlog[Application,,"Error",,@jogai_eventid].logseverity()}>2
(ソースの場合、アイテムの部分がeventlog[Application,,"Error",@jogai_sourceに変わります)

了解です。
当方の環境でも確認してみます。


ご存知でしたら教えていただきたいのですが、本パッチでイベントログのソース複数除外(正規表現)が
うまく動作した実績はあるのでしょうか。

これは現時点で正式パッチじゃないので、作成者に確認しないと分からない状況です。

ユーザー KAZ の写真

s_zbxさん

パッチ展開後のソースを読んでみましたが、これおかしいですね…A(^^;

以下は、パッチ展開後の~\zabbix-2.0.3\src\zabbix_agent\active.cのprocess_active_checks関数についての話です。

ここでソース(source)、イベントID(logeventid)等を取得してます。

while (SUCCEED == (ret = process_eventlog(
filename,
&lastlogsize,
&timestamp,
&source,
&severity,
&value,
&logeventid,
active_metrics[i].skip_old_data)))
{

その後、ここで正規表現チェックするのですが…

if (SUCCEED == regexp_match_ex(regexps, regexps_num, value, pattern, ZBX_CASE_SENSITIVE) &&
SUCCEED == regexp_match_ex(regexps, regexps_num, str_severity,
key_severity, ZBX_IGNORE_CASE) &&
SUCCEED == regexp_match_ex(regexps, regexps_num, str_source,
key_source, ZBX_IGNORE_CASE) &&
SUCCEED == regexp_match_ex(regexps, regexps_num, str_logeventid,
key_logeventid, ZBX_CASE_SENSITIVE))
{

str_sourceに取得した値を設定している個所がないですね…A(^^;

こんな感じの1行追加がいるかなと…

zbx_snprintf(str_source, sizeof(str_source), "%s", source);

テストはしてませんが、パッチ展開後のactive.cを更に修正してみました。

ユーザー s_zbx の写真

KAZ 様

ご調査、ご返信ありがとうございます。

ご提供いただいたacitve.cを使用してコンパイルしたzabix_agentd.exeを
使用して再度テストを実施してみました。

結果は正規表現で指定したソース以外検知されませんでした。(想定通り)
本当にありがとうございます。
しかし、これまでは正常に表示されていたソース名が、文字化けされるようになりました。
zabbx-serverのフロントエンドで文字化けを確認したのですが、
zabbix_agentd.log内で既に文字化けしているようです。

恐縮ですが、ご確認いただいても宜しいでしょうか。
zabbix_agentd.logを添付させていただきます。

また、コンパイル時にこれまで出力されていた警告以外にactive.cの箇所で
警告が出力されるようになりましたので、添付させていただきます。

※警告箇所は以下二行です

..\..\..\src\zabbix_agent\active.c(1065) : warning C4047: '関数' : 間接参照のレベルが 'const char *' と 'char **' で異なっています。
..\..\..\src\zabbix_agent\active.c(1065) : warning C4024: 'process_value' : の型が 9 の仮引数および実引数と異なります。

ユーザー s_zbx の写真

KAZ 様

連投失礼いたします。

ご提供いただいたactive.cにTNZ様からのご指摘箇所も修正したところ、
文字化けも解消し、想定通りに動作をしました。

数回テストをした限りでは問題なく正規表現で指定したソース以外の
イベントログのみ検知する動作をしております。

何度もご調査いただき本当にありがとうございました。
大変助かりました。

※追伸
今後同様の情報を探している方が検索しやすい様、
本スレッドの題名を
「zabbix-agent起動エラー」から
「イベントログのソースを複数指定した除外」
に変更させていただきたいと思います。

ユーザー KAZ の写真

s_zbxさん

上手くいって良かったです。
スレッドの題名変更はかまわないと思います。

では、失礼します。

ユーザー KAZ の写真

s_zbxさん

active.c_.txt 読んでみました。
コンパイル環境が現在手元にないので、コンパイルしてませんが…A(^^;

734行目の「char source;」ですが、「char *source;」じゃないかなと…
1058行目のsourceは&無しで…

【参考】
1008行目のprocess_eventlog関数の第4パラメータはchar *じゃなくchar **です。
なので、&source は *sourceのポインタ、つまり**sourceです。

ユーザー kodai の写真

本件、KAZさんが作成してくれたパッチをもとに2.0.9版を作成してZabbix社でレビューしてもらったのですが、他の機能に影響があるので正式に2.0系に取り込むのは難しいようです。 https://support.zabbix.com/browse/ZBXNEXT-1477

2.2系で修正を入れてもらうことになりましたので、この機能を使いたい方は2.2をお待ちください。