イベントログ障害復旧について

いつもお世話になります。

windowsイベントログの監視をして、トリガーを設定、障害検知はできるのですが
復旧が思い通りになりません。
条件式に不備があるのか、ご教授頂けますと幸いです。

環境 centos7
   zabbix3.4.3
   php7.1
   mariadb10.1
   zabbix-agent3.4

アイテム キー eventlog[Application,,,,,,skip]
トリガー (({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4357)}=1) and ({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=1)) or (({TRIGGER.VALUE}=1) and ({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=0) and ({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0))

正規表現 @r-fan  結果が真 リアファン

最新データに
2017/11/12 15:06:31 2017/11/12 15:05:01 FcService 警告 4357 ファン停止ワーニングが発生しました。(リアファン(1531))
が記録され障害を検知できます。
2017/11/12 15:08:30 2017/11/12 15:07:00 FcService 情報 4405 ファン停止ワーニングが復旧しました。(リアファン(1498))
で障害復旧します。
しかし
2017/11/12 15:08:30 2017/11/12 15:07:00 FcService 情報 4405 ファン停止ワーニングが復旧しました。(フロントファン2(1498))
でも復旧してしまいます。
復旧のlogeventidが違う場合は、復旧しないので、イベントログのフロントファン リアファンがうまく判別できてないのでしょうか?または、条件式が間違っているのでしょうか?

宜しくお願い致します。

コメント表示オプション

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

復旧の条件に以下の条件が含まれるのが誤りではないでしょうか?

({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0)

これでは、「正規表現 @r-fan  結果が真 リアファン」に合致
しないものという条件になってしまいませんか?

ユーザー kaeru の写真

すでにTNK様にご回答して頂いておりますが、若干気になった点がございます。
ご使用の環境が不明ですので見当違いかもしれませんが、
アイテムキーの指定がeventlog[Application,,,,,,skip]と幅が広く、
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0)を修正したとしても、
以下のようなケースで復旧してしまうような気がします。

1.次のイベントログApplicationで障害
 →タイムスタンプ略 FcService 警告 4357 ファン停止ワーニングが発生しました。(リアファン(1531))

2.次のまったく関係のないイベントログApplicationが出力された場合に復旧してしまう。
 →タイムスタンプ略 TEST エラー 9999 テストエラー

つまるところ、
アイテムキー:eventlog[Application,,,,,,skip]をもう少し絞って、
トリガーを再検討してはどうでしょうか。
 ※例えばアイテムキーを下記のように対象ログのみに限定する等。
   eventlog[Application,"リアファン",,FcService,,,skip]

ユーザー kyouji-east の写真

TNK様 kaeru様

 ご返答ありがとうございます。
正規表現の 結果が真と偽がよく理解できていないのですが
#これでは、「正規表現 @r-fan  結果が真 リアファン」に合致
しないものという条件になってしまいませんか?
これは、結果を偽にすることで、「正規表現 @r-fanは、リアファン」に合致するとなるのでしょうか?
単純に「正規表現 @r-fan [文字列が含まれる]」にしても、リアファン以外の文字列で復旧してしまいます。
これは、kaeru様のご指摘のように関係ないイベントログで、復旧してしまっているのでしょうか?
logeventidを変えると復旧しないので、@r-fanの部分での判定がうまくいっていないのでは、と思っていたもので。
あと、アイテムキーでの絞り込みの件は、最初は、絞り込んでアイテムを設定していたのですが、数が多く範囲を広げて
トリガーの設定で、振り分けようとした次第です。

eventlidについては、リアファン・フロントファンともに同じなので、障害「4357」 復旧「4405」
eventidでの評価ができず文字列での障害・復旧ができればと思っています。

宜しくお願い致します。

ユーザー TNK の写真

再度条件を確認しなおしました。

実現されたいことを実現するには、条件が不足していると思われま
す。
記載されていた条件では、logeventidが4405かつリアファン以外で
あった場合の条件が不足しています。

例えば、試されていたlogeventidや4405でフロントファンであった
場合、logeventidが4405であるだけで、

 ({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=0)

の部分がFalseになってしまうので、障害が復旧してしまいます。

ですので、後半の条件式に、logeventidが4405であった場合の条件
を追加してみてください。

つまり、トリガーの条件式にすると以下のようになります。

(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4357)}=1) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=1))
or
(({TRIGGER.VALUE}=1) and
(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=1) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0))
or
(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=0) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0))
)

リアファン以外であったら復旧はしないので、以下のように一部省
略してもよいと思います。

(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4357)}=1) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=1))
or
(({TRIGGER.VALUE}=1) and
(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=1) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0)
) or ({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0)
)

ユーザー kyouji-east の写真

TNK様

 いつもありがとうございます。
上記のトリガーでリアファンのみ復旧が可能になりました。
追加でフロントファンのトリガーも同様に設定したところ、今度は、フロントファンの障害で
リアファンの障害も検知してしまいました。
追加したのは、
正規表現 @f-fan2  結果が真 リアファン2
(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4357)}=1) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@f-fan2)}=1))
or
(({TRIGGER.VALUE}=1) and
(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=1) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@f-fan2)}=0))
or
(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=0) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@f-fan2)}=0))
)

同じeventidで複数の障害を検知・復旧させるには、障害検知の部分にも追加条件式が必要になるのでしょうか?

ユーザー kaeru の写真

>>kyouji-east様
文中ではフロントファンのトリガーを設定となっていますが、
正規表現を見る限りではリアファン2のトリガーに見受けられます。

これは新たにリアファン2用のトリガーを作成したが、
フロントファンの障害が発生すると、このトリガーも障害状態となってしまうということでしょうか?

また、"リアファン2"が入ってきた場合、
@f-fan2 だけではなく、@r-fanにも引っかかってしまいますが問題無いでしょうか。

ユーザー kyouji-east の写真

kaeru様

 ご指摘ありがとうございます。
本文中の 正規表現 @f-fan2  結果が真 リアファン2 は、
記載ミスで、実際には「フロントファン2」で設定しています。
TNK様に提案頂いた条件式で、新たにフロントファン2のトリガーを作ったところ、フロントファン2の障害を
検知するとリアファンの障害も検知してしまいました。
本当は、kaeru様が最初に言われたようにアイテムで絞った方が、トリガーの条件式が簡略化できそうなのですが、
アイテム数が多くトリガーの条件式で、どうにかと思っています。
宜しくお願い致します。

ユーザー kaeru の写真

式を確認しましたが、以下の箇所で引っかかってしまっているようです。

(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=0) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0))

以下の値が入ってきた場合、
イベントID4405ではなく、リアファンも含まないため障害となっています。
 2017/11/12 15:06:31 2017/11/12 15:05:01 FcService 警告 4357 ファン停止ワーニングが発生しました。(フロントファン2(1531))

パッと計算式が出てこないので考えてみます。
ただ、個人的な所感となり恐縮ですが、
式を複雑に過ぎると判読性が落ち、設定から時間がたった場合や担当者が変わった場合にブラックボックス化しやすく、
変更時のミス率が上がるため、
アイテム数が多いという事情はありますが、やはりもう少しアイテムで仕分けをした方が今後の管理上良いかと思います。

ユーザー kyouji-east の写真

kaeru様

 ご返答ありがとうございます。
#イベントID4405ではなく、リアファンも含まないため障害となっています。
つまりeventid(4357)とフロントファンが引っかかっているんですね。
ご指摘の通りトリガーの式が複雑になり判読が面倒になりそうです。
(あと、フロントファン1などもあるため)
一応アイテムで絞り込んで一部トリガーを作りましたが、判読が楽でした。
アイテムの件は、logeventidが、同じで、監視対象が違ったり、同じ監視対象で複数のアラームグレードがあったりと
アイテムの絞り込みも悩んでしまって、今回、トリガーにてどうにかならないかと・・・
もし、何か良い策があれば、ご教授願えれば幸いです。

ユーザー heya の写真

何か見当違いのことを書いていたようなので削除します。すみません・・・。

ユーザー kaeru の写真

ファン停止が警告、ファン復旧が情報で出力されているように見受けられるため、
TNK様の式に深刻度"情報"であることを追加し、他のファン停止でトリガーが反応をしないようにしました。

(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4357)}=1) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=1))
or
(({TRIGGER.VALUE}=1) and
(({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=1) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0))
or
((Templates_FC_win_log:eventlog[Application,,,,,,skip].logseverity()}=1) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].logeventid(4405)}=0) and
({Templates_FC_win_log:eventlog[Application,,,,,,skip].regexp(@r-fan)}=0))
)

現状では実際どの程度の規模と条件なのかわからないため、当方の知識ではこれだという回答が困難です。
見た感想ではリアファン、フロントファンをアイテムで絞れば良いように見えますが、
極端な話、リアファン1000等まであるのであれば確かに個別作成は避けたい気がします。
Templateによる監視の一括配布、ユーザマクロ使用、場合によってはシェルを挟むなど
各条件や手間と照らし合わせる必要が有るかと思います。

ユーザー kyouji-east の写真

kaeru様

 お忙しい中、早々のご返答ありがとうございます。
ご提案のトリガーを設定してみました。
今度は、フロントファン障害時、リアファンが障害になるとフロントファンが復旧になってしまいました。
トリガーのみで振り分けるのは、むずかしいですね。
ご提案のトリガーを参考にもう少し考えてみます。logseverityが1で情報以外では、復旧しないと思うのですが・・・
あとユーザーマクロ使用などで、簡略化できればと思いつつ・・・。

お忙しい中、ご丁寧な対応ありがとうございました。