网站首页 > 精选文章 / 正文
大家看到夜莺 v5 版本直接支持使用 PromQL 来配置告警规则,放弃了 v4 以及之前的版本那种选择 metric,再选择标签的方式,这个改动在笔者看来,是一个巨大的进步,但是很多小白用户跟我反馈说这样难度增加了,用不明白,我很生气,所以,写一篇 PromQL 入门教程,包教包会,如果还是不会,你来找我,远程教学!
打开夜莺的即时查询页面,或者 Prometheus 自带的查询页面,走起,我们用几个小需求着手,看看用 PromQL 分别应该怎么处理,顺道就能学会基本用法!
需求 1:查看某个指标的监控数据,比如内存利用率。这个指标名字是:`node_memory_MemAvailable_bytes`,什么?你问我怎么知道内存利用率是这个指标?用得多了就知道了。。。后面我们也会把常用的指标以及解释整理到夜莺的 metrics.yaml 文件里,需要的话可以去 GitHub 上查看
看这个数据很简单,就是直接输入指标名字就行了,系统会返回所有的 series,每个 series 里包含指标名字以及多个维度标签。
需求 2:对返回的内容做筛选,只看 `instance="10.206.0.13:9100"` 的监控数据,其他的不看,那就在 PromQL 上加过滤条件即可。过滤条件放到指标后面,用 `{}` 包起来
需求 3:我想看上面的 es 的两台机器的内存利用率,但是没有一个标签来具体标识,这怎么办?`{}`内的筛选条件,除了支持 `=` 之外,也支持正则,es 的两台机器的 instance 标签中都有 es 关键字,那我们就可以用正则来处理了
好了,针对夜莺的老版本的用户的话,就讲完了,上面的查询方法完全可以覆盖夜莺老版本的那种过滤机制。但是针对 PromQL 入门,还不够,还有不少有意思的特点,我下面继续讲一些给大家。
`node_memory_MemAvailable_bytes` 这个指标是 node_exporter 采集的,下面我们来看一个 Telegraf 采集的指标,`net_bytes_recv` 这个指标表示网卡收到的 byte 的数量,我们来查一下:
成功查到了数据,但是,怎么这么大?我来计算一下:
这个指标的单位是 byte,但是网络流量我们一般用 bit 做单位查看,所以先乘以 8,然后除以三个 1024 得到 Gb 的流量,一个是 600 多 Gb,一个是 500 多 Gb,这网卡也太强悍了吧。哈哈。其实这个指标并非是网卡的瞬时流量,而是从操作系统启动以来,网卡收到的总流量之和。这显然不是我们关注的,我们关注的应该是需求 4。
需求 4:查看网卡每秒的入方向流量
`net_bytes_recv` 这个值既然是一个单调递增的值,那么如果我知道某两个时间点的值,就可以计算出来这段时间进来的流量之和,再除以时间范围,就可以得到每秒的入流量。比如 ts1 这个时间的值是 100,ts2 这个时间的值是 200,ts1 和 ts2 相差 10 秒,即 `ts2 - ts1 = 10`,那么这 10 秒内的流量之和就是 `200 - 100 = 100`,每秒的入流量就是 `100 / 10 = 10`。
OK,看懂了吧,看不懂就再看一遍,现在我们有办法来查看网卡每秒的入方向流量了,看一下你的手表,记录一下时间,点击查询,记录一下值,眼睛继续盯着手表,等 10 秒之后再点一次查询,记录一下值,既然 10 秒钟前后的值都拿到了,那我们就可以算出来了,完美!
不用夸我为何这么聪明,天生的!Prometheus 的研发团队也学习了我这个思路,提供了一个 irate 函数来计算每秒的入向网络流量:
`[1m]`这个写法表示 1 分钟,我这个 telegraf 每 10 秒上报一次监控数据,`[1m]`大概有 6 次监控数据上报,irate 的逻辑就是从这 6 个值中最最新的两个值,然后算个减法,再除以这俩值之间的时间范围,完活,irate 这个函数就是干这个事情的。
不信?真的我不骗你,我们做个拆解,去掉 irate 函数,只看里边的部分,查询一下:
是 6 个值吧,`@` 前面是值,后面是时间戳,你可以自己用计算器算一下,按照我刚才说的算法,我就不算了,不浪费这个青春。
OK,这个信息量有点大了,我们学到了什么?
- 监控指标是有类型区分的,像内存使用率这种上下波动的,是 gauge 类型,还有一种是单调递增的,是 counter 类型
- counter 类型如果要求取每秒的增量,需要用到 irate 函数,其实还有个 rate 函数,是差不多的,唉,笔者太懒,没有去看 rate 函数和 irate 的区别,读者最好是查查,查到了留言告诉我啊,不胜感激
- irate 函数得需要一批值做计算,从一批值中取最新的 2 个值,那怎么才能取到一批值呢?需要给 PromQL 一个时间范围,时间范围是放到中括号中的,除了 m 是分钟单位,应该还支持别的,比如 h 是小时,还支持别的单位么?请有爱心的读者朋友查查留言告诉我啊
- irate 这是一个函数,Prometheus 其实还支持很多其他函数,比如 increase 函数,是算区间增量的,各种其他函数就不一一展开了
- 还有上面那个算数表达式:`net_bytes_recv * 8 / 1024 / 1024 / 1024`可以知道,PromQL 支持基本的四则运算,那后面如果觉得哪个指标的单位不合适,我们就可以用这种方式加一下运算逻辑,得到我们想要的啦
需求 5:上面计算每秒入方向流量的例子可以看出,我有两台机器,一个是 `10-255-0-34`,另一个是 `192.168.1.2`,我现在想计算这两台机器的流量之和。
那这里就又要引入一个新函数了,sum,求多条线的值的和,irate 是函数,sum 也是函数,用的场景不同,irate 是在某一个 series 的多个值上做运算,sum 是对多个 series 做运算:
除了 sum,还有 avg、max、min 等各种函数,对多个 series 做运算,这里就不一一展开了。
需求 6:还有一个比较常见的场景,是不同的指标之间做运算,比如我采集了机器的内存使用量,也采集了机器的内存总量,二者做除法,就可以求取内存使用率了,当然,Telegraf 自动采集了`mem_used_percent`,无需我们再做计算了,只是用这个例子来说明这个场景的需求:
需求 7:今天当下的内存利用率是这个样子,7 天之前呢?同比情况如何?夜莺里边内置了同比的函数,PromQL 中是怎么处理的呢?也比较简单,使用 offset 关键字,比如:
上面两个 PromQL,第一个是求当前最近 20 秒内的内存利用率,第二条是求 7 天之前的那个 20 秒内的内存利用率,自己可以对比一下这两个查询结果的时间戳,正好相差 7 天,就是这么准确 :)
需求 8:上面的例子都是查看监控数据的,那配置告警的 PromQL 怎么写?很简单,就是在原本查询数据的 PromQL 上增加一个阈值比较即可。比如,我想让内存利用率大于 85% 的机器告警,PromQL 可以这么写:
夜莺的告警引擎的处理逻辑:就是拿着用户配置的带有阈值的 PromQL 周期性去查询时序库,如果查到了数据,就表示有指标触发了告警,生成告警事件,嗯,就是这么简单,没想到吧,哈哈。当然了,告警规则其实还有一些持续时长、生效时间之类的配置,那个跟 PromQL 这个知识点无关,我们这里不展开。
OK,作为 PromQL 入门,就讲这么多,再讲就不能叫入门教程了,师傅领进门,修行在个人,了解了这些基础知识,后面大家就对照 Prometheus 的文档来用就好了。Good luck!
Tags:promql 语法
猜你喜欢
- 2025-01-08 GPT4 帮我写正则表达式
- 2025-01-08 Prometheus PromQL 介绍
- 2025-01-08 Prometheus 3.0 带来新 UI、OpenTelemetry 支持等
- 2025-01-08 学习PromQL查询语言的基础与高级用法内容