0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PagerDutyAdvent Calendar 2024

Day 5

PagerDuty の Event Orchestration の正規表現でつまずいた

Last updated at Posted at 2024-12-12

PagerDuty Advent Calendar の5日目の記事です。

私は Professional Services Consultant として 9月に PagerDuty に入社しました。

PagerDuty は UI も比較的シンプルで、ドキュメントも整備されており、数ある SaaS の中ではかなり習熟しやすい部類だなと個人的には思っています。とは言え製品習熟にあたってつまずいたポイントがいくつかあり、本日はその中で Event Orchestration の正規表現のお話をしようと思います。

そもそも Event Orchestration って

具体的にどこでつまずいたかに入る前に、Event Orchestration がどういう機能なのか、簡単に説明します。詳細は以下の記事をご覧いただいた方が良いですが、超ざっくりは、"監視ツールから飛んできたアラート / イベントの内容に応じて、実施するアクションを制御する機能" です。

"実施するアクションを制御" って何… というツッコミが入りそうですが、例えば以下のようなことが自動でできます。

  • 起票されるインシデントに対応方法のノートを追記する
  • Severity や Urgency を変更する
  • インシデントの通知先を変更する
  • そもそもインシデント起票しない(=通知しない)

このいろいろできる Event Orchestration なのですが、正規表現を使ってアラートの中の特定の文字列を取り出して加工する、ということができます。メール形式のアラートを PagerDuty に連携する場合によく使います。

上記の記事の記載を丸パクリですが、例えば PagerDuty に送信するアラートのメールが以下だとすると、

Subject: High API auth errors: 2% - prod-apigw-d01
To: (省略)
From: (省略)
cc: 

High API auth errors

Timestamp: 2023-12-30T04:24:15.041Z

Event ID: ABF023995
Auth Error Rate: 27
Server: prod-apigw-d01
Priority: 1

Event: trigger Severity: warning Source: prod-apigw-d01 Category: API Gateway User: N/A

正規表現を使って "Server:" や "Severity:" 以降の文字列を抜き出し、
image.png

custom_details というフィールドに入れることができます。
image.png

すると起票されたインシデントに以下のように表示され、見やすくなりますし取り出した値(event.custom_details.Server / event.custom_details.Severity)を使ったルールを別途書くこともできます。
image.png

メールは json のように構造化されたデータではないので、メールでアラート連携されるお客様は "正規表現を使って必要な情報を取り出す" ということを非常によく行います。

正規表現でつまずいた例

メールアラート連携する場合に非常によく使う正規表現なのですが、「正規表現がマッチしねー」という現象がよく起こります。

例えばメールの中に以下のような文字列があり、

Server
Severity
Description
dc03host025
warning
CPU usage exceeds 80%

後半3行を取り出して、以下のように custom_details に入れたいとします。

"event.custom_details.Server": "dc03host025"
"event.custom_details.Severity": "warning"
"event.custom_details.Description": "CPU usage exceeds 80%"

前半3行の文字列 (Server, Severity, Description) が固定という前提なら、以下の正規表現でそれぞれ取り出せるかなぁと思いました。
Description\n(.*)\n
Description\n.*\n(.*)\n
Description\n.*\n.*\n(.*)

https://regex101.com で実験してみるとうまくいきそうです。でも Event Orchestration で動かすとうまくいきませんでした。なんで???
image.png

ソリューション

https://regex101.com でまず実験してみるのは良いのですが、Event Orchestration と動作を一致させるには、設定が必要です。具体的には以下です。

  • FLAVOR を Golang にする
  • REGEX FLAGS は multi line, insensitive, single line を選ぶ

スクリーンショット 2024-12-12 11.13.31.png

この設定をすると、元々の正規表現だと、マッチする範囲が意図からずれていることがわかります。
image.png

今回のケースで特に効くのが single line の REGEX FLAG で、このフラグを立てると、. は改行含め何でもマッチするようになります。したがって、今回のように一行だけ値を取り出したい場合は、(.*) ではなく、([^\n]*) がおすすめです。

従って、今回のケースでは、以下のような正規表現になります。(「multi line のフラグ立ててるんだから、^$を使えよ」って言われそうですが)
Description\n([^\n]*)\n
Description\n[^\n]*\n([^\n]*)\n
Description\n[^\n]*\n[^\n]*\n([^\n]*)

image.png

「正規表現がマッチしねー」問題は、この対応で半分くらい(?)解決するかと思います。

最後に

実はもう1つハマったポイントがあるのですが、長くなるので今回はここまでとし、第2弾はまた別の機会に投稿します。

なお、本投稿の内容は以下に詳しく記載されているので、ご興味のある方はご参照ください。
https://support.pagerduty.com/main/lang-ja/docs/regular-expressions#test-your-regex

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?