Datadog プライベートロケーション自体を監視する

Datadog Synthetic の Private Location 自体を監視する方法について記します。

プライベートロケーションとは？という方は[こちら](https://qiita.com/hiren/items/e5e5d17eb116b02e4f9f)

# 問題
構築したプライベートロケーションが何らかの理由により停止した場合、テストが実行されなくなりますが、テスト結果がNGになっているわけではない為、アラートが発報されず、監視できていない事に気づけません。
※2021/10/16現在Synthetic監視はメトリクスモニターのようにデータの欠落による通知ができません。

## 問題の再現
1. プライベートロケーションのみ選択したテストを作成します。
![2021-10-13_19h36_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/4990dbd9-542b-58fe-d499-4d91cd707605.png)

1. プライベートロケーションワーカーを停止します。

1. テストのステータスはOKのまま、実行されたテスト結果は止まります。
![2021-10-13_20h36_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/613c5335-9003-f81f-1cd0-a47285ddb53d.png)

# 解決策
上項の問題はプライベートロケーション自体を監視する事で解決できます。

## 関連メトリクス
2021/10/16時点で[ドキュメント](https://docs.datadoghq.com/ja/synthetics/metrics/)には一切記載がありませんが、Datadog サイトからMetrics Explorerで探してみると下記のSyntheticsに関するメトリクスが確認できます。
※メトリクス名に付記している説明は、2021/08/26 Datadogサポート回答より

- `synthetics.pl.liveness`
Returns 1 if the Private Location is up and running

- `synthetics.pl.worker.running`
Number of containers available to run tests for a Private Location

- `synthetics.pl.worker.outdated`
Indicated if the Private Location image version is outdated, and can be upgraded

- `synthetics.pl.worker.pulled_tests`
Number of tests pulled by a Private Location

- `synthetics.pl.worker.remaining_slots`
Available slots to run pulled tests.

- `synthetics.pl.worker.concurrency`
The concurrency applied to each private locations

# 疑問
プライベートロケーションのSTATUSを監視する目的であればlivenessメトリクスの方が合致しているように思いましたが、実用した際に下記二つのメトリクスがどう違うのか分からないので検証してみました。

 - `synthetics.pl.liveness`
 - `synthetics.pl.worker.running`


結果を先に記載してしまうと、どちらも状態遷移は似た挙動を示しました。

## 前提

- プライベートロケーションを２ロケーション分作成（どちらもワーカーコンテナは１つづつ起動）
- 作成したプライベートロケーション１か所を監視元とするAPITest作成
- 以下２つのメトリクスで計６つモニターを作成（タイムフレームは全て５分）
 - synthetics.pl.liveness
 - synthetics.pl.worker.running
 - from locationid でのシングルモニター４つ
 - sum by locationid でのマルチモニター２つ

## 検証

1. ワーカーコンテナを１つだけ停止
⇒ シングルモニターはどちらのメトリクスも停止したロケーションがアラート状態に遷移した。
⇒ マルチモニターは停止したロケーションのメトリクスがNoData状態へ遷移し、アラート状態にはならなかった。

2. 全モニターのクエリにdefault_zero関数を追加
⇒ マルチモニターはどちらのメトリクスも変わらずOK状態を維持。

3. 停止したワーカーコンテナを再起動
⇒ シングルモニターはアラートが復旧しOK状態へ遷移。
⇒ マルチモニターはどちらのメトリクスもアラート状態に一瞬遷移してからOK状態へ遷移した。（下図参照）
![2021-08-31_12h24_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/c48b7f96-eabc-e731-0d91-2ee6158ac55f.png)


4. ３０分程度待機し、メトリクスのグラフをOKで落ち着かせてから再度ワーカーコンテナを１つだけ停止
⇒ シングルモニターはアラート状態に遷移。
⇒ マルチモニターはどちらのメトリクスもアラート状態に遷移した。が、１５分程度するとメトリクスがNoDataとなり軸ごと消える為、アラート状態からOK状態に遷移する。
（この時、アラート状態のメトリクスの閾値は回復してOK状態へ遷移を経ていない為、復旧イベントは発砲されない）

5. ワーカーコンテナを全て停止する
⇒ 停止したロケーションのシングルモニターはアラート状態に遷移。
⇒ マルチモニターはどちらのメトリクスも１５分程度アラート状態となるが、メトリクスが消えてNoData状態へ遷移する。

## 所感
synthetics.pl.livenessメトリクスは、クエリにデフォルトでas_count修飾子が付きます。
メトリクスグラフが見た目上０か１かにならないので、プライベートロケーションのSTATUS判定には使えません。
![2021-08-23_18h31_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/847b8867-1164-d8ac-f91c-a016a25763ff.png)
修飾子をas_rateに変更しても使え無さそうに見えますが、
![2021-12-01_19h12_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/2bf9501c-c9cc-59aa-dbf7-d9c644db2a18.png)
タイムフレームを5mにすると綺麗なグラフになります。
![2021-12-01_19h12_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/54744dd3-bc28-05c8-f45c-27407728df66.png)
ただし、メトリクスモニターのクエリーではタイムフレームを５分で設定する事はできるものの、モニターのステータス・編集画面では最小１時間の範囲でしか見れない為、実際に判定された値で見れないので混乱します。

また、synthetics.pl.livenessメトリクスは、実際のプライベートロケーションが落ちていなくても時折値に抜けが発生する事があります。
これも実際にグラフで見た時に誤解を招くので良くないと思いました。
![2021-09-30_10h29_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/f2c5d18b-e189-2dfe-ee46-df00976453f9.png)

対称に、synthetics.pl.worker.runningメトリクスは素直にワーカーコンテナが最低１台でも起動している or していないかで判定できるので扱いやすいと感じました。

## サポートにも聞いてみた
>時期などは確定しておりませんが、synthetics.pl.livenessについてはsynthetics.pl.worker.runningで代用できるため、将来的にDeprecateとなる可能性があるとのことでございますので、推奨する方法としてはsynthetics.pl.worker.runningとなります。
>2021/09/07 Datadogサポート回答より

# 結論
`synthetics.pl.worker.running`メトリクスでモニターを作成する。

# 追記
数か月前にしたためた本稿ですが、2021/11頃にDatadog サイト・ドキュメント共に更新があったようで、公式から[ドキュメント](https://docs.datadoghq.com/synthetics/private_locations/monitoring/)が出てました。

ワーカーコンテナの稼働状況や、プライベートロケーションに紐づくモニターなどが確認できるようになっています。

![2021-12-02_12h14_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/b0665ae5-0770-1d46-d013-75951bd85650.png)


プライベートロケーションを作成すると、下記のメトリクスを使用した３つのモニターが自動で作成されます。（プライベートロケーション作成済みの既存Organizationsにもモニターが作成されていました。）

- `synthetics.pl.worker.running`
- `synthetics.pl.worker.remaining_slots`
- `synthetics.pl.worker.outdated`

![2021-12-02_11h22_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/894be22b-872d-5724-04ca-2eaa9a503796.png)

本稿でも取り扱った`synthetics.pl.worker.running`メトリクスを用いたモニターですが、クエリが default_zero関数無しで by locationid のマルチモニターなので、ワーカーコンテナが停止してもアラート状態には遷移せず、NoData状態となります。※[検証](#検証)項参照
![2021-12-02_12h29_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/89032a22-bd9c-632c-4608-99aa2aeef557.png)

ただし、１０分間データ欠落した場合に通知するオプションが指定されている為、アラートイベントは発報されます。
![2021-12-02_12h31_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/c6bd40ef-805b-bcc6-52b3-3aa2a5618fba.png)
![2021-12-02_12h30_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/4a7dbf69-cea0-1599-12ad-b3e99324b4d1.png)

この要件で問題無ければ、特にモニターを自作しなくてもプライベートロケーションが監視出来るので良いですね。

# 参考
[Synthetics メトリクス](https://docs.datadoghq.com/ja/synthetics/metrics/)
[補間 - Datadog Docs](https://docs.datadoghq.com/ja/dashboards/functions/interpolation/)
[モニター評価での as_count() - Datadog Docs](https://docs.datadoghq.com/ja/monitors/guide/as-count-in-monitor-evaluations/)

[Monitor your private location - Datadog Docs](https://docs.datadoghq.com/synthetics/private_locations/#monitor-your-private-location)
[Private Location Monitoring - Datadog Docs](https://docs.datadoghq.com/synthetics/private_locations/monitoring/)