Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

しきい値監視からの卒業! Prometheus による機械学習を用いた異常検知アラートの実装

Takuya TAKAHASHI
November 22, 2022
1.8k

しきい値監視からの卒業! Prometheus による機械学習を用いた異常検知アラートの実装

CNDT2022 で発表した内容です

Takuya TAKAHASHI

November 22, 2022
Tweet

Transcript

  1. 2 アジェンダ - 自己紹介 - 監視どうしてます? - 異常検知アラートとは? - Prometheus

    メトリクスを利用した異常検知アラートの実装 - おわりに 2
  2. 5 宣伝: GMOペパボでは CNDT 2022 で 5セッション登壇しています! 自己紹介 - 全部終わっちゃってるので、アーカイブを御覧ください!

    - Dynamic VM Scheduling in OpenStack by Kazuhiko Yamashita - k8s Operatorで運用負担減&ハイブリッドクラウドのコスト最適化をした話 by Chiaki Sugawara - 実例から学ぶ Kubernetes Custom Controller のステータス管理 by Takuya Takahashi - ペパボのSREが生産性の向上を目指しCloud Nativeなチーム作り実践し た話 by Ryuichi Watanabe - しきい値監視からの卒業! Prometheus による機械学習を用いた異常 検知アラートの実装 by Takuya Takahashi 5
  3. 6 アジェンダ - 自己紹介 - 監視どうしてます? - 異常検知アラートとは? - Prometheus

    メトリクスを利用した異常検知アラートの実装 - おわりに 6
  4. 8 - 監視手法 - メトリクス監視、外形監視、etc… - 監視対象 - ワークロードの CPU、メモリ使用率、etc…

    - レスポンスコード、レイテンシ、etc… - プラットフォームの正常性 - Kubernetes API は動いているか? - クラスタ内通信は動いているか? - オートスケーラーは動いているか? - etc… 大クラウドネイティブ時代でもなくならないもの、それは監視 監視どうしてます? 8
  5. 9 - 監視手法 - メトリクス監視、外形監視、etc… - 監視対象 - ワークロードの CPU、メモリ使用率、etc…

    - SLO が Violation していないか - プラットフォームの正常性 - Kubernetes API は動いているか? - クラスタ内通信は動いているか? - オートスケーラーは動いているか? - etc… 大クラウドネイティブ時代でもなくならないもの、それは監視 監視どうしてます? 9 監視めちゃめちゃ大変
  6. 10 監視するものはどういうものがあるか - システムメトリクス - CPU 使用率、メモリ使用率、ネットワーク帯域 etc - 想定より高くなってないか?

    - サービスメトリクス - ステータスコード - 想定より失敗が多くないか? - リクエストレイテンシ - 想定より遅くなっていないか? - サービスやプラットフォームの健全性 - 外形監視、ネットワーク疎通監視 - 正常に動いているか? (true or false の2値) 監視どうしてます? 10
  7. 11 監視するものはどういうものがあるか - システムメトリクス - CPU 使用率、メモリ使用率、ネットワーク帯域 etc - 想定より高くなってないか?

    - サービスメトリクス - ステータスコード - 想定より失敗が多くないか? - リクエストレイテンシ - 想定より遅くなっていないか? - サービスやプラットフォームの健全性 - 外形監視、ネットワーク疎通監視 - 正常に動いているか? (true or false の2値) 監視どうしてます? 11
  8. 12 監視するものはどういうものがあるか - システムメトリクス - CPU 使用率、メモリ使用率、ネットワーク帯域 etc - 想定より高くなってないか?

    - サービスメトリクス - ステータスコード - 想定より失敗が多くないか? - リクエストレイテンシ - 想定より遅くなっていないか? 監視どうしてます? 12 - システムメトリクス - CPU 使用率、メモリ使用率、ネットワーク帯域 etc - 想定より高くなってないか? - サービスメトリクス - ステータスコード - 想定より失敗が多くないか? - リクエストレイテンシ - 想定より遅くなっていないか? - サービスやプラットフォームの健全性 - 外形監視、ネットワーク疎通監視 - 正常に動いているか? (true or false の2値) しきい値を用いてアラートを発泡する
  9. 13 しきい値アラート 監視どうしてます? - 特定の基準を超えた場合にアラートを発泡する - ex: CPU 使用率が 80%

    を超えたらアラート - ex: レスポンスタイムが 2.0s を上回ったらアラート 13
  10. 15 しきい値はどうやって決める? 監視どうしてます? - 平常時の負荷から決める - 普段は CPU 使用率が 40%

    だから 60% をしきい値にする - ピーク時に60%超えちゃってアラートが頻発... 15
  11. 16 しきい値はどうやって決める? 監視どうしてます? - 平常時の負荷から決める - 普段は CPU 使用率が 40%

    だから 60% をしきい値にする - ピーク時に60%超えちゃってアラートが頻発... - 繁忙期にはベースの負荷が高まりアラート... 16
  12. 26 - オンプレのメトリクス... 監視 … Cloud Native… - Prometheus だ!!

    オンプレ向け異常検知アラート 異常検知アラートとは? 26
  13. 27 - オンプレの監視 … Cloud Native… - Prometheus だ!! オンプレ向け異常検知アラート

    異常検知アラートとは? 27 Prometheus をデータソースとした 異常検知を実装できないか?
  14. 34 - 時系列データの予測モデルはいくつか存在する - ARIMA - Auto-Regressive Integrated Moving Average

    - 自己回帰(AR)と差分(I), 移動平均(MA)を組み合わせたモデルらしい - DataDog の異常検知モニターでも使用されている - LSTM - Long Short Term Memory - リカレントニューラルネットワークというものを使った深層学習 - etc… 時系列データの予測モデル Prometheus を利用した異常検知アラートの実装 34
  15. 35 - 時系列データの予測モデルはいくつか存在する - ARIMA - Auto-Regressive Integrated Moving Average

    - 自己回帰(AR)と差分(I), 移動平均(MA)を組み合わせたモデルらしい - DataDog の異常検知モニターでも使用されている - LSTM - Long Short Term Memory - リカレントニューラルネットワークというものを使った深層学習 - etc… 時系列データの予測モデル Prometheus を利用した異常検知アラートの実装 35
  16. 36 - 計算量が少なくて済む - 構築済みモデルに適切な次数を与えるだけ - 次数の探索にはある程度計算が必要 - 採用実績が豊富 -

    DataDog (SARIMA = Seasonal-ARIMA) - BigQuery ML の時系列予測モデル ARIMA を選択した Prometheus を利用した異常検知アラートの実装 36
  17. 37 1. 環境を用意する 2. データを用意する 3. データの形を整える 4. データを学習用 (train),

    テスト用(test)に分割する 5. 問題に最適なモデルを探索する 6. 結果をテストデータで確認する ARIMA を用いた時系列予測の手順 Prometheus を利用した異常検知アラートの実装 37
  18. 38 - Python 3.10.6 で実装する - 機械学習といえば Python! - Jupyter

    Notebook で実験する - うまくいったら API として実装する - pmdarima というライブラリを使う - ARIMA を使う上で便利な物が詰まってる 環境を用意する Prometheus を利用した異常検知アラートの実装 38
  19. 40 - とある Kubernetes Pod の CPU 使用率を利用した - 周期的でいい感じ

    データを用意する Prometheus を利用した異常検知アラートの実装 40
  20. 41 - Prometheus から REST API でデータを取得 - unix time,

    value の配列が得られる データを用意する Prometheus を利用した異常検知アラートの実装 41
  21. 42 - データ数を減らす、計算しやすい周期にする - 1時間ごとのデータなら24個で1日となる - prometheus API の step

    パラメータで調整 データの形を整える Prometheus を利用した異常検知アラートの実装 42 step = 600s step = 3600s
  22. 43 - 過学習(over fitting) を防ぐため - pandas.Serias を作成する - [datetime]

    が index, [float] が value - pmdarima 提供のメソッドに入れる データを学習用 (train), テスト用(test)に分割する Prometheus を利用した異常検知アラートの実装 43
  23. 44 - 赤がtrain, 青が test - 時系列データは index が train

    < test である必要がある - 過去のデータから未来を予測するので データを学習用 (train), テスト用(test)に分割する Prometheus を利用した異常検知アラートの実装 44
  24. 45 - データにより適切なモデルへの入力が異なる - ARIMA モデルでは以下の入力を必要とする - p … 自己回帰

    (AR) のパラメータ - d … 差分 (I) のパラメータ - q … 移動平均 (MA) のパラメータ - ARIMA(p, d, q) と表現する - Seasonal-ARIMA はさらに季節周期の次数 (P, D, Q) と周期 m がある - 合わせて ARIMA(p, d, q)(P, D, Q)[m] と表記される 最適なモデルを探索する Prometheus を利用した異常検知アラートの実装 45
  25. 47 - ARIMA(p, d, q)(P, D, Q)[m] を埋めていく - 差分パラメータは、d

    = 1, D = 1 が一般的らしい - m は季節周期なのでデータにより個別に設定する 最適なモデルを探索する Prometheus を利用した異常検知アラートの実装 47
  26. 49 - ARIMA(p, d, q)(P, D, Q)[m] を埋めていく - 差分パラメータは、d

    = 1, D = 1 が一般的らしい - m は季節周期なのでデータにより個別に設定する - 今回のデータは m = 24 - p, q, P, Q を埋める必要がある 最適なモデルを探索する Prometheus を利用した異常検知アラートの実装 49
  27. 54 - ARIMA(p, d, q)(P, D, Q)[m] を埋めていく - 差分パラメータは、d

    = 1, D = 1 が一般的らしい - m は季節周期なのでデータにより個別に設定する - 今回のデータは m = 24 - p, q, P, Q を埋める必要がある - auto_arima() により、以下の次数が選ばれた - ARIMA(1,1,1)(2,1,1)[24] 最適なモデルを探索する Prometheus を利用した異常検知アラートの実装 54
  28. 55 1. 環境を用意する 2. データを用意する 3. データの形を整える 4. データを学習用 (train),

    テスト用(test)に分割する 5. 問題に最適なモデルを探索する 6. 結果をテストデータで確認する ARIMA を用いた時系列予測の手順 Prometheus を利用した異常検知アラートの実装 55
  29. 56 - 作成したモデルで予測した結果を出す - n_periods … いくつぶん予測データを出力するか - 今回はテストデータの長さ分 -

    return_conf_int … 信頼区間の配列を return するか 結果をテストデータで確認する Prometheus を利用した異常検知アラートの実装 56
  30. 57 - 信頼区間 … 統計的に真の値が含まれる可能性の高い範囲 - conf_int[][0] = 信頼区間の min

    - conf_int[][1] = 信頼区間の max - min < 実績値 < max なら予測はあたりということになる 結果をテストデータで確認する Prometheus を利用した異常検知アラートの実装 57 グレーの範囲が 信頼区間
  31. 62 - 次数を手に入れたのでそれを入力値として持つ - メトリクスの定義を rules.yaml にまとめる exporter の実装 Prometheus

    を利用した異常検知アラートの実装 62 % cat ./rules.yaml - name: pod_cpu query: sum(rate(container_cpu_usage_seconds_total{pod=~"workload-pod.*"}[5m])) arima: order: (1,1,1) # (p,d,q) seasonal_order: (2,1,1,24) # (P,D,Q,m)
  32. 64 - order は tuple なので ast.literal_eval で str を

    tuple にする exporter の実装 Prometheus を利用した異常検知アラートの実装 64
  33. 65 - fit() の入力には prometheus をクエリしたデータを入れる - pd.Series に変換して入れるとよい exporter

    の実装 Prometheus を利用した異常検知アラートの実装 65 query_range() メソッドで prometheus にリクエストしてるよ
  34. 82 - データ間隔が 1h のメトリクスひとつに対し、 - 2.8GHz の CPU 2000m

    割当を100%消費し、 - 大体1分くらい リソース使用量が多い 異常検知 API の課題 82
  35. 83 - データ間隔が 1h のメトリクスひとつに対し、 - 2.8GHz の CPU 2000m

    割当を100%消費し、 - 大体1分くらい - さらに傾向が変わるとモデルを作り直さないといけなかったり - 時間経過によりモデルの鮮度が落ちるので作り直さないとだったり リソース使用量が多い 異常検知 API の課題 83
  36. 84 - データ間隔が 1h のメトリクスひとつに対し、 - 2.8GHz の CPU 2000m

    割当を100%消費し、 - 大体1分くらい - さらに傾向が変わるとモデルを作り直さないといけなかったり - 時間経過によりモデルの鮮度が落ちるので作り直さないとだったり リソース使用量が多い 異常検知 API の課題 84 すべてのメトリクスを異常検知モニタリングするには リソース使用量削減の工夫が必要そう
  37. 88 - 有用性は確認できた - 特定のメトリクスの監視には役に立ちそう - 既存のしきい値監視の置き換えはまだ難しそう - まだまだやれることがある -

    並列ジョブでモデル構築したり - 次数の探索をジョブで自動化したり 異常検知の道はまだまだ続くよ! おわりに 88
  38. 89 - 有用性は確認できた - 特定のメトリクスの監視には役に立ちそう - 既存のしきい値監視の置き換えはまだ難しそう - まだまだやれることがある -

    並列ジョブでモデル構築したり - 次数の探索をジョブで自動化したり - インフラ課題をいろいろな技術を使って解決しませんか!!! 異常検知の道はまだまだ続くよ! おわりに 89