即時復旧させたいログ監視における復旧条件式について

お世話になります。

【Zabbixバージョン】
Zabbix-server:5.4.0
Zabbix-agent2:5.2.6 (OS:RHEL7.4)

ログ監視において、トリガー条件に合致し生成されたイベントについては、
アクション(メール)が飛ばせれば、その後無条件で復旧扱いとしたい、という要件を満たすため、
以下のような設定をしているのですが、
テストの結果、一部ケースにおいて、想定と異なる挙動をとりました。

+-----------------------------------------------------------
【投入したトリガ設定】

◆障害イベント生成モード
[単一] を選択。

◆トリガー条件式
find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1
and find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1 ,,"regexp","{監視除外文言①}")=0
and find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1 ,,"regexp","{監視除外文言②}")=0
and find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1 ,,"regexp","{監視除外文言③}")=0

◆復旧条件式
last(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])<>0
※イベント生成時、アクションが飛ばせれば、即時に復旧としたいため、
 かならず正となる式を考えた結果、上記にしました。

【実施したテスト】
監視対象ログに対し、以下のパターンに分けて書き込み
トリガーの検知(イベントの生成)および、即時イベントが復旧するか、確認しました。

◆パターン①
以下2行を連続で書き込み。
1行目: ERROR含むかついずれかの{監視除外文言}を含まないログを出力させる -> トリガー条件式に合致させる
2行目: ERROR含むかついずれかの{監視除外文言}を含むログを出力させる -> トリガー条件式に合致させない

サンプルログ:
#tail -f {監視対象ログ}
20220407-230902 ERROR hogehoge fugafuga.
20220407-230902 ERROR {監視除外文言} hogehoge fugafuga.

結果、上記ログ2行ともヒストリとして格納され、
1行目がイベントとして作成され、かつ、即時復旧しました。(GUI上の障害一覧の継続時間は0秒)

-> これは想定通り。実現したかった動きをとっている

◆パターン②(①の逆)
以下2行を連続で書き込み。
1行目: ERROR含むかついずれかの{監視除外文言}を含むログを出力させる -> トリガー条件式に合致させない
2行目: ERROR含むかついずれかの{監視除外文言}を含まないログを出力させる -> トリガー条件式に合致させる

サンプルログ:
#tail -f {監視対象ログ}
20220407-231002 ERROR {監視除外文言} hogehoge fugafuga.
20220407-231002 ERROR hogehoge fugafuga.

結果、上記ログ2行ともヒストリとして格納され、
2行目がイベントとして作成されましたが、即時復旧がなされず、障害一覧に残り続けました。

-> これは想定外。

+-----------------------------------------------------------
上記を踏まえたうえで、以下質問がございます。
[質問1]
実施したテストケース/パターン②で期待値と異なる動きをとった理由。

[質問2]
上記②で設定した監視設定について改善すべき点があるか、あるいはほかの適切な監視設定があるか。

ご教示いただけますと幸いです。よろしくお願いいたします。

コメント表示オプション

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

[質問1]
実施したテストケース/パターン②で期待値と異なる動きをとった理由。

障害検知後、復旧条件式が評価されるのは、次にアイテムの値を取
得したときになるので、新しい値が入ってこないなら障害となった
ままになるからでしょう。

[質問2]
上記②で設定した監視設定について改善すべき点があるか、あるいはほかの適切な監視設定があるか。

瞬時に復旧させることはできないと思います。

ユーザー hntrs の写真

TNK様

ご回答ありがとうございます。
復旧条件式が評価されるのは、次にアイテムの値を取得したとき、とのことでしたため、
次のアイテムが来ない限りは復旧されない、と理解しました。

別で調査したところ、
アイテムを取得せずとも定期的に評価してくれる関数「nodata」があるとのことで、
復旧条件式を以下のように変更して、試してみました。

復旧条件式:
nodata(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate],30)=1

ただ、こちらもうまくいかず、障害検知後、
30秒経っても、log監視間隔である300秒が経っても、
復旧されない状態となっております。

TNK様が以前ご回答された以下記事において、
http://www.zabbix.jp/node/3725
「復旧条件にnodata()を使用する方法は使えなさそうです。」とのことでしたが、
これは現在も変わらない認識であっておりますでしょうか。
※もしそうだとして、Zabbixとしてはこれは不具合として認識されてないのでしょうか…?

ユーザー batica の写真

横から失礼いたします。

復旧条件式ではなく、条件式に関数「nodata」を使用するのはいかがでしょうか。
TNK様が以前ご回答なさっているフォーラムの投稿がございましたので、ご参考までに。
http://www.zabbix.jp/node/863

なお復旧条件式ですが、条件式「FALSE」かつ復旧条件式「TRUE」で復旧するようです。
なにかアイテムでデータを拾ってきて、それが条件式に合致しないかつ、データを受信しないは成り立たないので、
復旧しないのだと思います。

2 Trigger expression

When defining a problem expression alone, this expression will be used both as the problem threshold and the problem recovery threshold. As soon as the problem expression evaluates to TRUE, there is a problem. As soon as the problem expression evaluates to FALSE, the problem is resolved.

When defining both problem expression and the supplemental recovery expression, problem resolution becomes more complex: not only the problem expression has to be FALSE, but also the recovery expression has to be TRUE. This is useful to create hysteresis and avoid trigger flapping.

ユーザー hntrs の写真

batica様

ご回答、および有益な情報をいただき、ありがとうございます。
以下については理解しておりませんでした。
> 復旧条件式ですが、条件式「FALSE」かつ復旧条件式「TRUE」で復旧するようです。

ご指摘の通り、復旧条件式はやめて、トリガ条件式を以下のように改変しましたところ、
いずれの障害パターンにおいても、当方の想定通りの動作をするようになりました。

◆以前のトリガー条件式
find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1
and find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1 ,,"regexp","{監視除外文言①}")=0
and find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1 ,,"regexp","{監視除外文言②}")=0

◆変更後のトリガー条件式
nodata(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate],30)=0
and find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1
and find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1 ,,"regexp","{監視除外文言①}")=0
and find(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate])=1 ,,"regexp","{監視除外文言②}")=0

ありがとうございました。