暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Prometheus Alertmanager告警对接到企业微信和微信

原创 何放 2022-02-28
6984

前言

前几天总结了Prometheus+Alertmanager告警与钉钉的对接,近日经过摸索,查找网上资料,得出此文章。
Prometheus Alertmanager告警发送到企业微信和微信主要需要这么几个步骤:

  1. 获取企业微信后台相关消息,企业ID,部门ID,AgentId,Secret;
  2. Alertmanager服务配置和微信告警模板配置;
  3. Prometheus服务配置以及Alertmanager告警规则配置;

要是企业微信能收到告警消息了,再通过微信插件就能同步给微信了。

获取企业微信消息

访问企业微信官网:https://work.weixin.qq.com/ 企业微信可以供我们注册企业,目前限制不多,人人都可以注册,也不需要企业认证。

企业ID

注册完成之后,通过企业微信官网登录后台管理,在【我的企业】的企业信息里面,获取到Alertmanager服务配置需用到的第一个配置:企业ID
image.png

部门ID

在【通讯录】中,添加一个子部门,用于接收告警信息,后面把人加到该部门,部门内的人就能接收到告警信息了。
image.png
子部门添加完成之后就能看到该部门ID了
image.png

告警AgentId和Secret

告警AgentId和Secret的获取是需要在企业微信后台,在【应用管理】中,创建应用后才能够获得的。
image.png
填写相关消息,最后点击创建应用。
image.png
点击刚才创建好的应用Prometheus,就可以看到AgentId和Secret
image.png
Secret点击查看即可获取
image.png
image.png
通过以上步骤,我们就获取到配置Alertmanager的全部信息,包括:企业ID,接收告警的部门ID,AgentId和Secret,共四条消息。

Alertmanager配置

alertmanager.yml

alertmanager.yml叫做Alertmanager的配置文件,其模板都大同小异,此处为企业微信的模板。

global: resolve_timeout: 1m # 每1分钟检测一次是否恢复 wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 企业微信的api_url,无需修改 wechat_api_corp_id: 'xxxxxxxxxx' # 企业微信中企业ID wechat_api_secret: 'xxxxxxxxxxxxx' # 企业微信中,Prometheus应用的Secret templates: - '/software/alertmanager-0.23.0.linux-amd64/*.tmpl' # Alertmanager微信告警模板 route: receiver: 'wechat' group_by: ['env','instance','type','group','job','alertname'] group_wait: 10s # 初次发送告警延时 group_interval: 10s # 距离第一次发送告警,等待多久再次发送告警 repeat_interval: 5m # 告警重发时间 receivers: - name: 'wechat' wechat_configs: - send_resolved: true message: '{{ template "wechat.default.message" . }}' to_party: '2' # 企业微信中创建的接收告警的告警部门ID agent_id: '1000002' # 企业微信中创建应用的AgentId api_secret: 'xxxxxxxxxxxxx' # 企业微信中,Prometheus应用的Secret
wechat.tmpl

alertmanager.yml中templates项以配置的就是此文件,复制内容即可使用

{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
========= 监控报警 =========
告警状态:{{   .Status }}
告警级别:{{ .Labels.severity }}
告警类型:{{ $alert.Labels.alertname }}
故障主机: {{ $alert.Labels.instance }}
告警主题: {{ $alert.Annotations.summary }}
告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};
触发阀值:{{ .Annotations.value }}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
========= = end =  =========
{{- end }}
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
========= 异常恢复 =========
告警类型:{{ .Labels.alertname }}
告警状态:{{   .Status }}
告警主题: {{ $alert.Annotations.summary }}
告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};
故障时间: {{ ($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 }}
{{- end }}

Prometheus配置

Prometheus的配置主要由prometheus.yml主文件和rule.yml告警规则文件组成:

prometheus.yml
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - "rules/rule.yml"
rule.yml

告警规则文件罗列了CPU,服务状态,内存,磁盘的告警规则

groups: # 报警组组名称 - name: node_rule #报警组规则 rules: #告警名称,需唯一 - alert: Server Status #promQL表达式 expr: up == 0 #满足此表达式持续时间超过for规定的时间才会触发此报警 for: 10s labels: #严重级别 severity: critical annotations: #发出的告警标题 summary: "实例 {{ $labels.instance }} 关闭" #发出的告警内容 description: "系统 {{ $labels.instance }}: 实例关闭" ip: "{{ $labels.ip }}" - alert: Memory Usage expr: 100 - round(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) > 80 for: 1m labels: severity: error annotations: summary: "实例 {{ $labels.instance }} 内存使用率过高" description: "实例内存使用率超过 80% (当前值为: {{ $value }}%)" ip: "{{ $labels.ip }}" - alert: CPU Usage expr: 100 - round(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 80 for: 1m labels: severity: error annotations: summary: "实例 {{ $labels.instance }} CPU使用率过高" description: "实例CPU使用率超过 80% (当前值为: {{ $value }}%)" ip: "{{ $labels.ip }}" - alert: Disk Usage expr: 100 - round(node_filesystem_free_bytes{fstype=~"ext3|ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"} *100) > 80 for: 1m labels: severity: error annotations: summary: "实例 {{ $labels.instance }} 磁盘使用率过高" description: "实例磁盘使用率超过 80% (当前值为: {{ $value }}%)" ip: "{{ $labels.ip }}"

启动Prometheus和Alertmanager服务

nohup ./prometheus --config.file=/software/prometheus-2.33.3.linux-amd64/etc/prometheus.yml --storage.tsdb.retention.time=90d --log.level=debug > /software/prometheus-2.33.3.linux-amd64/prometheus.log 2>&1 & #启动prometheus软件,指定配置文件设置数据保留时间为90天设置日志级别 ss -alntup | grep -i 9090 #确认9090端口是否启动,此时命令应该有输出。 nohup ./alertmanager --config.file=/software/alertmanager/alertmanager.yml --cluster.advertise-address=0.0.0.0:9093 --log.level=debug > /software/alertmanager/alertmanager.log 2>&1 & #启动alertmanager软件指定配置文件设置监听为0.0.0.0:9093设置日志级别 ss -alntup | grep -i 9093 #确认9093端口是否启动,此时命令应该有输出。

接收的告警消息及恢复消息

此图为企业微信接收告警图片
image.png
微信目前能通过和企业微信关联接收企业微信消息,微信扫描二维码关注方式关联即可。
image.png
此图为微信接收告警图片
image.png

小结

Alertmanager的告警推送给企业微信是通过企业ID,部门ID,AgentId,Secret这四个消息来辨别接收者。消息是通过企业注册,企业微信部门和自定义应用来得到的,告警推送和告警模板都由Alertmanager这边控制。获取服务器消息和告警规则是Prometheus来操控。企业微信和微信能互相接收发送消息通过微信插件来完成。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论