✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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