本篇主要讲解alertmanager中关于告警规则的相关介绍,
prometheus 告警规则详解
prometheus 配置文件参考与介绍
告警流程介绍
prometheus会将产生的告警信息推送给alertmanager,alertmanager再根据配置的告警触发规则,进行报警,所以首先看下prometheus如何把告警信息推送给alertmanager
# 修改prometheus的配置文件
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
通过在prometheus的配置文件中指定alertmanager的服务地址来使prometheus与alertmanager进行通信
prometheus把告警信息推送给alertmanager之后,alertmanager会根据告警规则进行报警,所以需要配置告警规则,配置方式如下:
# 修改prometheus的配置文件
rule_files:
- "/etc/prometheus-rules/*.yml"
或者
rule_files:
- "/etc/prometheus-rules/system.yml"
- "/etc/prometheus-rules/mysql.yml"
- "/etc/prometheus-rules/kafka.yml"
/etc/prometheus-rules
这个目录是自定义的,我把所有的告警规则放在了此目录下,而以上就是关于配置告警的一些配置,贴一个完整版的
global:
scrape_interval: 20s
scrape_timeout: 20s
evaluation_interval: 20s
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
rule_files:
- "/etc/prometheus-rules/*.yml"
scrape_configs:
- job_name: 'k8s-node'
......
......
......
下面说一下告警规则的配置方法
告警规则
示例参考
groups:
- name: sentry
rules:
- alert: "Host Alive"
expr: (up{job='sentry'}) == 0
for: 60s
labels:
team: ops
severity: critical
cloud: yizhuang
annotations:
summary: "host is down for 60s"
description: "host: {{$labels.instance}}"
- alert: "Memory Usage"
expr: round((1-(node_memory_MemAvailable_bytes{job='sentry'} / (node_memory_MemTotal_bytes{job='sentry'})))* 100) > 85
for: 5m
labels:
team: ops
severity: warning
cloud: yizhuang
annotations:
summary: "Memory usage is too high and over 85% for 5min"
description: "The current host {{$labels.instance}}' memory usage is {{ $value }}%"
- name
: 警报规则组的名称- alert
: 警报规则的名称expr
: 使用PromQL表达式写的查询语句,用于触发是否进行告警for
: 当触发告警条件时,持续一段时间后再进行报警labels
: 自定义标签,设置后,会出现在告警中annotations
: 自定义告警描述信息
这里面还有一些变量,用来获取告警信息中的值,例如下面这些:
{{ $labels. }} 用来获取当前告警实例中指定标签的值 {{ $value }} 获取当前PromQL表达式计算的值
比如我这里有一条告警源信息
{
'receiver': 'webhook',
'status': 'firing',
'alerts': [{
'status': 'firing',
'labels': {
'alertname': '内存使用率',
'instance': '10.127.92.100',
'job': 'sentry',
'severity': 'warning',
'team': 'ops'
},
'annotations': {
'description': '内存使用率已超过55%,内存使用率:58%',
'summary': '内存使用率'
},
'startsAt': '2020-12-30T07:20:08.775177336Z',
'endsAt': '0001-01-01T00:00:00Z',
'generatorURL': 'http://prometheus-server:9090/graph?g0.expr=round%28%281+-+%28node_memory_MemAvailable_bytes%7Bjob%3D%22sentry%22%7D+%2F+%28node_memory_MemTotal_bytes%7Bjob%3D%22sentry%22%7D%29%29%29+%2A+100%29+%3E+55&g0.tab=1',
'fingerprint': '09f94bd1aa7da54f'
}],
'groupLabels': {
'alertname': '内存使用率'
},
'commonLabels': {
'alertname': '内存使用率',
'job': 'sentry',
'severity': 'warning',
'team': 'ops'
},
'commonAnnotations': {
'summary': '内存使用率'
},
'externalURL': 'http://alertmanager-server:9093',
'version': '4',
'groupKey': '{}:{alertname="内存使用率"}',
'truncatedAlerts': 0
}
那我这里可以在规则中设置的变量就有下面这些:
team组名:{{ $labels.team}}
severity报警等级:{{ $labels.severity }}
job报警规则名:{{ $labels.job }}
alertname报警名:{{ $labels.alertname }}
如何告警
告警的介质可以有很多,可以通过邮件、企业微信、钉钉、webhook等方式进行,这一块的配置是在alertmanager的配置文件中设置,具体如下:
1) webhook方式
receivers:
- name: 'webhook'
webhook_configs:
- url: 'http://alert-webhook:5000/webhook'
send_resolved: true
2) 邮件方式
global:
resolve_timeout: 5m
smtp_from: 'xxxx@163.com'
smtp_smarthost: 'smtp服务器地址'
smtp_auth_username: 'xxxx@163.com'
smtp_auth_password: '邮箱密码'
# 是否启用tls,可根据实际情况开启或关闭
smtp_require_tls: false
smtp_hello: '163.com'
receivers:
- name: 'email'
email_configs:
- to: 'test@163.com'
# 是否发送恢复通知
send_resolved: true
3) 企业微信方式使用企业微信告警,需要有企业的企业微信管理员权限,需要在后台里获取企业ID,部门ID等
global:
resolve_timeouot: 5m
# 企业微信的接口地址,应该不会变
wechat_api_url: "https://qyapi.weixin.qq.com/cgi-bin/"
wechat_api_corp_id: '企业微信的企业ID'
wechat_api_secret: '企业微信的应用secret'
receivers:
- name: 'wechat'
wechat_configs:
- send_resolved: true
message: '{{ template "wechat.default.message" . }}'
to_party: '接收告警的部门ID'
agent_id: '应用ID'
to_user: '用户ID'
api_secret: '部门secret'
注意这里使用了一个告警信息的模板,可以大概参考下
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
==========异常告警==========
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} #调整为北京时间
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
==========异常恢复==========
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} #调整为北京时间
恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} #调整为北京时间
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}
不过这里也可以用wehbook的方式来进行企业微信告警,可以使用企业微信的机器人,通过webhook调用机器人的接口,然后把信息推给机器人,从而完成告警。
注意:本篇文章不对告警模板进行讲解,下篇会详细说明




