SRE/DevOps不得不懂的:Prometheus的配置工程化!

news2024/12/23 9:30:06

6b14efb7814675d43454bb0e0a390f59.jpeg

原创不易,还请关注和转发~谢谢

背景

Prometheus有两个最基本的组件:一个是Prometheus程序,一个是Alertmanager程序。

它们的职责分工很明确:

  • • Prometheus程序负责:定时拉取监控指标数据、存储指标数据、根据告警规则发起告警通知;

  • • Alertmanager程序负责:负责告警通知的路由,即当接收到Prometheus程序的通知后,该将通知以何种方式通知给谁。

e840a6b8b6caf5d36c98e4067c2c4334.png

Prometheus程序的配置最核心的配置[1]是:

# ... 

# 当指标数据符合什么规则进行告警通知。
# 在其它文件定义,这里只是引用该文件的路径。
rule_files:
  [ - <filepath_glob> ... ]

# 从哪里,该如何拉取指标
scrape_configs:
  [ - <scrape_config> ... ]
  
# ...

Alertmanager程序的配置最核心的配置[2]是:

# ...
# 告警通知路由规则
route:
    [- <route_config>-]
# 告警通知的接收者列表,部分监控告警平台也称之为channel
receivers:
    [- <receivers>-]
# ...

在实际工作中,Prometheus和Alertmanager的配置会非常大。

严谨的软件工程要求我们在真正部署这些配置前,对其进行有效性和正确性的检查。否则SRE/DevOps的工程效率就会很低,因为你需要手工调试庞大的配置。

所以,我们需要有一种高效率的方式来保证配置的有效性和正确性。

保证Prometheus程序配置的有效性和正确性

promtool

Prometheus程序提供了一个叫promtool的命令行程序。解压Prometheus的程序包后,你会发现它和Prometheus程序放在一个文件夹中。

promtool提供了一些子命令来保证Prometheus程序配置的有效性和正确性:

# 校验Prometheus配置的有效性,它支持--lint="duplicate-rules"参数,用于检查重复的rule配置
check config [<flags>] <config-files>...
# 校验rule配置的有效性
check rules [<flags>] <rule-files>...
# 执行rules单元测试用例
test rules <test-rule-file>...

至于有效性检查,只需要执行check子命令即可,不需要过多说明。

promtool的test rules子命令可以实现rule配置的单元测试,具体命令如下:

./promtool test rules test.yml

test.yaml是单元测试描述文件。promtool是支持同时指定多个单元测试文件的,如:./promtool test rules test.yml test1.yml test2.yml

单元测试描述文件内容的格式如下:

# Prometheus的rule配置文件路径
rule_files:
    - rule1.yml

# 评估的间隔时长
evaluation_interval: 1m

# 单元测试列表
tests:
- interval: 1m
  input_series:
  alert_rule_test:
  promql_expr_test:

tests下的每个用例由4个字段组成:

  1. 1. input_series:测试用例的测试数据,即指标的时序数据;

  2. 2. interval:代表每个时序数据之间的间隔时长;

  3. 3. alert_rule_test:告警规则的测试用例;

  4. 4. promql_expr_test:promql表达式的测试用例。我们可以使用它进行调试我们的promsql。

接下来将详细介绍它们。

测试用例数据

测试用例数据的定义格式如下:

input_series:
  - series: 'up{job="prometheus", instance="localhost:9090"}'
    values: '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0'
  - series: 'up{job="node_exporter", instance="localhost:9100"}'
    values: '1+0x6 0 0 0 0 0 0 0 0' 
  - series: 'go_goroutines{job="prometheus", instance="localhost:9090"}'
    values: '10+10x2 30+20x5' 
  - series: 'go_goroutines{job="node_exporter", instance="localhost:9100"}'
    values: '10+10x7 10+30x4'

每一条input_serie由两个字段组成:

  • • series:指标时序数据的key

  • • values:指标的value。其中的每一个值之间的间隔时长是interval的值

为了简化values的值的定义,你可以一种扩展符号来定义其值。语法如下:

  • • a+bxc代表:a a+b a+(2*b) a+(3*b) … a+(c*b);这一个a值是起始值的序列,然后a以b的(0..c)的倍数进行递增;

  • • a-bxc表示:这一个a值是起始值的序列,然后a以b的(0..c)的倍数进行递减;

  • • _下划线表示:序列中的某次指标值没有被抓取到;

  • • stale表示:过期的样本数据。以下是一些来自官方文档的例子:

  • • -2+4x3表示:-2 2 6 10

  • • 1-2x4表示:1 -1 -3 -5 -7

  • • 1x4表示:1 1 1 1 1

  • • 1 _x3 stale表示:1 _ _ _ stale

  • • 1+0x6 0 0 0 0 0 0 0 0表示: 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0

  • • 10+10x2 30+20x5表示:10 20 30 30 50 70 90 110 130

测试Promsql表达式

在写Prometheus告警规则时,一个很大的痛点就是无法简单的验证自己写的promsql的正确性。我们在告警规则的单元测试中验证后,再配置到真正的rule文件中。

promsql的测试用例的写法如下:

promql_expr_test:
  - expr: go_goroutines > 5 
    # 要测试的promsql表达式,它将会从测试数据中查询数据
    eval_time: 4m
    # 评估时长。从测试数据的第0秒开始算。
    # 如果interval是1m,那么4m代表的是测试数据的第4个数值
    exp_samples: # 执行promsql表达式后,预期得到的数据结果
        - labels: 'go_goroutines{job="prometheus",instance="localhost:9090"}'
          value: 50
        - labels: 'go_goroutines{job="node_exporter",instance="localhost:9100"}'
          value: 50

告警规则的单元测试

在单元测试描述文件中,添加Promsql表达式的测试用例的同时,我们还可以添加告警规则的测试用例,代码样例如下:

alert_rule_test:
- eval_time: 10m
  alertname: InstanceDown
  exp_alerts:
  - exp_labels:
      severity: page
      instance: localhost:9090
      job: prometheus
    exp_annotations:
      summary: "Instance localhost:9090 down"
      description: "localhost:9090 of job prometheus has been down for more than 5 minutes."
  • • eval_time:规则评估时长;

  • • alertname:告警名,要求与Prometheus的告警规则中的alertname一致;

  • • exp_labels:预期收到的告警通知中的label值;

  • • exp_annotations:预期收到的告警通知中的annotation值。

保证Alertmanager程序配置的有效性和正确性

amtool

与Prometheus程序类似,Alertmanager程序提供了一个叫amtool[3]的命令行程序。

我们关注它的两个子命令:

  • • config routes test:验证配置的正确性

  • • check-config <config.yaml>:验证配置的有效性

config routes test子命令介绍

amtool不像promtool那样支持在YAML文件中定义测试用例,以下是它的命令样例: amtool config routes test --config.file=config.yaml --verify.receivers=team-X-pager service=database owner=team-X

--config.file参数指定了配置文件的路径。

除了支持指定配置的路径,还可以通过参数--alertmanager.url指定使用某个运行中的Alertmanager的配置。

--verify.receivers指定期望返回的receiver列表,使用逗号分隔。

该子命令的最后是标签集,由key=value的格式组成,并使用空格分隔。例子中service=database owner=team-X,代表的是{service="database",owner="team-X"}

为了更好的可视化,还可以加一个--tree的参数,效果如下:

% amtool config routes test --config.file=config.yaml --tree --verify.receivers=team-X-pager service=database owner=team-X

Matching routes:
.
└── default-route
    └── {service="database"}
        └── {owner="team-X"}  receiver: team-X-pager

如果验证失败,该命令返回非0结果。

check-config子命令介绍

它的运行效果如下:

% amtool check-config config.yaml
Checking 'config.yaml'  SUCCESS
Found:
 - global config
 - route
 - 1 inhibit rules
 - 5 receivers
 - 1 templates
  SUCCESS

如果验证失败,该命令返回非0结果。

可视化告警通知路由

Prometheus官网提供了一个告警通知路由的在线可视化编辑器[4]

59c1a60261677831cd4ed24b8e8b1c65.png
alertmanager-route-editor.png

将配置粘贴至编辑框中,然后在“Match Label Set”中输入告警的标签,最后下方会显示通知的路由路径。如下图,实心红点即是匹配了该label的receiver:

a0655ca2f24a5f2e371375c232e0255b.png
可视化工具在路由配置调试阶段非常有用。 减小了路由配置的难度。 但是,需要注意: 不要将任何敏感配置上传到公网。

如何集成到CI/CD Pipeline中

以上介绍的是两个命令最原始的使用方法,即手工运行。我们需要将其集成到CI/CD pipeline中,以实现工程化。

集成方式一般有两:

  1. 1. 在Pipeline中增加一个执行promtool和amtool的阶段

  2. 2. 集成构建工具中,比如集成到Bazel中。

当然有一些DevOps平台如果需要深度集成,可以将promtool、amtool的实现代码引入到自己的DevOps平台的代码中。

工程化的挑战

另一个工程化的挑战,就是以上的配置文件之间存在引用,如下prometheus的rule文件中的expr字段的值,实际上是被prometheus-unitesting.yml文件引用。

9762e41ec5a3351535aa01f6f9b6ed06.png

如果不对这个引用关系进行治理,这些配置的维护成本将会非常高。

由于YAML文件天生不具备变量定义的功能。可以采用类似Jsonnet、CUE这样的支持编程的配置语言代替YAML。

这个话题比较大,不在本文讨论范围。

引用链接

[1] 配置: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration
[2] 配置: https://prometheus.io/docs/alerting/latest/configuration/#configuration
[3] amtool: https://github.com/prometheus/alertmanager#amtool
[4] 在线可视化编辑器: https://prometheus.io/webtools/alerting/routing-tree-editor/?_gl=1

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

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

相关文章

谈谈IOC容器和AOP编程

Java发展的路途中&#xff0c;由刚开始的使用new创建对象&#xff0c;到使用抽象类&#xff0c;接口进行解耦&#xff0c;又到了提问时刻&#xff0c;什么是耦合度&#xff1f; 对于这个对象的关联和依赖关系&#xff0c;例如&#xff1a; 当一个对象要使用&#xff0c;但是&…

4.6k Star,SpringBoot+Vue+App+硬件实现的智能家居系统,一套带走

今天&#xff0c;推荐一个智能家居系统项目。这是我目前见过的最好的智能家居系统项目&#xff0c;功能完整&#xff0c;代码结构清晰。值得推荐。 4.6k Star&#xff0c;SpringBootVueApp硬件实现的智能家居系统&#xff0c;一套带走 简介 FastBee是一个简单易用的物联网平…

Cocos Shader实现HSL和RGB颜色模型

HSL和RGB是两种常见的颜色模型&#xff0c;被广泛应用于计算机图形学、数字图像处理、Web设计等领域。在进行颜色处理时&#xff0c;经常需要将HSL和RGB相互转换&#xff0c;本demo演示如何通过Cocos Creator 3.7游戏引擎&#xff0c;用HSL模型来调节图片颜色&#xff0c;并详细…

徐培:以数据智能技术助力制造型企业降本增效

导语 2023年4月7日&#xff0c;由中国DBA联盟&#xff08;ACDU&#xff09;和墨天轮社区联合主办的第十二届『数据技术嘉年华』(DTC 2023) 在北京新云南皇冠假日酒店盛大开启。次日&#xff0c;云和恩墨数据智能产品部总经理徐培博士在“智胜未来&#xff1a;数据技术创新应用”…

二、讲师管理接口开发总结

首先本项目将实体类单独放在model包中&#xff0c;方便后期集体的调用&#xff1a; 整个项目的建包结构都是在java包中建立com.lxl.ggkt包&#xff0c;方便后期包路径的扫描。 上述有三个包&#xff1a; enums包规定了一些状态规定&#xff0c;比如优惠券是否使用&#xff0c…

CVE-2017-7921漏洞复现

文章目录 漏洞描述 漏洞描述 0x01 CVE-2017-7921漏洞复现 许多HikvisionIP摄像机包含一个后门&#xff0c;允许未经身份验证的模拟任何配置的用户帐户。 0x02 漏洞复现&#xff1a; 利用工具发现漏洞&#xff08;CVE-2017-7921&#xff09;&#xff1a; 利用路径&#xff…

“数字裂变”宇宙,华为云与和伙伴组成“银河护卫队”

最近&#xff0c;《银河护卫队3》正在上映&#xff0c;取得了豆瓣高分和全网好评。很多朋友走出电影院都感叹&#xff0c;真想有像银河护卫队一样的朋友和伙伴。 “伙伴”这个词&#xff0c;不仅是超级英雄电影的内核&#xff0c;更是云计算产业的“新贵”。关注云产业的朋友可…

Go项目组织:在单一repo中管理多个Go module指南

0. 单repo单module管理回顾 众所周知&#xff0c;Go在1.11版本中引入了go module[1]&#xff0c;随着近几年Go module机制的逐渐成熟&#xff0c;它已经被Go团队确定为Go标准的依赖管理与构建方案&#xff0c;原先的GOPATH mode已经被彻底废弃。 在Go module模式下&#xff0c;…

C++——类和对象(5)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月8日 内容&#xff1a;C类和对象内容讲解 目录 前言&#xff1a; 1.操作符重载&#xff08;续&#xff09;&#xff1a; 前置和后置&#xff1a; 日期减日期&#xff1a; <<操作符&#xff1a; 结尾&#xff…

智能里既有技术也有艺术

智能不仅仅是技术方面的创新和应用&#xff0c;也是一种艺术的体现。智能技术需要融合多个学科和领域的知识&#xff0c;包括计算机科学、数学、心理学、哲学、人文艺术、宗教民俗等等&#xff0c;从而形成一个完整的系统。这个系统的设计和实现&#xff0c;需要技术人员具备深…

跟着我学 AI丨“Hey,Siri”的前生今世

Siri 是由苹果公司开发的一款智能语音助手&#xff0c;它可以通过语音识别和自然语言处理来回答用户的问题、执行任务、提供建议等等。Siri 可以在 iOS 和 macOS 设备上使用&#xff0c;它的出现极大地改变了人机交互的方式&#xff0c;让我们用语音成为了交互的媒介。 Siri 的…

轻松客观认识大模型系列:一

这是我关于《轻松客观认识大模型系列》第一篇 一、前言 这篇文章旨在为没有计算机科学背景的读者提供一些关于ChatGPT及其类似的人工智能系统&#xff08;如GPT-3、GPT-4、Bing Chat、Bard等&#xff09;如何工作的原理。ChatGPT是一种聊天机器人&#xff0c;建立在一个大型语…

AI 自动补全的这句日志能正常打印吗?

最近用上了 GitHub Copilot&#xff0c;它的能力不时让我惊叹&#xff0c;于是越来越多地面向 tab 编程&#xff0c;机械键盘的损耗都小了许多:-p 这天&#xff0c;它给我自动生成了一句像这样的日志打印代码&#xff1a; try {// ... } catch (Exception e) {log.error("…

Vue列表过滤与数据原理

目录 列表过滤 使用计算属性 使用watch监视属性 列表排序 Vue中数据原理 练习数据原理 Vue中数据原理总结 列表过滤 可以进行模糊搜索 使用计算属性 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml"> <…

YARN框架概述

Yarn 概述 Yarn概述对Yarn的需求简介变迁YARN于MRv1的区别MRv1YARN介绍 YARN集群安装部署集群角色介绍ResourceManager(RM)NodeManager(NM)集群部署规划 YARN RM重启机制概述**开启重启机制**RM状态数据的存储介质开启 后续正在学习&#xff1a;YARN HA高可用 YARN架构体系官方…

DNDC模型

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

harbor(docker仓库)仓库部署

harbor仓库部署 1. harbor概述2. harbor主要功能3. harbor架构介绍4. Docker Compose4.1 compose简介4.2 docker-compose工具命令 5. harbor部署5.1 部署Docker Compose5.2 部署harbor5.3 部署harbor开机自启 6. harbor应用6.1 配置客户端访问harbor6.2 harbor的web管理界面 1.…

炸裂!Hugging Face 发布重磅更新,人手一个 AutoGPT!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; Hugging Face&#xff0c;作为 AI 开源圈最为知名的「网红」创业公司&#xff0c;成立仅几年&#xff0c;便在 GitHub 开源了诸多实用开源项目&#xff0c;受到了不少开发者的赞赏。 其中影…

中小学智慧校园平台电子班牌系统源码的应用

智慧校园云平台电子班牌系统源码 智慧班牌系统是专门为学校打造的智能信息展示平台&#xff0c;为学校、教师、学生、家长创造一个学习成长交流的共享平台。主要用于显示班级信息、 班级风采、校园文化、课程表、校园活动通知、家校互联等。以图片、音视频、文字、动画、文档等…

【ADS867x】14 位 500kSPS 4/8 通道 ADC 简介及驱动应用示例

器件特性 具有集成模拟前端的 14 位模数转换器 (ADC)具有自动和手动扫描功能的 4 通道、8 通道多路复用器通道独立可编程输入&#xff1a; 10.24V、5.12V、2.56V、1.28V、0.64V10.24V、5.12V、2.56V、1.28V 5V 模拟电源&#xff1a;1.65V 到 5V I/O 电源恒定的阻性输入阻抗&am…