You are viewing documentation for the development version, it may be incomplete.
Join our translation project and help translate Zabbix documentation into your native language.

7 予測トリガー関数

概要

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

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

関数

トリガーを設定する前に、問題状態が何であるか、そしてアクションを実行するまでにどれだけの時間が必要かを定義する必要があります。その後、潜在的な望ましくない状況を通知するトリガーを設定する方法は2つあります。1つ目は、「アクションまでの時間」後にシステムが問題状態になると予想される場合にトリガーを発火させる方法です。2つ目は、システムが「アクションまでの時間」未満で問題状態に到達しそうな場合にトリガーを発火させる方法です。対応するトリガー関数は forecasttimeleft です。両関数の基礎となる統計解析は基本的に同一であることに注意してください。どちらの方法でも、同様の結果でトリガーを設定できます。

パラメータ

両方の関数はほぼ同じパラメータセットを使用します。参照用にサポートされている関数のリストを使用してください。

時間間隔

まず、Zabbixが予測を行うために分析すべき履歴期間を指定する必要があります。これは、avgcountdeltamaxminsum関数と同様に、time periodパラメータとオプションのタイムシフトを使用して指定します。

予測の範囲

(forecast のみ)
パラメータ time は、Zabbix が過去のデータから見つけた依存関係を将来どこまで外挿するかを指定します。time_shift を使用するかどうかに関係なく、time は常に現在の時点からカウントされます。

到達するしきい値

timeleft のみ)
パラメータ threshold は、分析対象のアイテムが到達しなければならない値を指定します。上からでも下からでも違いはありません。f(t)(下記参照)が決定したら、方程式 f(t) = threshold を解き、現在に最も近く、かつ現在より右側にある根を返します。該当する根がない場合は 1.7976931348623158E+308 を返します。

アイテムの値がしきい値に近づき、それを超えた場合、timeleft は交点がすでに過去にあるとみなし、threshold レベルとの次の交点に切り替えます(存在する場合)。ベストプラクティスとしては、予測は通常の問題診断の補完として使用し、代替として使用しないことが推奨されます。1

フィット関数

デフォルトの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
モード

forecast のみ)
トリガー関数が評価されるたびに、指定された履歴期間からデータを取得し、指定された関数をデータにフィットさせます。したがって、データがわずかに異なれば、フィットした関数もわずかに異なります。将来の指定した時点でフィットした関数の値を単純に計算しても、今から将来のその時点までに分析対象のアイテムがどのように振る舞うかはわかりません。いくつかの fit オプション(polynomial など)では、将来の単純な値は誤解を招く可能性があります。

mode forecast の結果
value f(now + time)
max maxnow <= t <= now + time f(t)
min minnow <= t <= now + time f(t)
delta max - min
avg 定義に従った f(t)(now <= t <= now + time)の平均値

詳細

巨大な数値での計算を避けるために、指定された期間の最初の値のタイムスタンプに1nsを加えたものを新しいゼロ時刻とみなします(現在のエポック時刻は109のオーダー、エポックの2乗は1018、倍精度は約10-16)。logarithmicおよびpowerフィットではlog(t)の計算が含まれるため、すべての時刻値を正にするために1nsが加えられます。時刻のシフトはlinearpolynomialexponentialには(計算が容易かつより正確になることを除き)影響しませんが、logarithmicおよびpower関数の形状は変化します。

起こりうるエラー

関数は、次のような状況で-1を返します。

  • 指定された評価期間にデータが存在しない場合
  • 数学的演算の結果が定義されていない場合3
  • 数値的な問題(残念ながら、入力データの組み合わせによっては、倍精度浮動小数点形式の範囲や精度が不十分になることがあります)4

選択した近似が提供されたデータをうまく表現できていない場合や、正確な予測を行うにはデータが少なすぎる場合でも、警告やエラーは表示されません。

例とエラーへの対処

ホストの空きディスク容量がなくなりそうなときに警告を受け取るには、次のようなトリガー式を使用できます。

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

ただし、エラーコード-1が発生し、トリガーが障害状態になる場合があります。一般的には、予測が正しく機能していないことを警告してくれるので良いことですが、なぜそうなったのかを詳しく調べる必要があります。しかし、-1は単に過去1時間以内にホストの空きディスク容量のデータが取得できなかったことを意味する場合もあります。誤検知のアラートが多すぎる場合は、より複雑なトリガー式の使用を検討してください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,(...))>...のような式かによって異なります。

さらに、アイテム値が負になるのが通常の場合、-1は有効な予測値となる場合があります。しかし、実際の運用でこのような状況になる可能性はほとんどありません(演算子=の動作についてはこちらを参照)。したがって、-1を障害とみなしたい場合は... or forecast(/host/item,(...))=-1、みなしたくない場合は... and forecast(/host/item,(...))<>-1を追加してください。

脚注

1 例えば、timeleft(/host/item,1h,X) < 1hのような単純なトリガーは、アイテム値がXに近づくと障害状態になり、値がXに達すると突然復旧する場合があります。問題がアイテム値がX未満である場合は、last(/host/item) < X or timeleft(/host/item,1h,X) < 1hを、アイテム値がXより大きい場合はlast(/host/item) > X or timeleft(/host/item,1h,X) < 1hを使用してください。

2 多項式の次数は1から6まで指定でき、polynomial1linearと同等です。ただし、高次の多項式は注意して使用してください。評価期間内のデータポイント数が多項式係数の決定に必要な数より少ない場合、多項式の次数は自動的に下げられます(例:polynomial5が指定されているが、ポイントが4つしかない場合はpolynomial3が適用されます)。

3 例えば、exponentialpower関数のフィッティングでは、アイテム値のlog()計算が必要です。データにゼロや負の値が含まれている場合、log()は正の値にしか定義されていないためエラーになります。

4 linearexponentiallogarithmicpowerフィットでは、必要な計算はすべて明示的に記述できます。polynomialではvalueのみ追加計算なしで算出できます。avgの計算には多項式の不定積分(解析的)が必要です。maxmindeltaの計算には多項式の導関数(解析的)とその根の数値的な探索が必要です。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)を使用してください。