概要
デフォルトのテンプレでは過分に情報が含まれますので、後続オペレーションをシンプルにするため、必要な情報のみに抜粋してみました
本記事の趣旨に外れるため、docker等にてGrafana構築済み、ならびに、P8s等のデータソース参照済みで、かつ、Slack 側もWebhook API設定済み前提で話は進みます。あらかじめご了承ください
手順
1. デフォルトテンプレートを確認
いずれも詳細は未確認ですが、Teams向け以外の特別なテンプレは見当たりませんでしたので、恐らくSlackも下記 default.title
と default.message
を利用している模様です。
★タイトル部分
{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ if gt (.Alerts.Resolved | len) 0 }}, RESOLVED:{{ .Alerts.Resolved | len }}{{ end }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}
{{ define "default.title" }}{{ template "__subject" . }}{{ end }}
★本文(観測データ)部分
{{ define "__text_values_list" }}{{ $len := len .Values }}{{ if $len }}{{ $first := gt $len 1 }}{{ range $refID, $value := .Values -}}
{{ $refID }}={{ $value }}{{ if $first }}, {{ end }}{{ $first = false }}{{ end -}}
{{ else }}[no value]{{ end }}{{ end }}
{{ define "__text_alert_list" }}{{ range . }}
Value: {{ template "__text_values_list" . }}
Labels:
{{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }}
{{ end }}Annotations:
{{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }}
{{ end }}{{ if gt (len .GeneratorURL) 0 }}Source: {{ .GeneratorURL }}
{{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: {{ .SilenceURL }}
{{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: {{ .DashboardURL }}
{{ end }}{{ if gt (len .PanelURL) 0 }}Panel: {{ .PanelURL }}
{{ end }}{{ end }}{{ end }}
★本文(定型文)部分
{{ define "default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing**
{{ template "__text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }}
{{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved**
{{ template "__text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }}
2. カスタムラベル作成
本文(観測データ)部分で提示したい情報、具体的には $value
から限定したい情報を、Edit alert rule
画面の Custom Labels
に登録していきます。
v9.1.6では項目 4 Notifications
にありますが、バージョンによって異なってくると思われます
上記画像例は複合機の用紙残量リマインダーのため、以下の「プリンターのIPアドレス」「用紙残量」「対象トレイ」を設定してみました。
最上段の CP = Soumu
は後ほど Notification policies
にて通知先の振り分けに利用します。
IP = {{ $value | reReplaceAll `^.*instance=(.*),\sjob=.*$` " $1 " }}
Paper Stock = {{ $value | reReplaceAll `^.*value=(.*)\s.*$` " $1 " }}
Tray = {{ $value | reReplaceAll `^.*prtInputIndex=(.*)\}\s.*$` " $1 " }}
reReplaceAll
はGoTemplate関数で、第2引数部分を第1引数部分に置き換えます。以下にて(恐らく動作確認済みの)Grafanaで利用できるGoTemplate関数が紹介されていますので、よろしければご参照ください。
なお、第1引数部分のregexはデータソース元で $value
をどのように格納しているかによって異なってきますので、あくまで一例としてお考え下さい。(IP
を例に挙げると、IPアドレス情報が格納されている instance=
直後の文字のみを抽出しています。)
3. オリジナルテンプレート作成
★タイトル部分
{{ define "titleSlack.text" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ if gt (.Alerts.Resolved | len) 0 }}, RESOLVED:{{ .Alerts.Resolved | len }}{{ end }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }}{{ end }}
複合機に関する通知で、対象の通知先へ送付されるものは用紙残量リマインダー1種類のため、タイトルから不要な識別子を除外
★本文(観測データ)部分
{{ define "bodySlack.text" }}{{ range . }}
Scores:
{{ range .Labels.SortedPairs }}{{ if and (ne .Name "alertname") (ne .Name "grafana_folder") (ne .Name "CP") (ne .Name "Paper Stock") }} - {{ .Name }} = {{ .Value }}
{{ end }}{{ end }}{{ if gt (len .PanelURL) 0 }}Panel: {{ .PanelURL }}
{{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: {{ .DashboardURL }}
{{ end }}{{ if gt (len .Annotations) 0 }}Annotations:
{{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }}
{{ end }}{{ end }}{{ end }}{{ end }}
Labels
から不要な情報を and+not equal条件 (ne .Name "hogehoge")
で次々と除外していきます。
★本文(定型文)部分
{{ define "messageSlackALVIX.text" }}
{{ if gt (len .Alerts.Firing) 0 }}
「RICOH IM C4500」にて用紙残量20%以下のトレイがあります:printer:
:man-bowing:適宜ご確認願います:man-bowing:
◆使用説明書:給紙トレイに用紙をセットする
https://manuals.ricoh.com/mfp/p_manual/IMC6000JPN/ja/intro/int/tray.htm
{{ template "bodySlack.text" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }}
{{ end }}{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
:woman-gesturing-ok:「RICOH IM C4500」の用紙残量不足は解消されました:man-gesturing-ok:
ご対応お疲れ様です:beers:
{{ template "bodySlack.text" .Alerts.Resolved }}{{ end }}{{ end }}
本例ではITリテラシー習熟が比較的のんびりされている方々への通知ですので、用紙交換方法のリンクを張ったり、絵文字を使ったりしています。
なお、さらっと説明を飛ばしていますが、わざわざ作ったカスタムラベル Paper Stock
も本文(観測データ)部分から省いています。
Slackの少なく表示する状態ではLabels (Scores)
中2項目しか表示されなかったため、詳細な用紙残量は不明でも、対象機器と対象トレイさえ判別できればアクション可能だと、運用の中で思えたからです。(この記事を書いたことで無駄なラベリングが残っていることに気づくことができました)
4. 通知先の限定
本項目は、オマケというか、本旨からはズレているのですが、手順2にて作成したカスタムラベルで通知先を制御する件にて、少しお話がございます。
上記画像の Continue matching subsequent sibling nodes
をOFFにすると、条件に一致する通知がどこへも飛ばなくなります。
英文的に、このチェックが外れていると「対象通知のこの宛先への通知のみは処理し、後続処理はドロップ」なら分かるのですが、「対象通知をドロップし、後続処理は続行」という動きになるのは、英文慣れない私にはとても違和感があります
ご一読ありがとうございます
Grafana v8.x以降から、新フォーマット形式での通知が導入されたそうですが、まだあまり慣れておりません。
つたない技術力と文章力な内容で誠に恐縮でしたが、最後までお読みいただいたことを、心より感謝申し上げます。