Article by: Ram Senthamarai, Aayush Seth
異常検知は鏡だらけの家で探偵をしているようなものです。何かがおかしいのは分かるけれど、見えているのが本当の問題なのか、それとも奇妙な反射にすぎないのか、いつも確信が持てません。
本番環境のシステムを監視するのは、絶えず形を変える干し草の山の中から動き回る針を探すように感じることがよくあります。Sentry では、お客様が従来のしきい値ベースや割合ベースのアラートを超えられるようにすることを目標にし、システム内の微妙で複雑な異常をほぼリアルタイムで検知できるよう支援することを目指しました。
本記事では、当社の AI/ML チームが Matrix Profile と Meta の Prophet を用いて、時系列の異常検知システムを開発した方法を詳しく説明します。直面した課題を取り上げ、このハイブリッドなアプローチによって、より信頼性が高く、よりインテリジェントなアラートを構築できた理由を解説します。
問題:ノイズの多いメトリクス、微妙な障害
システムメトリクスは本質的にノイズが多いものです。しかし、適切なタイミングで適切な異常を特定できるかどうかで、結果は大きく変わります。たとえば、素早い修正で済むのか、重大インシデントに発展するのか。とはいえ、自動の時系列異常検知(Time Series Anomaly Detection。以下 TSAD)は簡単な問題ではありません。
- コンテクストがすべて:データのスパイクは異常かもしれませんし、週末セール、プロダクトローンチ、システムメンテナンスの影響にすぎない場合もあります。コンテクストがなければ、その違いは判別しにくくなります。
- 「正常」は常に変動する:パターンは時間とともに変化します。季節性、トレンド、そして突然のレジームシフト(状態の急変)によって、今日の「正常」が明日の「異常」になり得ます。
- ノイズとシグナルのせめぎ合い:システムメトリクスのデータはノイズが多くなることがあります。特に大規模環境では、誤検知を連発せずに真の異常だけを検知するのは簡単ではありません。
- 万能解はない:各メトリクスの振る舞いは異なります。CPU 使用率、ユーザー登録数、取引量など、それぞれ特性が異なるため、状況に応じたアプローチが必要です。
- ラベル付きデータがない:教師あり学習は、正解(グラウンドトゥルース)がない場合、難しくなります。多くの場合、何が異常だったのかは、実際に何かが壊れてから初めて分かります。
- Sentry のスケール:何十万ものメトリクスを監視する Sentry のようなオブザーバビリティプラットフォームの規模で、この問題を解くことを想像してみてください。
要するに、自動 TSAD には、コンテクストを理解し、適応的で、精度が高く、しかもスケールすることが同時に求められます。
解決策:ハイブリッドアプローチ
ARIMA、SARIMA、TimeGPT、Moirai、AutoFormer、ChatTS などさまざまなモデルで広範に実験した結果、私たちは Matrix Profile と Prophet を組み合わせたハイブリッド手法に落ち着きました。これらのモデルを組み合わせることで、時系列データにおける異常をより広い視野と、よりニュアンスのある形で理解できるようになります。
Matrix Profile:形状ベースの異常検知
Matrix Profile は教師なしの手法で、部分系列同士を比較することで、時系列における反復パターン(motifs)と外れパターン(discords)を特定します。これは時系列内の各部分系列について、最も近い近傍の部分系列までの距離を計算するものです。距離が大きい場合、それは通常とは異なる、または異常な振る舞いを示していることを意味します。この手法は正確な値そのものよりも、データの形(スパイク、ディップ、反復サイクル)のほうが重要な場合に理想的です。
採用した理由
- 生の値だけでなく、類似性に基づいて異常を検出する
- STOMP アルゴリズムのおかげで効率的
- 事前学習を必要としない
- ハイパーパラメータは 1 つだけで、ウィンドウサイズである
Prophet:季節性を考慮した予測
Meta の Prophet は、日次・週次・年次の季節性を扱えるように設計された分解可能な時系列予測モデルです。また既知のイベント(例:デプロイ、祝日)を組み込むこともできます。Prophet の予測を利用して異常スコアを調整し、想定されるトレンドや周期によって生じる誤検知を減らします。
採用した理由
- 使いやすく、欠損データに対しても堅牢
- トレンドと季節性を効果的に捉えられる
- 信頼区間を生成し、外れ値を特定できる
まとめ:生の異常を「対応できるアラート」に変える
- Matrix Profile は外れパターンを検出(異常な形状)
- Prophet は期待値を予測し、残差が大きい箇所を特定
- アラートは両方の手法が異常を検知した場合、またはどちらか一方が高い確信度で異常を検知した場合に発報される
このハイブリッドモデルにより、短期的な異常への感度と長期的なトレンド把握の両方が得られます。少なくとも、それが狙いでしたが、実際には話はもう少し複雑でした。堅牢な異常検知システムを作るには適切なモデルを選ぶだけでは足りません。スケールする環境で、生の異常シグナルを「対応可能なアラート」に変換するには、相当な試行錯誤とイノベーション、そしてシステム設計が必要でした。
基本から始める:データ
神を信じる。その他の人はデータを持ってこい。
ええ、私たちもデータは用意しました。これがなければ、あまり実験はできませんよね。そこで、優秀なデータサイエンティストなら皆そうするように、私たちはまず、既存の業界標準データセットである UCR Time Series Classification Archive から始めました。ところがすぐに限界にぶつかりました。これはオブザーバビリティ領域をあまりカバーしていないのです。そこで私たちは独自の合成データを生成し、さらに Sentry に存在する既存のメトリクスデータも活用しました。
すべてはアルゴリズム次第
プログラマーが「何をしたか」を説明したくないときに使う言葉
広大なデータセットの中から一過性のトレンドを特定することは、異常検知における大きな課題です。これは主に、Matrix Profile の重要なハイパーパラメータである「ウィンドウサイズ」に左右されます。この扱いが難しい設定は、システム性能にとって極めて重要です。さまざまな自動チューニング手法を評価した結果、私たちは Summary Statistics Subsequence(SuSS)が最も効果的だと分かりました。SuSS は、ローカルとグローバルの要約統計量(平均、標準偏差、レンジ)を比較することで最適なウィンドウを賢く特定し、正確な異常検知に必要なコンテクストを精密に突き止めます。
次に課題となったのは、生の Matrix Profile 距離を明確で実行可能な異常スコアへ変換することでした。AnomalyScorer モジュールは、各部分系列がどれほどユニークであるかを表すこれらの距離を評価し、設定可能なしきい値と、任意で Prophet の予測を用いて、各データ点に精密な異常スコアを割り当てます。柔軟性を組み込み、統計的なしきい値(距離の 99 パーセンタイルなど)、動的なベースライン、さらには複数アルゴリズムを組み合わせるためのアンサンブルロジックまで取り入れました。その結果、各タイムスタンプに対して堅牢で解釈可能なスコアが得られ、これを下流のアラートと可視化のために、単純な「異常」または「なし」のフラグへ二値化します。このモジュール設計により、感度を微調整し、誤検知を大幅に減らし、あらゆる種類の時系列データに適応できるようになります。
アラートからの回復中に発生する断続的な挙動も、私たちが直面したもう一つの大きな課題でした。これは Matrix Profile の性質によるもので、一瞬のエラースパイクがウィンドウサイズが 50 であるという理由だけで、50 時間の期間内に複数のアラートを引き起こすことがあります。これを解決するために、私たちは賢い解決策を実装しました。多数決に基づくスムージングと、Prophet に基づく回復ロジックです。結果はどうだったかというと、私たちのシステムは真の異常の後にいつ静かになるべきかを理解し、高い確信を持てる場合にはアラートを抑制できるようになりました。これにより、アラートはより意味のあるものになり、過剰に押し寄せることがなくなります。
数千のメトリクスに対応できるようにシステムをスケールさせる
異常検知をスケールさせるのは、「変な姿勢で“寝ろ”と合図したら寝るように犬をしつけておいて、次はドッグランにいる全ての犬に、それを同じようにやってもらえるはずだ」と期待するようなものです。
さらに設定可能性を加える
すべてのメトリクスが同じ性質を持つわけではないことは理解しています。だからこそ、ユーザーが自分で制御できるようにし、各ユーザーの課題領域や望むアラート量に合わせられる 3 段階の感度レベルを提供したいと考えました。では、どうやって実現したのか。まず、合成データと実データの時系列を詰め込んだ大規模な社内データセットを構築しました。そこには、Issue 数から失敗率まで、季節性のパターンも分散も大きく異なるさまざまな系列が含まれています。次に、アルゴリズム全体にわたって厳密なテストとハイパーパラメータ調整を繰り返し、精度における最適なバランス点に到達するまでシステムをチューニングしました。
結果
以下は本番環境で確認できた、印象的ないくつかの結果です。最初の例は、一見すると誤検知のように見えます。ですが、よく見ると、システムは「最後の谷」がいつもよりその日の早い時間帯から始まっていることに気づき、それを異常として検知しています。

この 2 つ目の例は、週次と日次の周期を持つ、ノイズの多い時系列を示しています。ここでも私たちのシステムは、訓練されていない目には見過ごされていたかもしれない異常なシステム挙動をうまく検知できています。

異常検知システムを活用する
アラートの設定ページに移動し、しきい値オプションとして「Anomaly Detection」を選択してください。
以上です。

最後に:今後の展望
現在、次の取り組みを進めています。
- ユーザーからの異常に関するフィードバックを取り込み、モデルを継続的に改善する
- 複数の時系列にまたがる因果分析を行う
大規模環境で時系列の異常検知を行うのは簡単な課題ではありません。私たちは、強みが補完し合う複数のモデルを組み合わせ、弱点を補うための独自アルゴリズムを統合することで、本番環境の監視能力を大幅に高めるシステムを構築したのです。
Original Page: Robust Time Series Monitoring: Anomaly Detection Using Matrix Profile and Prophet
IchizokuはSentryと提携し、日本でSentry製品の導入支援、テクニカルサポート、ベストプラクティスの共有を行なっています。Ichizokuが提供するSentryの日本語サイトについてはこちらをご覧ください。またご導入についての相談はこちらのフォームからお気軽にお問い合わせください。


