この記事は ReviCo Advent Calendar 2025 の22日目の記事です。
週末はReviCoのむーたさんによるOpenSearchをアップデートしようとしてハマった話でした。
はじめに
こんにちは、ReviCoのレコメンドチームで開発をしているおとです。
数日前にうっちさんの「NewRelicのLog Parsing機能でテナント毎のログ監視を実現する」記事が出ていました。
本記事はその次の段として「抽出した属性を使って、通知をさらに賢くする」ためにAlerts の Workflows にある Enrich your data(以下Enrich dataと表記) を使ってレコメンドチームで設定しているアラートについての記事です。
New Relic のアラート通知は「何が起きたか」はすぐ分かる一方で、結局 New Relic を開いて該当ログを探しにいく…という流れになりがちです。
そこでレコメンドチームでは、
- アラート発火時に 追加のNRQL を実行し
- その結果を 通知テンプレート(Webhook) に埋め込み
- 通知に該当ログ(1次情報)を載せることで初動対応をしやすくする
ということをしています。具体的な設定方法は次のとおりです。
前提
- 対象ログが
Logイベントとして New Relic に取り込まれている - ログに以下のような属性がある(例)
BatchName-
TotalElapsedTime
※BatchNameとTotalElapsedTimeはLog Parsing機能でログメッセージから属性として取り込むようにした項
- Alerts & AI の Workflows / Destinations を使って通知している(旧 Notification channel ではなく)
1. Alert Condition:FACET
例として、「実行時間にテナント毎で30分以上かかってるバッチがあったら通知する」ことを目的とした
次のようなNRQLを設定したAlert Conditionがあるとします。
SELECT COUNT(*)
FROM Log
WHERE BatchName IS NOT NULL AND ElapsedTime > '00:30:00'
FACET Tenant,BatchName
ここで大事なのが FACET BatchName です。
「どの BatchName でアラートが上がったか」という値を後段(Workflows)で使います。
2. Workflows:Enrich data を設定する
Alert Workflows を開き、Enrich data を追加します。
2-1. FACET値は {{accumulations.tag.<facet>}} で参照できる
Alert Condition のクエリが FACET されている場合、Workflows のクエリで 「トリガーになったFACET値」 を参照できます。
今回の FACET BatchName なら、次を使えます:
{{accumulations.tag.BatchName}}
注意:accumulations は「実際にアラート(issue)が発火したとき」に値が入るため、設定時のプレビューやテスト送信では null になりやすいです。
Enrich data で使用できる{{...}} 形式の“パラメータ”は 1つまでのようなので(2つ以上設定しようとするとエラーになる)、今回Tenantは諦めてBatchNameのみを使用しています。
両方を使用してクエリを書きたい場合は、Log Parsingで、TenantとBatchNameを複合した項目を用意する必要がありそうです。
2-2. Enrichクエリに名前を付ける(例:tenantjoblog)
Enrich data には Query name(名前)を付けます。今回は tenantjoblog とします。
この名前が、後で通知テンプレートから参照するキーになります。
2-3. Enrich用NRQL(例:該当BatchNameのログを拾う)
「アラートが上がった BatchName のログだけ」に絞り、「最新1件だけ」通知に載せるイメージです。
SELECT BatchName,Tenant,ElapsedTime
FROM Log
WHERE ElapsedTime > '00:30:00' AND BatchName = {{accumulations.tag.BatchName}}
LIMIT 1
3. 通知テンプレート:Enrich data の結果を参照する
Workflows の通知(Slackなど)のテンプレート編集で、{{ を打つと変数候補が出ます。
Enrich data を追加していると、その結果が上の方に出るはずです。
4. まずは構造確認
整形する前に、最初は、丸ごと出して構造を確認すると早いです。
{{#if tenantjoblog}}
{{json tenantjoblog}}
{{else}}
tenantjoblog is Empty
{{/if}}
これで joblog の中にどんなキーがあるか(result が配列なのか等)が分かります。
5. Handlebar syntax で通知したい情報を出力
今回のEnrich data の結果を出力する際の通知テンプレートは以下のようになります。
レコメンドチームではWebhookを使ってSlackに通知しているため、エラーにならないよう整えています。
{{#if tenantjoblog}}
{{#each tenantjoblog.[result]}}
"{{#each this}}
{{#if @first}}
*Details*\n
{{else}}
*{{@key}}*\n{{this}}
{{#unless @last}}\n
{{/unless}}
{{/if}}
{{/each}}"
{{else}}
"tenantjoblog.[result] is Empty"
{{/each}}
{{else}}
"tenantjoblog is Empty"
{{/if}}
軽く解説
-
{{#if joblog}} ... {{/if}}
Enrich結果が無い(またはテスト送信で null)時に落ちないようガード -
{{#each joblog.[result]}}
Enrichで返った複数行(複数ログ)をループ -
{{#each this}}
1行の中の各キー(BatchName/TotalElapsedTime/message等)をループ -
{{@key}}
いま見ているキー名 -
{{escape this}}
"などが混ざってもテンプレが壊れにくいようにエスケープ(特にWebhook系で事故りやすい)
@first / @last / @key は Handlebars の each で使えるメタ変数です。
今回は「最初の1行はなぜか空っぽになりがち」だったので、Details 見出しだけ出す用途にしています。
6. できあがり
Slackに来る通知が例えばこんな感じになります。
Detailsの部分が今回Enrich dataで取得した部分です。
おわりに
本記事の例では「どのバッチ処理でどのテナントに何分かかっているのか」という情報を通知できるようにしました。
- Alert Condition の
FACETは、グラフを分けるだけじゃなく「Workflows側にトリガー値を渡す鍵」になる - Workflows の Enrich data を使うと、通知に一次情報(ログの中身)を載せられる
- 通知テンプレは Handlebars(ひげ構文)で十分整形できる
これを応用することで、さらに通知する情報を増やし、アラート発砲時の初動対応を迅速に行うことができます。
ぜひ活用してみてください。
参考リンク
-
New Relic Docs:ワークフロー変数(FACET値を
accumulations.tagで使う)
https://docs.newrelic.com/jp/docs/alerts/get-notified/custom-variables-incident-workflows/ -
New Relic Docs:通知メッセージテンプレート(Handlebars / json / escape など)
https://docs.newrelic.com/jp/docs/alerts/get-notified/message-templates/ -
EOL:FACET on messageId and timestamp in Alert Conditions
https://docs.newrelic.com/eol/2025/07/deprecating-alert-conditions/ -
Handlebars Built-in Helpers(@first/@last/@key など)
https://handlebarsjs.com/guide/builtin-helpers.html


