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

Prometheus报警为什么选择Alertmanager?

时间:2023-03-18 14:51:20 科技观察

本文转载自微信公众号《猿世界》,作者尹继焕。转载本文请联系元天地公众号。为什么要使用alertManagerertmanager主要用于接收Prometheus发送的告警信息。支持多种报警通知渠道,轻松对报警信息进行去重、去噪、分组等处理,超级好用。其实Grafana也有自己的告警功能。本来想直接使用Grafana的告警功能,这样就不需要额外部署组件了。我试过Grafana的alarm,但是用处不大,然后就放弃了。看上图,最难受的是在alert查询中不支持Template变量,不能用于变量类型的模板。下面解释一下这个问题:索引查询语句如下:sum(rate(http_server_requests_seconds_count{application="$application",instance="$instance"}[1m]))其实是基于application和instance来查询的,即,在Whenquerying中,可以选择用哪个application,哪个instance来查看数据。但是如果要使用Grafana的告警,就不能这么写了,那么怎么写呢?删除变量。如果我的A服务有5个实例,那么你要配置5条查询语句如下:sum(rate(http_server_requests_seconds_count{application="a-service",instance="10.11.11.12"}[1m]))sum(rate(http_server_requests_seconds_count{application="a-service",instance="10.11.11.13"}[1m]))sum(rate(http_server_requests_seconds_count{application="a-service",instance="10.11.11.14"}[1m]))总和(速率(http_server_requests_seconds_count{application="a-service",instance="10.11.11.15"}[1m]))sum(rate(http_server_requests_seconds_count{application="a-service",instance="10.11.11.16"}[1m]))至此,我直接放弃了。太难用了。不知道有没有其他方法可以解决这个问题。无论如何,我投票给了alertmanager。部署alertManager在部署alertmanager之前,我们先部署一个钉钉消息转发服务,即当有报警时,alertmanager会调用这个转发服务将报警内容发送给钉钉。dockerrun-d-p8060:8060--namewebhooktimonwong/prometheus-webhook-dingtalk--ding.profile="webhook1=https://oapi.dingtalk.com/robot/send?access_token=yourtoken"钉钉机器人需要定义关键字匹配告警信息,否则收不到消息。直接用Docker部署alertmanager,命令如下:dockerrun-d--namealertmanager-p9093:9093-v/opt/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.ymlprom/alertmanager:latestalertmanager.ymlglobal:resolve_timeout:5mroute:receiver:webhookgroup_wait:30sgroup_interval:5mrepeat_interval:5mgroup_by:[alertname]routes:-receiver:webhookgroup_wait:10sreceivers:-name:webhookwebhook_configs:-url:http://10.100.0.168:8060/dingtalk/webhook1/sendsend_resolved我们可以配置为我们上面部署的钉钉转发服务的IP+Port。修改prometheus的配置文件,添加alertmanager的配置。prometheus.yml#Alertmanagerconfigurationalerting:alertmanagers:-static_configs:-targets:["10.100.0.168:9093"]rule_files:-"/etc/prometheus/rules.yml"配置告警规则rules.ymlgroups:-name:qpsrules:-alert:QPS警告expr:(sumby(instance,application)(rate(http_server_requests_seconds_count[1m])))>100for:1mlabels:severity:warningannotations:description:"Application:{{$labels.application}}Instance:{{$labels.instance}}QPS超过100(当前值:{{$value}})"summary:""-alert:Applicationofflinewarningexpr:up==0for:0mlabels:severity:warningannotations:description:"Application:{{$labels.job}}Instance:{{$labels.instance}}hasbeenoffline"summary:""上面配置了QPS告警和应用离线告警,告警规则不再详细说明。可以自己学习,当然也有一些规则配置可以参考。具体可以查看这个网站:https://awesome-prometheus-alerts.grep.to/rules配置完成后,可以在PrometheusWeb控制台Alerts中查看。报警效果遇到的问题报警内容显示有问题,研究了很久。上面有钉钉告警发布后的消息接入。在描述信息中,写有哪个应用程序和哪个实例有问题。这是两个具体的信息。当我第一次配置报警规则时,我没有得到值。取不到值的原因是我的告警规则是这样写的:sum(rate(http_server_requests_seconds_count[1m]))>100规则本身没问题,可以执行,但是取不到实例值。后来在网上研究了一些其他的东西。规则,发现如果要获取具体的值,就得在规则中包含这些内容。那就改用下面的方法,在求和后接上要显示的指标名称,就可以显示在告警信息中了。就像Sql中的select一样,如果你不指定你要的是哪个字段,就不会被查询到。(sumby(instance,application)(rate(http_server_requests_seconds_count[1m])))>100作者简介:尹继焕,纯技术爱好者,?作者,《Spring Cloud 微服务 入门 实战与进阶》,公众号Apeland创始人。