トリガーの条件式における記述方法について

シンプルチェックのアイテムに対するトリガーの設定方法について、
以下のような動作をさせたい場合の条件式の書き方が分かりません。
お知恵をお貸しください。

トリガーの条件式で、「最新(T秒前/T個前)の値=N」の関数を用いて、
T=2、N=0とした場合に、以下の動きになることを確認しています。

【監視結果】 【ステータス】
  OK(1)→→→→→正常
  OK(1)→→→→→正常
  NG(0)→→→→→正常
  NG(0)→→→→→障害 ※2回目のNG(0)で障害検知
  NG(0)→→→→→障害
  OK(1)→→→→→障害
  OK(1)→→→→→正常 ※2回目のOK(0)で復旧

以下のようにトリガーを動作させたい場合、どのように条件式を
記述すればよろしいでしょうか?

【監視結果】 【ステータス】
  OK(1)→→→→→正常
  OK(1)→→→→→正常
  NG(0)→→→→→正常
  NG(0)→→→→→障害 ※2回目のNG(0)で障害検知
  NG(0)→→→→→障害
  OK(1)→→→→→正常 ※1回目のOK(1)で復旧
  OK(1)→→→→→正常

・最新の監視結果が2回連続NG(0)であったらステータスを障害にする。
・障害である場合、最新の監視結果がOK(1)となればステータスを正常にする。

よろしくお願いいたします。

コメント表示オプション

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

実際に設定されているトリガー式の記載をご確認ください

{host:item.key.last(#2)}=0
となっている場合だと、
「現在受信済のアイテム値のうち、最新の値から2個め(1回手前)に取得した値のみと比較して、0のとき障害、0以外なら正常」
という意味合いになります

この設定となっていた場合、仰っているパターン1では、以下のような判定理由・基準で「正常・障害」が判定されています
  OK(1)→→→→→N/A
  OK(1)→→→→→正常※最新の値から2個め(1回手前)の値は「正常」だから
  NG(0)→→→→→正常※最新の値から2個め(1回手前)の値は「正常」だから
  NG(0)→→→→→障害※最新の値から2個め(1回手前)の値は「障害」だから
  NG(0)→→→→→障害※最新の値から2個め(1回手前)の値は「障害」だから
  OK(1)→→→→→障害※最新の値から2個め(1回手前)の値は「障害」だから
  OK(1)→→→→→正常※最新の値から2個め(1回手前)の値は「正常」だから
ですので、
  OK(1)→→→→→N/A
  OK(1)→→→→→正常※最新の値から2個め(1回手前)の値は「正常」だから
  NG(0)→→→→→正常※最新の値から2個め(1回手前)の値は「正常」だから
  OK(1)→→→→→障害※最新の値から2個め(1回手前)の値は「障害」だから
  NG(0)→→→→→正常※最新の値から2個め(1回手前)の値は「正常」だから
  OK(1)→→→→→障害※最新の値から2個め(1回手前)の値は「障害」だから
  NG(0)→→→→→正常※最新の値から2個め(1回手前)の値は「正常」だから
  NG(0)→→→→→障害※最新の値から2個め(1回手前)の値は「障害」だから
  OK(1)→→→→→障害※最新の値から2個め(1回手前)の値は「障害」だから
  OK(1)→→→→→正常※最新の値から2個め(1回手前)の値は「正常」だから
このような動きになってしまいます。
おそらくこれは意図されているものと異なるかと思います

(長くなるので2回に分けて投稿します)

ユーザー fripper の写真

仰っている判定条件は、おそらく以下のような条件ではないかと思います
読み間違えていたらご指摘ください

・ここ最近2回分のデータ取得結果を総合的に判定して、2回ともNGだったら、障害として検知
・検知後、1度でも「正常」を示すデータを受信した時点で「復旧」とみなす

これを実現する判定式は、以下のように記述できるかと思います

({TRIGGER.VALUE}=0&{host:item.key.max(#2)}=0)|({TRIGGER.VALUE}=1&{host:item.key.last(0)}#0)

※){TRIGGER.VALUE} は、トリガーが判定される瞬間に、現時点で「正常」を示していた場合には 0 / 「異常」を示していた場合には 1 となります

この条件ですと、以下のようになります
  OK(1)→→→N/A
  OK(1)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定
  NG(0)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定
  NG(0)→→→障害※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値が 0 なので、「障害」と判定
  NG(0)→→→障害※判定開始時点トリガー値は「障害」、最新のアイテム値を判定、最新値が 0 なので、「障害」と判定
  OK(1)→→→正常※判定開始時点トリガー値は「障害」、最新のアイテム値を判定、最新値が 1 なので、「正常」と判定
  OK(1)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定
同じく、以下のようになります
  OK(1)→→→N/A
  OK(1)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定
  NG(0)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定
  OK(1)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定
  NG(0)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定
  OK(1)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定
  NG(0)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定
  NG(0)→→→障害※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値が 0 なので、「障害」と判定
  OK(1)→→→正常※判定開始時点トリガー値は「障害」、最新のアイテム値を判定、最新値が 1 なので、「正常」と判定
  OK(1)→→→正常※判定開始時点トリガー値は「正常」、2回分のアイテム値を総合判定、最大値は 1 なので、「正常」と判定

若干の発想の転換が必要となりますが、min / max の関数と、トリガーの「現時点での判定値」を示す{TRIGGER.VALUE}とを
併用することで、実現できるかと思います

fripper様

お世話になります。

分かりやすい回答ありがとうございます。
トリガーの条件式の記述方法が理解できておらず、すみません。

参考に記述していただいた条件式ですが少し意図した動作ではなかったため、
2つ目の条件式の "#" を "=" に修正し意図したとおりに動作することを確認しました。

大変勉強になりました。ありがとうございました。

たびたびすみません。

以前、お教えいただいたトリガーの条件式の記述方法ですが、ウェブ監視でも
同様の動作をさせたいと思っていますが、トリガーを作成すれば可能でしょうか。

またウェブ監視の場合で、1ステップに対して要求ステータスコードを複数指定
する場合、「200,201,202・・・」のように記載すればよいのでしょうか?

よろしくお願いいたします。

ユーザー kng の写真

マニュアルに以下の記載がありますので、カンマ区切りもしくは範囲での指定が可能と思います。

https://www.zabbix.com/documentation/2.2/manual/web_monitoring
https://www.zabbix.com/documentation/2.0/manual/web_monitoring

For example: 200,201,210-299

kng様

ご回答ありがとうございます。

マニュアルに記載がありましたね、大変失礼いたしました。
ありがとうございました。

すみません、再び質問させてください。

今、Zabbix-2.2.1を用いたウェブ監視のテンプレートを作成して、
トリガーの記述方法について悩んでおります。

以前ご質問させていただいたのと同様に、ウェブ監視でも以下のように
異常および復旧を検知するトリガーを設定したいと思っております。

>・ここ最近2回分のデータ取得結果を総合的に判定して、2回ともNGだったら、障害として検知
>・検知後、1度でも「正常」を示すデータを受信した時点で「復旧」とみなす

その際に回答いただいたいトリガーの条件式を参考に以下のようにトリガーを設定しました。

({TRIGGER.VALUE}=0&{Url:web.test.fail[Url_01].max(#2)}#0)|({TRIGGER.VALUE}=1&{Url:web.test.fail[Url_01].last()}#0)

「Url:web.test.fail[Url_01]」 は、ウェブ監視に設定したステップでエラーが発生している
数が返ってくると思っています。なので、0以外となれば異常検知する条件式にしたいと思っています。

しかし、上記の条件式では、
・トリガーが正常の状態で、「Url:web.test.fail[Url_01]」の数が0以外となる1回目で異常検知
・トリガーが異常の状態で、「Url:web.test.fail[Url_01]」の数が0となる1回目で復旧検知
となってしまいます。

条件式の記述について、知見をいただけると幸いです。
よろしくお願いいたします。

ユーザー fripper の写真

先日のトリガーでは、判定元のアイテム値が「OK(1)」「NG(0)」でしたが、
今回の test.fail 項目は、「OK(0)」「NG(非0)」が戻る‥と考えれば良いでしょうか?
# Web 監視機能はほとんど利用していないため、自信ないです

( max(#2) # 0 ) | ( last() # 0 )

として判定されていますが、

( min(#2) > 0 ) | ( last() # 0 )

とすると良いかと思います。
正常時 → 直近2回で、「2回とも異常を示す値なら」 →トリガー発動
異常時 → 最新1回が、「異常を示す値なら」→トリガー継続  それ以外ならトリガー復旧
という意味になるかと思います

fripper様

お世話になっております。
早々に回答いただき、ありがとうございます。

ご指摘いただいた通りにトリガー条件式を変更したところ、
意図したとおりに動作することを確認できました。

条件式の考え方をもう少し勉強します。
本当にありがとうございました。