Grafana系列之面板接入Prometheus Alertmanager

关于Grafana的仪表板Dashboard,以及面板Panel,参考Grafana系列之Dashboard。可以直接在面板上创建Alert,即所谓的Grafana Alert,参考Grafana系列之Grafana Alert。除了Grafana Alert外,面板也可接入Prometheus Alertmanager。

Alertmanager

关于Alertmanager的讲解,网上有很多不错的资料。

在这里插入图片描述

配置文件

alertmanager.yaml配置文件如下:

global:
  resolve_timeout: 10m # 10分钟内不再产生告警,则表示告警恢复
inhibit_rules:
- equal:
  - namespace
  - alertname
  source_matchers:
  - severity = critical
  target_matchers:
  - severity =~ warning|info
- equal:
  - namespace
  - alertname
  source_matchers:
  - severity = warning
  target_matchers:
  - severity = info
- equal:
  - namespace
  source_matchers:
  - alertname = InfoInhibitor
  target_matchers:
  - severity = info
- target_matchers:
  - alertname = InfoInhibitor
receivers:
- name: web.hook.promalert.feishu # 飞书群机器人告警通知
  webhook_configs:
  - url: http://prometheus-alert-center:8080/prometheusalert?type=fs&tpl=fs-tpl-pretty&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/9234ce69-1111-2222-96ce-f9136e47ac7&split=false # 不要试了,我已经篡改了
    send_resolved: false # 告警恢复后,不发送恢复通知
- name: 'web.hook.promalert.email' # 邮件告警通知
  webhook_configs:
  - url: 'http://prometheus-alert-center:8080/prometheusalert?type=email&tpl=email-tpl-pretty&email=aaa@tesla.com,bbb@tesla.com&split=false'
    send_resolved: false
- name: "null"
route:
  group_by:
  - namespace
  - instance
  - alertname
  - severity
  group_interval: 5m
  group_wait: 30s
  receiver: web.hook.promalert.feishu
  repeat_interval: 60m # 持续产生的告警,每隔1h才发送,避免告警轰炸,默认10m
  routes:
  - receiver: web.hook.promalert.feishu
  - matchers:
    - alertname = "Watchdog"
    receiver: "null"
templates:
- /etc/alertmanager/config/*.tmpl

配置中一般会包含以下几个主要部分:

  • 全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容;
  • 模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等;
  • 告警路由(route):根据标签匹配,确定当前告警应该如何处理;
  • 接收人(receivers):支持邮箱、微信、Slack、Webhook等,接收人一般配合告警路由使用;
  • 抑制规则(inhibit_rules):合理设置抑制规则可减少垃圾告警的产生

恢复通知

恢复通知到底要不要发送,不同的团队可采用不一样的实践。

这里给出一个绿色的恢复通知的样式:
在这里插入图片描述

分组

一个规则文件下可以配置若干个告警规则,规则文件也可以有若干个。比较好的做法是,关于节点的放在一个文件里,关于pod的放在一个文件里,业务告警规则放在另一个文件里,最后的效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实战

新增一个alert.yaml文件如下:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    # labels与Prometheus CRD中match ruleSelector -> matchLabels保持一致。
    release: kube-prom-stack
  name: tesla
spec:
  groups:
  - name: tesla
    rules:
      - alert: "tesla登录耗时大于6s"
        expr: 'round(rate(tesla_login_seconds_sum[1m])/rate(tesla_login_seconds_count[1m]), 0.01) > 6'
        for: 0s
        labels:
          severity: critical
        annotations:
          summary: tesla登录耗时大于6s
          description: "tesla登录耗时大于6s<br> 实际耗时: {{ $value }}s<br> <a href=\"http://grafana.test.tesla.com:8800/d/ce83e684dcqv4c/tesla登录?from=now-5m&to=now&timezone=browser&var-appId={{ $labels.appId }}&var-tenantId={{ $labels.tenantId }}\">查看详情</a>"

      - alert: "接口异常"
        expr: 'round(rate(http_server_requests_seconds_count{status=~"4..|5.."}[1m]), 0.01) > 0'
        for: 0s
        labels:
          severity: critical
        annotations:
          summary: 接口异常
          description: "接口异常<br> 应用: {{ $labels.job }}<br> 方法: {{ $labels.method }}<br> 状态码: {{ $labels.status }}<br> 接口: {{ $labels.uri }}<br> 报错: {{ $labels.exception }}<br> <a href=\"http://grafana.test.tesla.com:8800/d/ee990bqfj9nuoe/api?from=now-1h&to=now&var-job={{ $labels.job }}&var-uri={{ $labels.uri }}&var-status={{ $labels.status }}\">查看详情</a>"

然后执行命令:kubectl apply -f alert.yaml -o observe,或kc apply -f alert.yaml -o observe,kc是kubecolor的缩写。

来到Prometheus Alert页面,会发现新增的告警规则
在这里插入图片描述
Prometheus告警有一个独立的模块,Alertmanager,告警效果如下
在这里插入图片描述
上面直接给出最后的实现效果。

round

分析上面的告警配置,不难发现规则配置的核心自然就是expr表达式。

一开始并没有使用round函数,rate(tesla_login_seconds_sum[1m])/rate(tesla_login_seconds_count[1m]) > 6,给出的告警是这样的:
在这里插入图片描述
小数点后位数太多,不友好。

description里的这个数据对应于{{ $value }},取自于expr表达式的比较操作符的前面那部分。description里不能用round等PromQL函数,于是对expr统一增加round函数。

踩坑:对所有的expr表达式统一加round函数。

round函数不带小数点,也就是没有写成round(0.1)round(0.01)的两个问题:

  • 对API接口的4xx或5xx异常监控:expr表达式为round(rate(http_server_requests_seconds_count{status=~"4..|5.."}[1m])) > 0,意思是过去1分钟内平均值。试想一下,过去1分钟有1次接口异常,rate(http_server_requests_seconds_count{status=~"4..|5.."}[1m])结果是什么?好好想一想,或者去Grafana页面验证一下。正确的结果是1/60=0.0166667,这个数据使用round取整,肯定不满足大于0,也就是说本应该告警的事件,发生漏保。
  • 四舍五入并不精准:比如说某个登录请求耗时是6.2秒,经过round函数处理后,自然变成6。6.2 > 6自然成立,round(6.2) > 6则不成立;本应该告警的事件,因为round使用不当,告警漏报。

如下图,指标数是0.0166667的2倍,过去1分钟发生2次。
在这里插入图片描述
结论:统一调整优化round语法为取两位小数点,也就是一开始给出的规则配置文件。

跳转链接

告警成功发出后,在告警内容里增加该Prometheus Alert对应的Grafana面板链接,这一点很容易想到。

主要说四点:

  • 换行符:兼容邮件和markdown,换行符是<br>,而不是\n
  • 跳转链接:markdown语法[some-url](some-url)支持有限(自己不会),改为使用href方式;
  • 转义字符:description本身是双引号,在里面使用href标签,需要对href标签引入的双引号加以转义处理,否则执行kc apply -f alert.yaml命令失败,报错如下面截图所示。值得一提的是,如果对k8s(的yaml)不熟,死死盯着报错提示的第18行,就会陷入死胡同。kubectl执行yaml文件时,会忽略yaml文件里的注释行;真实的配置错误行,并不是报错提示的那一行。
    在这里插入图片描述
  • 变量定位:配置的跳转地址写成 http://grafana.test.tesla.com:8800/d/ee990bqfj9nuoe/api,当然没有问题。既然是API接口异常,并且Grafana面板里配置有变量,能不能直接跳转到触发告警的异常API呢?当然可以,{{ $labels.job }}即可从标签组里获取到具体的某个标签。写法:http://grafana.test.tesla.com:8800/d/ee990bqfj9nuoe/api?from=now-1h&to=now&var-job={{ $labels.job }}&var-uri={{ $labels.uri }}&var-status={{ $labels.status }}

Markdown

Prometheus Alert提供对Markdown语法的支持,不过需要测试和配置。
在这里插入图片描述
有待进一步学习

模板配置

告警方式有很多,本文暂且只考虑和配置飞书、邮件。不管什么样的通知方式,告警内容都是其中非常核心的一环(也就是上面的配置文件中的templates模块)。

当同时接入邮件、飞书、企业微信、阿里云短信,同一套告警内容如何同时适配多个不同的接收终端?

借助于开源项目(https://github.com/feiyu563/PrometheusAlert),可一定程度上解决上面提出的问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
飞书的告警模板:
在这里插入图片描述
可供参考的飞书模板:

{{ $var := .externalURL}}{{range $k,$v:=.alerts}}
{{if eq $v.status "resolved"}}
生产环境(GPU)告警恢复通知
🟡【告警名称】{{$v.labels.alertname}}
🚨【告警级别】{{$v.labels.severity}}
✅【告警状态】{{$v.status}}
🧭【开始时间】{{GetCSTtime $v.startsAt}}
🧭【结束时间】{{GetCSTtime $v.endsAt}}
📝【告警详情】{{$v.annotations.description}}
{{else}}
非生产环境(GPU)告警通知
🟡【告警名称】{{$v.labels.alertname}}
🚨【告警级别】{{$v.labels.severity}}
🔥【告警状态】{{$v.status}}
🧭【开始时间】{{GetCSTtime $v.startsAt}}
📝【告警详情】{{$v.annotations.description}}
{{end}}
{{end}}
{{ $urimsg:=""}}{{range $key,$value:=.commonLabels}}{{$urimsg = print $urimsg $key "%3D%22" $value "%22%2C"}}{{end}}[👉 点我屏蔽该告警 👈](http://alert.test.tesla.com/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)

可供参考的邮件模板:

{{if eq .state "ok"}}
<h1><a href ={{.ruleUrl}}>Grafana恢复信息</a></h1>
<h2>{{.ruleName}}</h2>
<h5>告警级别:严重</h5>
<h5>开始时间:{{GetCSTtime ""}}</h5>
<h3>{{.message}}</h3>
{{else}}
<h1><a href ={{.ruleUrl}}>Grafana恢复信息</a></h1>
<h2>{{.ruleName}}</h2>
<h5>告警级别:严重</h5>
<h5>开始时间:{{GetCSTtime ""}}</h5>
<h3>{{.message}}</h3>
{{end}}
<img src=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png />

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958075.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习入门】深度学习知识点总结

一、卷积 &#xff08;1&#xff09;什么是卷积 定义&#xff1a;特征图的局部与卷积核做内积的操作。 作用&#xff1a;① 广泛应用于图像处理领域。卷积操作可以提取图片中的特征&#xff0c;低层的卷积层提取局部特征&#xff0c;如&#xff1a;边缘、线条、角。 ② 高层…

数据结构 链表2

目录 前言&#xff1a; 一&#xff0c;反转一个链表(迭代) 二&#xff0c;打印一个链表&#xff08;递归&#xff09; 三&#xff0c;反转一个链表(递归) 四&#xff0c;双向链表 总结 前言&#xff1a; 我们根据 [文章 链表1] 可以知道链表相比较于数组的优缺点和计算机…

curl简介与libcurl开源库的使用总结

curl工具和libcurl不是同一个东西&#xff0c;二者的关系主要体现在以下方面&#xff1a; 定义与性质 curl工具&#xff1a; 是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;1997年首次发行。它支持多种协议&#xff0c;如HTTP、HTTPS、FTP、FTPS等&#xff0c;可用…

node.js 07.npm下包慢的问题与nrm的使用

一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…

Flutter:carousel_slider 横向轮播图、垂直轮播公告栏实现

安装依赖 carousel_slider: ^5.0.01、垂直滚动公告栏 import package:carousel_slider/carousel_options.dart;// 垂直滚动公告栏Widget _buildNotice() {return <Widget>[<Widget>[TDImage(assetUrl: "assets/img/home11.png",width: 60.w,height: 60.w…

RavenMarket:用AI和区块链重塑预测市场

不论是美股市场还是加密市场&#xff0c;AI都是本轮周期里的最大叙事。本轮AI的最大受益者英伟达市值超越苹果一跃成为全球第一大公司&#xff0c;加密领域围绕着AI的创新也是层出不穷&#xff0c;很多项目方开始向着AI转型。 而近期币圈最热门的板块就是AI agent&#xff0c;…

【玩转全栈】----Django基本配置和介绍

目录 Django基本介绍&#xff1a; Django基本配置&#xff1a; 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍&#xff1a; Django是一个开源的、基于Python的高级Web框架&#xff0c;旨在以快速、简洁的方式构建高质量的Web…

学技术学英语:TCP的三次握手和四次挥手

单词 汉语意思 音标 acknowledge 承认&#xff0c;确认 /əkˈnɒl.ɪdʒ/ acknowledgment 确认&#xff0c;承认 /əkˈnɒl.ɪdʒ.mənt/ duplex 双向的 /ˈdjuː.pleks/ establish 建立 /ɪˈstb.lɪʃ/ handshake 握手&#xff0c;握手协议 /ˈhnd.ʃeɪk…

iconfont等图标托管网站上传svg显示未轮廓化解决办法

打开即时设计 即时设计 - 可实时协作的专业 UI 设计工具 导入图标后拖入画板里面&#xff0c;右键选择轮廓化 将图标导出

SpringBoot集成Flink-CDC,实现对数据库数据的监听

一、什么是 CDC &#xff1f; CDC 是Change Data Capture&#xff08;变更数据获取&#xff09;的简称。 核心思想是&#xff0c;监测并捕获数据库的变动&#xff08;包括数据或数据表的插入、 更新以及删除等&#xff09;&#xff0c;将这些变更按发生的顺序完整记录下来&…

豆包 MarsCode + 开源 = ?AI 助力开源社区新人成长

来源&#xff5c;豆包 MarsCode “开源” 这个词&#xff0c;对开发者来说&#xff0c;可能是入门时的第一步&#xff0c;也可能是追求极致技术的终点。无数优秀的开源项目不仅推动了技术的进步&#xff0c;也成为开发者学习和成长的宝藏&#xff0c;但同时也因为其规模庞大、代…

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线&#xff08;CAN_H、CAN_L&#xff09;&#xff0c;线路少&#xff0c;无需共地差分信号通信&#xff08;相对的是单端信号&#xff09;&#…

机器学习-线性回归(简单回归、多元回归)

这一篇文章&#xff0c;我们主要来理解一下&#xff0c;什么是线性回归中的简单回归和多元回归&#xff0c;顺便掌握一下特征向量的概念。 一、简单回归 简单回归是线性回归的一种最基本形式&#xff0c;它用于研究**一个自变量&#xff08;输入&#xff09;与一个因变量&…

Linux 高级路由与流量控制-用 tc qdisc 管理 Linux 网络带宽

大家读完记得觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 此分享内容比较专业&#xff0c;很多与硬件和通讯规则及队列&#xff0c;比较底层需要有技术功底人员深入解读。 Linux 的带宽管理能力 足以媲美许多高端、专用的带宽管理系统。 1 队列&#xff0…

安装k8s前置操作(Ubuntu / CentOS)

本文将介绍在 Ubuntu 和 CentOS 系统上进行 Kubernetes 部署前的基本配置步骤。不同的操作系统有不同的配置方法&#xff0c;但大部分操作是相似的。本文章将分为两个部分&#xff1a;第一部分是 Ubuntu 前置操作&#xff0c;第二部分是 CentOS 前置操作。 第一节&#xff1a;U…

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…

C语言教程——动态内存管理(2)

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 我们之前学了动态内存管理分配函数&#xff0c;也是熟悉了动态内存分配函数&#xff0c;基于动态内存分配我把之前的通讯录做了修改&#xff0c;上传到了gitee上&#xff0c;这篇文章接着…

python学习笔记3-字符串常用的方法

一、判断&#xff08;9个&#xff09;&#xff1a; 二、查找和替换&#xff08;8个&#xff09; 三、⼤⼩写转换&#xff08;5个&#xff09; 四、⽂本对⻬&#xff08;3个&#xff09; 五、去除空⽩字符&#xff08;3个&#xff09; 六、拆分和连接 &#xff08;6个&#xff0…

MySQL主从配置

一、 主从原理 MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作。 二、主…

【java数据结构】二叉搜索树

【java数据结构】二叉搜索树 一、二叉搜索树的概念二、二叉搜索树的操作2.1 插入2.2 查找2.3 删除&#xff08;重点以及难点&#xff09;2.3.1 删除节点的左边为null2.3.2 删除节点的右边为null2.3.3 删除的左右节点都不为空 三、二叉搜索树的性能分析3.1 最优情况3.2 最差情况…