即時復旧させたいログ監視における復旧条件式について
お世話になります。
【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 - 投稿数: 4719
障害検知後、復旧条件式が評価されるのは、次にアイテムの値を取
得したときになるので、新しい値が入ってこないなら障害となった
ままになるからでしょう。
瞬時に復旧させることはできないと思います。
hntrs - 投稿数: 14
TNK様
ご回答ありがとうございます。
復旧条件式が評価されるのは、次にアイテムの値を取得したとき、とのことでしたため、
次のアイテムが来ない限りは復旧されない、と理解しました。
別で調査したところ、
アイテムを取得せずとも定期的に評価してくれる関数「nodata」があるとのことで、
復旧条件式を以下のように変更して、試してみました。
復旧条件式:
nodata(/{対象ホスト}/logrt[{監視対象ログ},"ERROR",,,skip,,,copytruncate],30)=1
ただ、こちらもうまくいかず、障害検知後、
30秒経っても、log監視間隔である300秒が経っても、
復旧されない状態となっております。
TNK様が以前ご回答された以下記事において、
http://www.zabbix.jp/node/3725
「復旧条件にnodata()を使用する方法は使えなさそうです。」とのことでしたが、
これは現在も変わらない認識であっておりますでしょうか。
※もしそうだとして、Zabbixとしてはこれは不具合として認識されてないのでしょうか…?
batica - 投稿数: 19
横から失礼いたします。
復旧条件式ではなく、条件式に関数「nodata」を使用するのはいかがでしょうか。
TNK様が以前ご回答なさっているフォーラムの投稿がございましたので、ご参考までに。
http://www.zabbix.jp/node/863
なお復旧条件式ですが、条件式「FALSE」かつ復旧条件式「TRUE」で復旧するようです。
なにかアイテムでデータを拾ってきて、それが条件式に合致しないかつ、データを受信しないは成り立たないので、
復旧しないのだと思います。
2 Trigger expression
hntrs - 投稿数: 14
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
ありがとうございました。