はじめに

こんにちは、MSPの田所です。

インシデント管理プラットフォーム PagerDuty には Event Orchestration という機能があります。
主に不要なアラートの抑制や、データの標準化のために使われるのですが、できることは多岐に渡ります。

今回は Event Orchestration によるタイトル編集とカスタムフィールドの追加をご紹介します。

Before

After

 

Event Orchestration とは

インシデント対応のよくある悩みとして、「アラート疲れ」が挙げられます。
これは重要度の低いアラートや、ひとつの原因から来る関連アラートが大量に押し寄せることにより、アラート対応の生産性の低下や、対応者の疲弊を引き起こすことを言います。
そしてそれらは重要なアラートの見落としリスクにも繋がります。

そこで PagerDuty は Event Orchestration というアラートの削減・自動化を後押しする機能を提供しています。

Event Orchestration は Event Rules の進化版の位置付けです。

PagerDutyのイベントオーケストレーション機能は「個々の自動化されたタスク」や「手作業」を連携させ、一連のワークフローを自動化するものです。これにより、繰り返し行ってきた煩雑な手作業を減らすことができ、エンジニアはノイズとなる通知に悩まされることなく、重要なインシデント対応に集中できるようになります。

具体的には以下4つのフローで実現します。

  • Integrations(Orchestration のエンドポイントの提示)
  • Global Orchestration(共通のルールやアクションの実行)
  • Service Routes(PagerDuty サービスへの通知)
  • Service Orchestrations(サービスごとのルールやアクションの実行)

まず監視ツールと連携を結んだ上で、発生したアラートに対して共通アクションを実行し、続いて PagerDuty サービスごとに設定したアクションを実行、そしてインシデント作成の流れとなります。

そうすることで以下のような悩みも全て解決!

  • 同じようなアラートはひとつのインシデントにまとめて欲しい
  • 特定の時間帯のアラートは出さないで欲しい
  • インシデントの優先順位を可視化して欲しい
  • 特定のアラートはしばらく待ってから検出して欲しい
  • タイトルや内容を見やすくして欲しい(今回はこちら)

今回はタイトルや内容の編集についてご紹介します。

 

Amazon SNS から PagerDuty への通知

Amazon SNS から PagerDuty にメール通知するケースを考えてみます。

PagerDuty サービスは典型的な設定として、全てのメールを受け入れて、同じ件名のものはまとまるようになっています。
内容が異なるアラートはそれぞれ検出、同じアラートは連発しても1件だけの検出、とする設定です。

この状況で、Amazon SNS トピックから PagerDuty サービスに向けてメッセージを発行します。
アラートを想定して、例えば以下のようなメッセージとします。

番号 件名 本文
1 Keepalive 監視名:死活監視
サービス:EC2
閾値:応答なし1分間
対象:web-1
リンク:Monitoring1
2 Keepalive 監視名:死活監視
サービス:EC2
閾値:応答なし1分間
対象:web-2
リンク:Monitoring2
3 CPUUtilization 監視名:CPU使用率
サービス:EC2
閾値:90%以上5分間
対象:web-1
リンク:Monitoring3
4 CPUUtilization 監視名:CPU使用率
サービス:RDS
閾値:90%以上5分間
対象:db-1
リンク:Monitoring4

Amazon CloudWatch とインテグレーションを結べばアラートタイトルの情報はもう少し充実しますが、今回は質素なサードパーティー製のツールということで。

メッセージ発行の結果は以下のようになります。

この場合、問題点は大きく2つあります。

  • タイトルの情報が少なすぎること
  • 同じタイトルのアラートがまとまっていること

これらを解消する方法を見ていきます。

 

タイトルや本文を編集する

1. Event Orchestration を設定する

まず、Event Orchestration を作成します。
そのエンドポイントを Amazon SNS と PagerDuty サービスの間に挟む構成となります。

Integrations の Email Address を SNS サブスクリプションに登録し、

Global Orchestration は今回は割愛、
Service Routes で PagerDuty サービスにルーティング設定し、

Service Orchestrations でアクションを設定していきます。

 

2. タイトルを編集する

変数の追加

Edit Event Rule > Variables > [+ Rule Variable] から変数を追加します。
今回は「サービス」「対象」「監視名」をメッセージ本文から抜き出します。
抜き出したい変数は正規表現で表します。

Variable Name Event Field Extraction Regex
Service event.custom_details.plain_body サービス:([^\n]+)
Target event.custom_details.plain_body 対象:([^\n]+)
MonitorName event.custom_details.plain_body 監視名:([^\n]+)

 

フィールドの設定

Edit Event Rule > Incident Data > Event Fields でタイトルを設定します。
summary がインシデントのタイトルにあたります。

Event field to set Replace using Replace with value
summary Template {{variables.Service}} : {{variables.Target}} で {{variables.MonitorName}} のアラートを検知しました

先ほどと同じメッセージを再度発行すると、以下のようになります。
タイトルの情報が充実しましたね。

 

3. Custom Details を設定する

今回はメッセージ本文の内容はすっきりしていますが、とても長くて情報が埋もれてしまうケースも考えられます。
そんな場合には Custom Details を設定すると、インシデント内で抜き出して表示できます。
同じく変数とフィールドを設定します。
今回は「対象」と「リンク」を抜き出します。

変数の追加

Edit Event Rule > Variables > [+ Rule Variable] から変数を追加します。
「対象」は先ほどすでに登録済みです。

Variable Name Event Field Extraction Regex
Target event.custom_details.plain_body 対象:([^\n]+)
Link event.custom_details.plain_body リンク:([^\n]+)

 

フィールドの設定

Edit Event Rule > Incident Data > Event Fields で Custom Details に追加するフィールドの名前と値を設定します。

Event field to set Replace using Replace with value
custom_details.Target Template {{variables.Target}}
custom_details.Link Template {{variables.Link}}


設定前後でインシデントの内容は以下のように変化しました。

Before

After

 

トリアージを調整する

1. 同じタイトルであることの問題点

Service Orchestrations でタイトルを編集できることを見てきました。
しかし4件のメッセージ発行に対して、2件のインシデントしか検出しない問題は残っています。
これは PagerDuty がメッセージの件名で同じアラートかどうかを判断していることに起因します。

多くの場合は異なるタイトルで検知するかと思いますが、例えばタイトル指定できないようなケースではまとまらない考慮が必要です。

 

2. 重複排除キーの活用

それに対して PagerDuty は解決策を用意しています。
“dedup_key” を設定することで、件名ではなく指定した条件で同じアラートかどうかを判断するよう変更できます。

Edit Event Rule > Incident Data > Event Fields で dedup_key とその条件を設定します。
今回は event.summary を指定して、編集後のタイトルを重複削除キーとして設定します。

編集後のタイトルには「サービス」「対象」「監視名」が含まれているため、これら組み合わせで判定されることになります。

Event field to set Replace using Replace with value
dedup_key Template {{event.summary}}

dedup_key で編集後のタイトルを指定

ようやく4つとも検出できました。

 

またここで「対象」だけを指定すると、対象リソース単位でアラートがまとめられていることを確認できます。
dedup_key で「対象」のみを指定

対象リソース単位 (web-1, web-2, db-1) でアラートがまとまりました。

 

おわりに

以上、PagerDuty Event Orchestration でタイトルと Custom Details を編集し、重複排除キーを利用する方法をご紹介しました。
さらに条件分岐を指定できたり、今回割愛した Global Orchestration を組み合わせたり、インシデント対応の負荷を下げるための手段は数多く用意されていると感じます。

どうせなら少しでも快適なインシデントライフ(?)を送りましょう!

おしまい