ホストメトリックの異常検知を行なうmackerel-agentのチェックプラグインを作りました

最近、異常検知の実験/実装を行なっていますが、その過程の中間成果物をmackerel-agentのチェックプラグインとして切り出しました(非公式のプラグインです。サポート宛てにお問い合わせしてもらっても回答できません。id:syou6162まで個人的に連絡してもらえたら対応できるかもしれません)。docker pull yasuhisa/check-host-metric-anomalyで簡単に使えるので、是非遊んでみてください。

このチェックプラグインの使いどころは

  • ホスト監視をしたいが、どれくらいの閾値が適当なのか分からない/閾値の調整が面倒なので、よしなにやって欲しい
  • 閾値による監視や式監視だけでは対応できないようなホストメトリックの変化を早期に発見したい
    • 例: 周期性があるので、静的な閾値監視だけでは不十分

といったところを想定しています。サービスメトリックにも仕組みとしては対応できますが、ホストメトリックと異なり投稿頻度が1分粒度とは限らないため、今回はひとまずホストメトリックのみ対応しています。

mackerel-agent.confに監視したいホストメトリック毎に以下のような設定項目を追記、mackerel-agentを再起動すれば、異常検知によるホストメトリックの監視が開始されます。異常検知アルゴリズムの学習データとして3週間程度の直近のホストメトリックを取得する必要があるため、MACKEREL_APIKEYが必要です。オプションの-v /tmp:/tmpは学習済みのモデルファイルの置き場を指定しています。

[plugin.checks.anomaly_sample]
command = "/path/to/docker run --rm -e MACKEREL_APIKEY=XXXXX -v /tmp:/tmp yasuhisa/check-host-metric-anomaly /app/run.sh --host-id HOST_ID --metric-name METRIC_NAME"
max_check_attempts = 3

たくさんのホストメトリックに対して異常検知したい場合、毎回docker runしているとコンテナの起動/停止コストが大きくなってくるため、docker startdocker execを使う方法がお勧めです。詳しくはREADMEを参照してください。

簡単な解説

  • 時系列データに対する異常検知の代表的なアルゴリズムの一つであるLOF(Local Outlier Factor)を利用しています
    • 教師なし学習であり、教師データ(どのデータ点が異常か/そうでないか)を与える必要はありません
    • 大雑把には「自分の近傍にデータ点が少ないデータほど異常である」というk近傍法的な考え方のアルゴリズムです
    • 1次元の時系列データをwindow幅Dで区切り、D次元ベクトルに変換後、LOFを用いて異常か判別します
  • モニタリング専用のホストで動かすのがオススメです
    • アルゴリズムの学習(ディフォルトは1時間おき)と予測をmackerel-agentを動かしているホスト内で行なうので、多少負荷がかかります
    • あまりに多くのホストメトリックの監視を行なうと、command timeoutしてUNKNOWNになってしまう場合があります
    • Dockerコンテナ上で動かさず、ホスト上で動かすようにすれば負荷は下がる(timeoutも起こしにくくなる)と思いますが、scikit-learnなどのPythonのライブラリを手元にインストールしてもらう手間がかかるため、このようにしています
  • 異常が検知できない/誤検知する場合
    • LOFは様々なタイプのデータに対して頑健に動くアルゴリズムですが、当然完璧ではありません
    • 例えば以下のようなタイプのデータは苦手です
      • 1日に一回のみ動くバッチが走っているホストのメトリック
      • ディスク容量のような単調増加するメトリック
    • 誤検知(異常でないにも関わらずアラートが発生)が起きる場合、mackerel-agent.confに以下の設定を行なってみると誤検知を回避できるかもしれません
      • --window-sizeを大きめに設定する
      • --warning--criticalを小さめの値に設定する
    • 異常であるにも関わらずアラートが起きない場合は、上記と逆のことをやってみるとうまくいくかもしれません

入門 機械学習による異常検知―Rによる実践ガイド

入門 機械学習による異常検知―Rによる実践ガイド

Mackerel サーバ監視[実践]入門

Mackerel サーバ監視[実践]入門

  • 作者: 井上大輔,粕谷大輔,杉山広通,田中慎司,坪内佑樹,松木雅幸
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/08/26
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る