【Prometheus】关于Prometheus告警的一些使用心得

关于Prometheus告警的一些使用心得

  • 指标规整及联动判定
  • 告警多条件判断
  • 告警路由分组和接受者
  • 以URL参数区分的多个Webhook的配置
  • 使用Alertmanger的API

之前一直有在用Prometheus的规则引擎配一些告警,感觉内容还是比较多,做一下整理,方便以后用的时候有的查,一些基础的点官方文档有写,这里就不做赘述,主要是记录一些实用技巧和避开一些坑。

指标规整及联动判定

首先是指标规整,从长期使用Prometheus的经验来看,同一个服务器上,我们可能部署多个exporter(尽管我在实际的生产环境尽可能的在进行exporter的合并),因此,同一个节点上的采集端点拥有一个label能够进行联结是很有必要的,比如,在所有的job配置中添加以下内容:

- job_name: Node...relabel_configs:- source_labels: [__address__]separator: ;regex: (.*):([0-9]+)target_label: ipaddressreplacement: $1action: replace

这样就会生成一个ipaddress标签,这将会方便我们进行指标的联动,比如,使用doris自带的metrics时,存在一个叫做doris_be_memory_allocated_bytes的指标,这个指标的含义是be角色当前使用了多少内存,实际使用中,我们更多的是需要知道内存使用率,而不是值,因此,在对指标进行统一label的配置后,我们可以这样进行内存使用率的查询:

doris_be_memory_allocated_bytes / on(organization, cluster, area, ipaddress) node_memory_MemTotal_bytes * 100 > 80

这个公式将会给出be组件的内存使用率。

告警多条件判断

这里说一个场景,针对于NIFI组件,我们有这样的一个判定规则:

  1. 任一集群的RootProcessGroup的队列文件数大于10000时
  2. 对应集群的存在队列文件数大于3000时

当这两个条件同时满足时,告警需要通报对应集群下每个节点的文件积压数量,如果要按照上述的逻辑编写表达式的话,是这样的:

(count((sum by(component_name) (nifi_amount_items_queued{component_type="RootProcessGroup"}) > 2000 ) and on(component_name)  (max by(component_name, instance) (nifi_amount_items_queued{component_type="RootProcessGroup"}) > 500)) by(component_name, instance)) * on(component_name) group_right() sum by(component_name, instance) (nifi_amount_items_queued{component_type="RootProcessGroup"})

表达式非常冗长,可读性很差,不论是维护还是后期交接,都会很麻烦,换个人来看表达式的count部分根本不知道想干什么,因此我们可以设置多个告警,然后组合不同的告警来实现这个目标,首先,我们配置一个NIFI集群告警的判定规则,这会对应我们的第一个判定逻辑:

  - alert: NIFIClusterFlowWarnexpr: sum(nifi_amount_items_queued{component_type="RootProcessGroup"}) by (component_name,province)>10000for: 5mlabels:# HIGH > MEDIUM > LOWserverity: MEDIUMalertgroup: NIFIannotations:summary: "NIFIClusterFlowWarn"description: 'NIFIClusterFlowWarn'

随后我们编写一个对应于第二个判定逻辑的规则:

  - alert: NIFINodeFlowWarnexpr: max by(component_name, province, instance) (nifi_amount_items_queued{component_type="RootProcessGroup"}) > 3000for: 5mlabels:# HIGH > MEDIUM > LOWserverity: MEDIUMalertgroup: NIFIannotations:summary: "NIFINodeFlowWarn"description: 'NIFINodeFlowWarn'

最后我们只需要写一个一目了然的判定规则作为新告警即可:

  - alert: NIFI积压详情expr: '((ALERTS{alertname="NIFIClusterFlowWarn"} == 1) and on(component_name, province) (ALERTS{alertname="NIFINodeFlowWarn"}==1)) * on(component_name, province) group_right() sum by(component_name, province, instance) (nifi_amount_items_queued{component_type="RootProcessGroup",project="qz_caiji"})'for: 10mlabels:# HIGH > MEDIUM > LOWserverity: MEDIUMalertgroup: NIFIannotations:summary: "NIFI积压告警"description: '{{ $labels.instance }}-{{ $value }}'

告警路由分组和接受者

Alertmanager那边,主要配置的就是告警的路由分组以及接受者了,实际使用中这块是比较让人头疼的,如果路由没有分好,可能会出现告警没被匹配从而没发送,或者发送到奇怪的接收渠道去了,对于一个新的Alertmanager,我们要先配置响应的告警receivers,这里我们配置的一个webhook,一个空接收者

receivers:- name: 'webhook'webhook_configs:- url: 'http://10.0.0.1:6000/api/v1/alertpush'send_resolved: true- name: 'nobody'

实际使用中,我们最好都配置一个空的接收者,这样,一些不需要人员接收的告警,我们就可以直接发送到nobody去。接下来,我们编写一个根路由:

route:group_by: ['organization', 'cluster', 'area', 'alertgroup']group_wait: 30sgroup_interval: 1mrepeat_interval: 24hreceiver: 'nobody'

基于根路由的现有配置,所有的告警都会依赖['organization', 'cluster', 'area', 'alertgroup']四个标签进行分组,没有下级路由匹配的情况下,所有告警被分发到空接收者,在这个大的根路由下,我们可以编写灵活的匹配规则,比如我们分两个子组:

route:...# 省略了部分配置routes:- receiver: 'webhook1'match:alertgroup: Nodegroup_by: ['instance']group_wait: 5sgroup_interval: 1mrepeat_interval: 24h- receiver: 'webhook2'match_re:alertgroup: "HDFS|YARN|DORIS"group_by: ['instance']group_wait: 5sgroup_interval: 1mrepeat_interval: 24h

这里将大数据组件和服务器指标做了路由分发,因为需要发给不同的接收者,如果想要匹配多个值,就用match_re,如果匹配单个值就用match

子路由中又使用了instance作为分组,这样做是为了单个采集端点发生多个告警的时候,做一次性发送,不过在使用过程中,会有一种情况,那就是我们还是希望不同的告警彼此之间不要影响,即使是一个采集端点下的,这种时候可以在用告警名称做区分:

    - receiver: 'webhook2'match_re:alertgroup: "HDFS|YARN|DORIS"group_by: ['instance', 'alertname']group_wait: 5sgroup_interval: 1mrepeat_interval: 24h

这样设置的话,一个类型的告警就会单独认为是一个组,而不会再去做等待了。

以URL参数区分的多个Webhook的配置

实际使用过程中,我们有通过URL参数来区分多个webhook的需求,举个例子,现在我们希望大数据组件以及服务器告警分发给不同的企业微信机器人,但是我们希望在/api/v1/alertpush这个路由下做处理,这样的好处是,不需要每次新增一个机器人接收者就要重新增加一个路由,那么我们可以这样配webhook:

receivers:- name: 'node'webhook_configs:- url: 'http://10.0.0.1:8010/api/v1/alertpush?group=bigdata'send_resolved: true - name: 'bigdata'webhook_configs:- url: 'http://10.0.0.1:8010/api/v1/alertpush?group=bigdata'send_resolved: true

这样,在webhook那边只要根据传入的group参数进行一个区分即可,这样做的应用场景是,我们可以通过配置文件动态的新增不同的告警接收者,只需要在Alertmanager里面配置receiver即可,一定程度上减少了配置的繁琐程度。

当然这只是一种可用的思路,直接全部告警发送到默认的webhook然后在这个webhook做统一的业务逻辑处理也是可以的

使用Alertmanger的API

既然Prometheus可以给Alertmanager发送告警,我们可不可以也依赖Alertmanager发送自己的自定义告警?答案是肯定的,只要向Alertmanager推送我们的告警信息即可,这是一个curl样例:

curl --location 'http://10.0.0.1:9093/api/v2/alerts' \
--header 'Content-Type: application/json' \
--data '[{"labels": {"alertgroup": "TEST","alertname": "xxxx","area": "Area","cluster": "Cluster","instance": "10.0.0.1:9100","job": "Nodes","organization": "XXXX","serverity": "HIGH","up_type": "hardware"},"annotations": {"description": "服务器探测异常, 请关注","summary": "TEST警"},"startsAt": "2024-04-02T01:37:03.071Z","endsAt": "2024-04-02T01:50:03.071Z"}
]'

需要注意的是,任何创建的告警都遵循Alertmanager的判定规则,即会考虑group_wait等参数的影响,另外,如果不配置endsAt或者为0值,则判断告警是发生的,否则认为告警是恢复的,在判定告警状态为resolved时,endsAt必须是startsAt之后的时间

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D怎么看模型内部结构---模大狮模型网

在3D建模和设计过程中,了解模型的内部结构是十分重要的。这不仅有助于审美和设计,还能够帮助我们更好地理解模型的构造和特性。模大狮将介绍一些方法和技巧,帮助您探索3D模型的内部结构。 一、使用切片工具 切片模型:通过切片工具…

手机销量分析案例

项目背景 某电商商城随着业务量的发展,积累了大量的用户手机销售订单数据。决策层希望能够通过对这些数据的分析了解更多的用户信息及用户的分布,从而可以指导下一年的市场营销方案以及更加精准的定位市场,进行广告投放。 数据说明 数据时…

等变GNN

非空集合 G G G上定义的二元运算如果满足某些性质,就构成了一个群。常见的群有: O ( n ) O(n) O(n): n n n维正交群,包含旋转和反演操作,反演可以理解为推理或者映射。 S O ( n ) SO(n) SO(n): n n n维特殊…

【学习笔记】java项目—苍穹外卖day04

文章目录 1. 新增套餐1.1 需求分析和设计1.2 代码实现1.2.1 DishController1.2.2 DishService1.2.3 DishServiceImpl1.2.4 DishMapper1.2.5 DishMapper.xml1.2.6 SetmealController1.2.7 SetmealService1.2.8 SetmealServiceImpl1.2.9 SetmealMapper1.2.10 SetmealMapper.xml1.…

Web攻击越发复杂,企业如何保护云上业

如今,电子政务、电子商务、网上银行、网上营业厅等依托Web应用,为广大用户提供灵活多样的服务。在这之中,流量攻击堪称是Web应用的最大敌人,黑客通过流量攻击获取利益、竞争对手雇佣黑客发起恶意攻击、不法分子通过流量攻击瘫痪目…

MySQL中使用distinct单、多字段去重方法

目录 一、distinct 1.1 只对一个字段查重 1.2多个字段去重 1.3针对null处理 1.4与distinctrow同义 二、聚合函数中使用distinct 三、CONCAT_WS函数 多个字段拼接去重是指将多个字段的值按照一定的规则进行拼接,并去除重复的拼接结果。这样可以生成唯一标识符…

【中大厂前端面试百问】这不迷死你?

写在前面 最近收到很多同行的抱怨,前端开发高级还行,对初中级最难过的不是面试过不去,而是“已读不回”,来自某聘的梗,确实是,初中级因为坑位较少,很多HR在专心招聘的时候都未必能让所有投简历…

TikTok账号为什么被封?如何防止被封?

多人在使用TikTok的过程中都会遇到一些问题,比如为什么TikTok没有浏览量?事实上,这很可能是因为你的账号已被禁止。但为什么它会被封呢?你怎样才能解决它? 一、TikTok账号为什么被封? 1、什么是 TikTok 影…

TikTok账号封号原因是什么?全面攻略

多人在使用TikTok的过程中都会遇到一些问题,比如为什么TikTok没有浏览量?事实上,这很可能是因为你的账号已被禁止。但为什么它会被封呢?你怎样才能解决它? 一、TikTok账号为什么被封? 1、什么是 TikTok 影…

本地项目提交到远程服务器的git流程

初入职场的开发小白或多或少都会遇到一些使用git来管理项目的问题,这里给大家浅浅的总结一下大致的提交流程 具体步骤如下: 将当前目录下的所有修改的文件添加到暂存区 git add .提交暂存区文件到本地仓库中 描述的内容就是你本次提交的一些相关说明 …

数据结构与算法(2)顺序表的初始化、插入、打印、删除、查找元素——C语言版

目录 1.前言 2.头文件的定义 3.菜单栏的设置 4.顺序表的初始化 5.添加元素 6.打印元素 7.查找元素 8.删除元素 9.插入元素 10.主函数 11.完整的代码实现 1.前言 数据结构包括三个方面 逻辑结构存储结构运算 而线性表有两种典型的存储结构 顺序存储结构链式存储结构 具体关系可…

idea端口占用

报错:Verify the connector‘s configuration, identify and stop any process that‘s listening on port XXXX 翻译: 原因: 解决: 一、重启大法 二、手动关闭 启动spring项目是控制台报错,详细信息如下&#xff…

openGauss 访问控制模型

访问控制模型 可获得性 本特性自openGauss 1.1.0版本开始引入。 特性简介 管理用户访问权限,为用户分配完成任务所需要的最小权限。 客户价值 客户依据自身需求创建对应的数据库用户并赋予相应的权限给操作人员,将数据库使用风险降到最低。 特性描…

Compose Navigation导航使用的部分注意事项

文章目录 一、前言二、使用判断条件进行显示隐藏和Navigation的区别三、Navigation和ViewModel的关系四、Navigation中替换页面的方式 一、前言 在Android的项目架构中有一种由单个Activity,多个页面组成的架构。页面之前是由Fragment来承载显示,现在可…

Photoshop 2024 Mac/win---图像处理的新纪元,解锁无限创意

Photoshop 2024是一款功能强大的图像处理软件,以其卓越的性能和广泛的应用领域,赢得了设计师、摄影师、图形艺术家等各类创意工作者的青睐。它提供了丰富的绘画和编辑工具,让用户能够轻松进行图片编辑、合成、校色、抠图等操作,实…

【0day】号卡sql注入

漏洞描述 号卡系统一键即可便捷快速的为您自己打造一个独立的属于你的号卡分销商城。此系统某接口存在SQL注入漏洞。 fofa语句 icon_hash"-795291075" 漏洞复现 构造payload nuclei验证 pocsuite3 验证 verify 验证 attack 验证 github poc总汇地址&#xff1a…

SpringBoot:自定义线程池配置类

文章目录 一、前言二、案例展示1、初始版本2、代码审核意见和优化建议3、潜在问题和风险4、优化建议5、优化后的代码 三、具体使用 一、前言 有时候我们在项目中做一些长链路的跑批任务时,基于Springboot项目的定时任务,我们可以指定一个自定义的线程配…

无极低码:同时删除两张表中的记录

原始需求:删除两张表用户id为44的数据记录 删除user_info表中u_id为44的用户 DELETE FROM user_info WHERE u_id 44; 删除user_org_rel 表中u_id为44的用户 DELETE FROM user_org_rel WHERE u_id 44; 简便写法:用工mysql写法一次执行两张表删除 &…

深入理解WebSocket:实时双向通信的利器

一、介绍 1.1 基础概念介绍 单工通信:数据传输只允许在一个方向上传输,只能一方发送数据,另一方接收数据并发送。半双工:数据传输允许两个方向上的传输,但在同一时间内,只可以有一方发送或接收数据。全双…

SpringBoot集成Mysql

一、概述 Spring Boot是一个用于简化Spring应用开发的框架,它提供了很多默认配置,使得开发者能够快速地集成各种技术和组件,包括MySQL数据库。在Spring Boot中集成MySQL,我们通常会使用Spring Data JPA或MyBatis等持久层框架&…