当前位置: 首页 > 科技观察

掌握web应用的监控告警

时间:2023-03-16 22:22:55 科技观察

最近群里还有一个需求:发生告警时,通过企业微信将告警信息发送给开发相关负责人,方便尽快排除故障。实际使用Alertmanager来完成这项工作,下面介绍具体的实现方法。告警通道配置监控详细配置最重要的是当故障发生时,可以将告警信息发出,让正确的人第一时间了解到故障的详细情况。只有这样才能尽快排除故障。企业微信被很多公司使用,Alertmanager支持企业微信作为报警通道。根据企业微信官方文档配置报警通道。如果觉得麻烦,可以在浏览器中搜索关键字“alertmanager企业微信”,里面有很多配置示例展示。我们需要得到如下五个键值对:wechat_api_url:'https://qyapi.weixin.qq.com/cgi-bin/'wechat_api_corp_id:'12345678'agent_id:12345678api_secret:12345678to_tag:4这五个键值对需要在Alertmanager中配置,最后四个key的值根据实际情况填写。企业微信有三种ID来选择消息的接收者:用户ID、部门ID、标签ID。因为第三种方式同时支持用户和部门,使用起来更加灵活,所以这里选择第三种方式。TagID点击“TagDetails”可以看到标签ID,配置Alertmanager时会用到。tagID显示Blackbox配置,这里直接贴配置文件。docker-compose.yaml:version:'3.3'services:blackbox_exporter:image:prom/blackbox-exporter:v0.19.0ports:-"9115:9115"restart:alwaysvolumes:-"./config:/config"命令:“--config.file=/config/blackbox.yaml”config/blackbox.yaml:modules:http_get:prober:httptimeout:5shttp:valid_http_versions:["HTTP/1.1","HTTP/2.0"]valid_status_codes:[200]no_follow_redirects:falsetls_config:insecure_skip_verify:trueAlertmanager配置是这里的关键,因为告警通知的发送控制是由Alertmanager控制的。配置文件如下。docker-compose.yaml:alertmanager:image:bitnami/alertmanager:0restart:"always"ports:-9093:9093container_name:"alertmanager"volumes:-"./config:/etc/alertmanager"config/config.yml:global:resolve_timeout:5mwechat_api_url:'https://qyapi.weixin.qq.com/cgi-bin/'wechat_api_corp_id:'1234567'templates:-'/etc/alertmanager/*.tmpl'route:receiver:wechatgroup_wait:1sgroup_interval:1srepeat_interval:2sgroup_by:[adm]routes:-matchers:-adm="search"receiver:searchEnginegroup_wait:10s-matchers:-adm="portalweb"receiver:portalWebgroup_wait:10sreceivers:-name:wechatwechat_configs:-to_tag:inframessage:'{{template"wechat.message".}}'agent_id:1000002message_type:markdownapi_secret:verylongstring-name:searchEnginewechat_configs:-to_tag:searchdepmessage:'{{template"wechat.message".}}'agent_id:1000002消息e_type:markdownapi_secret:verylongstring-name:portalWebwechat_configs:-to_tag:portalwebdepmessage:'{{template"wechat.message".}}'agent_id:1000002message_type:markdownapi_secret:verylongstring有几个参数需要介绍:group_wait:当Alertmanager收到一个新的alert(第一个alert),发送这个alert给接收者之前等待的时间为group_interval:对于一个alert如果已经发生,alertmanager每隔group_interval时间检查一次警报。repeat_interval:对于已经发生的告警,每隔repeat_interval重新发送给接收方。有一份文件整理的很好,直接列在这里。》Alertmanager收到一个新的告警后会等待group_wait时间,对这个新告警做一些分组、更新、静默操作。当第一个告警经过group_wait时间后,Alertmanager会每隔group_interval时间检查一次这个告警,判断是否需要对这个告警做一些操作,当Alertmanager经过n次group_interval检查,当n*group_interval刚好大于repeat_interval时,Alertmanager会再次发送这个告警给相应的接收者。文中这三个参数配置的值很小,主要用于测试,生产环境根据需要配置。另外需要注意的是,在Alertmanager的子路由(也就是routes中)配置的参数会覆盖根路由(也就是routes中)配置的参数,所以根据config/文件中的配置config.yml”,如果发送告警到达“searchEngine”,是不可能发送到默认接收方“wechat”的,除非子路由不匹配。告警模板文件:config/wechat.tmpl。{{define"wechat.message"}}{{-ifgt(len.Alerts.Firing)0-}}{{-range$index,$alert:=.Alerts-}}{{-ifeq$index0-}}#警报项:{{$alert.Labels.alertname}}{{-end}}>`**===Alertdetails===**`>警报级别:{{$alert.Labels.severity}}>报警详情:{{index$alert.Annotations"description"}}{{$alert.Annotations.message}}>失败时间:{{($alert.StartsAt.Add28800e9).Format"2006-01-0215:04:05"}}>故障示例:{{$alert.Labels.instance}}{{-end}}{{-end}}{{-ifgt(len.Alerts.Resolved)0-}}{{-range$index,$alert:=.Alerts-}}{{-ifeq$index0-}}#Resumeitem:{{$alert.Labels.alertname}}{{-end}}>`===Resumedetails===`>警报级别:{{$alert.Labels.severity}}>警报详情:{{index$alert.Annotations"description"}}{{$alert.Annotations.message}}>失败时间:{{($alert.StartsAt.Add28800e9).Format"2006-01-0215:04:05"}}>恢复时间:{{($alert.EndsAt.Add28800e9).Format"2006-01-0215:04:05"}}>故障实例:{{$alert.Labels.instance}}{{-end}}{{-end}}{{-end}}语句"{{($alert.StartsAt.Add28800e9).Format"2006-01-0215:04:05"}}"是将时间转换成北京时间time,否则默认显示UTC时间,不利于查看故障时间。配置好Alertmanager后,再看Prometheus的配置。Prometheus配置Prometheus需要添加告警规则文件。所有需要监控的指标都存储在Prometheus中,但是它并不知道指标的值处于什么状态,需要向Alertmanager发送告警,所以需要通过添加告警规则文件来通知它。Prometheus,各个配置文件如下,docker-compose.yaml:version:'3.3'services:prometheus:image:prom/prometheusrestart:alwaysports:-"9090:9090"volumes:-"./config:/config"command:--config.file=/config/prometheus.yamlPrometheus配置文件,config/prometheus.yaml:#myglobalconfigglobal:scrape_interval:15s#将抓取间隔设置为每15秒一次。默认为每1分钟一次。evaluation_interval:15s#每15秒评估一次规则。默认为每1分钟一次。#scrape_timeout设置为全局默认值(10s)。#Alertmanagerconfigurationalerting:alertmanagers:-static_configs:-targets:-192.168.52.128:9093#LoadrulesonlyandperiodicallyEvaluatethemaccordingtotheglobal'evaluation_interval'.rule_files:-/config/alerts.rules#包含ex的抓取配置实际上是一个要抓取的端点:#这是Prometheus本身。scrape_configs:-job_name:'web-monitor'scrape_interval:1mmetrics_path:/probeparams:module:[http_get]static_configs:-targets:-https://www.baidu.com-https://cn.bing.comlabels:adm:"search"-targets:-https://www.163.com-https://www.ifeng.comlabels:adm:"portalweb"relabel_configs:-source_labels:[__address__]target_label:__param_target-source_labels:[__param_target]target_label:instance-target_label:__address__replacement:192.168.52.128:9115#blackboxexporter的真实主机名:port.Prometheus的告警规则文件,config/alerts.rules:groups:-name:Web监控rules:-alert:WebAPI不能访问expr:probe_success==0for:10slabels:severity:非常严重annotations:summary:"{{$labels.instance}}:链接无法访问"description:"{{$labels.instance}}:链接无法连接超过10s"至此,所有配置已经完成,我们来看效果:效果展示在Prometheus.查看probe_successmetric的值,看到此时链接“https://www.163.com”访问异常(当然没有真正的问题,可以用一些手段来模拟)prometheus检查Alertmanagerweb界面,同时也接收Prometheus发送的告警信息Alertmanager告警详情企业微信告警信息如下,企业微信告警汇总依赖企业微信和Alertmanager实现根据告警详情指定告警接收者的配置.