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?

この記事は 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
      BatchNameTotalElapsedTimeは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 を追加します。

image.png

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で、TenantBatchNameを複合した項目を用意する必要がありそうです。

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 を追加していると、その結果が上の方に出るはずです。

image.png

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で取得した部分です。

image.png

おわりに

本記事の例では「どのバッチ処理でどのテナントに何分かかっているのか」という情報を通知できるようにしました。

  • Alert Condition の FACET は、グラフを分けるだけじゃなく「Workflows側にトリガー値を渡す鍵」になる
  • Workflows の Enrich data を使うと、通知に一次情報(ログの中身)を載せられる
  • 通知テンプレは Handlebars(ひげ構文)で十分整形できる

これを応用することで、さらに通知する情報を増やし、アラート発砲時の初動対応を迅速に行うことができます。
ぜひ活用してみてください。


参考リンク

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?