$ vim /root/alertmanager/config.yml
global:
# resolve_timeout:解析超时时间
resolve_timeout: 5m
# smtp_smarthost: 使用email打开服务配置
smtp_smarthost: 'smtp.126.com:465'
# smtp_from:指定通知报警的邮箱
smtp_from: '[email protected]'
# smtp_auth_username:邮箱用户名
smtp_auth_username: '[email protected]'
# smtp_auth_password:授权密码
smtp_auth_password: 'xsk123'
# smtp_require_tls:是否启用tls
smtp_require_tls: false
# route标记:告警如何发送分配
route:
# group_by:采用哪个标签作为分组的依据
group_by: ['alertname']
# group_wait:分组等待的时间
group_wait: 10s
# group_interval:上下两组发送告警的间隔时间
group_interval: 10s
# repeat_interval:重复发送告警时间。默认1h
repeat_interval: 1m
# receiver 定义谁来通知报警
receiver: 'mail'
# receiver标记:告警接受者
receivers:
# name:报警来源自定义名称
- name: 'mail'
# email_configs:通过邮箱发送报警
email_configs:
# to:指定接收端email
- to: '[email protected]'
# inhibit_rules标记:降低告警收敛,减少报警,发送关键报警
#inhibit_rules:
# - source_match:
# severity: 'critical'
# target_match:
# severity: 'warning'
# equal: ['alertname', 'dev', 'instance']
svEdlmtIA-6joL79FCaL7ZYO27lYt_D6DbDgm6P_128
运行容器
$ docker run -d -p 9093:9093 --name alertmanager docker.io/prom/alertmanager:latest
$ docker run -d -p 9093:9093 -v /root/alertmanager/config.yml:/etc/alertmanager/config.yml --name alertmanager docker.io/prom/alertmanager:latest #将配置挂载出来
Alertmanager主要负责对Prometheus产生的告警进行统一处理,因此在Alertmanager配置中一般会包含以下几个主要部分:
全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容;
global:
templates:
route:可存在多个Route,一个Route有多个Group,一个Group有多个Alert
resolve_timeout
判断Alert是否解决,然后发送通知routes
receiver
receivers
inhibit_rules
receivers:
- name: 'wechat'
wechat_configs:
- send_resolved: true
api_secret: 'svEdlmtIA-6joL79FCaL7ZYO27lYt_D6DbDgm6P_128'
corp_id: 'ww906049af7aae6271'
api_url: "https://qyapi.weixin.qq.com/cgi-bin/"
to_party: "1"
to_user: '@all'
agent_id: "1000002"
templates:
[ - <filepath> ... ]
receivers:
- name: 'mengyuan'
email_configs:
- to: '[email protected]'
html: '{{ template "email.mengyuan.html" . }}'
headers: { Subject: "[WARN] 报警邮件test" }
当触发'物理节点夯机或宕机'
告警的时候,'监控客户端状态异常告警'
会被抑制。
inhibit_rules:
- source_match:
alertname: '物理节点宕机'
target_match:
alertname: '监控客户端状态异常告警'
equal: ['ip']
- source_match:
alertname: '物理节点夯机或宕机'
target_match:
alertname: '服务组件端口状态异常'
equal: ['ip']
alertname是从何而来?
来自prometheus配置告警略文件blackbox.rules.yaml
- alert: 物理节点夯机或宕机
expr: probe_success{group=~"test"} == 0
for: 2m
labels:
severity: "警告"
annotations:
info: |
{{ with query "time()+8*3600" }}{{ . | first | value | humanizeTimestamp | reReplaceAll "(.+)\\.(.*)" "$1" }} {{ end }} {{$labels.group}}的{{$labels.ip}}服务器夯机或宕机
summary: "请联系管理员登陆主机进行检测,判断是人为操作原因,还是主机故障。"
test1.tmpl
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
=====================
{{- end }}
===告警详情===
告警详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }}{{- end }}
=====================
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
=====================
{{- end }}
===告警详情===
告警详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
恢复时间: {{ $alert.EndsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }};{{- end }}
=====================
{{- end }}
{{- end }}
{{- end }}
test2.tmpl
{{ 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 }}
第一个
模板文件email.tmpl
{{ define "email.mengyuan.html" }}
<table>
<tr><td>报警名</td><td>开始时间</td></tr>
{{ range $i, $alert := .Alerts }}
<tr><td>{{ index $alert.Labels "alertname" }}</td><td>{{ $alert.StartsAt }}</td></tr>
{{ end }}
</table>
{{ end }}
第二个
{{ define "test.html" }}
<table border="1">
<tr>
<td>报警项</td>
<td>实例</td>
<td>报警阀值</td>
<td>开始时间</td>
</tr>
{{ range $i, $alert := .Alerts }}
<tr>
<td>{{ index $alert.Labels "alertname" }}</td>
<td>{{ index $alert.Labels "instance" }}</td>
<td>{{ index $alert.Annotations "value" }}</td>
<td>{{ $alert.StartsAt }}</td>
</tr>
{{ end }}
</table>
{{ end }}
/api/v1/alerts
/api/v1/status
/api/v1/silences
/silence/{silenceID} get delete
/api/v2/receivers
/alerts/groups
#查询已有的告警,只要客户仍然处于活动状态(通常约为30秒到3分钟),客户就会不断重新发送警报
curl http://180.76.154.185:9093/api/v1/alerts
[
{
"labels": {
"" : "" ,
...
},
"annotations": {
"" : "" ,
},
"startsAt": "" ,
"endsAt": "" #endsAt只有在警报的结束时间已知时才被设置。否则,它将被设置为自上次收到警报以来的可配置超时时间。
"generatorURL": "" #该generatorURL字段是唯一的后向链接,用于标识客户端中此警报的原因实体。
},
...
]
#生成一个告警
$ curl -H "Content-Type: application/json" -d ‘[{"labels":{"alertname":"TestAlert1"}}]’ http://180.76.154.185:9093/api/v1/alerts
#抑制一个告警
$ curl -H "Content-Type: application/json" -X POST -d '{"comment": "test1","createdBy": "test1","endsAt": "2019-02-20T18:00:59.46418637Z","matchers": [{"isRegex": false,"name": "severity","value": "critical"},{"isRegex": false,"name": "job","value": "prometheus"},{"isRegex": false,"name": "instance","value": "localhost:9090"},{"isRegex": false,"name": "alertname","value": "InstanceDown"}]}' http://alerts.example.org:9093/api/v1/silences
删除silences
$ curl -X DELETE http://alerts.example.org:9093/api/v1/silence/<silenceId>
命令行可以对告警进行抑制、查询等操作。
amtool check-config /monitor/alertmanager/config/alertmanager/alertmanager.yml
#查看当前已触发的报警
amtool alert --alertmanager.url="http://127.0.0.1:9093"
#查看所有沉默
amtool silence query --alertmanager.url="http://127.0.0.1:9093"
#查看匹配的沉默
amtool silence query alertname=PodMemory --alertmanager.url="http://127.0.0.1:9093"
#沉默添加,如果comment_required设置为true,不写comment的话会提交不上
#alertname就是Prometheus那里设置的alert
#--start 生效时间
#--end 结束时间
amtool silence add alertname="PodMemory" container_name="elasticsearch" --start="2019-01-02T15:04:05+08:00" --end="2019-01-02T15:05:05+08:00" --comment="test" -a "wuchen" --alertmanager.url="http://127.0.0.1:9093"
#更新
amtool silence update --end="2019-02-02T15:05:05+08:00" 6cac2b37-4ce2-4af5-8305-9f47850d72a4 --alertmanager.url="http://127.0.0.1:9093"
#docker官方镜像,默认数据源保存在/alertmanager,所以要挂载数据盘,不然容器重启一切都白做
#因为查看沉默列表的时候,生效时间输出的不完整,所以可以
amtool silence query -o json --alertmanager.url="http://127.0.0.1:9093"
#还可以导出json数据
amtool silence query -o json PodMemory > 1.json --alertmanager.url="http://127.0.0.1:9093"
#沉默解除
amtool silence expire 8188b168-1332-4398-83a5-a9df4263c60d --alertmanager.url="http://127.0.0.1:9093"
#解除所有沉默
amtool silence expire $(amtool silence query -q --alertmanager.url="http://127.0.0.1:9093") --alertmanager.url="http://127.0.0.1:9093"