Splunk Observability Cloud - APIでディテクター作成

# はじめに
Splunk Observability Cloud の設定作業を API で行う方法をまとめておきたいと思います。この記事では、API でディテクターを設定していきます。

# 記事の内容
下記の操作を行う curl コマンドのサンプルです。
* シンプルなディテクターを作成
* 作成したディテクター設定の確認
* ディテクターを削除

# 参考にしたドキュメント
* API リファレンス > Detectors
    * [作成 (POST)](https://dev.splunk.com/observability/reference/api/detectors/latest#endpoint-create-single-detector)、 [参照 (GET)](https://dev.splunk.com/observability/reference/api/detectors/latest#endpoint-retrieve-detector-id)、 [更新 (PUT)](https://dev.splunk.com/observability/reference/api/detectors/latest#endpoint-update-single-detector)、[削除 (DELETE)](https://dev.splunk.com/observability/reference/api/detectors/latest#endpoint-delete-single-detector)

# 準備
コマンドだけで作業を完結したいので、下記の記事を参考に APIアクセストークン（session token）を取得しておきます。

https://qiita.com/aoichiba/items/4daee6e0b29f510c5bb5

# シンプルなディテクター作成

利用開始時に用意されているサンプルのメトリック demo.trans.latency を使って
シンプルなディテクターを作成してみます。

まずは上記の記事を参考に取得したAPIアクセストークンを環境変数にセットします。
~~~
export SPLUNK_O11Y_API_TOKEN=(取得したAPIアクセストークン)
~~~

そして Splunk Observability Cloud の Realm も環境変数にセットしておきます。
~~~
export SPLUNK_O11Y_REALM=(jp0 や us1 など）
~~~

作成するディテクターの設定を JSON ファイルとして準備します。
~~~
cat > request.json <<_EOF
{
  "name": "test detector 4",
  "description": "example",
  "maxDelay": 0,
  "programText" : "A = data('demo.trans.latency').percentile(pct=90).publish(label='A');detect(when(A > threshold(200)), auto_resolve_after='1h').publish('Latency is High')",
  "rules": [
    {
      "detectLabel": "Latency is High",
      "severity": "Major"
    }
  ],
  "tags": ["late_response"]
}
_EOF
~~~



最後にcurlコマンドでディテクターを作成します。

~~~
curl -X POST "https://app.${SPLUNK_O11Y_REALM}.signalfx.com/v2/detector" \
-H "Content-Type: application/json" \
-H "X-SF-Token: ${SPLUNK_O11Y_API_TOKEN}" \
-d @request.json
~~~

コマンドを実行すると次のような出力が表示されます。"id" 部分の「GNGUGeVA0AA」が今回作成したディテクターのIDです。
~~~
{
  "authorizedWriters" : {
    "teams" : [ ],
    "users" : [ ]
  },
  "created" : 1715217755370,
  "creator" : "（作成者のユーザーID）",
  "customProperties" : null,
  "description" : "example",
  "detectorOrigin" : "Standard",
  "id" : "GNGUGeVA0AA",
  "labelResolutions" : null,
  "lastUpdated" : 0,
  "lastUpdatedBy" : null,
  "maxDelay" : 0,
  "minDelay" : null,
  "name" : "test detector 1",
  （以下省略）
~~~

# 作成したディテクター設定の確認

curlコマンド先ほど作成したディテクターID（GNGUGeVA0AA）をGETします。
~~~
curl -X GET "https://app.${SPLUNK_O11Y_REALM}.signalfx.com/v2/detector/GNGUGeVA0AA" \
-H "Content-Type: application/json" \
-H "X-SF-Token: ${SPLUNK_O11Y_API_TOKEN}"
~~~

出力結果は次のようになります。
~~~
{
  "authorizedWriters" : {
    "teams" : [ ],
    "users" : [ ]
  },
  "created" : 1715217755370,
  "creator" : "（作成者のユーザーID）",
  "customProperties" : null,
  "description" : "example",
  "detectorOrigin" : "Standard",
  "id" : "GNGUGeVA0AA",
  "labelResolutions" : {
    "Latency is High" : 1000
  },
  "lastUpdated" : 1715217756154,
  （以下省略）
~~~


# ディテクターを削除

先ほど作成したディテクターのIDを環境変数にセットしておきます。

~~~
export SPLUNK_O11Y_DETECTOR_ID=(削除したいディテクターのID)
~~~
curlコマンド（DELETE）で削除します。
~~~
curl -X DELETE "https://app.${SPLUNK_O11Y_REALM}.signalfx.com/v2/detector/${SPLUNK_O11Y_DETECTOR_ID}" \
-H "Content-Type: application/json" \
-H "X-SF-Token: ${SPLUNK_O11Y_API_TOKEN}"
~~~

# おわりに

今回はdemoメトリクスを使ったシンプルなディテクターを作成する方法を紹介しましたが、APIリファレンスを参考にしたり、管理画面で作成したものを参考にすることで、実用的な設定のJSONファイルを用意することができると思います。
本記事が、ディテクター管理をコマンドで行う際の参考になればと思います。