【Prometheus】PromQL聚合函数详细用法与应用实战

news2024/9/21 16:19:52

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Prometheus监控系统零基础到进阶
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • PromQL聚合操作
    • 1. 聚合操作介绍
    • 2. PromQL聚合介绍
    • 3. PromQL聚合示例
    • 4. PromQL聚合实践
  • PromQL时间聚合操作
    • 1. PromQL时间聚合介绍
    • 2. PromQL时间聚合示例
    • 3. PromQL时间聚合实践

PromQL聚合操作

1. 聚合操作介绍

聚合运算,是数据处理中的比较常用操作,例如统计公司所有人员的年龄,求公司整体的平均年龄,最大年龄,或最小年龄等。
因此聚合操作它是从一组数据值中,计算出一个单一的值。
以下是一个包含了不同城市,以及各地区天气温度的表格。如果想要从这些数据中提取有价值的信息,如温度的最大值和最小值,我们需要使用聚合运算。
在这里插入图片描述

整体聚合:它不会区分数据的维度,而是将所有的数据作为一个整体来处理。这可以帮助我们了解整个数据集的总体情况。例如:
整体平均温度( avg ): 计算方法法是将所有温度值相加后,除以数量 (27 + 11 + 14 + 5 + 4 + 19 + 12 + 12 + 30 + (-1) + 15+ 5) / 12 ≈ 12.83 度。
整体最高温度( max ): 所有区域中,记录的最高温度,上述表格中为30度。
整体最低温度( min ): 所有区域中,记录的最低温度,上述数据中为-1度。

分组聚合:是按照数据集的子集进行分组,例如:(按照城市)这个维度进行分组聚合,我们就可以分别计算不同城市的气温分布情况;
广州的平均温度( avg ): 广州所有区的平均温度是 (27 + 11 + 14) / 3 = 17.33 度。
上海的最高温度( max ): 上海各区中的最高温度,为徐汇区的 30度。
武汉的最低温度( min ): 武汉各区中的最低温度,为武昌区的 -1度。

2. PromQL聚合介绍

在Prometheus中,聚合函数是非常重要的一部分,它们能够帮助用户从大量时间序列数据中提取出有价值的信息。本文将通过实际案例,详细介绍PromQL中聚合函数的使用方法和应用场景。
Prometheus 的聚合操作与此前刚才所描述的常规聚合在本质上是相似的,只不过它支持多种聚合运算函数,包括:

max :计算一组时间序列中的最大值。
min :计算一组时间序列中的最小值。
avg :计算时间序列的平均值。
sum :计算时间序列值的总和。
count :它不考虑时间序列的具体值,仅用来统计时间序列的数量。例如统计不同OS的数量,或者统计有多少个正在运行的Pod等等。
count_vaules :对每个样本的值进行数量统计,例如:http请求的状态码,200出现了多少次,404出现了多少次,500出现了多少次; count_values("code",http_requests_total{status=~"200|404"})
topk :  统计样本值中最大的k个元素 。topk函数逆序返回分组内的样本值最大的前k个时间序列及其值。topk(5, node_memory_usage_bytes)
bottomk : 统计样本值中最小的k个元素。bottomk函数顺序返回分组内的样本值最小的前k个时间序列及其值。 bottomk(3, node_cpu_usage)

除了这些基本聚合功能外,Prometheus 也提供了分组聚合的功能,它是基于时间序列的标签进行分组聚合:

by :通过 by 关键字,明确指定保留哪些标签进行聚合,其他的标签将被忽略。使用方法by 后面用括号括住标签名
without :与 by 相反, without 关键字用于指定要排除的标签,而剩下的标签则用于聚合和分组。

3. PromQL聚合示例

为了加深PromQL聚合操作的理解,我们使用前面提到的城市天气温度数据,并通过聚合操作来展示如何获取整体的最高温度、最低温度以及按城市维度进行分组求取平均温度等。
1、下载并运行程序,提供天气温度相关的指标数据
程序下载地址:
https://download.csdn.net/download/littlefun591/89720155?spm=1001.2014.3001.5501
在这里插入图片描述
在这里插入图片描述

mv weather_exporter_jingtian /usr/local/bin/

赋予执行权限

chmod +x /usr/local/bin/weather_exporter_jingtian

#编写systemd启动脚本

[root@jingtian01 ~ ]#vim /usr/lib/systemd/system/weather_exporter.service
[Unit]
Description=weather_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
ExecStart=/usr/local/bin/weather_exporter_jingtian --port 7001
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start weather_exporter.service 

查看启动状态

systemctl status weather_exporter.service

在这里插入图片描述

看下该程序的返回,每次请求随机返回温度值
在这里插入图片描述

2、编辑Prometheus配置文件,抓取对应的指标数据

[root@jingtian01 ~ ]#vim /etc/prometheus/prometheus.yml
  - job_name: "weather_exporter"
    static_configs:
      - targets: ["jingtian01:7001"]

重新加载prometheus文件

curl -X POST http://localhost:9090/-/reload

示例1:获取所有城市的整体温度总和

sum(weather_oldxu)

在这里插入图片描述

示例2:分别展示不同城市的最大温度
以什么分组,就用by括号括住该标签名

max(weather_oldxu) by (city)

在这里插入图片描述

示例3:分别展示不同城市的最小温度

min(weather_oldxu) by (city)

在这里插入图片描述

示例4:仅展示“武汉”城市的平均温度

avg(weather_oldxu{city="武汉"})

在这里插入图片描述

示例5:使用topk获取前三个的高温城市。topk的结果按温度值从高到低排序。
topk函数逆序返回分组内的样本值最大的前k个时间序列及其值。
topk(5, node_memory_usage_bytes)
topk(3, weather_oldxu)
在这里插入图片描述

示例6:使用bottomk获取排名靠前三的低温城市。bottomk的结果按温度值从低到高排列。
bottomk函数顺序返回分组内的样本值最小的前k个时间序列及其值。
bottomk(3, node_cpu_usage)
bottomk(3, weather_oldxu)
在这里插入图片描述

示例7:统计天气温度的数量,按城市进行区分
count(weather_oldxu) by (city)
在这里插入图片描述

示例8:统计各温度值出现的频次,按城市进行区分
count_values(“code”, http_requests_total{status=~“200|404”})
count_values(“count_values”, weather_oldxu)
在这里插入图片描述

4. PromQL聚合实践

实例1:查询所有节点,最近1分钟的负载,是否高于cpu核心的2倍
每个节点近一分钟负载
sum(node_load1) by (instance)
在这里插入图片描述

获取cpu核心
count(node_cpu_seconds_total{mode=“idle”} )by (instance)
在这里插入图片描述

我们制造CPU压力
[root@jingtian02 ~ ]#stress -c 6
在这里插入图片描述

总体表达式
sum(node_load1) by (instance) > count(node_cpu_seconds_total{mode=“idle”} )by (instance) * 2
在这里插入图片描述

向量作比较,标签一样即可
也可以这样对比
node_load1 > count(node_cpu_seconds_total{mode=“idle”}) by (instance,job) * 2
在这里插入图片描述

实例2:查询每个节点的CPU的使用率,指标名称: node_cpu_seconds_t
otal

# 模拟cpu使用率达到50%:stress --cpu 1
[root@jingtian02 ~ ]#stress -c 1

在这里插入图片描述

#表达式: (1 - CPU整体空闲率) * 100 = CPU使用率
#查看CPU空闲率
先查看总体CPU空闲
rate(node_cpu_seconds_total{mode=“idle”}[1m])
每个主机有俩CPU核心
在这里插入图片描述

根据实例分组来求平均
avg(rate(node_cpu_seconds_total{mode=“idle”}[1m])) by (instance)
在这里插入图片描述

总体表达式,求CPU使用率
(1- avg(rate(node_cpu_seconds_total{mode=“idle”}[1m])) by (instance)) * 100
可以看到jingtian02的CPU使用率大致为50%
在这里插入图片描述

实例3:查询所有节点,最近1分钟磁盘的最大写入速率,以MB/s为单位,指
标名称: node_disk_written_bytes_total

# 模拟数据写入,复制2G的数据,控制每秒20M左右的速度写
# yum install pv -y
# dd if=/dev/zero bs=1M count=2000 | pv -L 20M > /tmp/bigdata

max(rate(node_disk_written_bytes_total[1m])/1024/1024) by (instance)
在这里插入图片描述

实例4:查询所有节点,最近1分钟磁盘的读取写入速率,以MB/s为单位,指
标名称: node_disk_read_bytes_total

# 模拟数据读取,读取/tmp/bigdata文件,然后以每秒15MB的速度读取
# yum install pv -y
# pv -L 15M /tmp/bigdata > /dev/null

在这里插入图片描述

max(rate(node_disk_read_bytes_total[1m])) by (instance) /1024 /1024
在这里插入图片描述

实例5:计算Prometheus服务器的HTTP请求成功率,指标名称: promethe
us_http_requests_total
#计算公式: 请求成功的(2xx|3xx) / 总的请求 * 100 = 请求成功率
先看下所有请求
prometheus_http_requests_total
在这里插入图片描述

看下2开头,3开头的总数
sum(prometheus_http_requests_total{code=~“2.|3.”})
在这里插入图片描述

看下成功率
sum(prometheus_http_requests_total{code=~“2.|3.”}) / sum(prometheus_http_requests_total) * 100
在这里插入图片描述

实例6:查询请求排名前三的URL,指标名称: prometheus_http_requests_total
topk(3, prometheus_http_requests_total)
在这里插入图片描述

PromQL时间聚合操作

1. PromQL时间聚合介绍

在Prometheus中,除了可以“纵向的聚合”以外,还可以基于时间聚合也就是“横向聚合”。时间聚合不是在不同的序列上进行聚合操作,而是在“单个序列”的不同时间点之间进行聚合,这意味着,对于单个序列,我们可以计算过去一段时间内的最大值,最小值,以及平均值等。

avg_over_time(range-vector) :区间向量内每个指标的平均值。
min_over_time(range-vector) :区间向量内每个指标的最小值。
max_over_time(range-vector) :区间向量内每个指标的最大值。
sum_over_time(range-vector) :区间向量内每个指标的求和。
count_over_time(range-vector) :区间向量内指标样本的总个数。

在这里插入图片描述

时间聚合都是基于gauge类型的数据,如果是count类型数据,随着时间是不断增大的,没啥意义

2. PromQL时间聚合示例

1、获取武汉城市中武昌区,最近5分钟的温度数据
weather_oldxu{city=“武汉”,dist=“武昌区”}[5m]
在这里插入图片描述

2、获取武汉城市中武昌区,最近5分钟温度的最大值
max_over_time(weather_oldxu{city=“武汉”,dist=“武昌区”}[5m])
在这里插入图片描述

3、获取武汉城市中武昌区,最近5分钟温度的最小值
min_over_time(weather_oldxu{city=“武汉”,dist=“武昌区”}[5m])

4、获取武汉城市中武昌区,最近5分钟温度的平均值
avg_over_time(weather_oldxu{city=“武汉”,dist=“武昌区”}[5m])

5、获取武汉城市中武昌区,当前数据总共来自多少个样本
count_over_time(weather_oldxu{city=“武汉”,dist=“武昌区”}[5m])
在这里插入图片描述

3. PromQL时间聚合实践

实例1:查询最近1分钟内 tcp_timewait 连接数的最大值,并检查是否超过 1000个,指标名称: node_tcp_connection_states{state=“time_wait”}
先看下所有状态
node_tcp_connection_states
在这里插入图片描述

# 模拟大量tcp_timewait:ab -n 1000 -c 2 http://localhost:9090/
yum install httpd-tools -y
ab -n 1000 -c 2 http://localhost:9090/

在这里插入图片描述

查看最近一分钟tcp_timewait 连接数的最大值
max_over_time(node_tcp_connection_states{state=“time_wait”}[1m])
在这里插入图片描述

max_over_time(node_tcp_connection_states{state=“time_wait”}[1m]) > 1000

实例2:查询最近1分钟内 tcp_established 连接数的最大值,并检查是
否超过100个,指标名称: node_tcp_connection_states{state=“established”}

yum install -y nc
# 模拟established:
# 服务端(jingtian01):nc -lk 2345

在这里插入图片描述

# 客户端(jingtian02):for i in {1..1000}; do nc jingtian01 2345 >/dev/null 2>&1 & done

在这里插入图片描述

max_over_time(node_tcp_connection_states{state=“established”}[1m]) > 100
在这里插入图片描述

实例3:查询网站平均请求延迟1分钟大于3s的站点,指标名称: probe_duration_seconds(需要blackbox)

# 表达式
avg_over_time(probe_duration_seconds[1m]) > 3

实例4:查询MySQL服务器在最近1分钟内平均运行线程数超过50的。指标名
称: mysql_global_status_threads_running

# 模拟MySQL线程数
for i in {1..120} ; do
 mysql -e "SELECT SLEEP(60);" &
done
# 表达式
avg_over_time(mysql_global_status_threads_running[1m]) > 50

实例5:查询以监控MySQL服务器过去1分钟内的线程当前打开的最大连接
数。如果这个数值超过了服务器配置的最大连接数的80%则触发告警。
指标名
称:
mysql_global_status_threads_connected (表示当前打开的
连接数)
mysql_global_variables_max_connections (表示配置允许的
最大连接数)

# 模拟MySQL连接数
for i in {1..120} ; do
 mysql -e "SELECT SLEEP(60);" &
done
# 表达式
max_over_time(mysql_global_status_threads_connected[1m]) / mysql_global_va
riables_max_connections * 100 > 80

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

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

相关文章

基于springboot+vue乒乓球预约管理系统

基于springbootvuemysql实现的乒乓球预约管理系统(源码数据库部署视频) ### 主要技术 SpringBoot、LayUI、Vue、MySQL ### 系统角色 用户、管理员 ### 系统功能 前台: 首页、乒乓球场、公告信息、留言反馈、个人中心 后台: …

Nginx解析:入门笔记

🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索nginx之旅✨ 👋 大家好!文本学习和探索Nginx配置。…

【C++ Primer Plus习题】13.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "classic.h&quo…

数据同步-Mysql同步到ElasticSearch

Mysql同步到ElasticSearch 数据同步1、定时任务2、双写3、MQ异步写入4、Logstash5、Canal 数据同步 一般情况下&#xff0c;如果做查询搜索功能&#xff0c;使用 ES 来模糊搜索&#xff0c;但是数据是存放在数据库 MySQL 里的&#xff0c;所以说我们需要把 MySQL 中的数据和 E…

身份证识别及信息核验 API 对接说明

身份证识别及信息核验 API 对接说明 本文将介绍一种 身份证识别及信息核验 API 对接说明&#xff0c;它可以通过输入身份证图片 或 姓名和身份证号码&#xff0c;来校验姓名和身份证号的真实性和一致性。本接口用于校验姓名和身份证号的真实性和一致性&#xff0c;您可以通过输…

SOMEIP_ETS_098: SD_ClientService_subscribe_without_method_call

测试目的&#xff1a; 验证当测试器激活DUT的ETS客户端服务模式并发送OfferService消息时&#xff0c;DUT不会尝试订阅每个接收到的OfferService&#xff0c;因为测试器没有发送必要的clientServiceSubscribeEventgroup消息。 描述 本测试用例旨在确保DUT在没有收到clientSe…

SuiNS的成就与未来愿景

是Sui上领先的域名服务&#xff0c;通过用用户友好、易记的域名替换复杂的钱包地址&#xff0c;提升了链上交互。在过去的两年中&#xff0c;SuiNS经过了多次改进和优化&#xff0c;致力于创建易于理解的链上身份。 借鉴社交媒体的常见用法&#xff0c;SuiNS更进一步&#xff…

这样的接口幂等实现我认为最为优雅(防重复提交)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 这样的接口幂等实现我认为最为优雅 基于token(和网上大部分不一样)对比构思需要幂等性的场景不需…

【无人机设计与控制】用于四轴飞行器仿真和控制系统设计的参数驱动的 Simulink 模型

摘要 本文介绍了一种用于四轴飞行器仿真和控制系统设计的参数驱动Simulink模型。该模型通过参数化设置&#xff0c;允许用户对四轴飞行器的关键性能参数&#xff08;如质量、转动惯量、推力系数等&#xff09;进行调整&#xff0c;从而研究不同参数对飞行器性能的影响。通过此…

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

论文学习:常用的遥感参数

文章目录 归一化植被指数&#xff08;NDVI&#xff09;归一化红外指数7&#xff08;NDII7&#xff09;温度植被干旱指数&#xff08;TVDI&#xff09;归一化燃烧指数&#xff08;NBR&#xff09;差分归一化燃烧指数&#xff08;dNBR&#xff09;植被覆盖率&#xff08;VFC&…

2万字长文,如何成为一个“懂”AI 的产品经理?

产品经理比起大模型产品&#xff0c;更应该关注大模型本身。 注&#xff1a;随着时间推移&#xff0c;文章中的结论可能会发生变化。 此外&#xff0c;本文面向的读者是非算法团队的产品经理&#xff0c;为了保障文章的可读性&#xff0c;可能会省略部分细节&#xff0c;同时…

值得入手的 5 大数据恢复软件,数据恢复那是又快又全!

在日常工作与生活中&#xff0c;数据丢失的情况屡见不鲜。诸如重要文件的不慎误删、电脑系统的骤然崩溃、存储设备受病毒侵袭、格式化操作的失误等&#xff0c;此类突发状况常令人猝不及防。在此情形下&#xff0c;数据恢复软件便成为挽救重要数据的关键利器。 今天&#xff0c…

GMT绘图笔记:在地图上绘制直线而不是大圆弧

问题&#xff1a;利用GMT地图上绘制两点之间的直线&#xff0c;如果跨度过大会出现大圆弧线&#xff0c;而通常在备注地图图例的时候&#xff0c;通常需要强制绘制为直线。 在GMT&#xff08;Generic Mapping Tools&#xff09;中&#xff0c;使用plot命令绘制大跨度的范围线段…

全球数字化转型的前沿指南:企业架构师的TOGAF必备手册

领先数字化转型的权威声音 作为数字化转型领域的先驱&#xff0c;The Open Group 与 AZone 联手为全球的数字化专业人才提供了一本无与伦比的参考指南。《信息架构&#xff1a;商业智能&分析与元数据管理参考模型》不仅汇集了全球最先进的数据管理与信息架构理念&#xff0…

【生日视频制作】集装箱红色货车大卡车身AE模板AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程集装箱红色货车大卡车身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】集装箱红色货车大卡车身AE模板AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件 把AE模板导…

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言&#xff1a;快速排序的实现最重要的是找基准值&#xff0c;下面让我们来了解如何实现找基准值 基准值的注释&#xff1a;在快排的过程中&#xff0c;每一次我们要取一个元素作为枢纽值&#xff0c;以这个数字来将序列划分为两部分。 在此我们采用三数取中法&#xff0c;也…

滑动窗口——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 目录 一.滑动窗口算法原理&#xff1a; 二.无重复字符的最长子串 1.题目解析​编辑 2.算法原理 3.代码编写 三.长度最小的子数组 1.题目解析 2.算法原理 3.代码编…

小米红米系列机型 机型代码查询总目录 adb指令查询步骤

小米机型型号与代码 小米系列机型 型号众多。有时候我们在刷机或者下载固件的时候对一些 同型号分版本的机型不太注意下错固件刷机会导致系统故障。手机设备代码虽然在一般情况下用处不大&#xff0c;不过真正到你需要它的时候&#xff0c;又苦于不知道它是什么&#xff0c;以…

Acrobat Pro DC 2023 for Mac/Win:全能型PDF编辑器深度解析

Adobe Acrobat Pro DC 2023作为一款跨平台的PDF编辑器&#xff0c;无论是对于Mac还是Windows用户&#xff0c;都提供了极为全面且强大的PDF处理功能。该软件凭借其卓越的性能和丰富的特性&#xff0c;成为了全球范围内用户处理PDF文档的首选工具。 一、强大的编辑功能 Acroba…