作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


07-15:花了几个小时仍然是没走通这个流程,把中间结果记录一下。

07-16:嗨森,调通了!

1.部署了alert manager

部署的架构主要参考这篇文章:Alertmanager高可用

架构图如下:



为了方便prometheus访问alert manager,在alert manager前面还部署了CLB,可以通过VIP访问alert manager集群。

配置的细节如下:

  • --cluster.advertise-address="${POD_IP}:9094": 这个配置是告诉alertmanager它自己的地址是多少,便于gossip协议广播时排除自己。

  • --cluster.peer这个参数填写群集中的其他alertmanager的地址。
    • 一般第一个启动的节点不填这个参数,第二个启动的节点填第一个节点的ip:port,其他节点陆续链上去就行了。
    • 多个容器启动的时候是同时进行的,为了保障其中有一个节点一定是其他所有节点之前启动起来,我用了etctctl lock来保障启动顺序:如何用etcdctl产生分布式环境中的递增ID
    • 最终,gossip协议让所有节点都知道其他的所有节点的存在。
  • alertmanager.yaml配置文件中:
    • 配置webhook来进行告警的投递
    • webhook的链接可以点开任意微信群,然后加个机器人,就得到了链接。
  • 也可以使用amtool命令行工具来查询这些信息:
# 安装amtool
go install github.com/prometheus/alertmanager/cmd/amtool@latest # 查看服务器端配置
amtool --alertmanager.url=http://9.220.xxx.xxx/ config show # 查看群集状态
amtool --alertmanager.url=http://9.220.xxx.xxx/ cluster show

2.模拟告警

可以用命令行工具模拟告警:

curl -X POST "http://9.220.xxx.xxx/api/v2/alerts" -H "Content-type: application/json" -d '[{"status": "firing","labels": {"alertname": "name","service": "my-service","severity":"warning","instance": "name.example.net"},"annotations": {"summary": "High latency is high!"},"generatorURL": "http://prometheus.int.example.net/<generating_expression>"}]' -v

打开alert manager的页面,可以看见有这条告警。

3.alertmanager发给webhook的数据是什么格式?

这篇帖子里面有例子:prometheus+alertmanager+webhook实现自定义监控报警系统

json格式如下:

{
"receiver":"webhook",
"status":"resolved",
"alerts":[
{
"status":"resolved",
"labels":{
"alertname":"hostCpuUsageAlert",
"instance":"192.168.199.24:9100",
"severity":"page"
},
"annotations":{
"description":"192.168.199.24:9100 CPU 使用率超过 85% (当前值为: 0.9973333333333395)",
"summary":"机器 192.168.199.24:9100 CPU 使用率过高"
},
"startsAt":"2020-02-29T19:45:21.799548092+08:00",
"endsAt":"2020-02-29T19:49:21.799548092+08:00",
"generatorURL":"http://localhost.localdomain:9090/graph?g0.expr=sum+by%28instance%29+%28avg+without%28cpu%29+%28irate%28node_cpu_seconds_total%7Bmode%21%3D%22idle%22%7D%5B5m%5D%29%29%29+%3E+0.85&g0.tab=1",
"fingerprint":"368e9616d542ab48"
}
],
"groupLabels":{
"alertname":"hostCpuUsageAlert"
},
"commonLabels":{
"alertname":"hostCpuUsageAlert",
"instance":"192.168.199.24:9100",
"severity":"page"
},
"commonAnnotations":{
"description":"192.168.199.24:9100 CPU 使用率超过 85% (当前值为: 0.9973333333333395)",
"summary":"机器 192.168.199.24:9100 CPU 使用率过高"
},
"externalURL":"http://localhost.localdomain:9093",
"version":"4"
}
//版权声明:本文为CSDN博主「昵称2021」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
//原文链接:https://blog.csdn.net/bluuusea/article/details/104619235

然而,企业微信的webhook收的可不是这个格式:消息类型及数据格式

{
"chatid": "wrkSFfCgAAtMQKg4xqDatM5C9IDHFpTw|@all_subscriber|zhangsan",
"post_id" : "bpkSFfCgAAWeiHNo2p6lJbG3_F2xxxxx",
"visible_to_user": "zhangsan|lisi",
"msgtype": "text",
"text": {
"content": "<@zhangsan>广州今日天气:29度,大部分多云,降雨概率:60%",
"mentioned_list":["wangqing","@all"],
"mentioned_mobile_list":["13800001111","@all"]
}
}

很明显,直接把webhook地址配置到alertmanager肯定是发不出去的

4.注册企业微信的开发者

alertmanager里面有很多wechat的配置:

5.使用开源组件来把alert manager webhook 转换为 wechat webhook

还真有,地址在:https://github.com/k8stech/alertmanager-wechatrobot-webhook

我fork了作者的这个项目,并使其可以在容器环境跑起来,代码在:https://github.com/ahfuzhang/alertmanager-wechatrobot-webhook

启动命令行为:

./wechat-webhook -RobotKey=xxxxx -addr=:8999

部署后用命令行来测试一下是否能发到企业微信:

curl -X POST "http://9.220.xxx.xxx/webhook" -H "Content-type: application/json" -d '{"receiver":"webhook","status":"resolved","alerts":[{"status":"resolved","labels":{"alertname":"hostCpuUsageAlert","instance":"192.168.199.24:9100","severity":"page"},"annotations":{"description":"192.168.199.24:9100 CPU 使用率超过 85% (当前值为: 0.9973333333333395)","summary":"机器 192.168.199.24:9100 CPU 使用率过高"},"startsAt":"2020-02-29T19:45:21.799548092+08:00","endsAt":"2020-02-29T19:49:21.799548092+08:00","generatorURL":"http://localhost.localdomain:9090/graph?g0.expr=sum+by%28instance%29+%28avg+without%28cpu%29+%28irate%28node_cpu_seconds_total%7Bmode%21%3D%22idle%22%7D%5B5m%5D%29%29%29+%3E+0.85&g0.tab=1","fingerprint":"368e9616d542ab48"}],"groupLabels":{"alertname":"hostCpuUsageAlert"},"commonLabels":{"alertname":"hostCpuUsageAlert","instance":"192.168.199.24:9100","severity":"page"},"commonAnnotations":{"description":"192.168.199.24:9100 CPU 使用率超过 85% (当前值为: 0.9973333333333395)","summary":"机器 192.168.199.24:9100 CPU 使用率过高"},"externalURL":"http://localhost.localdomain:9093","version":"4"}'

在企业微信群里可以看见如上的信息。

然后,修改alertmanager的yaml文件:

global:
resolve_timeout: 10m
receivers:
- name: 'webhook'
webhook_configs:
- url: 'http://9.220.xxx.xxx/webhook'
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 1m
repeat_interval: 1m
receiver: 'webhook'

最后用命令行测试一下发送到alertmanager的告警,能否最终发到企业微信上:

curl -X POST "http://9.220.xxx.xx/api/v2/alerts" -H "Content-type: application/json" -d '[{"status": "firing","labels": {"alertname": "name","service": "my-service","severity":"warning","instance": "name.example.net"},"annotations": {"summary": "High latency is high!"},	"generatorURL": "http://prometheus.int.example.net/<generating_expression>"}]'



触发了多次告警,成功!

【解决了一个小问题】alert manager要怎么样才能触发告警到企业微信上?的更多相关文章

  1. 【解决了一个小问题】alert manager中的cluster.advertise-address参数是什么意思?

    如果在启动 alert manager的时候,不填写参数: /usr/bin/alertmanager --config.file=/etc/alert_manager/alertmanager.ya ...

  2. 【解决了一个小问题】go.mod文件中引用另一个库,总会自动拉取新版本

    我的项目依赖某个旧的公共库: require ( git.xxx.com/myprj/mylib v0.0.43 ) 可以编译的时候,系统总会自动加上这样的路径: require ( git.xxx. ...

  3. 【解决了一个小问题】golang protocol buffers 3中去掉json标签中的omitempty

    参考了这篇帖子:golang protobuf从生成的json标记中删除omitempty标记 由于是在windows上开发,因此写了一个python脚本来解决: remove_tag.py impo ...

  4. 【解决了一个小问题】golang gin框架中的模板,让模板中的参数不要做HTML转义

    代码中使用了类似的方式来向模板填充参数: c.HTML(200, "list.html", gin.H{"data":builder.String()}) 模板 ...

  5. 【解决了一个小问题】如何展示VictoriaMetrics组件上报的bucket数据

    VM体系还真的是不一(he)样(qun), 它上报的监控数据长这样: vmagent_remotewrite_block_size_rows_bucket{vmrange="2.448e+0 ...

  6. 【解决了一个小问题】golang build中因为缓存文件损坏导致的编译错误

    编译的过程中出现了一个吓人的错误: GOROOT=C:\Go #gosetup GOPATH=C:\Users\ahfuzhang\go #gosetup C:\Go\bin\go.exe mod t ...

  7. 【解决了一个小问题】golang中引用一个路径较长的库,导致goland中出现"module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2"

    在项目中的go.mod文件中有这样一句: require ( github.com/xxx-devops/xx1/sdk/go v2.2.3 ) 项目的编译没有问题,但是goland中出现如下提示: ...

  8. 【解决了一个小问题】alpine镜像中,busybox的date命令获取昨天的日期

    直接上答案: date -d@"$(( `date +%s`-86400))" +"%Y-%m-%d"

  9. 【解决了一个小问题】vmselect对应的vmstorage端口配置错误导致的问题

    从vmselect查询的时候,出现如下错误: error when executing query="up" on the time range (start=1639388706 ...

  10. 【解决了一个小问题】golang的go.mod中出现版本错误

    代码中的这一句使用prometheus2.28.0版本的代码: import "github.com/prometheus/prometheus/prompb" 我把require ...

随机推荐

  1. 如何快速从 ETL 到 ELT?火山引擎 ByteHouse 做了这三件事

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 前言 当涉及到企业分析场景时,所使用的数据通常源自多样的业务数据,这些数据系统大多采用以行为主的存储结构,比如支付 ...

  2. PPT 毕业答辩PPT应该怎么样改

    PPT 毕业答辩PPT应该怎么样改

  3. JQuery 弹出模态窗口

    index.html <!DOCTYPE html> <html> <head> <!-- Contact Form CSS files --> < ...

  4. MappedByteBuffer 写文件

    MappedByteBuffer中"put"和"force"的区别是什么 put()将数据存储在缓冲区中,force()通知操作系统将缓冲区刷新到磁盘. put ...

  5. Beyond Compare常用快捷键

    [会话]菜单的功能与快捷键 [文件]菜单的功能与快捷键 [编辑]菜单的功能与快捷键 [搜索]菜单的功能与快捷键

  6. C. Given Length and Sum of Digits... (贪心)

    https://codeforces.com/problemset/problem/489/C C. Given Length and Sum of Digits... You have a posi ...

  7. java调用本机的命令 如ping、打开文本等

    最近接触到用java代码调用主机的命令部分感觉有点意思整理总结一下 环境jdk1.8  操作系统win10,不用引入其他的包jdk自带的api就可以 一.java调用ping命令 import jav ...

  8. 淘宝flexible.js源码分析

    下面三种情况都会刷新页面,都会触发load事件. 1.a标签的超链接. 2.F5或者刷新按钮(强制刷新) 3.前进后退按钮 但是火狐中,有个特点,有个"往返缓存",这个缓存中不仅保 ...

  9. nginx 工作原理及特点

    本文为博主原创,未经允许不得转载: nginx 简介:是一个高性能 HTTP 和 反向代理 服务器. Nginx 特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中 ...

  10. 超全面总结Vue面试知识点,助力金三银四

    前言 本文会对Vue中一些常见的重要知识点以及框架原理进行整理汇总,意在帮助作者以及读者自测Vue的熟练度以及方便查询与复习.金三银四的到来,想必vue会是很多面试官的重点考核内容,希望小伙伴们读完本 ...