告警聚合
我们看一下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 96d v1.20.5
k8s-node-50.59 Ready 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 8d
- golang版本:1.17.10
- gin版本:1.9.0
- gorm版本:1.25.1
快速开始
- 钉钉机器人创建
这里就不做过多的说明了,详细请看告警认领功能实现章节
- 创建template模板
告警详情
{{ if gt (len .slice) 0 }}
告警序号
告警名称
告警实例
告警时间
告警详情
{{ range $index, $value := .slice }}
{{ $value.ID }}
{{ $value.AlertName }}
{{ $value.Instance }}
{{ $value.CreatedAt }}
{{ $value.AlertInfo }}
{{ end }}
{{ else }}
No data available
{{ end }}
这里只是简单的展示了告警详情,小伙伴也可以自定义该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实例过多请点击详情查看")
}
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
}
- 告警列表
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
}
- 加载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,
})
}
触发告警
告警信息的展示仅仅展示了部分内容,可以按照各自的需求进行展示
查看详情
告警详情仅仅展示了部分内容,可以根据数据库字段按需展示。这里也可以跟告警认领功能结合使用。