feiyu563/PrometheusAlert

通用自定义模版专用:欢迎共享大家的自定义模版,方便其他人也可以直接使用

feiyu563 opened this issue · 80 comments

通用自定义模版专用:欢迎共享大家的自定义模版,方便其他人也可以直接使用

[prometheus自定义模版,支持恢复通知模版]

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
## [Prometheus恢复信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警级别:{{$v.labels.level}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
###### 故障主机IP:{{$v.labels.instance}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{else}}
## [Prometheus告警信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警级别:{{$v.labels.level}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
###### 故障主机IP:{{$v.labels.instance}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{end}}
{{ end }}

[自定义模版中只取指定长度的告警消息写法]

{{ $v.annotations.description | printf "%.20s" }}

上面数字就表示需要取的文本长度,超出的会被截断

微信机器人自定义告警模板:

  1. 告警红色
  2. 恢复绿色
  3. 告警级别我用的severity,可以修改为level。请自己定义labels
  4. 使用hostname,请自己定义labels
  5. 我将故障主机IP改为实例地址,因为有些探针运行在本地,但告警对象不是它,所以修改为实例地址
  6. description是自定义的告警详细信息
{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
#### [Prometheus恢复信息]({{$v.generatorURL}})

> <font color="info">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
> <font color="info">告警级别</font>:{{$v.labels.severity}}
> <font color="info">开始时间</font>:{{$v.startsAt}}
> <font color="info">结束时间</font>:{{$v.endsAt}}
> <font color="info">实例地址</font>:{{$v.labels.instance}}
> <font color="info">主机名称</font>:{{$v.labels.hostname}}

**{{$v.annotations.description}}**
{{else}}
#### [Prometheus告警信息]({{$v.generatorURL}})

> <font color="#FF0000">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
> <font color="#FF0000">告警级别</font>:{{$v.labels.severity}}
> <font color="#FF0000">开始时间</font>:{{$v.startsAt}}
> <font color="#FF0000">结束时间</font>:{{$v.endsAt}}
> <font color="#FF0000">实例地址</font>:{{$v.labels.instance}}
> <font color="#FF0000">主机名称</font>:{{$v.labels.hostname}}

**{{$v.annotations.description}}**
{{end}}
{{ end }}


效果图:

image



备注:
此模板稍微修改也可以适用于钉钉。

请问自定义的消息模板能否通过什么方式注入到服务中,想把自定义的模板加入到自动部署的流程中

请问下,我在配置prometheus 邮件告警,使用自定义模板,是碰到这个错误,“2020/12/01 18:22:20.357 [E] [value.go:460] [1606818140356848598] 接口参数缺失!”,我在alertmanager配置的是“ - url: 'http://ip:port/prometheusalert' ”,是哪里配置不对导致参数缺失?我找不到原因所在。

feiyu563,你好;腾讯云的短信接口中需要输入多个参数,请问下在模板中需要怎么配置这些参数呢?

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}

Prometheus恢复信息

告警名称:{{$v.labels.alertname}}
告警级别:{{$v.labels.severity}}
开始时间:{{$v.startsAt}}
结束时间:{{$v.endsAt}}
实例地址:{{$v.labels.instance}}
主机名称:{{$v.labels.hostname}}

{{$v.annotations.description}}
{{else}}

Prometheus告警信息

告警名称:{{$v.labels.alertname}}
告警级别:{{$v.labels.severity}}
开始时间:{{$v.startsAt}}
结束时间:{{$v.endsAt}}
实例地址:{{$v.labels.instance}}
主机名称:{{$v.labels.hostname}}

{{$v.annotations.description}}
{{end}}
{{ end }}

大佬牛b,比默认模板好看多了。默认模版告警恢复傻傻不分清楚

prometheus 报警自定义模版

{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}**<font color="info"> [恢复信息] From Prome</font>**
 **{{$v.labels.alertname}}**
开始时间:{{GetCSTtime $v.startsAt}}
结束时间:{{GetCSTtime $v.endsAt}}
主机IP:{{$v.labels.kubernetes_node}}
{{else}}**<font color="#FF0000"> [告警信息] From Prome</font>**
** {{$v.labels.alertname}}**
告警级别:{{$v.labels.level}}
开始时间:{{GetCSTtime  $v.startsAt}}
主机IP:{{$v.labels.kubernetes_node}}
**{{$v.annotations.description}}**
{{end}}
{{ end }}

graylog3 报警自定义模版

<font color="warning">[告警信息] From Graylog</font> 
>**{{.event_definition_description}}**
{{ range $k,$v:=.backlog }}
>告警索引:{{$v.index}}
开始时间:{{GetCSTtime $v.timestamp}}
告警主机:{{$v.fields.gl2_remote_ip}}
**{{$v.message}}**
{{end}}

显示所有prometheus告警label的自定义模版:

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
## [Prometheus恢复信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
{{ range $key,$value:=$v.labels }}
###### {{$key}}:{{$value}}
{{end}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{else}}
## [Prometheus告警信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
{{ range $key,$value:=$v.labels }}
###### {{$key}}:{{$value}}
{{end}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{end}}
{{ end }}

效果如下图:

image

钉钉告警模板

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
#### [Prometheus恢复信息]({{$v.generatorURL}})

##### <font color="#02b340">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
##### <font color="#02b340">告警级别</font>:{{$v.labels.severity}}
##### <font color="#02b340">触发时间</font>:{{GetCSTtime $v.startsAt}}
##### <font color="#02b340">结束时间</font>:{{GetCSTtime $v.endsAt}}
##### <font color="#02b340">主机名称</font>:{{$v.labels.nodename}} {{$v.labels.hostname}}

**{{$v.annotations.summary}}**
[点击打开grafana]($v.annotations.grafana)
{{else}}
#### [Prometheus告警信息]({{$v.generatorURL}})

##### <font color="#FF0000">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
##### <font color="#FF0000">告警级别</font>:{{$v.labels.severity}}
##### <font color="#FF0000">触发时间</font>:{{GetCSTtime $v.startsAt}}
##### <font color="#FF0000">主机名称</font>:{{$v.labels.nodename}} {{$v.labels.hostname}}

**{{$v.annotations.summary}}**
[点击打开grafana]($v.annotations.grafana)
{{end}}
{{ end }}
  • 其中hostname需要自行定义或者各种xxx_exporter原生参数支持.

效果图如下

image

好看

我用这个模板,钉钉告警,在有触发告警时,会携带历史的恢复告警信息,导致一条告警消息,其中三四条恢复内容,一条告警消息。请问各位大佬有发现这个问题嘛。

我用这个模板,钉钉告警,在有触发告警时,会携带历史的恢复告警信息,导致一条告警消息,其中三四条恢复内容,一条告警消息。请问各位大佬有发现这个问题嘛。

这是因为消息合并了

pycgo commented

json里面字符串取部分拼接怎么做啊
数据:

'event': {
'id': '01FF4FDZJQJTG1JAN450JXF9BT',
'origin_context': 'urn:graylog:message:es:graylog_178:4ed1ca06-1120-11ec-8c7e-a2ca6eaea137',
}

想拿出来 graylog_178 4ed1ca06-1120-11ec-8c7e-a2ca6eaea137

[自定义模版中只取指定长度的告警消息写法]

{{ $v.annotations.description | printf "%.20s" }}

上面数字就表示需要取的文本长度,超出的会被截断

[自定义模版中只取指定长度的告警消息写法]

{{ $v.annotations.description | printf "%.20s" }}

上面数字就表示需要取的文本长度,超出的会被截断

您好,请问,针对ip:port这种针对匹配到的符号:进行截取的话,应该怎样写

{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
### [Prometheus恢复通知]({{$v.generatorURL}})

<font color="info">告警类型</font>:{{$v.labels.alertname}}
<font color="info">告警级别</font>:{{$v.labels.severity}}
<font color="info">故障时间</font>:{{GetCSTtime $v.startsAt}}
<font color="info">恢复时间</font>:{{GetCSTtime $v.endsAt}}
<font color="info">告警IP</font>:{{$v.labels.instance}}
<font color="info">告警主机</font>:{{$v.labels.hostname}}
#### =======<font color="info">告警详情</font>=======
**<font color="info">告警主题</font>:{{$v.annotations.summary}}**
**<font color="info">告警内容</font>:{{$v.annotations.description}}**
{{else}}
### [Prometheus告警通知]({{$v.generatorURL}})

<font color="#FF0000">告警类型</font>:{{$v.labels.alertname}}
<font color="#FF0000">告警级别</font>:{{$v.labels.severity}}
<font color="#FF0000">故障时间</font>:{{GetCSTtime $v.startsAt}}
<font color="#FF0000">告警IP</font>:{{$v.labels.instance}}
<font color="#FF0000">告警主机</font>:{{$v.labels.hostname}}
#### =======<font color="#FF0000">告警详情</font>=======
**<font color="#FF0000">告警主题</font>:{{$v.annotations.summary}}**
**<font color="#FF0000">告警内容</font>:{{$v.annotations.description}}**
**<font color="#FF0000">告警值</font>:{{$v.annotations.value}}**
{{end}}
{{ end }}

飞书 V2 报警模板,之所以将 {{$v.status}} 放进去,是因为飞书报警可以根据报警状态实现不同的 title color

// 飞书相关的代码
	var color string
	if strings.Count(text, "resolved") > 0 && strings.Count(text, "firing") > 0 {
		color = "orange"
	} else if strings.Count(text, "resolved") > 0 {
		color = "green"
	} else {
		color = "red"
	}
{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
**[Prometheus 恢复通知]({{$v.generatorURL}})**
告警名称:{{$v.labels.alertname}}
告警状态:{{$v.status}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} 
实例地址:{{$v.labels.instance}}
主机名称:{{$v.labels.hostname}}
**{{$v.annotations.description}}**
{{else}}
**[Prometheus 报警通知]({{$v.generatorURL}})**
告警名称:{{$v.labels.alertname}}
告警状态:{{$v.status}} > {{$v.labels.severity}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} 
实例地址:{{$v.labels.instance}}
主机名称:{{$v.labels.hostname}}
**{{$v.annotations.description}}**
{{end}}
{{ end }}

效果图
报警通知
橙色
恢复通知

飞书V2报警模板,结束将{{$v.status}}去,是因为飞书可以报警根据报警状态实现不同的标题颜色

//飞书相关的代码
	变种 颜色 字符串如果 字符串计数文本,“已解决”)>  0  && 字符串Count ( text , "firing" ) >  0 {
		 color  =  "orange" 
	} else  if  strings计数文本,“已解决”)>  0 {
		 color  =green=红色” 
	}
{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
**[Prometheus 恢复通知]({{$v.generatorURL}})**
告警名称:{{$v.labels.alertname}}
告警状态:{{$v.status}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} 
实例地址:{{$v.labels.instance}}
主机名称:{{$v.labels.hostname}}
**{{$v.annotations.description}}**
{{else}}
**[Prometheus 报警通知]({{$v.generatorURL}})**
告警名称:{{$v.labels.alertname}}
告警状态:{{$v.status}} > {{$v.labels.severity}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} 
实例地址:{{$v.labels.instance}}
主机名称:{{$v.labels.hostname}}
**{{$v.annotations.description}}**
{{end}}
{{ end }}

有效果图吗

这段飞书的配置段,写到哪儿?

【钉钉模板】

{{ $var := .externalURL}}{{ $status := .status}}{{ range $k,$v:=.alerts }} {{if eq $status "resolved"}}
## [告警恢复-通知]({{$var}})
#### 监控指标: {{$v.labels.alertname}}
{{ if eq $v.labels.severity "warning" }}
#### 告警级别: **<font color="#E6A23C">{{$v.labels.severity}}</font>**
{{ else if eq $v.labels.severity "critical"  }}
#### 告警级别: **<font color="#F56C6C">{{$v.labels.severity}}</font>**
{{ end }}
#### 当前状态: **<font color="#67C23A" size=4>已恢复</font>**
#### 故障主机: {{$v.labels.instance}}
* ###### 告警阈值: {{$v.labels.threshold}}
* ###### 开始时间: {{GetCSTtime $v.startsAt}}
* ###### 恢复时间: {{GetCSTtime $v.endsAt}}

#### 告警恢复: <font color="#67C23A">已恢复,{{$v.annotations.description}}</font>
{{ else }}
## [监控告警-通知]({{$var}})
#### 监控指标: {{$v.labels.alertname}}
{{ if eq $v.labels.severity "warning" }}
#### 告警级别: **<font color="#E6A23C" size=4>{{$v.labels.severity}}</font>**
#### 当前状态: **<font color="#E6A23C">需要处理</font>**
{{ else if eq $v.labels.severity "critical"  }}
#### 告警级别: **<font color="#F56C6C" size=4>{{$v.labels.severity}}</font>**
#### 当前状态: **<font color="#F56C6C">需要处理</font>**
{{ end }}
#### 故障主机: {{$v.labels.instance}}
* ###### 告警阈值: {{$v.labels.threshold}}
* ###### 持续时间: {{$v.labels.for_time}}
* ###### 触发时间: {{GetCSTtime $v.startsAt}}
{{ if eq $v.labels.severity "warning" }}
#### 告警触发: <font color="#E6A23C">{{$v.annotations.description}}</font>
{{ else if eq $v.labels.severity "critical" }}
#### 告警触发: <font color="#F56C6C">{{$v.annotations.description}}</font>
{{ end }}
{{ end }}
{{ end }}

【样例】

image

[prometheus自定义模版,支持恢复通知模版]

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
## [Prometheus恢复信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警级别:{{$v.labels.level}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
###### 故障主机IP:{{$v.labels.instance}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{else}}
## [Prometheus告警信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警级别:{{$v.labels.level}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
###### 故障主机IP:{{$v.labels.instance}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{end}}
{{ end }}

你好,这个是直接复制到template.tmpl模板中吗,但是我的告警还是原模板的,自定义的没有生效,config文件中需要修改什么吗

飞书告警模板

{{ range $k,$v:=.alerts }}{{ if eq $v.status "resolved" }}✅{{ $v.labels.alertname }}
告警级别:{{ $v.labels.severity }}
开始时间:{{ GetCSTtime $v.startsAt }} 
结束时间:{{ GetCSTtime $v.endsAt }}
故障主机IP:{{ $v.labels.instance }}
告警内容:
{{ $v.annotations.description }}{{ else }}{{ if eq $v.labels.severity "warning" }}🟡{{$v.labels.alertname}}
告警级别🟡:{{ $v.labels.severity }}
{{ else if eq $v.labels.severity "critical"  }}❌{{$v.labels.alertname}}
告警级别❌:{{ $v.labels.severity }}
{{ else if eq $v.labels.severity "emergency"  }}❌🔥🔥{{ $v.labels.alertname }}
告警级别❌🔥🔥:{{ $v.labels.severity }}
{{ end }}开始时间:{{ GetCSTtime $v.startsAt }} 
故障主机IP:{{ $v.labels.instance }}
告警内容:
{{ $v.annotations.summary }}
{{ $v.annotations.description }}{{ end }}{{ end }}

image

用不了没图案

用不了没图案

模板除了会判断{{ if eq $v.status "resolved" }},还需继续判断这里:{{ if eq $v.labels.severity "warning" }}
如果没有图案,可能是你的 severity标签 的值不一致。
比如,我的这里只有三个级别 {{ if eq $v.labels.severity "warning" }}

  • alert: "主机失联"
    expr: up == 0
    for: 1m
    labels:
    severity: emergency
    annotations:
    summary: "{{ $labels.instance }} 失联"
    description: "超过5分钟没有响应!"

    labels:
    severity: emergency

    labels:
    severity: critical

    labels:
    severity: warning

飞书

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{- if eq $v.status "firing"}}[{{$v.labels.alertname}}]({{$var}}) **😈{{$v.status}}**
{{- range $key,$value:=$v.annotations }}
{{if eq $key "summary" }} **☎SUMM: {{ $value}}**{{ end -}}
{{if eq $key "description" }} **✍DESC:** {{ $value}}{{ end -}}
{{if eq $key "message" }} **✉MSG:** {{ $value}}{{ end -}}
{{- end}}
 **⏱Start:** {{GetCSTtime $v.startsAt}}
*[view details]({{$v.generatorURL}})*
{{- range $key,$value:=$v.labels }}
> {{- $key}}:{{$value -}}
{{end}}
{{else}}[{{$v.labels.alertname}}]({{$var}}) **😎{{$v.status}}** 
{{- range $key,$value:=$v.annotations }}
{{if eq $key "summary" }} **☎SUMM:** {{ $value}}{{ end -}}
{{if eq $key "description" }} **✍DESC:** {{ $value}}{{ end -}}
{{if eq $key "message" }} **✉MSG:** {{ $value}}{{ end -}}
{{- end}}
 **⏱Start:** {{GetCSTtime $v.startsAt}}
 **⏲End:** {{GetCSTtime $v.endsAt}}
[view details]({{$v.generatorURL}})
{{- end }}{{end}}

prometheus-fs

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
**[Prometheus恢复信息]({{$v.generatorURL}})**

【恢复名称】[{{$v.labels.alertname}}]({{$var}})✅{{if $v.labels.level}}
【恢复级别】{{if eq $v.labels.level "0"}}提示{{else if eq $v.labels.level "1"}}警告{{else if eq $v.labels.level "2"}}一般严重{{else if eq $v.labels.level "3"}}严重{{else if eq $v.labels.level "4"}}灾难{{else}}{{$v.labels.level}}{{end}}{{end}}
【开始时间】{{GetCSTtime $v.startsAt}}
【结束时间】{{GetCSTtime $v.endsAt}}
【恢复实例】{{$v.labels.instance}}

**{{$v.annotations.description}}**
{{else}}
**[Prometheus告警信息]({{$v.generatorURL}})**

【告警名称】[{{$v.labels.alertname}}]({{$var}})🔥{{if $v.labels.level}}
【告警级别】{{if eq $v.labels.level "0"}}提示{{else if eq $v.labels.level "1"}}警告🟡{{else if eq $v.labels.level "2"}}一般严重🔥{{else if eq $v.labels.level "3"}}严重🔥🔥{{else if eq $v.labels.level "4"}}灾难🔥🔥❌{{else}}{{$v.labels.level}}{{end}}{{end}}
【开始时间】{{GetCSTtime $v.startsAt}}
【告警实例】{{$v.labels.instance}}

**{{$v.annotations.description}}**
{{end}}
{{ end }}

image

prometheus-dd

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
## [Prometheus恢复信息]({{$v.generatorURL}})
--------------------------------------------------------
#### 【恢复名称】[{{$v.labels.alertname}}]({{$var}}) ✅{{if $v.labels.level}}
#### 【恢复级别】{{if eq $v.labels.level "0"}}提示{{else if eq $v.labels.level "1"}}警告{{else if eq $v.labels.level "2"}}一般严重{{else if eq $v.labels.level "3"}}严重{{else if eq $v.labels.level "4"}}灾难{{else}}{{$v.labels.level}}{{end}}{{end}}
#### 【当前状态】**<font color="#67C23A" size=4>已恢复</font>**
#### 【开始时间】{{GetCSTtime $v.startsAt}}
#### 【结束时间】{{GetCSTtime $v.endsAt}}
#### 【恢复实例】{{$v.labels.instance}}
--------------------------------------------------------
**{{$v.annotations.description}}**
{{else}}
## [Prometheus告警信息]({{$v.generatorURL}})
--------------------------------------------------------
#### 【告警名称】[{{$v.labels.alertname}}]({{$var}}) 🔥{{if $v.labels.level}}
#### 【告警级别】{{if eq $v.labels.level "0"}}提示{{else if eq $v.labels.level "1"}}警告🟡{{else if eq $v.labels.level "2"}}一般严重🔥{{else if eq $v.labels.level "3"}}严重🔥🔥{{else if eq $v.labels.level "4"}}灾难🔥🔥❌{{else}}{{$v.labels.level}}{{end}}{{end}}
#### 【当前状态】**<font color="#E6A23C">需要处理</font>**
#### 【开始时间】{{GetCSTtime $v.startsAt}}
#### 【告警实例】{{$v.labels.instance}}
--------------------------------------------------------
**{{$v.annotations.description}}**
{{end}}
{{ end }}

image

prometheus-wx

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
## [Prometheus恢复信息]({{$v.generatorURL}})

#### <font color="#02b340">【恢复名称】</font>[{{$v.labels.alertname}}]({{$var}}) ✅{{if $v.labels.level}}
#### <font color="#02b340">【恢复级别】</font>{{if eq $v.labels.level "0"}}提示{{else if eq $v.labels.level "1"}}警告{{else if eq $v.labels.level "2"}}一般严重{{else if eq $v.labels.level "3"}}严重{{else if eq $v.labels.level "4"}}灾难{{else}}{{$v.labels.level}}{{end}}{{end}}
#### <font color="#02b340">【当前状态】</font><font color="#67C23A">已恢复</font>
#### <font color="#02b340">【开始时间】</font>{{GetCSTtime $v.startsAt}}
#### <font color="#02b340">【结束时间】</font>{{GetCSTtime $v.endsAt}}
#### <font color="#02b340">【恢复实例】</font>{{$v.labels.instance}}

**{{$v.annotations.description}}**
{{else}}
## [Prometheus告警信息]({{$v.generatorURL}})

#### <font color="#FF0000">【告警名称】</font>[{{$v.labels.alertname}}]({{$var}}) 🔥{{if $v.labels.level}}
#### <font color="#FF0000">【告警级别】</font>{{if eq $v.labels.level "0"}}提示{{else if eq $v.labels.level "1"}}警告🟡{{else if eq $v.labels.level "2"}}一般严重🔥{{else if eq $v.labels.level "3"}}严重🔥🔥{{else if eq $v.labels.level "4"}}灾难🔥🔥❌{{else}}{{$v.labels.level}}{{end}}{{end}}
#### <font color="#FF0000">【当前状态】</font><font color="#E6A23C">需要处理</font>
#### <font color="#FF0000">【开始时间】</font>{{GetCSTtime $v.startsAt}}
#### <font color="#FF0000">【告警实例】</font>{{$v.labels.instance}}

**{{$v.annotations.description}}**
{{end}}
{{ end }}

image

SUSE Rancher Webhook消息发送到飞书模版

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
**[Rancher容器云平台恢复告警信息]({{$v.labels.server_url}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警级别:{{$v.labels.severity}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05 UTC"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05 UTC"}}
集群ID: {{$v.labels.cluster_name}} 
故障主机IP: {{$v.labels.instance}}
PromQL: {{$v.alert.expression}}
触发告警持续时间: {{$v.labels.duration}}
当前值为**{{$v.annotations.current_value}}**
{{else}}
**[Rancher容器云平台告警信息]({{$v.labels.server_url}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警级别:{{$v.labels.severity}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05 UTC"}}
{{if eq $v.endsAt "0001-01-01T00:00:00Z"}}
结束时间: {{ printf "告警当前仍然存在!"}}
{{else}}
结束时间: {{TimeFormat $v.endsAt "2006-01-02 15:04:05 UTC"}}
{{end}}
集群ID: {{$v.labels.cluster_name}}
故障主机IP: {{$v.labels.instance}}
PromQL: {{$v.labels.expression}}
触发告警持续时间: {{$v.labels.duration}}
当前值为**{{$v.annotations.current_value}}**
{{end}}
{{ end }}

修改告警消息中的结束时间

  • 默认为0001-01-01 00:00:00
  • 修改后打印“告警当前仍然存在!”
  • 告警恢复通知打印正常恢复时间

截图

image

有个问题需要帮助下,为什么template 颜色没有生效,飞书相关判断标题颜色的代码是已经集成的还是需要配置什么吗?
image
image

有个问题需要帮助下,为什么template 颜色没有生效,飞书相关判断标题颜色的代码是已经集成的还是需要配置什么吗? image image

已解决

有个问题需要帮助下,为什么template 颜色没有生效,飞书相关判断标题颜色的代码是已经集成的还是需要配置什么吗? image image

已解决

请问如何解决的,遇到同样的问题

有个问题需要帮助下,为什么template 颜色没有生效,飞书相关判断标题颜色的代码是已经集成的还是需要配置什么吗? image image

已解决

请问如何解决的,遇到同样的问题

image
可以查看上面分享的飞书消息模版,可以知道飞书代码会自动判断消息中所带的状态,根据匹配到的”status“可以做出“template”=$color 变量颜色的修改,你可以在prometheusalert日志中看到 json消息体最后template={color} 就是消息卡片颜色。
我在自己的消息模版中加入了 {{status}}以输出状态,消息卡片颜色即可根据 status做出相应正确判断。

image
这是我的告警消息推送截图

@alvin6233 你可以在我的主页直接使用模版
Click me

钉钉告警模板,参考上面大佬微信告警模板修改,仅供参考(优化告警时间显示)

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
#### [Prometheus恢复信息]({{$v.generatorURL}})

##### <font color="#02b340">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
##### <font color="#02b340">告警级别</font>:{{$v.labels.severity}}
##### <font color="#02b340">开始时间</font>:{{GetCSTtime $v.startsAt}}
##### <font color="#02b340">结束时间</font>:{{GetCSTtime $v.endsAt}}
##### <font color="#02b340">实例地址</font>:{{$v.labels.instance}}
##### <font color="#02b340">主机名称</font>:{{$v.labels.hostname}}

**{{$v.annotations.description}}**
{{else}}
#### [Prometheus告警信息]({{$v.generatorURL}})

##### <font color="#FF0000">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
##### <font color="#FF0000">告警级别</font>:{{$v.labels.severity}}
##### <font color="#FF0000">开始时间</font>:{{GetCSTtime $v.startsAt}}
##### <font color="#FF0000">结束时间</font>:{{GetCSTtime $v.endsAt}}
##### <font color="#FF0000">实例地址</font>:{{$v.labels.instance}}
##### <font color="#FF0000">主机名称</font>:{{$v.labels.hostname}}

**{{$v.annotations.description}}**
{{end}}
{{ end }}
{{ $urimsg:=""}}{{ range $key,$value:=.commonLabels }}{{$urimsg =  print $urimsg $key "%3D%22" $value "%22%2C" }}{{end}}[*** 点我屏蔽该告警]({{$var}}/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)

告警
image

恢复
image

时间格式不对,选择使用下面这个
恢复:

开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}}

告警:

开始时间:{{ TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}}

SUSE Rancher Webhook消息发送到飞书模版

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
**[Rancher容器云平台恢复告警信息]({{$v.labels.server_url}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警级别:{{$v.labels.severity}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05 UTC"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05 UTC"}}
集群ID: {{$v.labels.cluster_name}} 
故障主机IP: {{$v.labels.instance}}
PromQL: {{$v.alert.expression}}
触发告警持续时间: {{$v.labels.duration}}
当前值为**{{$v.annotations.current_value}}**
{{else}}
**[Rancher容器云平台告警信息]({{$v.labels.server_url}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警级别:{{$v.labels.severity}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05 UTC"}}
{{if eq $v.endsAt "0001-01-01T00:00:00Z"}}
结束时间: {{ printf "告警当前仍然存在!"}}
{{else}}
结束时间: {{TimeFormat $v.endsAt "2006-01-02 15:04:05 UTC"}}
{{end}}
集群ID: {{$v.labels.cluster_name}}
故障主机IP: {{$v.labels.instance}}
PromQL: {{$v.labels.expression}}
触发告警持续时间: {{$v.labels.duration}}
当前值为**{{$v.annotations.current_value}}**
{{end}}
{{ end }}

修改告警消息中的结束时间

  • 默认为0001-01-01 00:00:00
  • 修改后打印“告警当前仍然存在!”
  • 告警恢复通知打印正常恢复时间

截图

图片

你的持续时间字段怎么来的??

【钉钉模板】

{{ $var := .externalURL}}{{ $status := .status}}{{ range $k,$v:=.alerts }} {{if eq $status "resolved"}}
## [告警恢复-通知]({{$var}})
#### 监控指标: {{$v.labels.alertname}}
{{ if eq $v.labels.severity "warning" }}
#### 告警级别: **<font color="#E6A23C">{{$v.labels.severity}}</font>**
{{ else if eq $v.labels.severity "critical"  }}
#### 告警级别: **<font color="#F56C6C">{{$v.labels.severity}}</font>**
{{ end }}
#### 当前状态: **<font color="#67C23A" size=4>已恢复</font>**
#### 故障主机: {{$v.labels.instance}}
* ###### 告警阈值: {{$v.labels.threshold}}
* ###### 开始时间: {{GetCSTtime $v.startsAt}}
* ###### 恢复时间: {{GetCSTtime $v.endsAt}}

#### 告警恢复: <font color="#67C23A">已恢复,{{$v.annotations.description}}</font>
{{ else }}
## [监控告警-通知]({{$var}})
#### 监控指标: {{$v.labels.alertname}}
{{ if eq $v.labels.severity "warning" }}
#### 告警级别: **<font color="#E6A23C" size=4>{{$v.labels.severity}}</font>**
#### 当前状态: **<font color="#E6A23C">需要处理</font>**
{{ else if eq $v.labels.severity "critical"  }}
#### 告警级别: **<font color="#F56C6C" size=4>{{$v.labels.severity}}</font>**
#### 当前状态: **<font color="#F56C6C">需要处理</font>**
{{ end }}
#### 故障主机: {{$v.labels.instance}}
* ###### 告警阈值: {{$v.labels.threshold}}
* ###### 持续时间: {{$v.labels.for_time}}
* ###### 触发时间: {{GetCSTtime $v.startsAt}}
{{ if eq $v.labels.severity "warning" }}
#### 告警触发: <font color="#E6A23C">{{$v.annotations.description}}</font>
{{ else if eq $v.labels.severity "critical" }}
#### 告警触发: <font color="#F56C6C">{{$v.annotations.description}}</font>
{{ end }}
{{ end }}
{{ end }}

【样例】

image

【钉钉模板】

{{ $var := .externalURL}}{{ $status := .status}}{{ range $k,$v:=.alerts }} {{if eq $status "resolved"}}
## [告警恢复-通知]({{$var}})
#### 监控指标: {{$v.labels.alertname}}
{{ if eq $v.labels.severity "warning" }}
#### 告警级别: **<font color="#E6A23C">{{$v.labels.severity}}</font>**
{{ else if eq $v.labels.severity "critical"  }}
#### 告警级别: **<font color="#F56C6C">{{$v.labels.severity}}</font>**
{{ end }}
#### 当前状态: **<font color="#67C23A" size=4>已恢复</font>**
#### 故障主机: {{$v.labels.instance}}
* ###### 告警阈值: {{$v.labels.threshold}}
* ###### 开始时间: {{GetCSTtime $v.startsAt}}
* ###### 恢复时间: {{GetCSTtime $v.endsAt}}

#### 告警恢复: <font color="#67C23A">已恢复,{{$v.annotations.description}}</font>
{{ else }}
## [监控告警-通知]({{$var}})
#### 监控指标: {{$v.labels.alertname}}
{{ if eq $v.labels.severity "warning" }}
#### 告警级别: **<font color="#E6A23C" size=4>{{$v.labels.severity}}</font>**
#### 当前状态: **<font color="#E6A23C">需要处理</font>**
{{ else if eq $v.labels.severity "critical"  }}
#### 告警级别: **<font color="#F56C6C" size=4>{{$v.labels.severity}}</font>**
#### 当前状态: **<font color="#F56C6C">需要处理</font>**
{{ end }}
#### 故障主机: {{$v.labels.instance}}
* ###### 告警阈值: {{$v.labels.threshold}}
* ###### 持续时间: {{$v.labels.for_time}}
* ###### 触发时间: {{GetCSTtime $v.startsAt}}
{{ if eq $v.labels.severity "warning" }}
#### 告警触发: <font color="#E6A23C">{{$v.annotations.description}}</font>
{{ else if eq $v.labels.severity "critical" }}
#### 告警触发: <font color="#F56C6C">{{$v.annotations.description}}</font>
{{ end }}
{{ end }}
{{ end }}

【样例】

image

我想问下,为什么我告警恢复后value没有改变呢,都是最初告警的那个数值。还有你告警的持续时间那个值是怎么获取来的呢

image

这个告警标题可以修改吗,指定为告警内容,在哪里修改

	"valueString": "[ metric='zyff-网关-日志-0001-192.158.134.2' labels={datasource=tianxun, instance=zyff-网关-日志-0001-192.158.134.2, job=网关} value=66.96831536111641 ], [ metric='zyff-网关-日志-0002-192.158.134.3' labels={datasource=tianxun, instance=zyff-网关-日志-0002-192.158.134.3, job=网关} value=60.23726019772007 ], [ metric='zyff-网关-日志-0003-192.158.134.4' labels={datasource=tianxun, instance=zyff-网关-日志-0003-192.158.134.4, job=网关} value=60.335218779220604 ], [ metric='zyff-网关-日志-0004-192.158.134.5' labels={datasource=tianxun, instance=zyff-网关-日志-0004-192.158.134.5, job=网关} value=60.209148972387304 ], [ metric='zyff-网关-日志-0005-192.158.134.6' labels={datasource=tianxun, instance=zyff-网关-日志-0005-192.158.134.6, job=网关} value=61.669998479785704 ], [ metric='zyff-网关-日志-0006-192.158.134.7' labels={datasource=tianxun, instance=zyff-网关-日志-0006-192.158.134.7, job=网关} value=60.035216073651654 ]"

怎么提取valueString里面的instance后面的值呢?

{{ $urimsg:=""}}{{ range $key,$value:=.commonLabels }}{{$urimsg =  print $urimsg $key "%3D%22" $value "%22%2C" }}{{end}}[*** 点我屏蔽该告警]({{$var}}/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)

在飞书借鉴了你的屏蔽告警模板,但是提示function "SplitString" not defined 我尝试定义函数但仍然认不到

t.Funcs(template.FuncMap{"SplitString": func(s string, i, j int) string {return s[i:j]}})

已解决,直接升级版本就支持了。

飞书 V2 报警模板,之所以将 {{$v.status}} 放进去,是因为飞书报警可以根据报警状态实现不同的 title color

// 飞书相关的代码
	var color string
	if strings.Count(text, "resolved") > 0 && strings.Count(text, "firing") > 0 {
		color = "orange"
	} else if strings.Count(text, "resolved") > 0 {
		color = "green"
	} else {
		color = "red"
	}
{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
**[Prometheus 恢复通知]({{$v.generatorURL}})**
告警名称:{{$v.labels.alertname}}
告警状态:{{$v.status}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} 
实例地址:{{$v.labels.instance}}
主机名称:{{$v.labels.hostname}}
**{{$v.annotations.description}}**
{{else}}
**[Prometheus 报警通知]({{$v.generatorURL}})**
告警名称:{{$v.labels.alertname}}
告警状态:{{$v.status}} > {{$v.labels.severity}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} 
实例地址:{{$v.labels.instance}}
主机名称:{{$v.labels.hostname}}
**{{$v.annotations.description}}**
{{end}}
{{ end }}

效果图 报警通知 橙色 恢复通知

这段飞书配置写哪里

{{ $urimsg:=""}}{{ range $key,$value:=.commonLabels }}{{$urimsg =  print $urimsg $key "%3D%22" $value "%22%2C" }}{{end}}[*** 点我屏蔽该告警]({{$var}}/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)

在飞书借用了你的屏幕告警模板,但提示函数“SplitString”未定义我试确定义数但仍然认不到

t.Funcs(template.FuncMap{"SplitString": func(s string, i, j int) string {return s[i:j]}})

已解决,直接升级版本就支持了。

老哥,我在飞书里面用也是和你一样的错误,怎么解决的?

vlinux commented

所以你现在解决了吗

aptxhb commented

.externalURL 怎么把这个变量内容替换成自己公网能访问的域名加 uri 呢?
比如:http://prometheus-k8s-0:9090/graph?g0.expr=up%7Bjob%3D~%
替换后:http://www.mydomain.com/graph?g0.expr=up%7Bjob%3D~%

clhlc commented

.externalURL 怎么把这个变量内容替换成自己公网能访问的域名加 uri 呢?
比如:http://prometheus-k8s-0:9090/graph?g0.expr=up%7Bjob%3D~%
替换后:http://www.mydomain.com/graph?g0.expr=up%7Bjob%3D~%

@aptxhb 尝试修改prometheus 的hostname 试试?

aptxhb commented
AEGEGE commented

请问自定义的消息模板能否通过什么方式注入到服务中,想把自定义的模板加入到自动部署的流程中

master版本支持了,刚测了一下,可以绕过认证直接整进去
curl -X POST http://url:8080/template/import -d @prometheus-alert-template.json

飞书机器人应用

{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}**Prometheus恢复信息**
告警级别:{{$v.status}}
告警类型:{{$v.labels.alertname}}
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} 
告警主题:{{$v.annotations.summary}}
{{else}}**Prometheus告警信息**
告警级别:{{$v.status}} --> {{$v.labels.severity}}
告警类型:**{{$v.labels.alertname}}**
开始时间:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
结束时间:告警当前仍然存在!
告警主题:{{$v.annotations.summary}}
**{{$v.annotations.description}}**
{{end}}
{{ end }}

image

aptxhb commented

企微告警模板:

{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}} ## Prometheus-恢复消息
> 事件: **{{$v.labels.alertname}}**
> 告警级别: {{$v.labels.level}}
> 开始时间: {{GetCSTtime $v.startsAt}}
> 结束时间: {{GetCSTtime $v.endsAt}}
> 主机: {{$v.labels.instance}}
> <font color="info">**事件详情: {{$v.annotations.description}}**</font>
{{else}} ## Prometheus-告警消息
> 事件: **{{$v.labels.alertname}}**
> 告警级别: {{$v.labels.level}}
> 开始时间: {{GetCSTtime $v.startsAt}}
> 主机: {{$v.labels.instance}}
> <font color="warning">**事件详情: {{$v.annotations.description}}**</font>
{{end}}{{end}}

效果:

image

aptxhb commented

[prometheus自定义模版,支持恢复通知模版]

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
## [Prometheus恢复信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警级别:{{$v.labels.level}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
###### 故障主机IP:{{$v.labels.instance}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{else}}
## [Prometheus告警信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警级别:{{$v.labels.level}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
###### 故障主机IP:{{$v.labels.instance}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{end}}
{{ end }}

Alerting - Contact points 的Optional WeCom settings 需要怎么引用填写呢

luyebb commented

graylog 的模板大家有用到吗,怎么写if else

aptxhb commented
luyebb commented

[杭州测试环境日志告警]

{{.event_definition_description}}

{{if {{.event_definition_title}} eq "杭州公测环境fatal日志告警"}}
{{ range $k,$v:=.backlog }}

告警索引:{{$v.index}}
开始时间:{{GetCSTtime $v.timestamp}}
告警主机ip:{{$v.fields.gl2_remote_ip}}
查看链接: [点击链接](http://1.1.1..1/ui/?dump={{$data := $v.message | fromJson}}{{if $data.params.filename}}{{$data.params.filename}}{{end}})
{{$v.message}}

{{end}}
{{else}}
{{ range $k,$v:=.backlog }}

告警索引:{{$v.index}}
开始时间:{{GetCSTtime $v.timestamp}}
告警主机ip:{{$v.fields.gl2_remote_ip}}
{{$v.message}}

{{end}}
{{ end }}

飞书告警模板:

{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}<font color="green">**告警恢复信息**</font>
事件: **{{$v.labels.alertname}}**
告警类型:{{$v.status}}
告警级别: {{$v.labels.level}}
开始时间: {{GetCSTtime $v.startsAt}}
结束时间: {{GetCSTtime $v.endsAt}}
主机: {{$v.labels.instance}}
<font color="green">**事件详情: {{$v.annotations.description}}**</font>
{{else}}**告警信息**
事件: **{{$v.labels.alertname}}**
告警类型:{{$v.status}}
告警级别: {{$v.labels.level}}
开始时间: {{GetCSTtime $v.startsAt}}
主机: {{$v.labels.instance}}
<font color="red">**事件详情: {{$v.annotations.description}}**</font>
{{end}}
{{ end }}

效果图:

image image
{{ $urimsg:=""}}{{ range $key,$value:=.commonLabels }}{{$urimsg =  print $urimsg $key "%3D%22" $value "%22%2C" }}{{end}}[*** 点我屏蔽该告警]({{$var}}/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)

在飞书借鉴了你的屏蔽告警模板,但是提示function "SplitString" not defined 我尝试定义函数但仍然认不到

t.Funcs(template.FuncMap{"SplitString": func(s string, i, j int) string {return s[i:j]}})

已解决,直接升级版本就支持了。

请问怎么只在告警里面有这个点我屏蔽告警按钮,恢复通知里面就不要带上

`{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
✅✅告警恢复
Prometheus

🚀🚀告警名称:{{$v.labels.alertname}}

🏷️🏷️告警级别: {{$v.labels.severity}}

🙋‍♂️🙋‍♂️告警团队:{{$v.labels.Team}}

🎢🎢告警集群:{{$v.labels.Cluster}}

♨️♨️告警租户:{{$v.annotations.Tanent}}

♨️♨️告警实例:{{$v.labels.instance}}

🙋‍♂️🙋‍♂️告警维护:{{$v.labels.maintainer}}

🕓🕓开始时间:{{GetCSTtime $v.startsAt}}

🕓🕓结束时间:{{GetCSTtime $v.endsAt}}

📝📝{{$v.annotations.Description}}

{{else}}
🔥🔥告警通知
Prometheus

🚀🚀告警名称:{{$v.labels.alertname}}

🏷️🏷️告警级别: {{$v.labels.severity}}

🙋‍♂️🙋‍♂️告警团队:{{$v.labels.Team}}

🎢🎢告警集群:{{$v.labels.Cluster}}

♨️♨️告警租户:{{$v.annotations.Tanent}}

♨️♨️告警实例:{{$v.labels.instance}}

🙋‍♂️🙋‍♂️告警维护:{{$v.labels.maintainer}}

🕓🕓开始时间:{{GetCSTtime $v.startsAt}}

📝📝告警内容:{{$v.annotations.Description}}

{{end}}
{{ end }}`

image

企微告警模板:

{{ $var := .externalURL}}{{ range $k,$v:=.alerts -}}
{{ if eq $v.status "resolved" -}}
## [Prometheus恢复信息]($v.generatorURL)💨

##### 🌟<font color="#02b340">【恢复名称】✅</font>[{{$v.labels.alertname}}]({{$var}})✅{{ if $v.labels.severity }}
##### 🌟<font color="#02b340">【恢复级别】</font>
{{- if eq $v.labels.severity "info" }}info 
{{- else if eq $v.labels.severity "warning" }}warning
{{- else if eq $v.labels.severity "critical" }}critical
{{- else if eq $v.labels.severity "error" }}error 
{{ else }}{{ $v.labels.severity }}
{{ end -}}
{{ end }}
##### 🌟<font color="#02b340">【当前状态】</font><font color="#67C23A">已恢复</font>
##### 🌟<font color="#02b340">【开始时间】</font>{{GetCSTtime $v.startsAt}}
##### 🌟<font color="#02b340">【结束时间】</font>{{GetCSTtime $v.endsAt}}
##### 🌟<font color="#02b340">【恢复区域】</font>{{$v.labels.number}} in {{$v.labels.channel}}

**<font color="#02b340">{{$v.annotations.description}}</font>**
{{ else -}}
## [Prometheus告警信息]($v.generatorURL)💨

##### 🌟<font color="#FF0000">【告警名称】🔔</font>[{{$v.labels.alertname}}]({{$var}})🔔{{ if $v.labels.severity }}
##### 🌟<font color="#FF0000">【告警级别】</font>
{{- if eq $v.labels.severity "info"}}info
{{- else if eq $v.labels.severity "warning"}}warning 🔥
{{- else if eq $v.labels.severity "critical"}}critical 💔💔
{{- else if eq $v.labels.severity "error"}}error 🔥🔥❌
{{ else }}{{ $v.labels.severity }}
{{ end -}}
{{ end }}
##### 🌟<font color="#FF0000">【当前状态】</font><font color="#E6A23C">需要处理</font>
##### 🌟<font color="#FF0000">【开始时间】</font>{{GetCSTtime $v.startsAt}}
##### 🌟<font color="#FF0000">【故障区域】</font>{{$v.labels.number}} in {{$v.labels.channel}}

**<font color="#E6A23C">{{$v.annotations.description}}</font>**💨💨

## ✨[点我去屏蔽告警]({{$var}})✨
{{ end -}}
{{ end }}

效果图

看了那么多人的模板,都没有把K8S的告警当回事,重要的namesapce,pod这些都不告警出来,真是无语;
俺也分享一下俺的飞书告警模板吧

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
测试环境Prometheus 恢复通知
🟡【告警名称】{{$v.labels.alertname}}
🚨【告警级别】{{ $v.labels.severity}}
✅【告警状态】{{$v.status}}
🧭【开始时间】{{GetCSTtime $v.startsAt}}
🧭【结束时间】{{GetCSTtime $v.endsAt}}
🏷️【命名空间】 {{$v.labels.namespace}}
📡 【实例名称】 {{$v.labels.host}}{{$v.labels.pod}}{{$v.labels.job}}{{$v.labels.deployment}}{{$v.labels.statefulset}}
📝【告警详情】 {{ $v.annotations.message }}{{ $v.annotations.description}};{{$v.annotations.summary}}
{{else}}
测试环境Prometheus 告警通知
🟡【告警名称】{{$v.labels.alertname}}
🚨【告警级别】{{ $v.labels.severity}}
🔥【告警状态】{{$v.status}}
🧭【开始时间】{{GetCSTtime $v.startsAt}}
🏷️【命名空间】 {{$v.labels.namespace}}
📡 【实例名称】 {{$v.labels.host}}{{$v.labels.pod}}{{$v.labels.job}}{{$v.labels.deployment}}{{$v.labels.statefulset}}
📝【告警详情】 {{ $v.annotations.message }}{{ $v.annotations.description}};{{$v.annotations.summary}}
{{end}}
{{ end }}

效果如下:
image

这是来自QQ邮箱的假期自动回复邮件。   您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

一个大嘴巴子

How to write a template for Microsoft Teams?

显示所有prometheus告警label的自定义模版:

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
## [Prometheus恢复信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
{{ range $key,$value:=$v.labels }}
###### {{$key}}:{{$value}}
{{end}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{else}}
## [Prometheus告警信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
{{ range $key,$value:=$v.labels }}
###### {{$key}}:{{$value}}
{{end}}
###### 开始时间:{{$v.startsAt}}
###### 结束时间:{{$v.endsAt}}
##### {{$v.annotations.description}}
![Prometheus](https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png)
{{end}}
{{ end }}

效果如下图:

image

我引用该模板,一直循环报警如下图片内容,不知道哪一个环境有问题?奇怪
image

微信机器人自定义告警模板:

  1. 告警红色
  2. 恢复绿色
  3. 告警级别我用的severity,可以修改为level。请自己定义labels
  4. 使用hostname,请自己定义labels
  5. 我将故障主机IP改为实例地址,因为有些探针运行在本地,但告警对象不是它,所以修改为实例地址
  6. description是自定义的告警详细信息
{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
#### [Prometheus恢复信息]({{$v.generatorURL}})

> <font color="info">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
> <font color="info">告警级别</font>:{{$v.labels.severity}}
> <font color="info">开始时间</font>:{{$v.startsAt}}
> <font color="info">结束时间</font>:{{$v.endsAt}}
> <font color="info">实例地址</font>:{{$v.labels.instance}}
> <font color="info">主机名称</font>:{{$v.labels.hostname}}

**{{$v.annotations.description}}**
{{else}}
#### [Prometheus告警信息]({{$v.generatorURL}})

> <font color="#FF0000">告警名称</font>:[{{$v.labels.alertname}}]({{$var}})
> <font color="#FF0000">告警级别</font>:{{$v.labels.severity}}
> <font color="#FF0000">开始时间</font>:{{$v.startsAt}}
> <font color="#FF0000">结束时间</font>:{{$v.endsAt}}
> <font color="#FF0000">实例地址</font>:{{$v.labels.instance}}
> <font color="#FF0000">主机名称</font>:{{$v.labels.hostname}}

**{{$v.annotations.description}}**
{{end}}
{{ end }}

效果图:

image

备注:
此模板稍微修改也可以适用于钉钉。

为什么我的模板总是无法获取到 {{ $v.labels.severity}} 告警级别这个值

钉钉告警模板:

{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}} 
#### Prometheus-恢复消息
- 事件: **{{$v.labels.alertname}}**
- 告警级别: {{$v.labels.level}}
- 开始时间: {{GetCSTtime $v.startsAt}}
- 结束时间: {{GetCSTtime $v.endsAt}}
- 主机: {{$v.labels.instance}}
- <font color="info">**事件详情**: {{$v.annotations.description}}</font>
{{else}} 
#### Prometheus-告警消息
- 事件: **{{$v.labels.alertname}}**
- 告警级别: {{$v.labels.level}}
- 开始时间: {{GetCSTtime $v.startsAt}}
- 主机: {{$v.labels.instance}}
- <font color="warning">**事件详情: {{$v.annotations.description}}**</font>
{{end}}{{end}}

效果示例:

image

有没有办法计算持续时间?

有没有办法计算持续时间?

这是来自QQ邮箱的假期自动回复邮件。   您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

麻烦把你这个自动回复去掉一下

有没有详细配置教程啊

看了那么多人的模板,都没有把K8S的告警当回事,重要的namesapce,pod这些都不告警出来,真是无语; 俺也分享一下俺的飞书告警模板吧

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }} {{if eq $v.status "resolved"}} 测试环境Prometheus 恢复通知 🟡【告警名称】{{$v.labels.alertname}} 🚨【告警级别】{{ $v.labels.severity}} ✅【告警状态】{{$v.status}} 🧭【开始时间】{{GetCSTtime $v.startsAt}} 🧭【结束时间】{{GetCSTtime $v.endsAt}} 🏷️【命名空间】 {{$v.labels.namespace}} 📡 【实例名称】 {{$v.labels.host}}{{$v.labels.pod}}{{$v.labels.job}}{{$v.labels.deployment}}{{$v.labels.statefulset}} 📝【告警详情】 {{ $v.annotations.message }}{{ $v.annotations.description}};{{$v.annotations.summary}} {{else}} 测试环境Prometheus 告警通知 🟡【告警名称】{{$v.labels.alertname}} 🚨【告警级别】{{ $v.labels.severity}} 🔥【告警状态】{{$v.status}} 🧭【开始时间】{{GetCSTtime $v.startsAt}} 🏷️【命名空间】 {{$v.labels.namespace}} 📡 【实例名称】 {{$v.labels.host}}{{$v.labels.pod}}{{$v.labels.job}}{{$v.labels.deployment}}{{$v.labels.statefulset}} 📝【告警详情】 {{ $v.annotations.message }}{{ $v.annotations.description}};{{$v.annotations.summary}} {{end}} {{ end }}

效果如下: image

接口参数异常