如何快速实现Prometheus告警聚合

时间:2025-11-04 00:11:41来源:极客码头作者:域名

上篇回顾

上篇文章我们主要对告警排班进行了阐述,何快合具体实现思路可以添加下方二维码一起来聊一聊。速实当然我们针对告警排班并没有做到通用,警聚针对这种情况后期会输出一个可通用demo。何快合当我们在使用告警时经常会遇到告警洪流的速实问题,所以我们针对此类问题特此做一了个告警聚合来尽可能的警聚避免改问题的出现

告警聚合

我们看一下GPT针对告警聚合给出的解释

在 Prometheus 中,告警聚合是何快合指将多个相关的告警事件合并为单个聚合告警。当存在大量具有相同或相似问题的速实告警时,告警聚合可以帮助减少噪声,警聚并提供更清晰、何快合更有可读性的速实告警信息。高防服务器

通过告警聚合,警聚可以将多个相关的何快合告警事件合并为一个聚合告警,并在其中提供概要和摘要信息。速实这样,警聚当出现大规模故障或问题时,可以避免大量重复的单独告警,而是以更简洁的方式提供关键信息。

告警聚合通常基于共享标签(例如,相同的实例、相同的任务等)来确定哪些告警应该被聚合。在 Prometheus 的配置文件中,服务器租用可以使用 group_by 关键字来定义告警聚合规则。

案例介绍

基于告警认领功能实现代码的基础上进行稍加修改(代码可以添加下方二维码获取),依旧使用gin、gorm是实现针对告警名称的聚合,结合template简单展示告警详情列表

环境概述

复制# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master-50.57 Ready control-plane,master 96d v1.20.5 k8s-node-50.58 Ready <none> 96d v1.20.5 k8s-node-50.59 Ready <none> 96d v1.20.5 # kubectl get pod -n monitoring NAME READY STATUS RESTARTS AGE alertmanager-main-0 2/2 Running 0 8d alertmanager-main-1 2/2 Running 0 8d alertmanager-main-2 2/2 Running 0 8d blackbox-exporter-55c457d5fb-5m7ql 3/3 Running 0 8d grafana-9df57cdc4-gpzsq 1/1 Running 0 8d kube-state-metrics-56dbb74497-gpkn9 3/3 Running 0 8d node-exporter-4wl6d 2/2 Running 0 8d node-exporter-b4595 2/2 Running 0 8d node-exporter-g4l99 2/2 Running 0 8d prometheus-adapter-59df95d9f5-tnt4w 1/1 Running 0 8d prometheus-adapter-59df95d9f5-xhz5v 1/1 Running 0 8d prometheus-k8s-0 2/2 Running 1 8d prometheus-k8s-1 2/2 Running 1 10m prometheus-operator-c46b8b7c9-mg9cv 2/2 Running 0 8d1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22. golang版本:1.17.10gin版本:1.9.0gorm版本:1.25.1

快速开始

钉钉机器人创建

这里就不做过多的说明了,详细请看告警认领功能实现章节

创建template模板 复制<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>告警详情</title> </head> <body> <table id="tfhover" class="tftable"> {{ if gt (len .slice) 0}} <tr> <th >告警序号</th> <th>告警名称</th> <th>告警实例</th> <th>告警时间</th> <th>告警详情</th> </tr> {{ range $index, $value := .slice}} <tr> <td>{{ $value.ID}}</td> <td>{{ $value.AlertName}}</td> <td>{{ $value.Instance}}</td> <td>{{ $value.CreatedAt}}</td> <td>{{ $value.AlertInfo}}</td> </tr> {{ end}} {{ else}} <tr> <td colspan="3">No data available</td> </tr> {{ end}} </table> </body> </html> <style type="text/css"> table.tftable {font-size:12px;color:#333333;width:100%;border-width: 1px;border-color: #729ea5;border-collapse: collapse;} table.tftable th {font-size:12px;background-color:#acc8cc;border-width: 1px;padding: 8px;border-style: solid;border-color: #729ea5;text-align:left;} table.tftable tr {background-color:#d4e3e5;} table.tftable td {font-size:12px;border-width: 1px;padding: 8px;border-style: solid;border-color: #729ea5;} </style> <script type="text/javascript"> window.onload=function(){ var tfrow = document.getElementById(tfhover).rows.length; var tbRow=[]; for (var i=1;i<tfrow;i++) { tbRow[i]=document.getElementById(tfhover).rows[i]; tbRow[i].onmouseover = function(){ this.style.backgroundColor = #ffffff; }; tbRow[i].onmouseout = function() { this.style.backgroundColor = #d4e3e5; }; } }; </script>1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.

这里只是简单的展示了告警详情,小伙伴也可以自定义该template

核心代码

聚合实例 复制func (pa *prometheusAlert) AddPrometheusAlert(paMsg model.Alerts) (err error) { var alertInfo model.PrometheusAlert var ( uids []string instance []string claimUsers string title string ) for _, alert := range paMsg.Alerts { alertInfo.UID = utils.EntryMd5([]string{alert.Labels.AlertName, alert.Labels.Pod, alert.Labels.Namespace, alert.Labels.Severity, alert.StartsAt.String()}) alertInfo.AlertName = alert.Labels.AlertName alertInfo.Instance = alert.Labels.Instance alertInfo.Server = alert.Labels.Server alertInfo.Severity = alert.Labels.Severity alertInfo.AlertInfo = alert.Annotations.Description alertInfo.Pod = alert.Labels.Pod alertInfo.Pod = alert.Labels.Container alertInfo.Namespace = alert.Labels.Namespace _, uid := db.PrometheusAlert.AddPrometheusAlert(alertInfo) uids = append(uids, uid) alertMsg, _ := db.PrometheusAlert.SelectPrometheusAlert(alertInfo.UID) instance = append(instance, alertMsg.Instance) } if len(instance) >= 2 { instance = instance[:2] instance = append(instance, "\n\n<font color=\"#02b340\">实例过多请点击详情查看</font>") } data, title := template.DingGroupAlert(paMsg.Alerts[0].Labels.AlertName, paMsg.Alerts[0].Annotations.Description, strings.Join(instance, ",")) data += fmt.Sprintf("### [查看详情](dingtalk://dingtalkclient/page/link?url=%s&pc_slide=true&title=%s)", utils.URLEncode(viper.GetString("groupAlert.url")+"?uid="+strings.Join(uids, ",")), "") _ = DingSend.SendDing(viper.GetString("dingTalk.hook"), data, title, utils.StringToSlice(claimUsers)) return nil }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34. 告警列表 复制func (pa *prometheusAlert) SelectPrometheusAlertList(uids string) (data []*model.PrometheusAlert, err error) { for _, uid := range strings.Split(uids, ",") { dataOne, _ := db.PrometheusAlert.SelectPrometheusAlert(uid) data = append(data, dataOne) } return data, nil }1.2.3.4.5.6.7. 加载template 复制func (pa *prometheusAlert) PrometheusAlertList(ctx *gin.Context) { uids, _ := ctx.GetQuery("uid") slice, _ := service.PrometheusAlert.SelectPrometheusAlertList(uids) ctx.HTML(200, "index.html", gin.H{ "slice": slice, }) }1.2.3.4.5.6.7.

触发告警

告警信息的展示仅仅展示了部分内容,可以按照各自的需求进行展示

查看详情

告警详情仅仅展示了部分内容,可以根据数据库字段按需展示。这里也可以跟告警认领功能结合使用。WordPress模板

相关内容