Zabbixの予兆監視を使えるようになろう
こんにちは。プラットフォーム技術部の渋谷です。
先日引っ越しをしまして、新居からこの記事を書いています。家の探し方についてはこちらの記事をご覧ください。
引っ越しにあたり、各種解約/契約手続き、エアコンなどの家電の購入、荷作り/荷解きなどやることが多く、二度と引っ越しをしたくないですが、先のことはわからないですよね。
私の未来を予測することは難しいですが、Zabbix3.0以降のバージョンには予測機能があります(雑な前振り)。
Zabbixでは予測機能を使用して予兆を発見することで問題を防げます。
Zabbix標準テンプレート(Windows by Zabbix agent)でも予測機能が使われるようになっていますが、まだ予測機能を利用したことがない人も多いのではないでしょうか。
誰でも予兆監視を始められるようにZabbixの機能を紹介します。
Zabbixの予測機能
例えばディスク監視する場合を考えてみましょう。
Cドライブにディスク使用率が80%を超えたタイミングでアラートが発生するトリガーが設定しているとします。
ディスク使用量が急増し、80%を超えたタイミングでアラートを発生しても対応するための時間が取れないことが考えられます。
より早くディスク使用量の増加に気づくためには、Zabbix3.0以降で追加されているforecast関数、timeleft関数を利用し、未来の数値を監視する必要があります。
forecast関数とtimeleft関数は両関数とも基礎となる統計分析は同じですので、どちらでも好きな方を利用できます。
具体例
具体例を見てみましょう。
例えば過去4週間のデータを元に1週間後の値を予測し検知する場合に、トリガー条件式を以下のように書けます。
※Zabbix6.4環境でトリガー条件式を作成しているため、5.3以前の環境を利用している場合は式を読み替えてください。
- 1週間後のディスク使用率が80%を超えている
forecast(/ホスト名/vfs.fs.size[C:,pused],4w,1w,"linear","max")>=80
- 1週間以内にディスク使用率が80%となる
timeleft(/ホスト名/vfs.fs.size[C:,pused],4w,80,"linear")<=1w
近似関数(fit関数)
過去データから未来の値を予測するにあたりどのような関数を利用するかを指定する必要があり、その関数を近似関数と呼んでいます。
Zabbixで利用できる近似関数は以下のものがあります。
- linear:x = a + bt
線形関数(1次関数)※デフォルト - polynomialN:x = a0 + a1t + a2t^2 + … + ant^n
N次関数 ※N=1~6 - exponential:x = aexp(bt)
指数関数 - logarithmic:x = a + blog(t)
対数関数 - power:x = at^b
べき関数(累乗関数)
先ほど紹介した例では近似関数に線形関数である"linear"を入力しています。
線形関数とは、いわゆる1次関数と呼ばれるもので中学数学の範囲ですね。
数学を毛嫌いしている人でもグラフを見てもらえればそんなのあったなと理解しやすいかもしれません。
“polynomialN“の場合N=2であればこれも中学数学範囲の2次関数です。
指数関数や対数関数、べき乗関数については頭が痛くなる人が多くなりそうなため紹介は避けておきます。
近似関数の具体的にコードを見たい方はソースコードを読んでみてください。
結局どれを使えば良いの?
システム監視において、基本的には線形関数"linear"を使うと良いです。
ディスク容量監視は時間経過に伴い線形で変化します。
CPU使用率やメモリ使用率についてもグラフをぱっと見で3次関数や指数関数と近似しているように見えることがあるかもしれませんが、その関数を利用することは不適切です。
線形関数"linear" を使うようにしましょう。
単純にグラフを見て近似しているからと近似関数を選ぶのではなく、監視項目の特性を理解した上で選ぶようにしましょう。
IoTでの利用や機械学習で株価を予測したいといった際には"linear"以外の関数も有用になるかもしれません。
モード
モードとはforecast関数でのみ使用できる、予測の出力形式のことです。
- value:f(now + time)
予測値を示す※デフォルト - max:maxnow <= t <= now
現在からtimeで指定された時刻までの最大予測値を示す - min:minnow <= t <= now + time f(t)
現在からtimeで指定された時刻までの最小予測値を示す - delta:max – min
maxとminの差を示す - avg:average of f(t) (now <= t <= now + time) according to definition
現在からtimeで指定された時刻までの平均値を示す
実際に予兆監視してみた
簡易的に予兆監視を実験してみました。
Linuxサーバー上でログ監視をおこない、そのログに毎秒1,2,3…と数値を出力し整数値として取得します。
アイテム
- 名前:forecastログ
- タイプ:Zabbixエージェント(アクティブ)
- キー:log[/var/log/prediction_log,,,,skip]
保存前処理
- 名前:正規表現
- パラメータパターン:([0-9]+)
- パラメータ出力:\1
- データ型:整数
トリガー
- 名前:100秒後に値が200を超える
- 条件式:forecast(/ホスト名/log[/var/log/prediction_log,,,,skip],#100,100s)>=200
毎秒出力するスクリプト
#!/bin/bash
for ((i = 0; i <= 1000; i++))
do
echo $i >> /var/log/prediction_log;
sleep 1
done
実行結果
ログはまだ200に達していませんが障害検知できました。
最も大切なのは予測の元となるデータ
Zabbixの予測機能についていくつか説明してきましたが、最も大切となるのは予測するためのデータです。
グラフの傾きが一定であれば特に注意する必要はないかもしれませんが、実際には利用ユーザー数の増減やアプリケーションの増減によってグラフの傾きが変化していくことが多いでしょう。
その場合は評価期間を短くし、傾きの変化を細かく計算することが有効です。
下記グラフの場合では評価期間を100や50にすることにより傾きを再計算させ、予測を修正することが可能です。
また評価期間を長くすることで、より正確に長期的な予測が可能になることもあります。
最後に
実際に予兆関数を使う際は「どの期間のデータを利用しどれだけ先を予測するか」を設計する必要があります。
システムごとに特徴がことなるため、単純にこうすればいいといったお勧めを提案できません。
参照する期間が長すぎるとDB負荷があがってしまうことにも留意する必要があります(trigger の予兆関数は評価されるたびに、指定された history 期間からデータを取得するため)。
監視しているシステムに合った設計を試行錯誤しながら予兆監視ライフを満喫していきましょう。
Zabbixに関するお問い合わせはこちらからお願いいたします。