prometheus 的触发的报警将发送到 alertmanager 启动的接口中,然后由 alertmanager 轮训自己的通知方,将信息发送。因此,建议将 alertmanager 和 prometheus 分机器部署,不要放在一起,然后再用别的脚本什么的监控一下这两个,做到交叉监控。
服务器ip: 192.168.7.107
下面例子中,我使用docker 启动的 alertmanager , 使用了 邮件 、企业微信 、 钉钉 的通知方式。
alertmanager 的 yaml 文件
cat > alertmanager.yml << EOF
global:
resolve_timeout: 5m
templates:
- "/etc/alertmanager/template/wechat.tmpl"
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 6m
receiver: default
receivers:
- name: 'default'
email_configs:
- to: "[email protected]"
send_resolved: true
from: "[email protected]"
smarthost: "smtp.xxxxx.com:25"
auth_username: "[email protected]"
auth_password: "1qwe1234qwe"
webhook_configs:
- url: 'http://192.168.7.107:8060/dingtalk/ops_dingding/send'
send_resolved: true
wechat_configs:
- corp_id: 'wwd67845aba34a0c123'
to_party: '2'
agent_id: '1000001'
api_secret: 'wfsdt2*HkjpQsz9jBfQxhVb0DL0xfdaspge90uytaZ0'
message: '{{ template "wechat.html" .}}'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname']
EOF
钉钉报警接口
钉钉报警需要启动一个钉钉的接口,写到 alertmanager.yml 文件的 webhook_configs 中。从 github 下载项目 prometheus-webhook-dingtalk ,地址: https://github.com/timonwong/prometheus-webhook-dingtalk ,编译好后,得到 prometheus-webhook-dingtalk 二进制文件,使用它启动钉钉api ,另外我觉得钉钉默认的通知模板信息太多,因此我把模板简化了一下,启动时加载自己的模板
这是启动脚本
cat > start_dingding.sh << EOF
#!/bin/bash
cd /opt/dingding_api
kill -9 `ps -ef | grep prometheus-webhook-dingtalk | grep -v grep | awk '{print $2}'`
nohup ./prometheus-webhook-dingtalk \
--template.file="/opt/dingding_api/alert.tmpl" \
--ding.profile="ops_dingding=https://oapi.dingtalk.com/robot/send?access_token=abfc2126267fsdgfde70444a771da42cd3bb245dfafb39fsdf23rrfdwfs22d52" >> start_dingding.log &
EOF
这是钉钉模板
其实就是把项目中 template/default.tmpl 文件删除了多余的东西,建议使用 template/default.tmpl 文件 修改,直接复制我这个好像报错,不知道哪的原因,但是使用源文件修改的不报错。应该是回车符的原因。
cat > /opt/dingding_api/alert.tmpl << EOF
{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}
{{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{ end }}
{{ define "__text_alert_list" }}{{ range . }}
**报警详情**
{{ range .Annotations.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
{{ end }}{{ end }}
{{ define "ding.link.title" }}{{ template "__subject" . }}{{ end }}
{{ define "ding.link.content" }}#### \[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}\] **[{{ index .GroupLabels "alertname" }}]({{ template "__alertmanagerURL" . }})**
{{ template "__text_alert_list" .Alerts.Firing }}
{{ end }}
EOF
微信报警模板
微信报警默认的信息也和钉钉一样巨多,我整了个简洁的。这里的 Labels 直接取的是 prometheus 的 Graph 中的值,Annotations是 configmap 文件中报警项 annotations 中定义的值。触发时间,就写这个,发出来的信息就会变成报警时间,{{ define “wechat.html” }} 才是 alertmanager.yml 文件中 message 项要写的值。
cat > wechat.tmpl << EOF
{{ define "wechat.html" }}
{{ range .Alerts }}
======== 阿里云报警 ==========
***请注意告警状态: {{ .Status }}
告警级别: {{ .Labels.severity }}
告警类型: {{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
========end==========
{{ end }}
{{ end }}
EOF
alertmanager 启动脚本
cat > start_alert.sh << EOF
#!/bin/bash
docker stop `docker ps -a |awk '/alertmanager/{print $1}'`
docker rm `docker ps -a |awk '/alertmanager/{print $1}'`
docker run -d \
--name alertmanager \
--restart=always \
-p 9093:9093 \
-v /etc/localtime:/etc/localtime:ro \
-v /opt/alert/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
-v /opt/alert/data:/alertmanager \
prom/alertmanager:v0.15.3
EOF
启动以后,会有个 9093 端口。将 192.168.7.107:30003 写到 prometheus 的 configmap 中
alerting:
alertmanagers:
- static_configs:
- targets: ["192.168.7.107:9093"]
重读一下 configmap , 然后触发一条报警,等待 邮件 、 钉钉 、 微信 通知 。
下面是修改的模板和自定义模板的消息对比。