promthus报警alertmanager配置中的几个关键点
1.alertmanager.yml中报警时间参数的意思
以发邮件为报警方式为例
resolve_timeout: 5m # 当告警状态由firing变为resolve后,还要呆多长时间,才宣布告警解除(邮件里才没有重复的恢复告警信息) group_wait: 30s #在alertmanager缓存30s,聚合不同机器的告警,聚合group group_interval: 1m #一组报警,计算的间隔时间。如果这个时间段内,报警有变化(增加、减少)或恢复有变化(增加、减少)都会触发发邮件. repeat_interval: 3m #问题没有报警或恢复的改变,重复报警,间隔3m再发邮件
2.报警模板
{{ define "email.to.html" }} {{- if gt (len .Alerts.Firing) 0 -}} {{ range .Alerts.Firing }} <h2>@告警通知</h2> 告警程序: 服务器报警 <br> 告警级别: {{ .Labels.severity }} 级 <br> 告警类型: {{ .Labels.alertname }} <br> 故障主机: {{ .Labels.instance }} <br> 告警详情: {{ .Annotations.description }} <br> 触发时间: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }} <br> {{ end }} {{ end -}} {{- if gt (len .Alerts.Resolved) 0 -}} {{ range .Alerts.Resolved }} <h2>@告警恢复</h2> 告警程序: 服务器恢复 <br> 故障主机: {{ .Labels.instance }}<br> 恢复详情: {{ .Annotations.description }}<br> 告警时间: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }}<br> 恢复时间: {{ .EndsAt.Local.Format "2006-01-02 15:04:05" }}<br> {{ end }} {{ end -}} {{- end }}其中注意,{{.Alerts.Resolved}}与{{ range .Alerts.Firing }}的用法。
这个语法可参考http://www.muzhuangnet.com/show/36757.html
告警模板
上篇文章介绍了关于告警规则的一些编写,在使用企业微信告警的时候,提到了告警模板,这里详细说下告警模板如何写。
首先,告警模板是基于go语言的模板来写的,具体可参考官方文档:https://golang.org/pkg/text/template/
,这里列举一些常用的写法,然后再去看下面的示例,就知道什么意思了。
"."
的用法
写过helm的一定知道这个'.'
,就是你定义了一个模板,当给这个模板传数据的时候,可以使用'.'来访问获取对应的变量
{{ .Country.Name.Age }}
这种就是通过链式访问这个复杂类型的数据。
模板变量
在模板中定义了变量后,在整个模板中都能使用,例如:
{{ $Name := <span class="hljs-string">"fei"</span> }} hello {{ $Name }}
define
{{ define <span class="hljs-string">"this.is.template"</span> }}
定义了一个名为"this.is.template"的模板
if/else语句
满足条件继续执行,不满足则去执行else
,不满足条件可以是一些空值,或者false,例如false
,0
,nill
,空字符串
{{ <span class="hljs-keyword">if</span> .Name }} hello {{ .Name }} {{ <span class="hljs-keyword">else</span> }} no one!!! {{ end }}
这里就是判断Name
是否有值,有就会输出hello {{ .Name }},没有输出no one,结束用{{ end }}
多条件可以使用
{{ <span class="hljs-keyword">if</span> .Name1 }} hello {{ .Name1 }} {{ <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> .Name2 }} hello {{ .Name2 }} {{ <span class="hljs-keyword">else</span> }} no one {{ end }}
Range语法
模板里使用range
来进行遍历数据,类似于jinja2
模板语言中的for
,例如:
假设数据结构为:
<span class="hljs-keyword">type</span> Info <span class="hljs-keyword">struct</span> { Name <span class="hljs-keyword">string</span> Age <span class="hljs-keyword">int</span> }
然后模板写法如下:
{{ <span class="hljs-keyword">range</span> .Info }} name: {{ .Name }} age: {{ .Age }} {{ end }}
比较
- eq 等于
- ne 不等于
- lt 小于
- le 小于等于
- gt 大于
- ge 大于等于
可以做判断比较之类的
{{ <span class="hljs-keyword">if</span> gt .Number1 .Number2 }} {{ .Number1 }}大于{{ .Number2 }} {{ end }}
逻辑运算
- and 全都满足,返回
true
- not 取反
- or 有一个为
true
,即可返回true
做一些逻辑运算,比如说
{{ <span class="hljs-keyword">if</span> and .Username .Passwd }} begin login {{ <span class="hljs-keyword">if</span> gt (<span class="hljs-built_in">len</span> .Passwd) <span class="hljs-number">16</span> }} passwd valid {{ end }} {{ <span class="hljs-keyword">else</span> }} login faild {{ end }}
{{ <span class="hljs-keyword">if</span> not .Authenticated }} access deny {{ end }}
内置函数
- title: 将字符串转换为首字母大写
- toUpper: 所有字母转换成大写
- toLower: 所有字母转换成小写
- join: 拼接字符串
- safeHtml: 将字符串标记为不需要自动转义的html
- len: 获取长度
简单举例:
{{ <span class="hljs-string">"abcd"</span> | toUpper }} {{ <span class="hljs-string">"ABCD"</span> | toLower }} {{ .Values | join <span class="hljs-string">","</span> }}
移除空格
写过ansible-playbook的一定知道,在使用jinja2
写模板的时候,缩进、空格会让人很头疼,go语言的模板同样也是如此,也是使用-
减号来做处理
{{- }} #去掉左边的空格 {{ -}} #去掉右边的空格 {{- -}} #去掉两边所有的空格
数据结构介绍
.Receiver: 接收器的名称 .Status: 如果正在告警,值为firing,恢复为resolved .Alerts: 所有告警对象的列表,是一个列表, .Alerts.Firing: 告警列表 .Alerts.Resolved: 恢复列表 .GroupLabels: 告警的分组标签 .CommonLabels: 所有告警共有的标签 .CommonAnnotations: 所有告警共有的注解 .ExternalURL: 告警对应的alertmanager连接地址
相关阅读
评论:
↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑