すべてのプロダクト
Search
ドキュメントセンター

:通知テンプレートとWebhookテンプレートを設定する

最終更新日:Dec 30, 2024

指定された通知ポリシーのアラートルールがトリガーされると、ARMSはDingTalk、Lark、WeCom、テキストメッセージ、電話、メール、またはWebhookによってアラート通知を送信します。ARMSは、通知方法ごとに事前設定された通知テンプレートを提供します。事前設定された通知テンプレートが要件を満たしていない場合は、通知テンプレートを変更できます。このトピックでは、Goテンプレート構文、事前設定された通知テンプレート、およびテンプレート内の変数について説明します。

Goテンプレート構文

ARMSは、Goテンプレート構文を使用して通知テンプレートをレンダリングします。Goテンプレート構文を使用してテンプレートをレンダリングする場合、テンプレートはコンテキストに基づいて入力されます。

説明

通知テンプレートのアラートパラメータは、複数のラベルで構成されています。ラベルを使用して、必要なアラートパラメータをカスタマイズできます。たとえば、この例のalertnameラベルは、アラート名を示します。

次のサンプルコードは、一般的なGoテンプレートの構文を示しています。

{
  "alerts": [
    {
      "annotations": {
        "message": "Namespace: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / Container: kube-state-metrics. The memory usage of the container has exceeded 80%. Current value: 15.52%.",
        "value": "15.521240234375"
      },
      "endsAt": "2023-02-22T07:27:15.404000000Z",
      "fingerprint": "bec72890cc2c7b4a027e008df0cd1013",
      "labels": {
        "container": "kube-state-metrics",
        "severity": "warning",
        "instance": "10.0.80.186:10255",
        "clustername": "klyz1688-kubernetes-1",
        "alertname": "The memory usage of the container has exceeded 80%.",
        "_aliyun_arms_involvedObject_name": "klyz1688-kubernetes-1",
        "pod_name": "kube-state-metrics-ccb59dbff-jljg4",
        "_aliyun_arms_involvedObject_kind": "cluster",
        "name": "k8s_kube-state-metrics_kube-state-metrics-ccb59dbff-jljg4_arms-prom_359508f3-7e76-4740-b915-41ea48849641_0",
        "namespace": "arms-prom"
      },
      "startsAt": "2023-02-22T07:18:15.578000000Z",
      "status": "firing"
    }
  ],
  "commonAnnotations": {
    "message": "Namespace: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / Container: kube-state-metrics. The memory usage of the container has exceeded 80%. Current value: 15.52%.",
    "value": "15.521240234375"
  },
  "commonLabels": {
    "container": "kube-state-metrics",
    "severity": "warning",
    "instance": "10.0.80.186:10255",
    "clustername": "klyz1688-kubernetes-1",
    "alertname": "The memory usage of the container has exceeded 80%.",
    "_aliyun_arms_involvedObject_name": "klyz1688-kubernetes-1",
    "pod_name": "kube-state-metrics-ccb59dbff-jljg4",
    "_aliyun_arms_involvedObject_kind": "cluster",
    "name": "k8s_kube-state-metrics_kube-state-metrics-ccb59dbff-jljg4_arms-prom_359508f3-7e76-4740-b915-41ea48849641_0",
    "namespace": "arms-prom"
  },
  "groupLabels": {
    "alertname": "The memory usage of the container has exceeded 80%."
  },
  "status": "firing",
  "startTime":"2023-02-22 07:18:15",
  "endTime":"The time when the alert was cleared", // アラートがクリアされた時刻
  "level":"error",
  "dispatchRuleName":"Notification policy name", // 通知ポリシー名
  "alarmId":"123456"
}

ドット(.)

ドットは、現在のスコープ内のコンテキストを示すために使用されます。

例1:上記のサンプルコードに示されているトップレベルスコープ内のすべてのコンテキストを取得します。

{{ . }}

出力:上記のサンプルコードのコンテキストが返されます。

例2:コンテキスト内のlevelフィールドを取得します。

{{ .level }}

出力:

error

例3:コンテキスト内のcommonLabels.alertnameフィールドを取得します。

{{ .commonLabels.alertname }}

出力:

The memory usage of the container has exceeded 80%.

変数

Goテンプレートに渡されるデータは、テンプレートの変数に格納してアクセスできます。たとえば、$context変数を{ {$context := .}}アクションで使用して渡されたデータを変数に保存すると、{{$context}}アクションを使用して変数にアクセスできます。

例1:アラート名を$alertname変数に割り当てます。次に、$alertname変数の値が返されます。

{{ $alertname := .commonLabels.alertname }} {{$alertname}}

出力:

The memory usage of the container has exceeded 80%.

例2:alertsリストの最初の要素を$alert0変数に割り当てます。次に、最初のアラート(要素)のalertnameが返されます。

{{ $alert0 := index .alerts 0 }} {{$alert0.labels.alertname}}

出力:

The memory usage of the container has exceeded 80%.

ifおよびelseアクション

データを確認するためにifアクションを実行できます。ifアクションがビジネス要件を満たしていない場合は、elseアクションを実行できます。null値、0、nilポインタ、空の文字列、または長さゼロの文字列の場合、falseが返されます。

例1:アラートイベントのseverityタグの値がwarningの場合、P3アラートが生成されます。

{{if eq "warning" .commonLabels.severity }} P3 alert {{ end }}

出力:

P3 alert

例2:アラートイベントのseverityタグの値がcriticalの場合、P1アラートが生成されます。それ以外の場合は、P2アラートが生成されます。

{{if eq "critical" .commonLabels.severity }} P1 alert {{ else }} P2 alert {{ end }}

出力:

P2 alert

forアクション

forアクションは、コードを繰り返し実行するために使用されます。

例1:alertsリストをトラバースし、各アラートのalertnameを取得します。

{{ for .alerts}} {{.labels.alertname}} \n {{end}}

出力:

The memory usage of the container has exceeded 80%.
                

rangeアクション

rangeアクションは、指定されたコンテンツをトラバースするために使用されます。

例1:0から9までの整数をトラバースします。

{{ $ran := range 0 10 }} {{ for $ran }} {{.}} {{end}}

出力:

 0 1 2 3 4 5 6 7 8 9

index関数

index関数は、配列内の要素を取得するために使用されます。

例1:alertsリストの最初の要素を取得し、$alert0変数に値を割り当てます。

{{ $alert0 := index .alerts 0 }} {{$alert0.labels.alertname}}

出力:

 The memory usage of the container has exceeded 80%.

比較関数

一般的な比較関数:

  • eq:等しい

  • ne:等しくない

  • lt:より小さい

  • le:以下

  • gt:より大きい

  • ge:以上

例:severityタグの値がcommonLabelsセクションでwarningと等しい場合、P3アラートが生成されます。

{{if eq "warning" .commonLabels.severity }} P3 alert {{ end }}

出力:

  P3 alert

論理関数and、or、およびnot

例:severityタグの値がcommonLabelsセクションでwarningまたはwarnningと等しい場合、P3アラートが生成されます。

{{if or (eq "warning" .commonLabels.severity) (eq "warning" .commonLabels.severity) }} P3 alert {{ end }}

出力:

  P3 alert

一般的な組み込み関数

printf:出力データをフォーマットします。

例:valueの最初のアラートのalertsリストの小数点以下2桁に丸められて返されます。

{{ $alert0 := index .alerts 0 }} {{ printf "%.2f" $alert0.annotations.value }}

出力:

  15.52

humanizePercentage:パーセンテージをフォーマットします。

例:文字列0.95332123123124をより読みやすいパーセンテージに変換します。

{{ "0.95332123123124" | humanizePercentage }}

出力:

95.33%

humanizeDate:ミリ秒のタイムスタンプを日付に変換することにより、日付をフォーマットします。デフォルトの日付形式は、yyyy-MM-dd HH:mm:ssです。

例:タイムスタンプ1671074058234を日付に変換します。

{{ "1671074058234" | humanizeDate }}

出力:

2022-12-15 11:14:18

len:配列の長さを取得します。

例:alertsリストの長さを取得します。

{{ len .alerts }}

出力:

1

事前設定された通知テンプレート

メール通知テンプレート

アラート名: {{ .commonLabels.alertname }}
{{if .commonLabels.clustername }}
クラスター名: {{ .commonLabels.clustername }}
{{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
アプリケーション名: {{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}
通知ポリシー: {{ .dispatchRuleName }}
アラート発生時刻: {{ .startTime }}
アラート内容: {{ if .newIncidentIn }} (新規イベント) {{ end }} {{ for .alerts }} {{.annotations.message}} {{ if .generatorURL }} <a href="{{.generatorURL}}" >詳細URL</a> {{end}} {{end}}

テンプレートの内容

説明

アラート名: {{ .commonLabels.alertname }}

アラートの名前。デフォルトでは、通知ポリシーはalertnameでグループ化されます。したがって、アラートに関連するすべてのイベントは同じアラート名を持ちます。

{{if .commonLabels.clustername }}
クラスター名: {{ .commonLabels.clustername }}
{{ end }}

イベントにclusternameラベルが存在する場合、clusternameラベルの値はクラスター名フィールドとしてレンダリングされます。

{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
アプリケーション名: {{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}

アラートをトリガーするオブジェクトのタイプがappの場合、対応するアプリケーションの名前が返されます。

通知ポリシー: {{ .dispatchRuleName }}

アラートに一致する通知ポリシーの名前。

アラート発生時刻: {{ .startTime }}

アラートが発生した時刻。

アラート内容:{{ if .newIncidentIn }} (新規イベント) {{end}} 
{{ for .alerts }} {{.annotations.message}} {{if .generatorURL }} <a href="{{.generatorURL}}" >詳細URL</a> {{end}} {{end}}

アラートイベントリストをトラバースして、message値をレンダリングします。イベントにgeneratorUrlフィールドが含まれている場合、generatorUrlフィールドの値はイベント詳細のURLとしてレンダリングされます。

説明

HTML構文<a></a>は、URLをレンダリングするために事前設定テンプレートで使用されます。

<a href="{{.generatorUrl}}">詳細URL</a>

{{ if .newIncidentIn }} (新規イベント) {{end}}:アラートグループで新しいイベントが発生した場合、現在の通知がマークされ、新規イベントが返されます。

サンプルコードをレンダリングに使用した後、次の結果が返されます。

アラート名: The memory usage of the container has exceeded 80%.
クラスター名: klyz1688-kubernetes-1
通知ポリシー: Notification policy name
アラート発生時刻: 2023-02-22 07:18:15
アラート内容: Namespace: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / Container: kube-state-metrics. The memory usage of the container has exceeded 80%. Current value: 15.52%.

テキストメッセージと電話通知テンプレート

テキストメッセージと電話通知テンプレートの内容は、アラート詳細のURLが含まれていないことを除いて、メールテンプレートと同じです。

{{ .level }} アラートが発生しました
アラート名: {{ .commonLabels.alertname }}
{{if .commonLabels.clustername }}
クラスター名: {{ .commonLabels.clustername }}
{{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
アプリケーション名: {{ .commonLabels._aliyun_arms_involvedObject_name }}
{{ end }}
通知ポリシー: {{ .dispatchRuleName }}
アラート発生時刻: {{ .startTime }}
アラート内容: {{ if .newIncidentIn }} (新規イベント)
 {{end}} {{ for .alerts }} {{ .annotations.message }} {{ end }}
            

チャットボット通知テンプレート

{{ if .newIncidentIn }} (新規イベント) {{end}}
{{if .commonLabels.clustername }}
 >  クラスター名: {{ .commonLabels.clustername }}
 {{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}
 >  アプリケーション名: {{ .commonLabels._aliyun_arms_involvedObject_name }}
 {{ end }}
{{ for .alerts }} >  {{ .annotations.message }} {{if .generatorURL }} [詳細URL]({{.generatorURL}})  {{end}}{{if .annotations._aliyun_arms_insights_analyze_link }}[<font color='#ff0000'>根本原因</font>]({{ .annotations._aliyun_arms_insights_analyze_link}}){{ end }}{{if  eq "1" .labels._aliyun_arms_denoise_code }} (重要: {{.labels._aliyun_arms_important_reason }}) {{end}}

{{end}}

ロボットのレンダリング結果はMarkdownで返されます。チャットボットごとに、サポートされるMarkdown機能が異なります。

  • 参照:>

  • フォントの色:

    <font color='#ff0000'>根本原因</font>
    説明

    フォントの色を変更できるのは、DingTalkとWeComのみです。Larkではフォントの色を変更できません。

  • 改行:

    • DingTalkの改行:テンプレートでEnterキーを2回押します。

    • Larkの改行:テンプレートでEnterキーを1回だけ押します。

    • WeComの改行:テンプレートでEnterキーを1回だけ押します。

Webhookテンプレート

{
  "Alert name":"{{ .commonLabels.alertname }}
{{if .commonLabels.clustername }}", "Cluster name":"{{ .commonLabels.clustername }} {{ end }}
{{if eq "app" .commonLabels._aliyun_arms_involvedObject_kind }}", "Application name":"{{ .commonLabels._aliyun_arms_involvedObject_name }} {{ end }}",
  "Notification Policy":"{{ .dispatchRuleName }}",
  "Alert triggered at":"{{ .startTime }}",
  "Alert content":"{{ for .alerts }} {{ .annotations.message }} {{ end }}"
}

サンプルコードをレンダリングに使用した後、次の結果が返されます。

{
  "Alert name": "The memory usage of the container has exceeded 80%.",
  "Cluster name": "klyz1688-kubernetes-1",
  "Notification policy": "Notification policy name", // 通知ポリシー名
  "Alert triggered at":"{{ .startTime }}", // アラート発生時刻
  "Alert content": "Namespace: arms-prom / Pod: kube-state-metrics-ccb59dbff-jljg4 / Container: kube-state-metrics. The memory usage of the container has exceeded 80%. Current value: 15.52%."
}

変数

次の表に、通知テンプレートで使用できる変数を示します。

変数

説明

alarmId

元のアラートのID。

alerts

元のアラートイベント。データ型はList<Alert>です。

alerts.annotations

元のアラートの注釈。データ型はMap<String, String>です。

alerts.endsAt

元のアラートがクリアされた時刻。

アラートがクリアされた時刻は、アラートが発生した時刻にアラートのクリアに費やされた時間を加えたものです。

alerts.startsAt

元のアラートが発生した時刻。

alerts.fingerprint

元のアラートのフィンガープリント。1つのラベルグループのアラートは、同じフィンガープリントを持ちます。

alerts.labels

元のアラートのラベル。

alerts.status

元のアラートのステータス。有効な値:

  • firing:アラートが発生しています。

  • resolved:アラートはクリアされています。

commonAnnotations

元のアラートのグループの同じ注釈。

commonLabels

元のアラートのグループの同じラベル。

groupLabels

グループラベル。アラートは、通知ポリシーのグループ条件で指定されたラベルに基づいてグループ化されます。

status

アラートグループのステータス。有効な値:

  • firing:アラートが発生しています。

  • resolved:アラートはクリアされています。

startTime

アラートグループが作成された時刻。

endTime

アラートグループがクリアされた時刻。これは、グループ内の最後の元のアラートがクリアされた時刻です。

level

アラートの重大度レベル。有効な値:

  • critical:P1

  • error:P2

  • warning:P3

  • page:P4

dispatchRuleName

アラートグループの通知ポリシーの名前。