Zabbixで値が変わったことを検知するとき、一定時間検知を続けるため、diff
やlast(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秒間検知し続けた。おそらく+αの部分は最低でも監視間隔自体の秒数を設定したほうがいい。