3.2.5 アノマリー検知
(1) 概要
アノマリー検知とは,通常のパターンから外れた異常な挙動やイベントを検出する手法のことです。JP1/IMでは,過去のデータを基に平均値と標準偏差を計算し,現在の値がこれらの範囲を大きく外れる場合に異常と判断し,アラートを発報する機能を提供します。異常の分析と判断には,Zスコアを使用します。
Zスコアは,標準スコアとも呼ばれ,値と値のグループの平均との関係を表すものです。値と平均の差をグループの標準偏差で割って計算されたものです。
アノマリー検知を使用すると,外れ値を検知できます。また,稼働実績が少なく,しきい値の設定が難しい場合の異常検知にも適用できます。
|
|
なお,次のような場合は,しきい値の設定による異常検知を行ってください。
-
しきい値の設定が行いやすい監視項目(運用として許容する値が決まっている項目)の異常を検知する必要がある場合
-
アノマリー検知を使用した場合,許容範囲を超えていないときでも,平均から一定の値を超えた場合に異常を検知する必要がある場合
(2) 前提条件
■アノマリー検知のアラート定義機能の前提条件
アノマリー検知の機能を使用する場合,次の条件を満たすようにしてください。
-
アノマリー検知のアラートを設定したいメトリックが,JP1/IM - Agentでサポートされている必要があります。
-
Prometheusコマンドの引数で指定するパフォーマンスデータの保存期間に,アノマリー検知で定義するアラートの計測期間より大きい値を指定する必要があります。パフォーマンスデータの保存期間については,マニュアル「JP1/Integrated Management 3 - Manager コマンド・定義ファイル・APIリファレンス」の「サービス定義ファイル(jpc_プログラム名_service.xml)」(2. 定義ファイル)の,「prometheusコマンドのオプション」の説明を参照してください。
-
JP1/IMのアノマリー検知では,その時点で収集可能なデータからZスコアを計算します。そのため,インテリジェント統合管理データベースにアラートの計測期間以下のパフォーマンスデータしか格納されていない場合,不要なアラートが通知されるおそれがあります。アノマリー検知のアラート定義については,計測期間分以上のパフォーマンスデータが格納された状態で定義することを推奨します。
(3) 使用できるバージョンの組み合わせ
アノマリー検知の機能を使用できるバージョンの組み合わせを,次に示します。
-
JP1/IM - Manager 13-00以降
-
JP1/IM - Agent 13-11以降
- 重要
-
アノマリー検知には,値が常に一定となるメトリックを使用しないでください。そのようなメトリックを使用すると,正しく計算を行うことができません。
(4) アノマリー検知のアラート定義機能
ユーザーは,メトリック,計測範囲,しきい値(Zスコア)を検討し,アノマリー検知のアラートを定義します。アノマリー検知のアラート定義は,JP1/IM - Agentのアラート設定ファイル(jpc_alerting_rules.yml)の項目「expr」で指定するアラートの条件式(PromQL文)で指定します。条件式には,アノマリー検知の計算結果となるZスコアが,しきい値として設定したスコアを上回るかどうかの判定条件を指定します。上回る場合に外れ値として判定して異常を検知します。
Zスコアの公式を,次に示します。
-
Zスコアの公式
データポイントとデータの平均値の算出には,avg_over_time()を使用します。
データの標準偏差の算出には,stddev_over_time()を使用します。
avg_over_time()は,指定したメトリックの計測範囲(range vector)の平均値を返す関数です。
stddev_over_time()は,指定したメトリックの計測範囲(range vector)の標準偏差の値を返す関数です。
アノマリー検知のアラート定義の例を,次に示します。
■アラート定義例
-
1週間分の稼働データを元にして,平均値と標準偏差からZスコアの計算を行い,Zスコア(計算結果)の値がしきい値を超えるデータが検出された場合にアラートを通知する場合
groups: - name: node_exporter rules: - alert: MemAvailable(Node exporter) expr: 3 < abs((avg_over_time(node_memory_MemAvailable_bytes[5m])-avg_over_time(node_memory_MemAvailable_bytes[7d]))/stddev_over_time(node_memory_MemAvailable_bytes[7d])) : (略) : -
1週間分の稼働データを元にして,instanceごとのCPU未使用率(windows_cpu_time_totalメトリックのラベルmode="idle")の平均値と標準偏差からZスコアの計算を行い,Zスコア(計算結果)の値がしきい値を超えるデータが検出された場合にアラートを通知する場合(byとrate()を使用した例)
groups: - name: windows_exporter rules: - alert: cpu_unsed expr: 3 < abs((avg_over_time((avg by (instance)(rate(windows_cpu_time_total{mode="idle"}[2m])))[5m:])*100) - (avg_over_time((avg by (instance)(rate(windows_cpu_time_total{mode="idle"}[2m])))[7d:])*100)) / (stddev_over_time((avg by (instance)(rate(windows_cpu_time_total{mode="idle"}[2m])))[7d:])*100) : (略) :
上記の例のように,rate()と組み合わせて使用する場合,avg_over_time()とstddev_over_time()で指定する期間の末尾に":"を付与する必要があります。
アラート設定ファイルの詳細については,マニュアル「JP1/Integrated Management 3 - Manager コマンド・定義ファイル・APIリファレンス」の「アラート設定ファイル(jpc_alerting_rules.yml)」(2. 定義ファイル)を参照してください。
avg_over_time関数,stddev_over_time関数,およびrate関数の詳細については,「2.7.4(7)(e) 使用できる関数」を参照してください。
(a) Zスコアの計算式に設定する基準値の例
アノマリー検知のアラート定義で設定する計算式に使用する基準値の例について記載します。
なお,アノマリー検知を使用する場合,prometheusコマンドの引数で指定するデータの保存期間の設定を,運用に沿った期間に変更することを前提としています。保存期間に設定する値には,アノマリー検知で定義するアラートの計測期間より大きい値を指定する必要があります。
■ 計測期間の設定
avg_over_time()とstddev_over_time()で,平均値または標準偏差を計算するために指定する計測期間の基準値の例を,次に示します。運用するシステムに応じて,適宜,設定を変更してください。
-
標準値(稼働後からしばらく期間が経過して安定稼働しているシステムの場合)
計測期間の基準値は7dです。
コマンドの引数で指定するprometheusのデータ保存期間に"7d"以上の値に設定し,avg_over_time()とstddev_over_time()のそれぞれの計測期間に[7d]を設定します。
-
稼働したばかりのシステムの場合
計測期間の基準値は3dです。
コマンドの引数で指定するprometheusのデータ保存期間に"3d"以上の値に設定し,avg_over_time()とstddev_over_time()のそれぞれの計測期間に[2d]から[3d]の範囲で値を設定します。
上記に示す計測期間の基準値はあくまで目安です。prometheusのデータ保存期間を延ばすことで,"7d"以上の値を設定できます。
■ Zスコア(しきい値)の設定
アノマリー検知のアラート定義で設定するしきい値の基準値の例について記載します。
アノマリー検知では,Zスコア(計算結果)が,しきい値として設定したスコアを上回る場合に,外れ値と判定して異常を検知します。しきい値の基準値の例を,次に示します。
なお,しきい値が2以下の範囲は,一般的に問題ない値とされるため,しきい値には2を超える値を設定します。
-
標準値
しきい値の基準値は3です。
一般的なZスコアの手法による分析と判断で異常を検知する場合,しきい値に"3"を設定します。
-
標準より厳しい検知を行う場合
しきい値の基準値は2.5です。
標準値から0.5減算し,しきい値に"2.5"を設定します。
-
標準より緩い検知を行う場合
しきい値の基準値は3.5です。
標準値に0.5加算し,しきい値に"3.5"を設定します。
上記に示すしきい値の基準値はあくまで目安です。2などの小さい値を設定した場合,平均から少し離れた値でも検知するようになります。値を小さくすればするほど異常を検知しやすくなります。また,大きな値を設定した場合,平均から大きく離れた値で異常を検知するようになります。
■ 対象メトリック
アノマリー検知のアラートの定義に使用するメトリックは,JP1/IM - Agentで収集されている必要があります。
(5) ユースケース
■ネットワーク送信量の監視
ネットワーク送信量を監視対象とした場合の監視例を次に示します。
<想定する構成>
監視対象のサーバに,JP1/IM - ManagerおよびJP1/IM - Agentがインストールされており,OS監視を行っています。また,1台のサーバマシンに,各エージェントを統合するJP1/IM - Managerがインストールされています。
システムの稼働状況は,一定の使用率を示しており,安定稼働している状態です。
<構築>
-
アノマリー検知のアラートの定義
OS監視を行っているJP1/IM - Agentのアラート設定ファイル(jpc_alerting_rules.yml)に,ネットワーク送信量に関するアノマリー検知の設定を行う定義例を,次に示します。
この例では,7日分のネットワーク送信量を元データとして,平均値と標準偏差を計算し,実数値が正常範囲から外れている場合に,異常を検知する。
groups: - name: windows_exporter rules: - alert: windows_net_packets_sent_total (Windows exporter) expr: 3 < abs((avg_over_time(rate(windows_net_packets_sent_total[2m])[5m:])-avg_over_time(rate(windows_net_packets_sent_total[2m])[7d:]))/stddev_over_time(rate(windows_net_packets_sent_total [2m])[7d:])) for: 3m labels: jp1_pc_product_name: "/HITACHI/JP1/JPCCS2" jp1_pc_component: "/HITACHI/JP1/JPCCS/CONFINFO" jp1_pc_severity: "Warning" jp1_pc_eventid: "0401" jp1_pc_metricname: " windows_net_packets_sent_total " annotations: jp1_pc_firing_description: "ネットワーク送信量が平常時よりも上昇しています。" jp1_pc_resolved_description: "ネットワーク送信量が正常に戻りました。" -
リソース比較用のダッシュボードの定義
APサーバ群の各サーバで,ネットワーク送信量の値を確認するダッシュボードを定義します。
<運用>
-
オペレーターの対処
-
アノマリー検知のアラート発報
監視しているネットワーク送信量がしきい値を超えた場合,<構築>で定義したアラートによって,JP1イベントが発行されます。オペレーターは,自動アクション経由のメール通知,または,ダッシュボード画面のアラート情報で,システムの異常値を検知した場合,システム管理者にエスカレーションします。
-
システム管理者の対処
-
関連リソースの稼働情報の調査
システム管理者は,ダッシュボードで各リソースの稼働情報を確認し,原因を調査します。
例えば,次の図のように,APサーバ③で,ネットワーク送信量が平時の送信量と比較して増加していることを確認し,一次調査で,ユーザーの増加によって数値が上昇していることを確認した場合,一時対処として,ユーザーにシステムの使用の制限を依頼し,値が減少するかを確認します。
-
一時対処の確認
システム管理者は,一時対処が完了したあと,再度ダッシュボード上で値を確認し,値の上昇が落ち着いていることを確認します。
-
根本原因の調査,本対策の検討
その他の稼働情報の調査やアプリケーションのログを参照し,根本原因の調査や本対策の検討を行います。
■空きメモリ量の監視例
空きメモリ量を監視対象とした場合の監視例を次に示します。
<想定する構成>
「ネットワーク送信量の監視」の<想定する構成>と同等とします。
<構築>
-
アノマリー検知のアラートの定義
OS監視を行っているJP1/IM - Agentのアラート設定ファイル(jpc_alerting_rules.yml)に,空きメモリ量に関するアノマリー検知の設定を行う定義例を,次に示します。
この例では,7日分の空きメモリ量を元データとして,平均値と標準偏差を計算し,実数値が正常範囲から外れている場合に,異常を検知します。
groups: - name: windows_exporter rules: - alert: windows_memory_available_bytes (Windows exporter) expr: 3 < abs((avg_over_time(windows_memory_available_bytes[5m])-avg_over_time(windows_memory_available_bytes[7d]))/stddev_over_time(windows_memory_available_bytes[7d])) for: 3m labels: jp1_pc_product_name: "/HITACHI/JP1/JPCCS2" jp1_pc_component: "/HITACHI/JP1/JPCCS/CONFINFO" jp1_pc_severity: "Alert" jp1_pc_eventid: "0402" jp1_pc_metricname: " windows_memory_available_bytes" annotations: jp1_pc_firing_description: "空きメモリ量が平常時よりも減少しています。" jp1_pc_resolved_description: "空きメモリ量が正常に戻りました。" -
リソース比較用のダッシュボードの定義
APサーバ群の各サーバで,空きメモリ量の値を確認するダッシュボードを定義します。
<運用>
-
オペレーターの対処
-
アノマリー検知のアラート発報
監視している空きメモリ量の予測値がしきい値を超えた場合,<構築>で定義したアラートによって,JP1イベントが発行されます。オペレーターは,自動アクション経由のメール通知,または,ダッシュボード画面のアラート情報で,システムの異常値を検知した場合,システム管理者にエスカレーションします。
-
システム管理者の対処
-
関連リソースの稼働情報の調査
システム管理者は,ダッシュボードで各リソースの稼働情報を確認し,原因を調査します。
例えば,次の図のように,APサーバ①で,空きメモリ量が平時の量と比較して増加していることを確認し,一次調査で,平時と比べアクセスが集中していることを確認した場合,一時対処として,APサーバ①のアクセスを別のAPサーバに分散させ,メモリ消費量の削減を行います。
-
一時対処の確認
システム管理者は,一時対処が完了したあと,再度ダッシュボード上で値を確認し,値の上昇が落ち着いていることを確認します。
-
根本原因の調査,本対策の検討
その他の稼働情報の調査やアプリケーションのログを参照し,根本原因の調査や本対策の検討を行います。
■しきい値監視を行うことが望ましいケース
アノマリー検知ではなく,しきい値の設定による異常検知を行うことが望ましいケースについて記載します。
例として,1TBの容量のディスクを持つサーバーで,平常の作業に含まれない操作を行い,一時的に多量のバックアップを取得したことが原因で,ディスク使用量が次の図のようなデータ推移をしたこととします。また,ディスク所要量が20%程度を下回るまでは,運用に問題がないこととします。
アノマリー検知では,平常時のデータ推移から一定量増加した時点で異常を検知します。そのため,上記の例では,運用として許容された増加量であっても,突発的な作業で値が増加した場合には,異常を検知してしまいます。
上記のように一時的な値の上昇が連続した場合,そのつど異常が検知され,運用の想定内であっても,異常の検知件数が増加してしまいます。
ディスク容量に限らず,しきい値の設定が行いやすい監視項目(運用として許容する値が決まっている項目)に対しては,しきい値監視のアラート定義を設定することが望ましいということになります。
(6) ダッシュボードによる確認
アノマリー検知で使用するベースライン,実数値,平均値,正常範囲を,ダッシュボード上で確認するための手順について記載します。
■事前定義
ダッシュボード上に値を表示させるために,事前にメトリック定義ファイルにメトリックを定義する必要があります。
空きメモリ領を表示させる場合の定義例を,次に示します。
- 重要
-
アノマリー検知で使用するベースライン,実数値,平均値,正常範囲のメトリックを,ダッシュボードで表示する場合,その値の算出元となるメトリックや計測範囲によって,ほかのメトリックと比較してダッシュボードの表示に時間がかかることがあります。
{
"name":"memory_unused_baseline",※1
"default":false,
"promql":"avg_over_time(windows_memory_available_bytes[5m]) / (1024*1024*1024)",※2
"resource_en": {
"category":"platform_windows",
"label":"Memory unused_base",
"description":"Available size in the physical memory area.",
"unit":"GB"
},
"resource_ja":{
"category":"platform_windows",
"label":"空きメモリ量_ベース",
"description":"物理メモリ領域の未使用サイズ",
"unit":"ギガバイト"
}
},
{
"name":"memory_unused_average",※3
"default":false,
"promql":"avg_over_time(windows_memory_available_bytes[7d]) / (1024*1024*1024)",※4
"resource_en":{
"category":"platform_windows",
"label":"Memory unused_average",
"description":"Available size in the physical memory area.",
"unit":"GB"
},
"resource_ja": {
"category":"platform_windows",
"label":"空きメモリ量_平均",
"description":"物理メモリ領域の未使用サイズ",
"unit":"ギガバイト"
}
},
{
"name":"memory_unused_std_up",※5
"default":false,
"promql":"(avg_over_time(windows_memory_available_bytes[7d])+ stddev_over_time(windows_memory_available_bytes[7d])) / (1024*1024*1024)",※6
"resource_en":{
"category":"platform_windows",
"label":"Memory unused_std_up",
"description":"Available size in the physical memory area.",
"unit":"GB"
},
"resource_ja":{
"category":"platform_windows",
"label":"空きメモリ量_正常範囲+",
"description":"物理メモリ領域の未使用サイズ",
"unit":"ギガバイト"
}
},
{
"name":"memory_unused_std_down",※7
"default":false,
"promql":"(avg_over_time(windows_memory_available_bytes[7d])- stddev_over_time(windows_memory_available_bytes[7d])) / (1024*1024*1024)",※8
"resource_en":{
"category":"platform_windows",
"label":"Memory unused_std_down",
"description":"Available size in the physical memory area.",
"unit":"GB"
},
"resource_ja":{
"category":"platform_windows",
"label":"空きメモリ量_正常範囲-",
"description":"物理メモリ領域の未使用サイズ",
"unit":"ギガバイト"
}
}- 注※1
-
ベースラインのメトリックの定義を示します。
- 注※2
-
5分間の平均の値をベースラインとして算出するPromQL文を示します。
- 注※3
-
平均値のメトリックの定義を示します。
- 注※4
-
7日間のデータを基準に平均値を算出するPromQL文を示します。
- 注※5
-
平均値+標準偏差のメトリックの定義を示します。
- 注※6
-
7日間のデータを元に平均値と標準偏差を算出し,それらの和を計算するPromQL文を示します。
- 注※7
-
平均値−標準偏差のメトリックの定義を示します。
- 注※8
-
7日間のデータを元に平均値と標準偏差を算出し,それらの差を計算するPromQL文を示します。
■ダッシュボード上での操作
「事前定義」で定義したメトリックを元に,[ダッシュボード一覧]ダイアログで,次のようなパネルを追加し,作成したパネルを左右に並べます。
- パネルA
-
-
y軸:空きメモリ量_ベース
-
y2軸:空きメモリ量_平均
-
最小値:取得結果に合わせた最小値
-
最大値:取得結果に合わせた最大値
-
- パネルB
-
-
y軸:空きメモリ量_正常範囲
-
y2軸:空きメモリ量_正常範囲
-
最小値:取得結果に合わせた最小値
-
最大値:取得結果に合わせた最大値
-
なお,上記のパネルを作成するときは,それぞれのパネルのy軸に最小値と最大値を設定してください。設定しない場合,軸ごとに変動した値が設定されてしまいます。
|
|