指定された通知ポリシーのアラートルールがトリガーされると、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}}
テンプレートの内容 | 説明 |
| アラートの名前。デフォルトでは、通知ポリシーは |
| イベントに |
| アラートをトリガーするオブジェクトのタイプが |
| アラートに一致する通知ポリシーの名前。 |
| アラートが発生した時刻。 |
| アラートイベントリストをトラバースして、 説明 HTML構文
|
サンプルコードをレンダリングに使用した後、次の結果が返されます。
アラート名: 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 | 元のアラートのステータス。有効な値:
|
commonAnnotations | 元のアラートのグループの同じ注釈。 |
commonLabels | 元のアラートのグループの同じラベル。 |
groupLabels | グループラベル。アラートは、通知ポリシーのグループ条件で指定されたラベルに基づいてグループ化されます。 |
status | アラートグループのステータス。有効な値:
|
startTime | アラートグループが作成された時刻。 |
endTime | アラートグループがクリアされた時刻。これは、グループ内の最後の元のアラートがクリアされた時刻です。 |
level | アラートの重大度レベル。有効な値:
|
dispatchRuleName | アラートグループの通知ポリシーの名前。 |