文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何快速实现Prometheus告警聚合

2024-11-30 09:00

关注

告警聚合

我们看一下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

快速开始

  1. 钉钉机器人创建

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

  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

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

核心代码

  1. 聚合实例
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
}
  1. 告警列表
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. 加载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,
 })
}

触发告警

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

查看详情

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

来源:原生运维圈内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯