Sidebar

Become a monitoring expert!
Sign up for Zabbix training

7 予兆 trigger 関数

概要

時には、問題が発生する予兆があることがあります。これらの兆候を発見することで、事前に対策を講じ、問題の影響を防ぐ、
または少なくとも最小限に抑えることができます。

Zabbix は history データに基づいて監視システムの将来の挙動を予測するツールを備えています。
これらのツールは予兆トリガー機能で実現されます。

関数

問題状態を定義する方法と、対策を講じるのに必要な時間の2つを知る必要があります。それから、潜在的な望ましくない状況について
信号を送る trigger をセットアップする方法が2つあります。
1番目に、trigger は、"time to act" の後にシステムが問題状態になると予想されるときに発火しなければなりません。
2番目は、システムが "time to act" よりも短い時間で問題状態に到達しそうなときに、trigger が発火することです。
対応する trigger 関数は、forecasttimeleft です。基本的な統計解析は両関数とも基本的に同じであることに注意してください。
お好きな方法で trigger をセットアップして、同様の結果を得ることができます。

1 パラメータ

両関数とも、ほぼ同じパラメータを使用します。supported functionsを参考にしてください。

時間間隔

まず最初に、Zabbix が予測値を算出するために分析する期間を指定する必要があります。
これは、avgcountdeltamaxminsum関数と同様に、time periodパラメータとオプションの
タイムシフトによって行うことが可能です。

予測の水平線

(forecast のみ) パラメータ time は、Zabbix が history データから発見した依存関係を、どの程度未来に推定するかを指定します。
time_shift を使用するかどうかに関係なく、time は常に現在の瞬間からカウントされます。

1.1 到達する閾値

(timeleft のみ)パラメータ threshold は、分析対象が到達すべき値を指定します。上からでも下からでも違いはありません。
f(t) が決まったら(後述)、方程式 f(t) = threshold を解いて、今より右側にあるルート、またはそのようなルートがない場合は
9999999999.9999 を返さなければなりません。

item の値がしきい値に近づき、それを超えた場合、 timeleft はその交点がすでに過去のものであると仮定し、
もしあれば threshold レベルで次の交点に切り替わります。ベストプラクティスは、予測を通常の問題診断の補完として
使うことであり、代替としては使わないことです1

1.2 fit 関数

デフォルトの fitlinear 関数です。しかし、監視するシステムがより複雑な場合は、より多くのオプションから選択することができます。

fit x = f(t)
linear x = a + b*t
polynomialN2 x = a0 + a1*t + a2*t2 + ... + an*tn
exponential x = a*exp(b*t)
logarithmic x = a + b*log(t)
power x = a*tb
1.3 モード

(forecast のみ) trigger 関数は評価されるたびに、指定された history 期間からデータを取得し、そのデータに指定された
関数を当てはめるものです。そのため、データが少し違えば、フィットする関数も少し違ってきます。単純に、もし、将来の
指定された時間にフィットした関数の値を計算するだけなら、分析された item が現在から将来のその時点までの間に
どのように動作すると予想されるかについて何も知らないことになります。
いくつかの fit オプション (polynomial など) では、未来からの単純な値は誤解を招くかもしれません。

モード forecast 結果
value f(now + time)
max maxnow <= t <= now + time f(t)
min minnow <= t <= now + time f(t)
delta max - min
avg average of f(t) (now <= t <= now + time) according to definition

詳細

膨大な数の計算を避けるために、指定された周期の最初の値のタイムスタンプに 1 ns を加えたものを新しいゼロ時刻と見なします。
(現在のエポックタイムは 109 のオーダー、エポック2乗は 1018、倍精度は約 10-16)
1 nsは、log(t)の計算を含む logarithmic および power fit のためのすべての正の時間値を提供するために追加されます。
タイムシフトは、linear , polynomial , exponential* には影響しませんが、logarithmicpower 関数の形状を変更します。
(計算がより簡単で正確になることは別として)

潜在的なエラー

このような場合、関数は -1 を返します。

  • 指定された評価期間内にデータがない。
  • 算術演算の結果が定義されていない3
  • 数値の複雑さ(残念ながら、入力データによっては倍精度浮動小数点フォーマットの範囲と精度が不十分となる)4があります。

選択された fit が提供されたデータをうまく説明できない場合や、正確な予測のためにデータが少なすぎる場合、
警告やエラーは表示されません。

例とエラーの処理

ホストの空きディスク容量がなくなりそうなときに警告を表示させるには、次のような trigger 式を使用することができます:

timeleft(/host/vfs.fs.size[/,free],1h,0)}<1h

しかし、エラーコード-1 が出て、trigger が問題状態になることがあります。一般的には、予測が正しく動作しておらず、
その原因を見つけるためにもっと徹底的に調べるべきだという警告を得ることができるので、これは良いことです。
しかし、時には、-1が単に過去1時間に取得されたホストの空きディスク容量に関するデータがなかったことを意味することもあり、
悪いこともあります。もし、あまりにも多くの偽陽性(false positive)アラートが出るようであれば、より複雑なトリガー式を
使用することを検討してください。 5:

timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1

この状況は、forecast では少し難しくなります。まず第一に、-1は、forecast(/host/item,(...))<... のような式か
forecast(/host/item,(...))>... のようにするかによって trigger を問題状態に置くか置かないか決まります。

さらに、item の値が負であることが普通であれば、-1 は有効な予測であるかもしれません。しかし、現実の状況でこのような状況に
なる確率はごくわずかです(how the operator = worksを参照してください)
そこで、-1を問題として扱いたい、あるいは扱いたくない場合は、それぞれ ...or forecast(/host/item,(...))=-1 または
...and forecast(/host/item,(...))<>-1 を追加してください。


  1. 例えば、timeleft(/host/item,1h,X) < 1h のような単純な trigger は、item の値がXに近づくと問題状態になり、 値Xに達すると突然回復することがあります。もし、item の値がXを下回っていることが問題なのであれば last(/host/item) < X or timeleft(/host/item,1h,X) < 1h もし、item の値がXより大きいのが問題なら、次のようにします。 last(/host/item) > X or timeleft(/host/item,1h,X) < 1h↩︎

  2. 多項式の次数は 1 から 6 まであり、polynomial1linear と等価です。 ただし、高次の多項式は注意してwith caution使用してください。 評価期間が多項式係数の決定に必要な点数より少ない場合、多項式次数は低くなります。 (例:polynomial5を要求されたが、4点しかないのでpolynomial3が適用されます)↩︎

  3. 例えば、指数 関数や 冪乗 関数のフィッティングでは、項目値のlog()を計算します。 log()は正の値に対してのみ定義されているので、データにゼロや負の数が含まれているとエラーになります。↩︎

  4. 線形フィット、指数フィット、対数フィット、パワーフィットの場合、必要な計算をすべて明示的に記述することができます。 多項式フィットでは、追加のステップなしに value だけが計算できます。avg の計算には、多項式の反次導関数を (解析的に)計算する必要があります。max , min , deltaの計算には、多項式微分の計算(解析的)とその根の探索(数値的)が含まれます。 f(t) = 0を解くには、多項式の根を(数値的に)求めます。↩︎

  5. しかし、この場合、-1 はトリガーが問題状態から回復する原因となることがあります。完全に保護するために使用します。 timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and ({TRIGGER.VALUE}=0 and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1 or {TRIGGER.VALUE}=1)↩︎