From dc3a414125194690e8dfd6e8f9daa6fa86d3d610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=9E=97=E8=80=80?= Date: Thu, 24 Sep 2020 14:42:37 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=201.=20Webhook=20supports=20custom=20messa?= =?UTF-8?q?ge=20/=20WebHook=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=8A=A5=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 孙林耀 --- .gitignore | 1 + config/notifiers.go | 4 +++ examples/dingtalk/alertmanager.yml | 22 +++++++++++++++ examples/dingtalk/json.tmpl | 44 ++++++++++++++++++++++++++++++ notify/webhook/webhook.go | 26 ++++++++++++++++-- template/json.tmpl | 44 ++++++++++++++++++++++++++++++ template/template.go | 9 ++++++ 7 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 examples/dingtalk/alertmanager.yml create mode 100644 examples/dingtalk/json.tmpl create mode 100644 template/json.tmpl diff --git a/.gitignore b/.gitignore index cb77717880..0572341af0 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ !/.travis.yml !/.promu.yml !/api/v2/openapi.yaml +!examples/dingtalk/alertmanager.yml diff --git a/config/notifiers.go b/config/notifiers.go index 3817143432..68b1016923 100644 --- a/config/notifiers.go +++ b/config/notifiers.go @@ -372,6 +372,10 @@ type WebhookConfig struct { // Alerts exceeding this threshold will be truncated. Setting this to 0 // allows an unlimited number of alerts. MaxAlerts uint64 `yaml:"max_alerts" json:"max_alerts"` + + // Webhook content format + Json string `yaml:"json,omitempty" json:"json,omitempty"` + Text string `yaml:"text,omitempty" json:"text,omitempty"` } // UnmarshalYAML implements the yaml.Unmarshaler interface. diff --git a/examples/dingtalk/alertmanager.yml b/examples/dingtalk/alertmanager.yml new file mode 100644 index 0000000000..31be549392 --- /dev/null +++ b/examples/dingtalk/alertmanager.yml @@ -0,0 +1,22 @@ +global: + resolve_timeout: 5m + +route: + group_by: ['alertname'] + group_wait: 10s + group_interval: 10s + repeat_interval: 1m + receiver: 'web.hook' +receivers: + - name: 'web.hook' + webhook_configs: + - url: 'https://oapi.dingtalk.com/robot/send?access_token=' + json: '{{ template "dingTalk.json" . }}' +inhibit_rules: + - source_match: + severity: 'critical' + target_match: + severity: 'warning' + equal: ['alertname', 'dev', 'instance'] +templates: + - "json.tmpl" \ No newline at end of file diff --git a/examples/dingtalk/json.tmpl b/examples/dingtalk/json.tmpl new file mode 100644 index 0000000000..d5a7d55a79 --- /dev/null +++ b/examples/dingtalk/json.tmpl @@ -0,0 +1,44 @@ +{{ define "dingTalk.json" }} + {{ $key_map := (`{"alertname":"告警名称","name":"服务名称","group":"项目/服务组","service":"服务","severity":"告警级别","message":"说明","instance":"实例"}`|toMap) }} + {{ $alert_name := "" }} + {{ $alert_status := "" }} + {{ if eq .Status "firing" }} + {{ $alert_status = printf "【告警触发】[未处理: %d个]" (.Alerts.Firing | len) }} + {{ else if eq .Status "resolved" }} + {{ $alert_status = printf "【告警恢复】[已处理: %d个]" (.Alerts.Resolved | len) }} + {{ else }} + {{ $alert_status =(.Status | toUpper) }} + {{ end }} + {{ range .GroupLabels.SortedPairs }} {{ if eq .Name "alertname" }}{{ $alert_name = (.Value) }}{{end}} {{ end }} + {{ $alert_title := (printf "%s %s 告警" $alert_status $alert_name ) }} + {{ $alert_msg := (printf "### %s %s 告警" $alert_status $alert_name ) }} + {{ range .Alerts.Firing }} + {{ range .Labels.SortedPairs }} + {{ if (ne (index $key_map .Name) "") }} + {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} + {{else}} + {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg .Name .Value ) }} + {{end}} + {{ end }} + {{ range .Annotations.SortedPairs }} + {{ if (ne (index $key_map .Name) "") }} + {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} + {{else}} + {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg .Name .Value ) }} + {{end}} + {{ end }} + {{ $alert_msg = (printf "%s\\n\\n> [监控数据](%s)" $alert_msg .GeneratorURL ) }} + {{ end }} + { + "msgtype": "markdown", + "markdown": { + "title":"{{ $alert_title }}", + "text": "{{ $alert_msg }}" + }, + "at": { + "atMobiles": [ + ], + "isAtAll": false + } + } +{{ end }} \ No newline at end of file diff --git a/notify/webhook/webhook.go b/notify/webhook/webhook.go index 81ebbbf27f..3f209796f6 100644 --- a/notify/webhook/webhook.go +++ b/notify/webhook/webhook.go @@ -100,8 +100,30 @@ func (n *Notifier) Notify(ctx context.Context, alerts ...*types.Alert) (bool, er } var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(msg); err != nil { - return false, err + if n.conf.Json != "" { + body, err := n.tmpl.ExecuteTextString(n.conf.Json, data) + if err != nil { + return false, err + } + if !json.Valid([]byte(body)) { + return false, fmt.Errorf("Json格式异常: %s ", body) + } + if err := json.Indent(&buf, []byte(body), "", " "); err != nil { + return false, fmt.Errorf("Json格式异常: %s ", body) + } + } else if n.conf.Text != "" { + body, err := n.tmpl.ExecuteTextString(n.conf.Json, data) + if err != nil { + return false, err + } + err = json.NewEncoder(&buf).Encode(body) + if err != nil { + return false, err + } + } else { + if err := json.NewEncoder(&buf).Encode(msg); err != nil { + return false, err + } } req, err := http.NewRequest("POST", n.conf.URL.String(), &buf) diff --git a/template/json.tmpl b/template/json.tmpl new file mode 100644 index 0000000000..beb1c08a92 --- /dev/null +++ b/template/json.tmpl @@ -0,0 +1,44 @@ +{{ define "dingTalk.json" }} + {{ $key_map := (`{"alertname":"告警名称","service":"服务","severity":"告警级别","message":"说明","instance":"实例"}`|toMap) }} + {{ $alert_name := "" }} + {{ $alert_status := "" }} + {{ if eq .Status "firing" }} + {{ $alert_status = printf "【告警触发】[未处理: %d]" (.Alerts.Firing | len) }} + {{ else if eq .Status "resolved" }} + {{ $alert_status = printf "【告警恢复】[已处理: %d]" (.Alerts.Resolved | len) }} + {{ else }} + {{ $alert_status =(.Status | toUpper) }} + {{ end }} + {{ range .GroupLabels.SortedPairs }} {{ if eq .Name "alertname" }}{{ $alert_name = (.Value) }}{{end}} {{ end }} + {{ $alert_title := (printf "%s %s 告警" $alert_status $alert_name ) }} + {{ $alert_msg := (printf "### %s %s 告警" $alert_status $alert_name ) }} + {{ range .Alerts.Firing }} + {{ range .Labels.SortedPairs }} + {{ if (ne (index $key_map .Name) "") }} + {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} + {{else}} + {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg .Name .Value ) }} + {{end}} + {{ end }} + {{ range .Annotations.SortedPairs }} + {{ if (ne (index $key_map .Name) "") }} + {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} + {{else}} + {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg .Name .Value ) }} + {{end}} + {{ end }} + {{ $alert_msg = (printf "%s\\n\\n> [监控数据](%s)" $alert_msg .GeneratorURL ) }} + {{ end }} + { + "msgtype": "markdown", + "markdown": { + "title":"{{ $alert_title }}", + "text": "{{ $alert_msg }}" + }, + "at": { + "atMobiles": [ + ], + "isAtAll": false + } + } +{{ end }} diff --git a/template/template.go b/template/template.go index fed6a3bd41..ef9d189a5a 100644 --- a/template/template.go +++ b/template/template.go @@ -15,6 +15,7 @@ package template import ( "bytes" + "encoding/json" tmplhtml "html/template" "io/ioutil" "net/url" @@ -144,6 +145,14 @@ var DefaultFuncs = FuncMap{ "stringSlice": func(s ...string) []string { return s }, + "toMap": func(s string) map[string]string { + m := make(map[string]string) + if err := json.Unmarshal([]byte(s), &m); err != nil { + panic(err) + } else { + return m + } + }, } // Pair is a key/value string pair. From 0e97b473637ebed1406d6b263b5b195eed50dc7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=9E=97=E8=80=80?= Date: Tue, 29 Mar 2022 01:28:03 +0800 Subject: [PATCH 2/7] fix: webhook message parsing error in custom text format. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 孙林耀 --- config/notifiers.go | 2 +- notify/webhook/webhook.go | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/config/notifiers.go b/config/notifiers.go index f305624dbf..130bbbfe07 100644 --- a/config/notifiers.go +++ b/config/notifiers.go @@ -401,7 +401,7 @@ type WebhookConfig struct { MaxAlerts uint64 `yaml:"max_alerts" json:"max_alerts"` // Webhook content format - Json string `yaml:"json,omitempty" json:"json,omitempty"` + JSON string `yaml:"json,omitempty" json:"json,omitempty"` Text string `yaml:"text,omitempty" json:"text,omitempty"` } diff --git a/notify/webhook/webhook.go b/notify/webhook/webhook.go index 2ec53dc59f..3ec2e88efc 100644 --- a/notify/webhook/webhook.go +++ b/notify/webhook/webhook.go @@ -17,6 +17,7 @@ import ( "bytes" "context" "encoding/json" + "fmt" "io" "net/http" @@ -96,24 +97,21 @@ func (n *Notifier) Notify(ctx context.Context, alerts ...*types.Alert) (bool, er } var buf bytes.Buffer - if n.conf.Json != "" { - body, err := n.tmpl.ExecuteTextString(n.conf.Json, data) + if n.conf.JSON != "" { + body, err := n.tmpl.ExecuteTextString(n.conf.JSON, data) if err != nil { return false, err } if !json.Valid([]byte(body)) { - return false, fmt.Errorf("Json格式异常: %s ", body) + return false, fmt.Errorf("json format error: %s ", body) } if err := json.Indent(&buf, []byte(body), "", " "); err != nil { - return false, fmt.Errorf("Json格式异常: %s ", body) + return false, fmt.Errorf("json format error: %s ", body) } } else if n.conf.Text != "" { - body, err := n.tmpl.ExecuteTextString(n.conf.Json, data) - if err != nil { + if body, err := n.tmpl.ExecuteTextString(n.conf.Text, data); err != nil { return false, err - } - err = json.NewEncoder(&buf).Encode(body) - if err != nil { + } else if _, err = buf.WriteString(body); err != nil { return false, err } } else { From db806e64cb6e562b4018149a75de7fe952d7a525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=9E=97=E8=80=80?= Date: Tue, 29 Mar 2022 01:30:54 +0800 Subject: [PATCH 3/7] fix: golangci-lint check failed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 孙林耀 --- examples/dingtalk/alertmanager.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/dingtalk/alertmanager.yml b/examples/dingtalk/alertmanager.yml index 31be549392..033f89bc89 100644 --- a/examples/dingtalk/alertmanager.yml +++ b/examples/dingtalk/alertmanager.yml @@ -19,4 +19,4 @@ inhibit_rules: severity: 'warning' equal: ['alertname', 'dev', 'instance'] templates: - - "json.tmpl" \ No newline at end of file + - "json.tmpl" From 9d897b6242e2cd1c103b29e27aa68dda2eb3b8d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=9E=97=E8=80=80?= Date: Thu, 4 May 2023 12:44:28 +0800 Subject: [PATCH 4/7] Add the toJson and safeJson functions to handle special characters in alarm messages and avoid disrupting JSON formats due to line breaks, quotation marks, etc. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 孙林耀 --- template/template.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/template/template.go b/template/template.go index 20354011be..037274ed31 100644 --- a/template/template.go +++ b/template/template.go @@ -160,6 +160,14 @@ var DefaultFuncs = FuncMap{ return m } }, + "toJson": func(o interface{}) string { + data, _ := json.Marshal(o) + return string(data) + }, + "safeJson": func(o interface{}) string { + data, _ := json.Marshal(o) + return strings.Trim(string(data), "\"") + }, } // Pair is a key/value string pair. From 3e9f2a1d10f0715b9db0d8f3224f16ff674e2e25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=9E=97=E8=80=80?= Date: Thu, 4 May 2023 12:46:06 +0800 Subject: [PATCH 5/7] Add a Feishu notification example based on JSON webhook. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 孙林耀 --- examples/feishu/README.md | 97 +++++++++++++++++++++++++++++ examples/feishu/alertmanager.yml | 26 ++++++++ examples/feishu/feishu_message.png | Bin 0 -> 68831 bytes examples/feishu/json.tmpl | 42 +++++++++++++ 4 files changed, 165 insertions(+) create mode 100644 examples/feishu/README.md create mode 100644 examples/feishu/alertmanager.yml create mode 100644 examples/feishu/feishu_message.png create mode 100644 examples/feishu/json.tmpl diff --git a/examples/feishu/README.md b/examples/feishu/README.md new file mode 100644 index 0000000000..6855135caf --- /dev/null +++ b/examples/feishu/README.md @@ -0,0 +1,97 @@ +### Alert +```json +[ + { + "labels": { + "alertname": "Test Alert Temiydom wgatpelzn eiesvt.", + "env": "Test", + "group": "Ops", + "name": "Teft dwqokj yqka jbroocrw xwz.", + "severity": "critical" + }, + "annotations": { + "message": "Zxoiyg mnukiqqa imgxyh gwahxoe rixwdzgfn.\"\nLcxdl dpcmu gcrwhvyb qbipfn ifipq omumebq whwmupxag rnbryqneyu gih mszuxf.Tfwbmtj dxuwskbctr ostv kpmxujo tlydykp." + }, + "startsAt": "2023-05-04T03:45:54.173Z", + "endsAt": "2023-05-04T04:45:54.173Z", + "generatorURL": "https://www.github.com" + } +] +``` +### Template +```gotemplate +{{- define "feishu.title" -}} + {{- if eq .Status "firing" -}} + [Firing {{- .Alerts.Firing | len -}}/{{- .Alerts | len -}}] + {{- else if eq .Status "resolved" -}} + [Resolved {{- .Alerts.Resolved | len -}}] + {{- else -}} + [{{- .Status | toUpper | safeJson -}}] + {{- end -}} + {{" "}}{{- range .GroupLabels.SortedPairs -}} {{- if eq .Name "alertname" -}}{{- .Value | safeJson -}}{{- end -}} {{- end -}} +{{- end -}} + +{{- define "feishu.msg" -}} + ### {{ template "feishu.title" . -}}\n + {{- range $idx,$elem := .Alerts.Firing -}} + {{- range .Labels.SortedPairs -}} + **{{- .Name | safeJson -}}**:{{" "}}{{- .Value | safeJson -}}\n + {{- end -}} + {{- range .Annotations.SortedPairs -}} + **{{- .Name | safeJson -}}**:{{" "}}{{- .Value | safeJson -}}\n + {{- end -}} + **Srart Time**:{{" "}}{{- .StartsAt -}}\n + {{- if eq .Status "firing" -}} + [View data]({{.GeneratorURL | safeJson}}) + {{- end -}} + {{- end -}} +{{- end -}} +{{- define "feishu.json" -}} + { + "msg_type": "interactive", + "card": { + "elements": [ + { + "content": "{{- template "feishu.msg" . -}}", + "tag": "markdown" + } + ], + "config": { + "wide_screen_mode": true + } + } + } +{{- end -}} + +``` +### Alertmanager Config +```yaml + +receivers: + - name: alert_test + webhook_configs: + - url: 'https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxx' + json: '{{ template "feishu.json" . }}' + send_resolved: true +``` + +### Webhook Content +``` +{ + "msg_type": "interactive", + "card": { + "elements": [ + { + "content": "### [Firing1/1] Test Alert Temiydom wgatpelzn eiesvt.\n**alertname**: Test Alert Temiydom wgatpelzn eiesvt.\n**env**: Test\n**group**: Ops\n**name**: Teft dwqokj yqka jbroocrw xwz.\n**severity**: critical\n**message**: Zxoiyg mnukiqqa imgxyh gwahxoe rixwdzgfn.\"\nLcxdl dpcmu gcrwhvyb qbipfn ifipq omumebq whwmupxag rnbryqneyu gih mszuxf.Tfwbmtj dxuwskbctr ostv kpmxujo tlydykp.\n**Srart Time**: 2023-05-04 03:45:54.173 +0000 UTC\n[View data](https://www.github.com)", + "tag": "markdown" + } + ], + "config": { + "wide_screen_mode": true + } + } +} +``` + +### Feishu message +![image](./feishu_message.png) \ No newline at end of file diff --git a/examples/feishu/alertmanager.yml b/examples/feishu/alertmanager.yml new file mode 100644 index 0000000000..021465cc9c --- /dev/null +++ b/examples/feishu/alertmanager.yml @@ -0,0 +1,26 @@ +global: + resolve_timeout: 5m +route: + group_by: ['alertname'] + group_wait: 10s + group_interval: 10s + repeat_interval: 24h + + receiver: 'alert_test' + +receivers: + - name: alert_test + webhook_configs: + - url: 'https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxxxxxx' + json: '{{ template "feishu.json" . }}' + send_resolved: true + +inhibit_rules: + - source_match: + severity: 'critical' + target_match: + severity: 'warning' + equal: ['alertname', 'dev', 'instance'] + +templates: + - "json.tmpl" diff --git a/examples/feishu/feishu_message.png b/examples/feishu/feishu_message.png new file mode 100644 index 0000000000000000000000000000000000000000..552c168021b21e066d034e7cd30d474276e0186f GIT binary patch literal 68831 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 Date: Thu, 4 May 2023 15:50:09 +0800 Subject: [PATCH 6/7] Add test cases for toMap, toJson, and safeJson MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 孙林耀 --- template/template_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/template/template_test.go b/template/template_test.go index 97d36fb173..d8fea4a09c 100644 --- a/template/template_test.go +++ b/template/template_test.go @@ -506,6 +506,18 @@ func TestTemplateFuncs(t *testing.T) { title: "Template using reReplaceAll", in: `{{ reReplaceAll "ab" "AB" "abc" }}`, exp: "ABc", + }, { + title: "Template using toMap", + in: `{{ toMap "{}" }}`, + exp: "map[]", + }, { + title: "Template using toJson", + in: "{\"content\": {{ toJson `ab\n\"c` }}}", + exp: `{"content": "ab\n\"c"}`, + }, { + title: "Template using safeJson", + in: "{\"content\": \"{{ safeJson `ab\n\"c` }}\"}", + exp: `{"content": "ab\n\"c"}`, }} { tc := tc t.Run(tc.title, func(t *testing.T) { From 9d41fe2a3ad8d77008f6ba4112f766cdf738454a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E6=9E=97=E8=80=80?= Date: Thu, 4 May 2023 16:07:23 +0800 Subject: [PATCH 7/7] Optimization: Example of custom webhook messages. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 孙林耀 --- .gitignore | 3 +- examples/dingtalk/json.tmpl | 44 --------- examples/webhook/dingtalk/README.md | 93 ++++++++++++++++++ .../{ => webhook}/dingtalk/alertmanager.yml | 0 .../webhook/dingtalk/dingTalk_message.png | Bin 0 -> 40307 bytes examples/webhook/dingtalk/json.tmpl | 44 +++++++++ examples/{ => webhook}/feishu/README.md | 3 +- .../{ => webhook}/feishu/alertmanager.yml | 6 +- .../{ => webhook}/feishu/feishu_message.png | Bin examples/{ => webhook}/feishu/json.tmpl | 0 template/json.tmpl | 80 ++++++++------- 11 files changed, 182 insertions(+), 91 deletions(-) delete mode 100644 examples/dingtalk/json.tmpl create mode 100644 examples/webhook/dingtalk/README.md rename examples/{ => webhook}/dingtalk/alertmanager.yml (100%) create mode 100644 examples/webhook/dingtalk/dingTalk_message.png create mode 100644 examples/webhook/dingtalk/json.tmpl rename examples/{ => webhook}/feishu/README.md (99%) rename examples/{ => webhook}/feishu/alertmanager.yml (76%) rename examples/{ => webhook}/feishu/feishu_message.png (100%) rename examples/{ => webhook}/feishu/json.tmpl (100%) diff --git a/.gitignore b/.gitignore index 3438f117df..4b913c87e1 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ !/.travis.yml !/.promu.yml !/api/v2/openapi.yaml -!examples/dingtalk/alertmanager.yml +!examples/webhook/dingtalk/alertmanager.yml +!examples/webhook/feishu/alertmanager.yml diff --git a/examples/dingtalk/json.tmpl b/examples/dingtalk/json.tmpl deleted file mode 100644 index d5a7d55a79..0000000000 --- a/examples/dingtalk/json.tmpl +++ /dev/null @@ -1,44 +0,0 @@ -{{ define "dingTalk.json" }} - {{ $key_map := (`{"alertname":"告警名称","name":"服务名称","group":"项目/服务组","service":"服务","severity":"告警级别","message":"说明","instance":"实例"}`|toMap) }} - {{ $alert_name := "" }} - {{ $alert_status := "" }} - {{ if eq .Status "firing" }} - {{ $alert_status = printf "【告警触发】[未处理: %d个]" (.Alerts.Firing | len) }} - {{ else if eq .Status "resolved" }} - {{ $alert_status = printf "【告警恢复】[已处理: %d个]" (.Alerts.Resolved | len) }} - {{ else }} - {{ $alert_status =(.Status | toUpper) }} - {{ end }} - {{ range .GroupLabels.SortedPairs }} {{ if eq .Name "alertname" }}{{ $alert_name = (.Value) }}{{end}} {{ end }} - {{ $alert_title := (printf "%s %s 告警" $alert_status $alert_name ) }} - {{ $alert_msg := (printf "### %s %s 告警" $alert_status $alert_name ) }} - {{ range .Alerts.Firing }} - {{ range .Labels.SortedPairs }} - {{ if (ne (index $key_map .Name) "") }} - {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} - {{else}} - {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg .Name .Value ) }} - {{end}} - {{ end }} - {{ range .Annotations.SortedPairs }} - {{ if (ne (index $key_map .Name) "") }} - {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} - {{else}} - {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg .Name .Value ) }} - {{end}} - {{ end }} - {{ $alert_msg = (printf "%s\\n\\n> [监控数据](%s)" $alert_msg .GeneratorURL ) }} - {{ end }} - { - "msgtype": "markdown", - "markdown": { - "title":"{{ $alert_title }}", - "text": "{{ $alert_msg }}" - }, - "at": { - "atMobiles": [ - ], - "isAtAll": false - } - } -{{ end }} \ No newline at end of file diff --git a/examples/webhook/dingtalk/README.md b/examples/webhook/dingtalk/README.md new file mode 100644 index 0000000000..d97157481d --- /dev/null +++ b/examples/webhook/dingtalk/README.md @@ -0,0 +1,93 @@ +### Alert +```json +[ + { + "labels": { + "alertname": "Test Alert Cvvtintokg.", + "env": "Test", + "group": "Ops", + "name": "Hbcqqq dzrvxi dxvftrprop dotm.", + "severity": "critical" + }, + "annotations": { + "message": "Yqlvc qdxjqdw kmedspse adfbai rmw klqeosrv fgcronx usjp embhqt.\"\nNpctkymw mkezjf iynfo qae wdvfw fmxev.Jyhbt kcfepqp dhesgstrt vpvashto yfv wvpd gadptu hbzgjwi ctt rbg." + }, + "startsAt": "2023-05-04T06:42:15.904Z", + "endsAt": "2023-05-04T07:42:15.904Z", + "generatorURL": "https://www.github.com" + } +] +``` +### Template +```gotemplate +{{ define "dingTalk.json" }} + {{ $key_map := (`{"alertname":"Alert Name","name":"Service Name","group":"Group","service":"Service","severity":"Severity","message":"Message","instance":"Instance Name"}`|toMap) }} + {{ $alert_name := "" }} + {{ $alert_status := "" }} + {{ if eq .Status "firing" }} + {{ $alert_status = printf "[Firing: %d]" (.Alerts.Firing | len) }} + {{ else if eq .Status "resolved" }} + {{ $alert_status = printf "[Resolved: %d]" (.Alerts.Resolved | len) }} + {{ else }} + {{ $alert_status =(.Status | toUpper) }} + {{ end }} + {{ range .GroupLabels.SortedPairs }} {{ if eq .Name "alertname" }}{{ $alert_name = (.Value) }}{{end}} {{ end }} + {{ $alert_title := (printf "%s %s" $alert_status $alert_name ) }} + {{ $alert_msg := (printf "### %s %s" $alert_status $alert_name ) }} + {{ range .Alerts.Firing }} + {{ range .Labels.SortedPairs }} + {{ if (ne (index $key_map .Name) "") }} + {{ $alert_msg = (printf "%s\n\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} + {{else}} + {{ $alert_msg = (printf "%s\n\n> %s: %s" $alert_msg .Name .Value ) }} + {{end}} + {{ end }} + {{ range .Annotations.SortedPairs }} + {{ if (ne (index $key_map .Name) "") }} + {{ $alert_msg = (printf "%s\n\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} + {{else}} + {{ $alert_msg = (printf "%s\n\n> %s: %s" $alert_msg .Name .Value ) }} + {{end}} + {{ end }} + {{ $alert_msg = (printf "%s\n\n> [View Data](%s)" $alert_msg .GeneratorURL ) }} + {{ end }} + { + "msgtype": "markdown", + "markdown": { + "title":{{ $alert_title|toJson }}, + "text": {{ $alert_msg|toJson }} + }, + "at": { + "atMobiles": [ + ], + "isAtAll": false + } + } +{{ end }} +``` +### Alertmanager Config +```yaml +receivers: + - name: 'web.hook' + webhook_configs: + - url: 'https://oapi.dingtalk.com/robot/send?access_token=' + json: '{{ template "dingTalk.json" . }}' +``` + +### Webhook Content +``` +{ + "msgtype": "markdown", + "markdown": { + "title": "[Firing: 1] Test Alert Eijwywi wtuplkvno uix.", + "text": "### [Firing: 1] Test Alert Eijwywi wtuplkvno uix.\n\n\u003e Alert Name: Test Alert Eijwywi wtuplkvno uix.\n\n\u003e env: Test\n\n\u003e Group: Ops\n\n\u003e Service Name: Tdjafh qbhhpmyt aeekyhrhr tdjdbbap.\n\n\u003e Severity: critical\n\n\u003e Message: Bstg aenfwxmvk qbihjaxo.\"\nEoog xzrgupeeel yqyndiw appvaw wkkbre dhemrscsg egvofxxvs xqxj.Egwmievu xysgytr idwufuw.\n\n\u003e [View Data](https://www.github.com)" + }, + "at": { + "atMobiles": [], + "isAtAll": false + } +} +``` + +### Feishu message +![image](./dingTalk_message.png) \ No newline at end of file diff --git a/examples/dingtalk/alertmanager.yml b/examples/webhook/dingtalk/alertmanager.yml similarity index 100% rename from examples/dingtalk/alertmanager.yml rename to examples/webhook/dingtalk/alertmanager.yml diff --git a/examples/webhook/dingtalk/dingTalk_message.png b/examples/webhook/dingtalk/dingTalk_message.png new file mode 100644 index 0000000000000000000000000000000000000000..3a3e16ee5650d8f58af47a40f50b4318a33b1e04 GIT binary patch literal 40307 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.Q^bNsXNVASk%`R&EXG?wQxEDd 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 literal 0 HcmV?d00001 diff --git a/examples/webhook/dingtalk/json.tmpl b/examples/webhook/dingtalk/json.tmpl new file mode 100644 index 0000000000..01a9134354 --- /dev/null +++ b/examples/webhook/dingtalk/json.tmpl @@ -0,0 +1,44 @@ +{{ define "dingTalk.json" }} + {{ $key_map := (`{"alertname":"Alert Name","name":"Service Name","group":"Group","service":"Service","severity":"Severity","message":"Message","instance":"Instance Name"}`|toMap) }} + {{ $alert_name := "" }} + {{ $alert_status := "" }} + {{ if eq .Status "firing" }} + {{ $alert_status = printf "[Firing: %d]" (.Alerts.Firing | len) }} + {{ else if eq .Status "resolved" }} + {{ $alert_status = printf "[Resolved: %d]" (.Alerts.Resolved | len) }} + {{ else }} + {{ $alert_status =(.Status | toUpper) }} + {{ end }} + {{ range .GroupLabels.SortedPairs }} {{ if eq .Name "alertname" }}{{ $alert_name = (.Value) }}{{end}} {{ end }} + {{ $alert_title := (printf "%s %s" $alert_status $alert_name ) }} + {{ $alert_msg := (printf "### %s %s" $alert_status $alert_name ) }} + {{ range .Alerts.Firing }} + {{ range .Labels.SortedPairs }} + {{ if (ne (index $key_map .Name) "") }} + {{ $alert_msg = (printf "%s\n\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} + {{else}} + {{ $alert_msg = (printf "%s\n\n> %s: %s" $alert_msg .Name .Value ) }} + {{end}} + {{ end }} + {{ range .Annotations.SortedPairs }} + {{ if (ne (index $key_map .Name) "") }} + {{ $alert_msg = (printf "%s\n\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} + {{else}} + {{ $alert_msg = (printf "%s\n\n> %s: %s" $alert_msg .Name .Value ) }} + {{end}} + {{ end }} + {{ $alert_msg = (printf "%s\n\n> [View Data](%s)" $alert_msg .GeneratorURL ) }} + {{ end }} + { + "msgtype": "markdown", + "markdown": { + "title":{{ $alert_title|toJson }}, + "text": {{ $alert_msg|toJson }} + }, + "at": { + "atMobiles": [ + ], + "isAtAll": false + } + } +{{ end }} diff --git a/examples/feishu/README.md b/examples/webhook/feishu/README.md similarity index 99% rename from examples/feishu/README.md rename to examples/webhook/feishu/README.md index 6855135caf..9a8b65fb6b 100644 --- a/examples/feishu/README.md +++ b/examples/webhook/feishu/README.md @@ -66,9 +66,8 @@ ``` ### Alertmanager Config ```yaml - receivers: - - name: alert_test + - name: "web.hook" webhook_configs: - url: 'https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxx' json: '{{ template "feishu.json" . }}' diff --git a/examples/feishu/alertmanager.yml b/examples/webhook/feishu/alertmanager.yml similarity index 76% rename from examples/feishu/alertmanager.yml rename to examples/webhook/feishu/alertmanager.yml index 021465cc9c..63c0724ba5 100644 --- a/examples/feishu/alertmanager.yml +++ b/examples/webhook/feishu/alertmanager.yml @@ -6,12 +6,12 @@ route: group_interval: 10s repeat_interval: 24h - receiver: 'alert_test' + receiver: 'web.hook' receivers: - - name: alert_test + - name: 'web.hook' webhook_configs: - - url: 'https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxxxxxx' + - url: 'https://open.feishu.cn/open-apis/bot/v2/hook/' json: '{{ template "feishu.json" . }}' send_resolved: true diff --git a/examples/feishu/feishu_message.png b/examples/webhook/feishu/feishu_message.png similarity index 100% rename from examples/feishu/feishu_message.png rename to examples/webhook/feishu/feishu_message.png diff --git a/examples/feishu/json.tmpl b/examples/webhook/feishu/json.tmpl similarity index 100% rename from examples/feishu/json.tmpl rename to examples/webhook/feishu/json.tmpl diff --git a/template/json.tmpl b/template/json.tmpl index beb1c08a92..6a233016b2 100644 --- a/template/json.tmpl +++ b/template/json.tmpl @@ -1,44 +1,42 @@ -{{ define "dingTalk.json" }} - {{ $key_map := (`{"alertname":"告警名称","service":"服务","severity":"告警级别","message":"说明","instance":"实例"}`|toMap) }} - {{ $alert_name := "" }} - {{ $alert_status := "" }} - {{ if eq .Status "firing" }} - {{ $alert_status = printf "【告警触发】[未处理: %d]" (.Alerts.Firing | len) }} - {{ else if eq .Status "resolved" }} - {{ $alert_status = printf "【告警恢复】[已处理: %d]" (.Alerts.Resolved | len) }} - {{ else }} - {{ $alert_status =(.Status | toUpper) }} - {{ end }} - {{ range .GroupLabels.SortedPairs }} {{ if eq .Name "alertname" }}{{ $alert_name = (.Value) }}{{end}} {{ end }} - {{ $alert_title := (printf "%s %s 告警" $alert_status $alert_name ) }} - {{ $alert_msg := (printf "### %s %s 告警" $alert_status $alert_name ) }} - {{ range .Alerts.Firing }} - {{ range .Labels.SortedPairs }} - {{ if (ne (index $key_map .Name) "") }} - {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} - {{else}} - {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg .Name .Value ) }} - {{end}} - {{ end }} - {{ range .Annotations.SortedPairs }} - {{ if (ne (index $key_map .Name) "") }} - {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg (index $key_map .Name) .Value ) }} - {{else}} - {{ $alert_msg = (printf "%s\\n\\n> %s: %s" $alert_msg .Name .Value ) }} - {{end}} - {{ end }} - {{ $alert_msg = (printf "%s\\n\\n> [监控数据](%s)" $alert_msg .GeneratorURL ) }} - {{ end }} +{{- define "feishu.title" -}} + {{- if eq .Status "firing" -}} + [Firing {{- .Alerts.Firing | len -}}/{{- .Alerts | len -}}] + {{- else if eq .Status "resolved" -}} + [Resolved {{- .Alerts.Resolved | len -}}] + {{- else -}} + [{{- .Status | toUpper | safeJson -}}] + {{- end -}} + {{" "}}{{- range .GroupLabels.SortedPairs -}} {{- if eq .Name "alertname" -}}{{- .Value | safeJson -}}{{- end -}} {{- end -}} +{{- end -}} + +{{- define "feishu.msg" -}} + ### {{ template "feishu.title" . -}}\n + {{- range $idx,$elem := .Alerts.Firing -}} + {{- range .Labels.SortedPairs -}} + **{{- .Name | safeJson -}}**:{{" "}}{{- .Value | safeJson -}}\n + {{- end -}} + {{- range .Annotations.SortedPairs -}} + **{{- .Name | safeJson -}}**:{{" "}}{{- .Value | safeJson -}}\n + {{- end -}} + **Srart Time**:{{" "}}{{- .StartsAt -}}\n + {{- if eq .Status "firing" -}} + [View data]({{.GeneratorURL | safeJson}}) + {{- end -}} + {{- end -}} +{{- end -}} +{{- define "feishu.json" -}} { - "msgtype": "markdown", - "markdown": { - "title":"{{ $alert_title }}", - "text": "{{ $alert_msg }}" - }, - "at": { - "atMobiles": [ + "msg_type": "interactive", + "card": { + "elements": [ + { + "content": "{{- template "feishu.msg" . -}}", + "tag": "markdown" + } ], - "isAtAll": false + "config": { + "wide_screen_mode": true + } } - } -{{ end }} + } +{{- end -}}