Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

OpenTelemetry Collectorで教師なし異常検知ができるIsolation Forest Processor

OpenTelemetry Collector Contrib v0.132.0のリリースノートを眺めていたところ、面白そうなProcessorがalphaステータスで出ていたのでご紹介します。その名もIsolation Forest Processor。

github.com

Isolation Forestというのは二分木を用いた異常検知アルゴリズムで、多数のデータを入力しても計算量やメモリ使用量を小さく抑えられることが特徴のようです。大量で多次元なデータを扱うオブザーバビリティデータの処理に向いていそうな特性ですね。

en.wikipedia.org

Isolation Forest Processorは、テレメトリーを受け取った上で異常検知を行い、その結果を2つの属性として付与します。anomaly.is_anomaly属性は異常かどうかを表すboolean、anomaly.isolation_score属性は分離度を表すスコアです。なお、この属性名はconfigで変えることもできます。メトリックはもちろん、トレースやログにも対応しています。

試しに以下のようなconfigを書き、 トレースのパイプラインにこのProcessorを組み込んでみました。

processors:
  isolationforest:
    features:
      # スパン名とスパンの所要時間を特徴量とする
      traces: [operation.name, duration]
    training_window: 1h
    update_frequency: 1m
    min_samples: 500
    contamination_rate: 0.05

そして、普段は100msほどで処理が終わるものの、3%の確率で異常に所要時間が長くなるようなトレースを送ってみました。

すると、以下のようにanomaly属性が付与されたトレースデータが生成・投稿されました。

異常ではないと判定されたスパン

異常だと判定されたスパン。処理に7秒ほどかかっている

今回はたまたまうまく行った例を拾ってきましたが、精度についてはなんとも言えないところでした。少なくともサンプル数や異常度の期待値といったハイパーパラメータの調整を結構頑張る必要がありそうです。

お手軽に異常検知を試してみたい方はIsolation Forest Processorを試してみてはいかがでしょうか。