Zabbixで値が変わったことを検知するとき、一定時間検知を続けるため、difflast(0)#prev()を使うのではなく、deltaを使ってみる。

以前、MongoDBのReplica SetのfailoverなどをZabbixで監視するで「単にlast(0)prev()を比べて異なる場合に検知するだけだと、アイテムの更新間隔が短い場合にすぐにZabbixが復旧と判断してしまう」ため、countを使って直近 n 分間のスパンで条件式を書くようにし、n 分間は検知を続けてくれるようにした。

今回はdeltaを使って n 分間は検知を続けてくれるようにする。

お題は再起動した事実をZabbixで検知することにする。

boot timeを監視するスクリプトを作成し、snmpdで値を取得できるように設定する。

who -b | awk '{print $3$4}' | sed -r 's/-|://g'

以下のようなトリガーだと、boot timeが変わったことを検知しても、次の監視タイミングで復旧と判断してしまう。

{mongo-replicaset:boot[time].last(0)}#{mongo-replicaset:boot[time].prev()}

ドキュメントによると、deltaを使えば、指定秒間の最大値と最小値の差分が取れる。

期間内の最大値と最小値の差分を返します( 「max」-「min」)。最初のパラメータで期間を秒単位で設定するか、収集した値の数(ハッシュマーク#を先頭に付けます)で設定します。

差分が0以上かどうかを判定することで、指定秒間ずっと検知し続けることができる。

{mongo-replicaset:boot[time].delta(900)}>0

これで直近900秒間ずっと同じ値が続くまで、復旧と判断することはない。
しかし、監視間隔の問題か、30秒間隔の監視で実際に実行すると14分で、また300秒間隔の監視で実際に実行すると10分で、復旧と判断されてしまったので、15分間ずっと検知し続けたければ900ジャストではなく、+αの秒数を指定するといい。
300秒間隔の監視で1200秒をdeltaに設定すると、ちょうど900秒間検知し続けた。おそらく+αの部分は最低でも監視間隔自体の秒数を設定したほうがいい。