【无标题】

欢迎关注个人微信公众号  singless
1 介绍

prometheus相信大家都接触的比较多,prometheus天然的适合云原生场景,并且也有一套成熟的告警体系。通过alertmanger可以将告警信息发送到钉钉、企业微信等常用的办公软件。不过alertmanger的告警内容比较单一,在某些场景下,我们可能在接收到告警的同时获取到更多的信息,比如某个服务当前的状态,或是某个命令执行的结果。通过这些信息有一些基本的判断后,可能就不需要再打开电脑去检查业务的状态了。

【无标题】_第1张图片

本文主要介绍如何配置webhook,再产生告警时,由webhook执行已经写好的脚本,在脚本中我们会发送业务当前的状态检查结果到企业微信机器人。

告警机制这边先放个图

【无标题】_第2张图片

prometheus从exporter中采集指标,并根据配置好的rule.yaml中的规则去判断指标值是否正常,如果指标值异常,会将告警推送到alertmanager。altermanger再发送消息给webhook。

2 部署webhook

webhook官网地址如下

https://github.com/adnanh/webhook

ubuntu系列可以直接通过apt安装webhook,其他系列可以参考官方文档通过go对源码进行编译安装。webhook默认使用9000端口。

首先安装webhook

root@ceph-4:~# apt install webhook

安装后我们通过一个小例子来体验webhook的功能。编辑webhook配置文件,配置文件格式参考

https://github.com/adnanh/webhook/blob/master/docs/Hook-Definition.md

https://github.com/adnanh/webhook/blob/master/docs/Hook-Examples.md

root@ceph-4:~# cat /etc/webhook.conf
- id: singless-webhook  ##hook名,访问时需要用到
execute-command: "/root/test.sh"  ##webhook被访问时执行的脚本
command-working-directory: "/var/webhook"  ##webhook的工作目录,可以自己新建一个
root@ceph-4:~#
root@ceph-4:~# cat /root/test.sh ##脚本内容如下,注意一定要写明解释器,比如bash或python,或者脚本会无法执行
#!/bin/bash
/usr/bin/echo webhook >> /root/webhook

配置完成后重启webhook,并尝试触发webhook。访问方式为http://{webhook_ip}:{port}/hooks/{webhook_id}

其中端口默认使用9000端口,webhook_id为上面在配置文件中指定的id,通过下图可以看到,访问webhook后,/root/webhook文件被写入了内容,说明/root/test.sh脚本成功执行。

root@ceph-4:~# systemctl restart webhook.service
root@ceph-4:~# curl http://192.168.85.151:9000/hooks/singless-webhook
root@ceph-4:~# cat /root/webhook
webhook

【无标题】_第3张图片

3 修改webhook的默认端口

某些情况下,9000端口我们可能已经由其他业务使用了,这种情况下,可以修改webhook的端口。可以直接修改webhook的service文件,添加一个-port参数。比如下图,我修改端口为9001,修改后重启服务生效。

root@ceph-4:~# cat /lib/systemd/system/webhook.service
[Unit]
Description=Small server for creating HTTP endpoints (hooks)
Documentation=https://github.com/adnanh/webhook/
ConditionPathExists=/etc/webhook.conf

[Service]
ExecStart=/usr/bin/webhook -nopanic -hooks /etc/webhook.conf -port 9001

[Install]
WantedBy=multi-user.target
root@ceph-4:~#
root@ceph-4:~# systemctl daemon-reload
root@ceph-4:~# systemctl restart webhook.service

【无标题】_第4张图片

4 发送自定义告警内容到企业微信机器人

现在我们已经知道webhook的基本功能,下来来一个例子,当ceph状态异常时,将ceph health detail命令的执行结果发送到企业微信群。

prometheus和alertmanger的部署和对接这边不在赘述。

prometheus的告警规则如下,当ceph状态为warn时会推送告警到alertmanger

root@ceph-4:~# cat /usr/local/prometheus/rules/ceph_rules.yml
groups:
- name: ceph.rules
rules:
 - alert: CephErrorState
  expr: ceph_health_status > 0
   for: 5m
  labels:
    severity: critical
  annotations:
    description: Ceph is in Warring state longer than 5m, please check status of pools and OSDs
    summary: CEPH in WARN

alertmanger配置如下,当接收到prometheus的告警时,会发送消息给webhook

root@ceph-4:~# cat /usr/local/alertmanager/alertmanager.yml
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 1m
repeat_interval: 1h
receiver: 'wechat.hook'   ##指定告警接收者,和下面的name保持一致
receivers:
 - name: 'wechat.hook'
  webhook_configs:
     - url: 'http://192.168.85.151:9001/hooks/singless-webhook'   ##webhook地址
inhibit_rules:
 - source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'dev', 'instance']

webhook配置如下,当webhook被访问时会执行/root/trigger.sh脚本

root@ceph-4:~# cat /etc/webhook.conf
- id: singless-webhook
execute-command: "/root/trigger.sh"
command-working-directory: "/var/webhook"

trigger.sh脚本内容如下

root@ceph-4:~# cat /root/trigger.sh
#!/bin/bash
wechat_webhook=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=3b0a40d5-1c1a-4d67-87ac-a40584f217b8
ceph_health_detail=$(ceph health detail)
date=$(date)

curl $wechat_webhook \
-H 'Content-Type: application/json' \
-d '{ "msgtype": "text","text": {"content": "'"$date"' \n '"$ceph_health_detail"'"}}'

解释一下脚本中一些变量的作用

  • wechat_webhook:企业微信机器人的webhook地址,企业微信机器人可以参考网上教程创建

  • ceph_health_detail:记录ceph health detail命令的执行结果

  • date:记录当前时间

这个脚本的作用就是将当前时间和ceph health detail命令的执行结果发送给企业微信机器人

现在我模拟一下业务故障,看下效果

停止掉ceph的osd服务,这时候ceph状态会变为WARN,触发prometheus告警。

【无标题】_第5张图片

检查可以发现,收到了企业微信机器人发送的消息,且消息内容也是我们想要的。

【无标题】_第6张图片

我们再将ceph环境恢复,恢复后prometheus也会触发恢复告警。因此机器人也可以收到恢复的告警

图片

总结,webhook让我们在接收到告警后上环境检查前可以做更多的事情。比如可以在产生告警时通过脚本抓取告警时的一些进程信息,服务信息。或是在告警产生时执行一些预定义的检查脚本等。总之该工具可以根据自身需要做很多定制化的内容,应用广泛。

你可能感兴趣的:(prometheus)