予測トリガー関数
概要
時には、問題が発生する前兆が現れることがあります。これらの兆候を見つけることで、問題の影響を防ぐ、あるいは少なくとも最小限に抑えるための対策を事前に講じることができます。
Zabbixには、過去のデータに基づいて監視対象システムの将来の動作を予測するためのツールがあります。これらのツールは、予測トリガー関数として実現されています。
関数
トリガーを設定する前に、問題状態が何であるか、そしてアクションを実行するのにどれだけの時間が必要かを定義する必要があります。その後、潜在的な望ましくない状況を通知するトリガーを設定する方法は2つあります。1つ目は、「アクションを実行するまでの時間」後にシステムが問題状態になると予想される場合にトリガーを発火させる方法です。2つ目は、システムが「アクションを実行するまでの時間」未満で問題状態に到達しそうな場合にトリガーを発火させる方法です。対応するトリガー関数はforecastとtimeleftです。両関数で使用される統計分析は基本的に同じであることに注意してください。どちらの方法でも、ほぼ同じ結果でトリガーを設定できます。
パラメータ
両方の関数はほぼ同じパラメータセットを使用します。参照用にサポートされている関数のリストを使用してください。
時間間隔
まず、Zabbixが予測を行うために分析する履歴期間を指定する必要があります。これは、avg、count、delta、max、min、sum関数と同様に、時間間隔パラメータとオプションの時間シフトを使用して指定します。
予測の範囲
(forecast のみ)
パラメータ time は、Zabbixが過去のデータから見つけた依存関係をどれだけ先の未来まで外挿するかを指定します。time_shift を使用するかどうかに関係なく、time は常に現在の時点からカウントされます。
到達するしきい値
(timeleft のみ)
パラメータ threshold は、分析対象のアイテムが到達すべき値を指定します。上からでも下からでも違いはありません。f(t)(下記参照)が決定したら、方程式 f(t) = threshold を解き、現在に最も近く、かつ現在より右側にある根を返します。該当する根がない場合は 1.7976931348623158E+308 を返します。
アイテムの値がしきい値に近づき、それを超えた場合、timeleft はその交点がすでに過去にあるとみなし、threshold レベルとの次の交点(存在する場合)に切り替えます。ベストプラクティスとしては、予測は通常の問題診断の代替ではなく、補完として使用するべきです。1
フィット関数
デフォルトのfitはlinear関数です。しかし、監視対象のシステムがより複雑な場合は、他のオプションを選択することもできます。
fit |
x = f(t) |
|---|---|
| linear | x = a + b*t |
| polynomialN2 | x = a~0~ + a~1~*t + a~2~*t2 + ... + a~n~*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 | max~now\ <=\ t\ <=\ now\ +\ time~ f(t) |
| min | min~now\ <=\ t\ <=\ now\ +\ time~ f(t) |
| delta | max - min |
| avg | 定義に従ったf(t)(now <= t <= now + time)の平均 |
詳細
巨大な数値での計算を避けるために、指定された期間の最初の値のタイムスタンプに1nsを加えたものを新しいゼロタイム(現在のエポックタイムは109オーダー、エポックの2乗は1018、倍精度は約10-16)とみなします。対数やべき乗近似ではlog(t)の計算が含まれるため、すべての時間値を正にするために1nsを加えます。時間のシフトは線形、多項式、指数(より簡単で正確な計算を除く)には影響しませんが、対数やべき乗関数の形状を変化させます。
起こりうるエラー
関数は以下のような場合に-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まで指定でき、polynomial1はlinearと同じです。ただし、高次の多項式は注意して使用してください。評価期間内のポイント数が多項式係数の決定に必要な数より少ない場合は、多項式の次数が下げられます(例:polynomial5が指定されているがポイントが4つしかない場合、polynomial3が適用されます)。
3 例えば、exponentialやpower関数のフィッティングでは、アイテム値のlog()計算が必要です。データにゼロや負の値が含まれている場合、log()は正の値にしか定義されていないためエラーになります。
4 linear、exponential、logarithmic、powerの各フィットでは、必要な計算をすべて明示的に記述できます。polynomialでは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)を使用してください。