同一イベント発生時のイベント出力の抑止動作について

お世話になります。

Zabbixでのログ監視を検討しています。
■利用中のバージョン
・Zabbix 3.0

監視対象のログに同一イベントが大量に出力された際に、
Zabbixの[監視データ]-[イベント]画面に大量のレコードが作成され、
他のメッセージを見落とすことを懸念しています。

上記の対応として、一定期間内に同一メッセージが出力された場合、
[イベント]には1件だけ、表示される様に設定を行いたいと考えています。

良い方法、事例が御座いましたら、ご教授お願い致します。

また、過去のナレッジを参照させて頂きたいところ、
Zabbixは標準で大量イベントの抑止が行われるとの記載が見受けられました。

上記についてナレッジ、ドキュメント等で詳しい情報が公開されていましたら、
ご案内頂けると助かります。

コメント表示オプション

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

>>Basi様
nodata関数を使用してはどうでしょうか?
nodataは指定した期間(秒)内に1つでもデータを取得した場合に1を返し、
取得しなかった場合は0を返します。
https://www.zabbix.com/documentation/2.2/jp/manual/appendix/triggers/fun...

例えば、"/var/log/messages"から"error"のみを拾う以下のアイテムがあると仮定します。

  ・アイテム:logrt[/var/log/messages,error]

このアイテムに対してnodata関数を使用したトリガーを作成すると以下のような形になります。

  ・トリガー:({HOST:logrt[/var/log/messages,error].regexp(error)}=1) and
        ({HOST:logrt[/var/log/messages,error].nodata(30)}=0)

上記トリガーの場合、
「"error"を拾ってきた場合、尚且つ、30秒間データを取得していない場合に障害」となります。
30秒以内で連続で"error"が発生した場合もイベントとしては1回しか上がらず、
"error"が出力されなくなった30秒後に障害状態が解除され、
再び"error"が出力された場合にイベントが上がります。

nodata関数使用にあたり注意点としては以下が考えられます。
 ・[障害イベントを継続して生成]との併用は出来ません。
   #nodata関数が独自にトリガー評価タイミングを持つため、
    意図せずに複数のアクションが実行されてしまう
 ・nodataに指定できる最小値は30秒となります。

>また、過去のナレッジを参照させて頂きたいところ、
>Zabbixは標準で大量イベントの抑止が行われるとの記載が見受けられました。
Zabbixのデフォルト設定のことを指しているかと思います。
抜粋すると「1回のチェックでZabbixサーバへ送信できる一致レコードは最大100個までです。」となっています。
細かい制限もありますので以下をご確認頂ければと思います。
https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtype...

ユーザー Basi の写真

>>kaeru様

ご連絡ありがとうございます。

アドバイスを頂いた様にnodate関数を利用することで、
同一メッセージが大量出力した際に、期間内に複数回イベントが通知されたても
イベントを1件のみ表示させることができました。

ただし、nodate関数を利用した場合、
同一メッセージ以外のメッセージが出力された場合にイベント画面に表示されなくなりました。

恐らく、以下の様な処理がされたものと想定しています。

前提:
/var/log/messagesに"error"を含む文字列が出力した場合に
検知する様に条件文を指定しています。

 1./var/log/messagesに"error"が複数回出力される
 2.nodate関数の指定期間内の為、イベントが1件のみ表示される。
 3.nodate関数の指定期間内に/var/log/messagesに出"error2"が出力される
 4.nodate関数の指定期間内の為、イベントが出力されない。

条件文の指定によって、以下(1)、(2)の条件を満たすことは出来ないでしょうか。

(1).同一メッセージについては複数回出力された場合であってもイベントは1件のみ通知する。
(2).(1)の前後に出力された他のメッセージについては、別途イベントを通知する。

良い方法が御座いましたら、ご教授頂けると幸いです。

> Zabbixのデフォルト設定のことを指しているかと思います。
> 抜粋すると「1回のチェックでZabbixサーバへ送信できる一致レコードは最大100個までです。」となっています。
> 細かい制限もありますので以下をご確認頂ければと思います。

情報のご案内ありがとうございます。
参照させて頂きます。

ユーザー kaeru の写真

>>Basi様
動きについては間違いありません。
ただ、申し訳ないのですが適切な解を思いつきませんでした。
(より良い方法をご存知の有機者様がおられれば逆に私も教えてほしいです。)

私が今の知識で単純に思いつくのがトリガーを2つ作る方法です。
"error"と"error2"ですと、errorという文字列が重複していますので、
まずは"「"error"含む、尚且つ、"error2"は含まない」という条件のトリガーを作成します。

  ・トリガー1:({HOST:logrt[/var/log/messages,error].regexp(error)}=1) and
({HOST:logrt[/var/log/messages,error].regexp(error2)}=0) and ←"error2"に関しては除外
         ({HOST:logrt[/var/log/messages,error].nodata(30)}=0)

次に"error2"のみを検知するトリガーを作成します。
    
  ・トリガー2:({HOST:logrt[/var/log/messages,error].regexp(error2)}=1) and
         ({HOST:logrt[/var/log/messages,error].nodata(30)}=0)

これであれば対応は可能かと思います。

ユーザー Basi の写真

>>kaeru様

度々のご回答有難う御座います。

案内頂いた内容では検知したい文字列毎にトリガーを作成する必要があり、
今回目的とする監視内容に合致しませんでした。
# 監視対象ログには未知のメッセージが出力されることが前提であり、
 事前にメッセージの網羅は困難なため。

条件式の組合せだけでは要件を満たすことは難しそうですね。
監視方法の見直し等を検討したいと思います。

また、良い方法が見つかれば別途、投稿させて頂きたいと思います。

ユーザー heya の写真

多少負荷はかかるかもしれませんが、syslog 側で対処できそうな気もします。
syslog 側でフィルターをかけるとか、syslog から「最後と違うログだったら(または、最後のログからxx秒以上経っていたら) zabbix_sender を使って Zabbix に伝える」という自作プログラムにログを渡すとか。