尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Micrometer 系列【37】Spring Boot Actuator | 集成 AlertManager 告警推送

Micrometer 系列【37】Spring Boot Actuator | 集成 AlertManager 告警推送 文章目录1. Alertmanager1.1 概述1.2 核心概念1告警分组Grouping2告警抑制Inhibition3告警静默Silences2. 集成演示2.1 部署 AlertManager2.2 Webhook 推送告警信息2.2.1 配置 Prometheus与 Alertmanager 对接2.2.2 Prometheus 添加告警规则2.2.3 Alertmanager 配置 webhook 告警通知2.2.4 模拟告警触发1. Alertmanager1.1 概述Alertmanager主要用于接收Prometheus发送的告警信息它支持丰富的告警通知渠道而且很容易做到告警信息进行分组、静默、抑制等是Prometheus生态中非常重要的一个模块。告警体系分为两大模块Prometheus服务内定义告警规则将告警推送至AlertmanagerAlertmanager统一接管告警提供告警静默、告警抑制、告警聚合能力并通过邮件、值班通知系统、聊天工具等渠道发送通知。搭建告警与通知功能的核心步骤部署并配置Alertmanager配置Prometheus使其对接Alertmanager在Prometheus中编写告警规则AlertManager不做告警判定只做告警治理与推送分发是生产告警降噪、避免轰炸的核心组件。1.2 核心概念1告警分组Grouping分组机制将同类告警合并为一条通知。大规模故障场景下尤为实用一旦大面积故障爆发系统可能同时触发成百上千条告警。举例集群中运行着上百个服务实例发生网络分区故障半数实例无法连接数据库。Prometheus告警规则配置为实例无法访问数据库时触发告警。最终会有数百条告警推送到Alertmanager。运维人员只希望收到一条通知同时能够查看受影响的具体实例。此时可以配置Alertmanager按照集群名称、告警名称对告警分组最终只发送一条汇总通知。告警分组规则、分组通知的等待时长、通知接收人均在配置文件的路由树中定义。2告警抑制Inhibition抑制机制当某条优先级更高的告警已经触发时屏蔽相关联的其他告警通知。举例一条告警提示整个集群无法访问。可以配置Alertmanager当该告警触发时屏蔽此集群下所有其他告警。避免大量次要告警刷屏干扰定位根因。3告警静默Silences静默可以在指定时间段内直接屏蔽告警。静默规则使用匹配器定义语法和路由树一致。当新告警抵达时会校验是否匹配任意一条生效静默规则匹配成功则不会发送该告警的通知。静默规则在Alertmanager Web页面中配置。2. 集成演示2.1 部署 AlertManager部署目录结构alertmanager/ ├── alertmanager.yml# 主配置文件├── templates/# 告警消息模板目录│ └── wechat.tmpl# 钉钉/企业微信消息模板└── data/# 持久化目录告警状态、静默记录alertmanager.yml默认配置# 全局配置global:# 告警超时时间resolve_timeout:5m# 路由配置route:# 用于将传入警报分组在一起的标签。group_by:[alertname]# 发送通知的初始等待时间group_wait:30s# 在发送有关新警报的通知之前需要等待多长时间group_interval:5m# 如果已发送通知则在再次发送通知之前要等待多长时间通常约3小时或更长时间repeat_interval:1h# 接受者名称receiver:web.hook# 接受者receivers:# 接受者名称-name:web.hook# webhook URLwebhook_configs:-url:http://127.0.0.1:5001/# 抑制规则inhibit_rules:-source_match:# 原标签匹配》告警级别严重severity:criticaltarget_match:# 目标标签匹配》告警级别警告severity:warning# 警报中必须有以下标签值才会被抑制。equal:[alertname,dev,instance]在上一篇的docker-compose.yml中新增Alertmanager告警组件alertmanager:image:prom/alertmanager:v0.32.2container_name:alertmanagerports:-9093:9093volumes:-./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro-./alertmanager/templates:/etc/alertmanager/templates:ro-./alertmanager/data:/alertmanagercommand:---config.file/etc/alertmanager/alertmanager.yml---storage.path/alertmanager# 如需集群高可用开启cluster参数# - --cluster.listen-address0.0.0.0:9094restart:unless-stoppedextra_hosts:-host.docker.internal:host-gateway启动docker-composeup-d访问http://ip:9093/2.2 Webhook 推送告警信息Alertmanager支持多种通知方式也就是支持多种通知接收者receiverwebhookweb回调或者HTTP服务的推送API接口wechat通过微信API发送VictorOps通过VictorOps API发出OpsGenie通过OpsGenie API发送sns短信Slack通过Slack webhooks发送。该通知包含一个附件Pushover通过Pushover API发送PagerDuty通过PagerDuty API发送email电子邮件接下来使用webhook方式实现告警信息推送2.2.1 配置 Prometheus与 Alertmanager 对接要实现Prometheus向Alertmanager中发送信息只需要配置Alertmanager连接地址即可。修改prometheus.yml添加Alertmanager地址、告警规则文件地址# 加载告警规则文件支持通配符rule_files:-alert-rules/*.yml# 配置推送告警到 Alertmanageralerting:alertmanagers:-static_configs:# 配置alertmanager连接地址-targets:[localhost:9093]localhost改为虚拟或主机地址2.2.2 Prometheus 添加告警规则在实际环境中告警规则肯定有很多比如对服务器异常进行告警就有宕机、CPU使用率超过100%、内存使用率超过80%、硬盘使用率超过80%等等。基本流程告警规则文件编写一组PromQL表达式满足条件 →Prometheus生成告警Prometheus检测到告警后推送到Alertmanager进行通知分发。直接在prometheus/alert-rules目录下编写告警规则模板示例1新建service-rules.yml文件监控的服务Job采集失败触发告警groups:-name:spring-service-rulesrules:-alert:ServiceInstanceDownexpr:up{jobspring-micrometer-service} 0for:30slabels:severity:criticalannotations:summary:服务实例宕机/无法采集description:|Job名称{{$labels.job}} 实例地址{{$labels.instance}} 当前状态采集失败服务大概率宕机或网络不通示例2HTTP请求错误率过高groups:-name:spring-service-rulesrules:# HTTP请求错误率过高-alert:HttpRequestErrorHighexpr:sum(rate(http_server_requests_seconds_count{status~5..}[1m])) by(instance,job) / sum(rate(http_server_requests_seconds_count[1m])) by(instance,job)0.05for:1mlabels:severity:warningannotations:summary:接口5xx错误率大于5%Docker环境需要添加文件映射-./prometheus/alert-rules:/etc/prometheus/alert-rules:ro重启Prometheus查看控制台发现当前规则已被激活也可以看到详细的规则信息。2.2.3 Alertmanager 配置 webhook 告警通知使用Spring boot创建一个web项目提供一个API接口用于接收告警通知。RestControllerRequestMapping(/alertmanager)publicclassAlertmanagerController{RequestMapping(/hook)publicObjecthook(RequestBodyStringbody){System.out.println(接受到告警信息body);System.out.println(告警信息发送到数据库。。。);returnsuccess;}}在alertmanager.yml中添加route及receivers配置webhook_configs中的url配置配我们提供了webhook接口地址。# 全局配置,全局配置包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。global:# 告警超时时间resolve_timeout:5m# 路由配置,设置报警的分发策略它是一个树状结构按照深度优先从左向右的顺序进行匹配。route:# 用于将传入警报分组在一起的标签。# 基于告警中包含的标签如果满足group_by中定义标签名称那么这些告警将会合并为一个通知发送给接收器。group_by:[alertname]# 发送通知的初始等待时间group_wait:30s# 在发送有关新警报的通知之前需要等待多长时间group_interval:5m# 如果已发送通知则在再次发送通知之前要等待多长时间通常约3小时或更长时间repeat_interval:30s# 接受者名称receiver:web.hook# 配置告警消息接受者信息例如常用的 email、wechat、slack、webhook 等消息通知方式receivers:# 接受者名称-name:web.hook# webhook URLwebhook_configs:-url:http://127.0.0.1:9111/alertmanager/hook重新启动查看控制台当前是没有信息提示的2.2.4 模拟告警触发关掉监控的Spring Boot程序Prometheus显示服务掉线查看Alertmanager控制台发现收到了一条告警通知在查看我们定义的webhook接口也收到了告警信息
返回列表