2022 年 08 月 05 日
Zabbix 6.0 の新機能:ベースライン監視について
Zabbix 6.0.0 からベースライン監視ができるようになりました。この記事ではベースライン監視についてとその具体的な使用方法について解説します。
ベースライン監視とは
「ベースライン監視」は過去の監視データのパターンをもとにシステムの状態が正常か否かを判定するための監視手法です。他の Web ページの説明も参考にしてみましょう。
「ベースライン」とは,システムを運用するのに問題がないと想定されるパフォーマンスデータの値のことです。
JP1/Performance Management - Remote Monitor for Platform (2022 年 5 月 30 日 閲覧)
インバリアント分析技術が登場する以前から、しきい値監視よりも検知精度を向上させた手法としてベースライン監視という手法がありました。この手法は、通常時の性能値の変動パターンを記憶し、その変動パターンから、正常とする範囲の変動幅(ベースライン)を定義します。そして、そのベースラインに沿った挙動かどうかで正常/異常を判定します。
サイレント障害を検知する新分析技術 (2022 年 5 月 30 日 閲覧)
Zabbix LTS 版では 6.0.0 からこの機能が使えるようになりました。
Zabbix のベースライン監視
もともと Zabbix コミュニティでは 2014 年の ZBXNEXT-2579 や 2017 年の ZBXNEXT-3709 といったようなベースライン監視を求める声がありました。 その後 2021 年 12 月の 6.0.0alpha8 にて正式にベースライン監視用の機能がリリースブランチに取り込まれました。
ベースライン監視をおこなうために以下のトリガー関数が追加されています。
関数名 | 説明 |
---|---|
baselinedev() | 直前の期間のデータを標準化した値を返す関数 |
baselinewma() | 設定された期間中の過去のデータの加重移動平均を返す関数 |
直前の期間のデータを標準化した値を返す baselinedev 関数
あるデータ xi からデータ全体の平均値 x̄ を引き、さらにそれをデータ全体の標準偏差 σ で割った値を標準化(Standardization)されたデータ Xi と言います。Zabbix では xi - x̄ の絶対値を使うため、つねに正の数が返ってきます。
baselinedev 関数は設定した期間の中からもっとも新しい期間のデータを標準化した値を返します。baselinedev 関数の戻り値は「直前の期間のデータがデータ全体の平均からどの程度ばらついているか」を表します。
図 1. 平均が 0 で標準偏差がσの正規分布の確率密度関数
Copyright M. W. Toews, Licensed by Creative Commons Attribution 2.5 Generic
図 1 の正規分布の確率密度関数が示すように、データが正規分布にしたがうと仮定すると、baselinedev 関数の戻り値が 1 以下であれば、そのデータ xi は平均から見てデータ全体の 68.2% 以内の割合に収まっています。つまり -1 σから 1 σの間です。また 2 以下であれば 95.4% 以内の割合に収まっています。つまり -2 σから 2 σの間です。
したがって baselinedev 関数を使ってトリガー条件式を作るさいにはどの程度のデータのばらつきを許容するのかポリシーを定めたうえでしきい値を決定するとよいでしょう。たとえば 95.4% に収まらない(2 σ以上の)データを検知したいときは baselinedev 関数が 2 以上を返したときに障害となるようにします。また 99.7% の範囲から外れたデータを検知するには、baselinedev 関数が 3 以上を返したときに障害となるようにします。
baselinedev 関数の具体的な設定例
ホスト「agent01」のキー system.cpu.util に対して、過去 4 週間の範囲で、1 時間前のデータの平均を標準化するには次のように書きます。
baselinedev(/agent01/system.cpu.util,1h:now/h,"w",4)
この関数の引数は図 2 を参考に解釈してください。より詳細な説明は付録 1 を参照してください。
図 2. baselinedev の引数の説明
どこの期間のデータを集めて、どこの期間の平均が標準化されて返るのかは図 3 を参考にしてください。
現在が 2022 年 7 月 24 日(日)の午前 1 時とすると、2022 年 7 月 24 日 0 時 0 分~0 時 59 分まで(図の赤色で示した期間)の CPU 利用率の平均が標準化されて返ってきます。標準偏差は 2022 年 6 月 20 日~2022 年 7 月 17 日の 4 週間のあいだの日曜日 0 時 0 分 ~0 時 59 分(図の緑色で示した期間)の CPU 利用率の平均と、2022 年 7 月 24 日 0 時 0 分~0 時 59 分(図の赤色で示した期間)の CPU 利用率の平均計 5 つの期間のデータから計算されます。
図 3. 標準化した値を求めるためのデータ収集のイメージ
baselinedev 関数を使いトリガー条件式を作ってみましょう。ここでは収集されたデータが 2 σを超えるような値だった場合に障害とみなすとします。するとトリガー条件式は次のように書くことができます。
baselinedev(/agent01/system.cpu.util,1h:now/h,"w",4) > 2
このとき、最新の期間のデータが図 1 で言うところのプラスの方向に位置するのかマイナスの方向に位置するのかは判別できません。前述のとおり Zabbix では最新のデータの平均から収集したデータ全体の平均を引いたあとその値を絶対値にしているからです。
加重移動平均を求める baselinewma 関数
平均は各データの合計をデータの個数で割った値です。一方、加重平均(Weighted Average)は平均値の中でそれぞれのデータの寄与具合を重みとして表現し平均を算出します。データ A、B、C の加重平均 WA を求めるとき、データ A から順に重みをつけるとすると次のように計算できます。
加重移動平均(Weighted Moving Average)は現在時刻から見て新しいデータほど大きな重みを付ける平均のことです。つまり新しいデータほど重く、古いデータほど軽く重みづけされます。
baselinewma 関数の具体的な設定例
ホスト「agent02」のキー vm.memory.utilization に対して、過去 5 週間の範囲で、昨日の期間がもっとも重みづけされた加重移動平均を求める場合は次のように書きます。
baselinewma(/agent02/vm.memory.utilization,1d:now/d,"w",5)
この関数の引数は図 4 を参考に解釈してください。より詳細な説明は付録 1 を参照してください。
図 4. baselinewma の引数の説明
どこの期間のデータを集めて、どこの期間の平均が標準化されて返るのかは図 5 を参考にしてください。
現在日時から見てグラフ点線の 07 月 24 日(日)が 1 日前(昨日)だとすると、2022 年 6 月 13 日~2022 年 7 月 17 日までの日曜日のデータの平均が加重移動平均の計算に使用されます。
図 5. 加重移動平均を求めるためのデータ収集のイメージ
ここでは 7 月 17 日のデータの平均がもっとも重く見られるように加重移動平均が計算されます。なお baselinedev 関数では点線で示す期間のデータも計算に含まれていましたが、baselinewma 関数ではその期間のデータは計算に含まれません。
baselinewma 関数を使ってトリガー条件式を作ってみましょう。ここでは「agent02」ホストの vm.memory.utilization が平均して 60% ほどで推移しているとし、加重移動平均で 65% 以上になったときに障害とすることでシステム管理者にシステムの状態を確認させたいとします。このような場合トリガー条件式は次のように書きます。
baselinewma(/agent02/vm.memory.utilization,1d:now/d,"w",5) >= 65
時間で重みづけしているとはいえ、データを収集するシーズンが長いほど、あるひとつの期間で平均から外れるような値が出たとしても最終的に求められる平均値にはあまり影響がないことに注意しましょう。過去 5 週間のうち 4 つの期間の平均が 60% で、最新の期間だけ平均が 80% だったとしてもその加重移動平均は 66.6% です。
したがって baselinewma 関数が返す値をもとに障害のしきい値を設定しても、シーズンの長さとしきい値によってはある期間の突出した値が検知できないパターンも十分考えられます。トリガー条件式を作るさいには注意が必要です。
まとめ
本記事では Zabbix6.0 から追加されたベースライン監視機能について紹介しました。あらたに標準化されたデータを計算する baselinedev 関数と、加重移動平均を計算する baselinewma 関数が利用できるようになりました。
これにより、過去のデータに対して統計的な処理をしたうえで、トリガー条件式に障害のしきい値の設定ができるようになりました。これらの関数を活用することで、より柔軟なシステム監視の構築につなげられるでしょう。
付録 1. baselinedev と baselinewma の引数について
いずれの関数も渡される引数は同じです。
第 1 引数 | 第 2 引数 | 第 3 引数 | 第 4 引数 |
---|---|---|---|
/host/key | data period:time shift | season_unit | num_seasons |
引数 | 引数 |
---|---|
/host/key | ホスト名と対象のアイテムキーを指定します。 |
data period | 評価対象にする期間を <N><time unit> の形式で設定します。 <N> - 時間の単位の数 この設定は season_unit で設定した時間の単位以下でなければなりません。 |
time shift | タイムシフトを指定します。 |
season_unit | 評価対象にする期間を過去どこまで遡るかを、 h(時間)、d(日)、w(週)、M(月)、y(年) の内どれかひとつから設定します。 |
num_seasons | 評価対象にする期間を過去どこまで遡るかを設定します。 |
第 2 引数で指定する「data period」と「time shift」については説明を省略しますが、Zabbix のドキュメントにもあるように以下の表をイディオムとして使えばいいでしょう。
パラメータ | 説明 |
---|---|
1d:now/d | 昨日 |
1d:now/d+1d | 今日 |
2d:now/d+1d | 2 日前 |
1w:now/w | 先週 |
1w:now/w+1w | 今週 |
https://www.zabbix.com/documentation/6.0/en/manual/config/triggers/expression(2022/06/08 閲覧)
付録 2. Zabbix におけるヒストリ関数の計算タイミングについて
Zabbix ではトレンドデータを計算に使う関数を「トレンド関数」と呼びます。
トリガー条件式がトレンド関数のみで構成されている場合、各トレンド関数はトリガー条件式の中でもっとも短い期間ごとにいちどだけ評価されます。ふたたびその式が評価される時間までは同じ計算結果が使われます。
Zabbix の公式ドキュメントにもあるように、たとえばトリガー条件式を
trendavg(/host/key,1d:now/d) > 1 or trendavg(/host/key2,1w:now/w) > 2
とした場合、もっとも短い期間は 1d(1 日)です。そのためそれぞれのトレンド関数は 1 日に 1 回の頻度で評価されます。
baselinedev や baselinewma もトレンドデータから標準偏差あるいは加重移動平均を計算するトレンド関数のひとつです。したがって例として挙げた baselinedev 関数のみで構成されるトリガー条件式は 10:00、11:00、12:00...... のように 1 時間に 1 回のみ評価されます。
baselinedev(/agent01/system.cpu.util,1h:now/h,"w",4) >= 2
出典:https://www.zabbix.com/documentation/6.0/en/manual/appendix/functions/trends