prometheus_practice icon indicating copy to clipboard operation
prometheus_practice copied to clipboard

wechat告警消息格式化

Open lirunwen opened this issue 8 years ago • 33 comments

alertmanager发送到wechat的消息原始格式不易读,使用templates文件也无法实现wechat消息的格式化。 请问如何实现wechat text消息的内容和格式定制?谢谢!

lirunwen avatar Feb 24 '18 02:02 lirunwen

  1. 修改 alertmanger.yml ,指定覆盖的模版文件地址,例如:
templates:
  - 'demo.tmpl'
  1. 在 demo.teml 里面添加自定义的内容,例如
{{ define "wechat.default.message" }}
// 添加你自己想要的内容
{{- end }}

songjiayang avatar Feb 24 '18 06:02 songjiayang

http://www.songjiayang.com/posts/alertmanager-mo-ban-zhong-shi-jian-format 能否分享下wechat.tmpl模板

prodanlabs avatar Jun 20 '18 09:06 prodanlabs

@D-PENG 告警模版可以参考

{{ define "wechat.default.message" }}
{{ range .Alerts }}
告警级别:{{ .Labels.severity }}
告警类型:{{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
{{ end }}

songjiayang avatar Jun 20 '18 16:06 songjiayang

@D-PENG 如果有定制化的开发需求,需要接触下 go 语言,如果只是一些自定义配置,例如告警消息,可以参考下 go 的 template 模版引擎

songjiayang avatar Jun 21 '18 05:06 songjiayang

请问,触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }},中的时间是写死的,如果要取实时的值,需要取哪个lable的值?

tangxuye avatar Aug 14 '18 12:08 tangxuye

您好,用这个模板显示的时间都是UTC时间,能转成本地时间吗

ningbingjian1 avatar Aug 17 '18 09:08 ningbingjian1

贴下今天刚亲测OK的。。。。

{{ define "wechat.default.message" }} {{ if gt (len .Alerts.Firing) 0 -}} Alerts Firing: {{ range .Alerts }} 告警级别:{{ .Labels.severity }} 告警类型:{{ .Labels.alertname }} 故障主机: {{ .Labels.instance }} 告警主题: {{ .Annotations.summary }} 告警详情: {{ .Annotations.description }} 触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} {{- end }} {{- end }} {{ if gt (len .Alerts.Resolved) 0 -}} Alerts Resolved: {{ range .Alerts }} 告警级别:{{ .Labels.severity }} 告警类型:{{ .Labels.alertname }} 故障主机: {{ .Labels.instance }} 告警主题: {{ .Annotations.summary }} 触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} 恢复时间: {{ .EndsAt.Format "2006-01-02 15:04:05" }} {{- end }} {{- end }} 告警链接: {{ template "__alertmanagerURL" . }} {{- end }}

Liamlu28 avatar Oct 23 '18 15:10 Liamlu28

StartsAt.Format 可以调用time 包 Local 方法转换成 我们想要的时间:比如 StartsAt.Local 即可

Liamlu28 avatar Nov 20 '18 02:11 Liamlu28

你这个警告模板不会,恢复的信息和警告的信息不能分开。

scdylh avatar Nov 20 '18 04:11 scdylh

你这个警告模板不会,恢复的信息和警告的信息不能分开。

测试一下便分晓

Liamlu28 avatar Nov 22 '18 16:11 Liamlu28

@ningbingjian1 可以把时间+8小时转化为北京时间,然后打印输出

songjiayang avatar Dec 21 '18 07:12 songjiayang

@ningbingjian1 可以把时间+8小时转化为北京时间,然后打印输出

怎样在模板里面加+8 小时呢。 模板是这样的 :故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}

shiyiwenv avatar Jan 30 '19 07:01 shiyiwenv

@shiyiwenv 比较笨一点就是直接把时间加8小时,例如:

{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}

songjiayang avatar Jan 31 '19 06:01 songjiayang

@shiyiwenv 比较笨一点就是直接把时间加8小时,例如:

{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}

按照上面的方式试了一下,go模板语法会报错的。 :( unexpected "(" in operand"

shiyiwenv avatar Jan 31 '19 07:01 shiyiwenv

@shiyiwenv 比较笨一点就是直接把时间加8小时,例如:

{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}

按照上面的方式试了一下,go模板语法会报错的。 :( unexpected "(" in operand"

你用的 Alertmanager 版本是多少,我直接测试的 golang 代码是可以使用的,比如 https://play.golang.org/p/kORApsIIMzj

songjiayang avatar Jan 31 '19 08:01 songjiayang

@shiyiwenv 比较笨一点就是直接把时间加8小时,例如:

{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}

按照上面的方式试了一下,go模板语法会报错的。 :( unexpected "(" in operand"

你用的 Alertmanager 版本是多少,我直接测试的 golang 代码是可以使用的,比如 https://play.golang.org/p/kORApsIIMzj

我的alertmanager 是 0.14.0 . 可能gotemplate 不能这样写吗? 我不太熟悉gotemplate 。

shiyiwenv avatar Jan 31 '19 09:01 shiyiwenv

@imluyuan 模板可以用,但是很容易多条告警是通过一条消息发送出来的。

告警恢复:

告警主题: 在 kube-etcd 集群中出现节点故障
告警类型: TargetDown
命名空间: kube-system
故障主机: 192.168.112.216:2379
告警级别: warning
触发时间: 2019-04-12 07:17:02
恢复时间: 2019-04-12 07:19:02
告警主题: 在 kube-etcd 集群中出现节点故障
告警类型: TargetDown
命名空间: kube-system
故障主机: 192.168.112.217:2379
告警级别: warning
触发时间: 2019-04-12 07:22:02
恢复时间: 2019-04-12 07:35:02
告警链接:
http://dev.alertmanager.com/#/alerts?receiver=wechat

这种情况该怎么去解决呢?

ixiaoyi93 avatar Apr 12 '19 08:04 ixiaoyi93

你这个警告模板不会,恢复的信息和警告的信息不能分开。

测试一下便分晓

测试发现,如果同一类型的多个告警源, 既有firing也有resolved时,也会一同发送。参考官方模板,写成如下格式感觉更好:

{{- define "_alert_list" -}}
{{- range .Alerts.Firing -}}
--------
告警类型:{{ .Labels.alertname }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end -}}
{{- end -}}

{{- define "_resolve_list" -}}
{{- range .Alerts.Resolved -}}
************
告警类型:{{ .Labels.alertname }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢复时间: {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end -}}
{{- end -}}


{{- define "wechat.dcos.message" -}}
{{- if and (gt (len .Alerts.Firing) 0) (gt (len .Alerts.Resolved) 0) -}}
Alerts Firing:{{.Alerts.Firing | len}}
Alerts Resolved:{{len .Alerts.Resolved}}
{{ template "_alert_list" . }}
{{ template "_resolve_list" . }}
{{- else -}}
  {{- if gt (len .Alerts.Firing) 0 -}}
Alerts Firing:{{.Alerts.Firing | len}}
{{ template "_alert_list" . }}
  {{- end -}}
  {{- if gt (len .Alerts.Resolved) 0 -}}
Alerts Resolved:{{len .Alerts.Resolved}}
{{ template "_resolve_list" . }}
  {{- end -}}
{{- end -}}
{{- end -}}

fat8701 avatar Apr 22 '19 01:04 fat8701

@fat8701 您好 我用的钉钉要怎么改呢

zxitedu avatar Apr 24 '19 07:04 zxitedu

@fat8701 您好 我用的钉钉要怎么改呢

没用钉钉 https://www.jianshu.com/p/f0fae97d9349 供参考 网上相关帖子应该不少

fat8701 avatar Apr 24 '19 07:04 fat8701

@fat8701 也就是您上面给的模块 就只是适合WeChat的

zxitedu avatar Apr 24 '19 07:04 zxitedu

@fat8701 也就是您上面给的模块 就只是适合WeChat的

仅用wechat测试过,邮件应该也ok,钉钉比较特殊吧,需要进行消息格式转换。自己测测吧。

fat8701 avatar Apr 24 '19 08:04 fat8701

@fat8701 请问,在alertmanager的receivers段如何调用该模板?

aukeyits avatar Jul 03 '19 09:07 aukeyits

@fat8701 请问,在alertmanager的receivers段如何调用该模板?

见2楼回复

fat8701 avatar Jul 03 '19 09:07 fat8701

@fat8701 如果有多个模板,如何为接收器指定不同的模板名字?

aukeyits avatar Jul 03 '19 10:07 aukeyits

@fat8701 如果有多个模板,如何为接收器指定不同的模板名字?

API request data as defined by the WeChat API. [ message: <tmpl_string> | default = '{{ template "wechat.default.message" . }}' ] 和模板里定义的名字对应

fat8701 avatar Jul 03 '19 10:07 fat8701

mark

wanghy8166 avatar Sep 17 '19 02:09 wanghy8166

@fat8701
hello 你的这个模板 Firing和Resolved 也会在同一封邮件发送啊

arsenalpoll avatar Sep 18 '19 11:09 arsenalpoll

@fat8701 hello 你的这个模板 Firing和Resolved 也会在同一封邮件发送啊

这个是微信告警,不是邮件;同一类告警(Firing or Resolved)会集中在一条信息中(先列出所有Firing再列出所有Resolved),个人觉得同一类告警分开2条发没必要,当然你也可以按需修改。

fat8701 avatar Sep 18 '19 11:09 fat8701

@fat8701 这样啊 微信和邮件不通用啊。您这个只有微信的模板吗? 对应的邮件模板有没有? 还有一个问题就是 怎么样才能做到 一条告警一封邮件?

arsenalpoll avatar Sep 18 '19 11:09 arsenalpoll