DatadogのモニターとPagerDutyのアラートを連携するにあたって困ったこと

# はじめに

みなさんこんにちは！今回は、DatadogのMonitorからの通知をPagerDuty側でAlertとして連携する際に困ったことがありましたので、原因と解決策についてご紹介します。

# 前提

DatadogとPagerDutyにおける前提は以下の通りです。

* Datadog Monitorはそれぞれ以下を監視
  * Monitor①：クラウドコストを監視
  * Monitor②：SLOを監視
* Monitorからの通知は、PagerDutyのService Integrationを経由して連携

# 今回発生した事象

今回発生した事象は、Monitor①、②の通知を以下の条件で発報した状況において、「2つのMonitorからの通知がPagerDutyでは1つのAlert(Incident)として認識されてしまう」というものでした。

1. Monitor①の通知が発報
2. Monitor①に紐づくAlert①(Incident①)はOpenのまま、Monitor②の通知が発報

DatadogとPagerDutyの関係を以下に示します。当初は青枠のように2つのMonitorは別々のAlert(Incident)として認識される事を期待していましたが、実際は赤枠のように2つのMonitorが1つのAlert(Incident)にまとめて認識されてしまいました。

![image1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/387de175-1c08-4998-81f1-28130dc50cf5.png)

:::note warn
もちろん、根本原因が共通しており対応が同じ通知は集約することでノイズアラート低減などの効果はあると思います。ただ、今回のクラウドコストとSLOのような、明らかに対応の異なる通知が1つに集約されてしまうことで、**インシデントの見逃しや対応状況を適切に管理できない可能性**があります。
:::

# 原因

原因としては、2つのDatadog Monitorからの通知が、PagerDutyでは同じAlert Keyになっていたことが挙げられます。上記の条件でDatadog Monitorの通知を発報させPagerDutyで確認したところ、Alert Keyが同じである事を確認出来ました。インシデントの番号(# XXX)が同じ値であることからも1つのインシデントとしてまとめて認識されていることが分かります。

![image2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/f4c150aa-c747-4df6-9ecf-6b9de58ed808.png)

PagerDutyのナレッジベースの[インシデントの重複排除](https://support.pagerduty.com/main/docs/event-management#deduplicate-incidents)に関する記載からも、今回の事象はAlert Keyが同じであったことが原因と考えられます。機械翻訳したものを以下に示します。(上記スクリーンショットのAlert Keyがdedup_keyに対応します)

> dedup_key / incident_key は、トリガーイベントを適用する場所を示す大文字と小文字を区別する識別子であり、後続のアラート/インシデントの重複を排除します。
>
> * このキーを持つ未解決のインシデントがない場合は、新しいインシデントが作成されます。
> * 一致するキーを持つ未解決のインシデントがある場合、新しいイベントは、追加のトリガー ログ エントリとしてそのインシデントのアラート ログに追加されます。
> ・・・

# 解決策

DatadogのTag機能、PagerDutyのService Orchestration機能を使用して、2つのDatadog Monitorに対して別々のAlert Keyを割り当てることで今回の事象を解決しました。それぞれ実施したことを以下に示します。

* Datadog
Monitorを一意に識別できる文字列をTagに付与。(今回はMonitor IDを付与。)

* PagerDuty
Service Orchestrationにて、Alert KeyをDatadogで付与したTagに書き換えるルールの実装。

通知からインシデントの起票までの概要を以下に示します。Datadog、PagerDutyそれぞれの設定画面は次項に示します。

![image3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/d23e7a60-8894-4883-ac30-f93a2d35056a.png)

:::note info
PagerDutyのService Orchestrationで実装した部分はGlobal Orchestrationでも実装可能です。
:::

## Datadogの設定画面

DatadogではMonitor IDをタグ情報に付与しています。

![image4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/daf4f1aa-fe93-4202-ac40-3be9e5568798.png)

## PagerDutyの設定画面

PagerDutyでは、まず正規表現を用いてDatadogで付与したTagを抽出し変数として格納しています。次に、dedup_keyを変数に書き換えています。

![image5.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/9770b611-cfac-48e5-8b00-a08fd6d32617.png)

# 結果

PagerDutyにて確認したところ、Alert KeyがDatadogで設定したTagに書き換えられていることを確認出来ました。インシデントの番号(# XXX)が異なる値であることからも別々のインシデントとして認識されていることが分かります。

![image6.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/ee6786f5-a3ed-4f19-a768-ea3e9e5729f9.png)

# 終わりに

いかがだったでしょうか。DatadogのモニターとPagerDutyのアラートを連携するにあたって困ったことと解決策についてご紹介しました。もしこの記事がお役に立ちましたら、「いいね」「記事のストック」をお願いします！

---

- Datadog は、米国その他の諸国における Datadog Inc. またはその関連会社の商標です。
- PagerDuty は、米国その他の諸国における PagerDuty, Inc. またはその関連会社の商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。