如何快速实现Prometheus告警聚合

2023年 9月 12日 45.9k 0

上篇回顾

上篇文章我们主要对告警排班进行了阐述,具体实现思路可以添加下方二维码一起来聊一聊。当然我们针对告警排班并没有做到通用,针对这种情况后期会输出一个可通用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                     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 }}
            
            {{ end }}
            {{ else }}
            
            {{ end }}
        
    告警序号 告警名称 告警实例 告警时间 告警详情
    {{ $value.ID }} {{ $value.AlertName }} {{ $value.Instance }} {{ $value.CreatedAt }} {{ $value.AlertInfo }}
    No data available
    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;} window.onload=function(){ var tfrow = document.getElementById('tfhover').rows.length; var tbRow=[]; for (var i=1;i= 2 { instance = instance[:2] instance = append(instance, "nn实例过多请点击详情查看") } 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,
     })
    }

    触发告警

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

    查看详情

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

    相关文章

    Oracle如何使用授予和撤销权限的语法和示例
    Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
    下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
    社区版oceanbase安装
    Oracle 导出CSV工具-sqluldr2
    ETL数据集成丨快速将MySQL数据迁移至Doris数据库

    发布评论