Myluzh Blog

PromQL基础语法与函数

发布时间: 2024-10-22 文章作者: myluzh 分类名称: Kubernetes 朗读文章


0x01 瞬时向量与区间向量
瞬时向量:表示单一时间点的数据,例如当前的 HTTP 请求总数。
# 查询
http_request_total
# 结果
http_request_total{container="grafana", endpoint="http", handler="/", instance="10.42.0.170:3000", job="grafana", method="get", namespace="monitoring", pod="grafana-6bc86f4fc-m6n66", service="grafana", statuscode="200"}
4
区间向量:表示在一段时间内的多个样本,例如过去 5 分钟的请求总数。
# 查询
http_request_total[5m]
# 结果
http_request_total{container="grafana", endpoint="http", handler="/", instance="10.42.0.170:3000", job="grafana", method="get", namespace="monitoring", pod="grafana-6bc86f4fc-m6n66", service="grafana", statuscode="200"}
4 @1729673751.484
4 @1729673766.484
4 @1729673781.484
4 @1729673796.484
4 @1729673811.484
4 @1729673826.484
4 @1729673841.484
4 @1729673856.484

0x02 偏移量

使用偏移量查询过去 5 分钟的数据,但以 30 分钟前的数据为基础。
# 查询
http_requests_total[5m] offset 30m
# 结果
http_requests_total{container="grafana", endpoint="http", handler="/", instance="10.42.0.170:3000", job="grafana", method="get", namespace="monitoring", pod="grafana-6bc86f4fc-m6n66", service="grafana", statuscode="200"}
3

0x03 标签过滤

精确匹配:过滤处理器为 /login 的数据。
# 查询
http_requests_total{handler="/login"}
# 结果
http_requests_total{container="grafana", endpoint="http", handler="/login", instance="10.42.0.170:3000", job="grafana", method="get", namespace="monitoring", pod="grafana-6bc86f4fc-m6n66", service="grafana", statuscode="200"}
1
正则匹配:过滤处理器中包含 "login" 的数据。
# 查询
http_requests_total{handler=~~".*login.*"}
# 结果
http_requests_total{container="grafana", endpoint="http", handler="/login", instance="10.42.0.170:3000", job="grafana", method="get", namespace="monitoring", pod="grafana-6bc86f4fc-m6n66", service="grafana", statuscode="200"}
2
剔除匹配:过滤处理器不包含 "login" 的数据。
# 查询
http_requests_total{handler!~~".*login.*"}
# 结果
http_requests_total{container="grafana", endpoint="http", handler="/logout", instance="10.42.0.170:3000", job="grafana", method="get", namespace="monitoring", pod="grafana-6bc86f4fc-m6n66", service="grafana", statuscode="200"}
3
多值匹配:过滤处理器为 /login 或 /password 的数据。
# 查询
http_requests_total{handler=~"/login|/password"}
# 结果
http_requests_total{container="grafana", endpoint="http", handler="/login", instance="10.42.0.170:3000", job="grafana", method="get", namespace="monitoring", pod="grafana-6bc86f4fc-m6n66", service="grafana", statuscode="200"}
2

0x04 数学运算

查看主机内存大小并转换为 GB。
# 查询
node_memory_MemTotal_bytes / 1024 / 1024 / 1024
# 结果
16.0 GB
四舍五入,向上取最接近的整数。
# 查询
ceil(node_memory_MemFree_bytes / 1024 / 1024 / 1024)
# 结果
4 GB
向下取整。
# 查询
floor(node_memory_MemFree_bytes / 1024 / 1024 / 1024)
# 结果
3 GB

0x05 聚合操作

总和:获取所有机器的内存总和(以 GB 为单位)。
# 查询
sum(node_memory_MemTotal_bytes / 1024 / 1024 / 1024)
# 结果
75 GB
最小值:获取所有机器的最小内存值(以 GB 为单位)。
# 查询
min(node_memory_MemTotal_bytes / 1024 / 1024 / 1024)
# 结果
8 GB
平均值:获取所有机器的平均内存值(以 GB 为单位)。
# 查询
avg(node_memory_MemTotal_bytes / 1024 / 1024 / 1024)
# 结果
15 GB
标准差:获取所有机器内存的标准差(以 GB 为单位)。
# 查询
stddev(node_memory_MemTotal_bytes / 1024 / 1024 / 1024)
# 结果
2.5 GB
方差:获取所有机器内存的方差(以 GB 为单位)。
# 查询
variance(node_memory_MemTotal_bytes / 1024 / 1024 / 1024)
# 结果
6.25 GB
计数:统计数据总量。
# 查询
count(node_memory_MemTotal_bytes)
# 结果
5
根据字段统计
# 查询
sum(http_request_total) by (statuscode, handler)
# 结果
4
前 N 条:获取前 N 条数据。
# 查询
topk(5, sum(http_request_total) by (statuscode, handler))
# 结果
http_request_total{statuscode="200", handler="/login"}: 4
后 N 条:获取后 N 条数据。
# 查询
bottomk(5, sum(http_request_total) by (statuscode, handler))
# 结果
http_request_total{statuscode="404", handler="/notfound"}: 1
分位数:获取指定百分比的分位数(0.5 表示中位数)。
# 查询
quantile(0.5, http_request_total)
# 结果
3

0x06 预测统计

根据 1 天的数据预测 4 小时后的数据,并判断是否小于 0。
# 查询
predict_linear(node_filesystem_files_free{mountpoint="/"}[1d], 4*3600) < 0 # 结果 false 

0x07 缺失数据处理

如果样本数据不为空,则返回 nodata,如果为空则返回 1。
# 查询
absent(http_request_total{handler="/login"})
# 结果
0

0x08 差值

计算两个样本之间的差值。
# 查询
delta(node_memory_MemFree_bytes[5m])
# 结果
-50000000

0x09 排序

正序排序
# 查询
sort(http_request_total)
# 结果
http_request_total{statuscode="200"}: 4
倒序排序
# 查询
sort_desc(http_request_total)
# 结果
http_request_total{statuscode="500"}: 5

0x10 标签处理

将数据中的一个或多个 label 值,赋值给一个新的 label。
# 查询
label_join(node_filesystem_files_free, "new_label", "", "instance", "mountpoint")
# 结果
node_filesystem_files_free{new_label="10.42.0.170:/"}: 1000000
根据某个 label 值进行正则匹配,然后赋值给新的 label,并添加到数据中。
# 查询
label_replace(node_filesystem_files_free, "host", "$1", "instance", "(.*)-(.*)")
# 结果
node_filesystem_files_free{host="10.42.0.170"}: 500000

标签: Prometheus PromQL TSDB

发表评论