Splunk Observability CloudのDetectorでアノマリ検出

# はじめに

Splunk Observability Cloudはメトリクスから簡単にDetectorを作れて、更に機械学習によるアノマリ検出もできるので方法をまとめます。

# Detectorを用いたアノマリ検出の設定

とりあえず用語の整理です。

| 英語名 | 日本語名 | 説明 |
| ------- | ------- | ------- |
| Detector | ディテクター | 検出器。アラート定義みたいなもの。|
| Alert | アラート | Detectorで検出された、通常あまりよろしくない事象。|
| Chart | チャート | メトリクスを分析・可視化したもの。グラフとか。|


## Detectorの作成

DetectorはChartまたはメトリクスから作成できます。

### Chartから作成

Chartの右上に🔔アイコンがあります。ここから対象のメトリクスに対してDetectorを作成できます。
これが一番楽な方法だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/c2c0fb0c-f149-eff1-5bfd-e00e8e2cf4f3.png)

Chartで定義済みのメトリクスとその条件などが既にセットされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/02dc542d-bf6a-427d-10e3-2652d1c2b0e3.png)

Alert conditionを選びましょう。色々使えますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/9f960de9-cb64-9ca0-c303-07288e97fec1.png)

大体の意味は以下の通りです。
| Condition | 意味 |  
| ------- | ------- |
| Static Threhold | 静的閾値 |
| Heartbeat Check | メトリクスが途絶えた場合に検出 | 
| Resource Running Out | リソース枯渇。ディスク、メモリ使用率などが指定した値（100や0など）に近い将来到達する場合に検出 | 
| Outlier Detection | 同じような動きをするメトリクス間で一つだけ異常な動きをしている場合に検出（LB配下のEC2のリソースとか） |
| Sudden Change | 突発的な動きがあった場合に検出 |
| Historical Anomaly | 過去の周期から外れた動きをしている場合に検出 | 
| Custom Threshold | 複数のメトリクスの条件の組み合わせ（AND / OR）で検出 |

詳細はこちら。パラメータの説明だったり検出ロジックが書かれていたりします。

https://docs.splunk.com/Observability/alerts-detectors-notifications/alert-condition-reference/index.html#nav-Built-in-alert-conditions


アノマリ検出の一つのSudden Changeを見てみましょうか。
センシティビティを選ぶというシンプルな設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/27c643fe-742d-23a6-897c-2270376a2d78.png)

もっとチューニングさせろ！と言う場合はadvanced settingをクリックしてください。
色々でてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/26207faa-0345-8fc9-e14c-f9f3e688b8a0.png)



さて、こういうアノマリ検出系にありがちな困りごとが「この設定でどれだけアラートあがるの？」ということだと思います。
それに対してSplunkが偉いのは、画面の上に出ている[Preflight check](https://docs.splunk.com/Observability/alerts-detectors-notifications/preview-detector-alerts.html)機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/251eb210-1c9e-5c2d-bcee-ed1f3e03d776.png)

定義したDetectorを過去データに適用してみて、どれだけアラートが発生するかをシミュレートしてくれる機能です。
上の例だと、スパイクが起きてるのにアラートとして見なしていません。というのも、このメトリクスは定期的なスパイクが発生するため統計的に異常と見なしていないようです。

静的閾値で敢えてアラート発生する条件にするとこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/ffdf324f-92be-c0fd-9ce2-724892e1c028.png)

きちんとチェックされていますね。
設定してみてバンバンアラート上がっちゃったからチューニングして、、、みたいな試行錯誤がいらなくなるのは大きいです。


設定が固まれば、次はアラートの情報追加です。
Severity、Runbook（手順書や関連ダッシュボードなどのURL）、Tip（このアラート出たらこのコマンド打て！的なの）を設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/55310397-e726-57ef-b83c-ae8fe1fb78e9.png)

次はアラート通知先です。メール、チャット（Slack、Teams）、ServiceNowなど色々選べます。Plugin追加したらJiraとかにも送れるようです。Incident Intelligenceというのは担当者アサインと電話通知とか自動でやってくれる機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/f7e0144a-bc85-4223-bdcf-24daa09e233d.png)

最後に名前つけてActivateしておしまい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/d80a7655-ce53-10f4-3283-9f4fb4bc6e8c.png)

ChartからDetectorを作成する利点のもう一つとして、Chartとアラート発生状況が紐づいて見えることです。アラートが発生したらこのように赤くなります。発生したアラートも見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/bce7920d-7a19-a14e-de24-d25524c0da29.png)

平和な時は緑。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/e2985790-48d5-7dc6-5375-04af53e56af4.png)

アクティブなアラート一覧も確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/726d12c2-e510-3bc1-9849-60f611690f54.png)

アラートをクリックするとこんな感じ。アラート発生したとき（表示期間の変更もできます）のメトリクスの状況や、関連するダッシュボードへのリンクがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/04d99415-1103-1951-871f-7ff1a98bffa9.png)



### メトリクスから作成

メトリクスをChartにしてないけどDetector作りたいとき（あんまりない気もしますが）もできます。
作成したDetectorを既存のChartに紐づけることもできます。

New Detectorをクリックして、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/b33a5708-fbb2-cfa3-daf2-cd0b68066d28.png)

APMかIM（インフラ・ミドルウェア）のメトリクスかを選んで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/98725172-9c0b-834c-cdb9-5243e7159570.png)

メトリクスを選びます。後の流れはChartのときと同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/024b2abb-0899-a7ef-ae89-2f009f6be458.png)

APMの場合は任意のサービスのエラーかレイテンシーを対象にできます。リクエスト数もメトリクスとしては取っていますので定義できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/fffef704-c8af-c33b-792d-49ef834bc94f.png)



## AutoDetect

今まで新規にDetectorを作る方法を説明してきましたが、AutoDetectという、OOTBのベストプラクティス的なDetectorが用意されています。これをベースに閾値のチューニングや通知先の設定すると楽です。

https://docs.splunk.com/Observability/alerts-detectors-notifications/autodetect-list.html#nav-List-of-available-AutoDetect-detectors

APMであればエラー、レイテンシー、リクエストのSudden Changeや、KubernetesであればNodeの健全性やDeploymentがSpec通りか、など色々あって、拡充も続けられています。

## 補足

- 30台のホストがあった場合、全部にDetectorを仕込む必要はないです。ディスク使用率のメトリクスに対してDetectorを一つだけ仕込めば、検出したホストに対するアラートが発報されます。
- [Muting rule（静観条件）](https://docs.splunk.com/Observability/alerts-detectors-notifications/mute-notifications.html#mute-alert-notifications)も設定できます。期間指定or永続、条件指定（特定ホストのみなど）。
- Terraform使えます。

# アノマリ検出シナリオ

じゃあ何にDetector仕込みますか？という話ですよね。

あまりにアラートが多いと人は見なくなる or アラート疲れを起こすので何でもかんでも仕込めばいいという話ではないです。
アクション可能なアラートであること、ということがとても重要です。何をしたらいいか分からないアラート、放っておいてもよいアラートならそもそも不要じゃないでしょうか。定義しておいて画面上で見えるようにするのはよいですが、通知して着弾した不運な誰かを疲弊させるのは避けるべきです。

それではアクションを取るべきアラートは何かと言うと、ユーザーエクスペリエンス観点（エラー、レイテンシー、SLOに基づいていれば更に良い）、ビジネスKPI観点（コンバージョンレート、売上などサービスによる）、もしくは明確にまずい事象に対して作り、通知を受け取ったらそこからフロントエンド、アプリ、インフラで原因究明していく、という流れがオブザーバビリティ的ではないかと思います。
（この話もそのうち）

# まとめ

Splunk Observability CloudでDetectorを使いアノマリ検出する方法をまとめました。
クリックベースで設定できますしPreflight機能によるシミュレーション、Chartとの紐づけが便利だなと思います。