当前位置: 首页 > news >正文

Prometheus 04-1: PromQL查询语言深入实践

Prometheus-04: PromQL查询语言深入实践

PromQL语法、函数、高级查询和最佳实践

相关文档链接

官方文档资源

  • PromQL官方文档 - PromQL查询语言官方指南
  • PromQL函数参考 - 所有内置函数详细说明
  • PromQL操作符 - 运算符和操作符文档
  • 查询示例 - 官方查询示例集合

GitHub项目资源

  • PromQL教程 - 官方PromQL教程
  • PromQL练习 - 演示站点和练习
  • 查询优化指南 - 性能优化文档
  • PromQL备忘单 - 常用查询备忘单

中文资源和教程注释lwh-csdn

  • PromQL完全指南 - 云原生社区中文教程
  • PromQL实战教程 - 详细的中文实战指南
  • 时间序列数据库查询 - PromQL查询技巧博客
  • 监控告警实践 - Kubernetes监控实践

在线工具和资源

  • PromQL在线查询器 - PromLabs提供的在线查询工具
  • PromQL查询构建器 - Prometheus内置查询界面
  • Grafana Explore - Grafana的PromQL查询探索功能
  • PromQL测试平台 - Grafana官方演练平台

一、PromQL基础语法

1.1 什么是PromQL

PromQL(Prometheus Query Language)是Prometheus的函数式查询语言,用于实时查询和聚合时间序列数据。它具有以下特点:

  • 时间序列导向: 专门为时间序列数据设计
  • 函数式编程: 支持复杂的函数组合和嵌套
  • 实时查询: 支持即时向量和区间向量查询
  • 强大的聚合: 内置丰富的聚合函数和操作符
PromQL数据模型
指标名称{标签名1="标签值1", 标签名2="标签值2", ...}示例:
http_requests_total{method="GET", status="200", job="webapp"}
node_cpu_seconds_total{cpu="0", mode="idle", instance="localhost:9100"}

1.2 时间序列选择器

即时向量选择器(Instant Vector Selectors)
# 选择指标的最新值
up# 使用标签过滤
up{job="prometheus"}# 使用正则表达式
up{job=~"prom.*"}# 排除特定标签值
up{job!="node-exporter"}# 组合多个标签条件
http_requests_total{method="GET", status=~"2..", job!="test"}
区间向量选择器(Range Vector Selectors)
# 查询过去5分钟的数据
http_requests_total[5m]# 查询过去1小时的数据注释lwh-csdn
cpu_usage_seconds_total[1h]# 时间范围单位
[5s]   # 5秒
[30m]  # 30分钟  
[2h]   # 2小时
[1d]   # 1天
[1w]   # 1周
[1y]   # 1年
偏移修饰符(Offset Modifier)
# 查询5分钟前的值
http_requests_total offset 5m# 查询1小时前过去5分钟的数据
http_requests_total[5m] offset 1h# 组合使用
rate(http_requests_total[5m] offset 1h)

1.3 标签匹配操作符

# 完全匹配
{job="prometheus"}# 不等于
{job!="prometheus"}# 正则表达式匹配
{job=~"prom.*"}
{status=~"2..|4.."}# 正则表达式不匹配
{job!~"test.*"}# 组合条件
{job="webapp", method="GET", status=~"2.."}

二、PromQL操作符详解

2.1 算术操作符

# 基本算术运算注释lwh-csdn
+ (加法)
- (减法)
* (乘法)
/ (除法)
% (取模)
^ (幂运算)# 示例应用
# 计算CPU使用百分比
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)# 内存使用百分比
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100# 磁盘使用百分比
(1 - (node_filesystem_free_bytes / node_filesystem_size_bytes)) * 100# 网络带宽利用率(MB/s)
rate(node_network_transmit_bytes_total[5m]) / 1024 / 1024

2.2 比较操作符

# 比较操作符
== (等于)
!= (不等于)
>  (大于)
<  (小于)
>= (大于等于)
<= (小于等于)# 使用bool修饰符返回0或1
http_requests_total > bool 100
cpu_usage_percent >= bool 80# 过滤条件
# 查找CPU使用率大于80%的实例
node_load1 > 4# 查找内存使用率超过90%的主机
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90

2.3 逻辑操作符

# 逻辑操作符
and (逻辑与)
or  (逻辑或)
unless (逻辑非)# 示例应用
# 同时满足CPU和内存高使用率的实例
(cpu_usage > 80) and (memory_usage > 90)# CPU或内存任一高使用率的实例
(cpu_usage > 80) or (memory_usage > 90)# 排除测试环境的指标
up unless up{env="test"}# 复杂逻辑组合
(cpu_usage > 80 and memory_usage > 70) or disk_usage > 95

2.4 集合操作符

# 向量匹配
# 一对一匹配(默认)
vector1 + vector2# 多对一匹配
vector1 + on(label) group_left vector2# 一对多匹配  
vector1 + on(label) group_right vector2# 示例:为每个实例添加节点信息注释lwh-csdn
node_memory_MemTotal_bytes * on(instance) group_left(nodename) node_uname_info

三、PromQL内置函数

3.1 聚合函数

基础聚合函数

# sum - 求和
sum(http_requests_total)# avg - 平均值
avg(cpu_usage_percent)# min - 最小值
min(node_filesystem_free_bytes)# max - 最大值
max(node_load1)# count - 计数
count(up == 1)# stddev - 标准差
stddev(http_request_duration_seconds)# stdvar - 方差
stdvar(response_time_seconds)
分组聚合
# 按标签分组聚合
sum by (job) (http_requests_total)
avg by (instance) (cpu_usage_percent)
max by (device) (node_filesystem_usage_bytes)# 排除特定标签的聚合注释lwh-csdn
sum without (instance) (http_requests_total)
avg without (cpu) (node_cpu_seconds_total)# 多标签分组
sum by (job, instance) (up)
avg by (method, status) (http_request_duration_seconds)
TopK和BottomK
# 获取前K个最大值
topk(5, http_requests_total)# 获取前K个最小值  
bottomk(3, node_filesystem_free_bytes)# 按分组获取TopK
topk by (job) (3, http_requests_total)# 实际应用示例
# 获取CPU使用率最高的5个实例
topk(5, 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m]) * 100)))# 获取磁盘空间最少的3个分区
bottomk(3, node_filesystem_free_bytes{fstype!="tmpfs"})

3.2 速率和变化函数

rate() 函数
# 计算每秒平均增长率
rate(http_requests_total[5m])# 计算网络流量速率
rate(node_network_receive_bytes_total[5m])# rate函数适用场景
# - Counter类型指标
# - 计算每秒增长率
# - 处理Counter重置# 实际应用
# HTTP请求QPS
sum(rate(http_requests_total[5m])) by (job)# 网络吞吐量(MB/s)
rate(node_network_transmit_bytes_total[5m]) / 1024 / 1024
irate() 函数
# 计算瞬时增长率(基于最后两个数据点注释lwh-csdn)
irate(http_requests_total[5m])# irate vs rate
# irate: 更敏感,适合快速变化的指标
# rate: 更平滑,适合长期趋势分析# 应用示例
# 瞬时CPU使用率
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)# 瞬时磁盘IO率
irate(node_disk_reads_completed_total[5m])
increase() 函数
# 计算时间范围内的增长量
increase(http_requests_total[1h])# 等价于 rate() * 时间范围
increase(counter[5m]) == rate(counter[5m]) * 5 * 60# 应用示例
# 过去1小时的请求总数
increase(http_requests_total[1h])# 过去5分钟的错误数
increase(http_requests_total{status=~"5.."}[5m])

3.3 时间和日期函数

# 时间函数
time()           # 当前时间戳
minute()         # 分钟 (0-59)
hour()           # 小时 (0-23)  
day_of_month()   # 日期 (1-31)
day_of_week()    # 星期 (0-6, 0为周日)
month()          # 月份 (1-12)
year()           # 年份# 实际应用
# 工作时间过滤注释lwh-csdn(9:00-18:00)
http_requests_total and on() (hour() >= 9 and hour() < 18)# 工作日过滤(周一到周五)
cpu_usage and on() (day_of_week() >= 1 and day_of_week() <= 5)# 获取特定时间段的数据
sum_over_time(http_requests_total[1d]) and on() (hour() == 14)

3.4 数学函数

# 基础数学函数
abs(x)      # 绝对值
sqrt(x)     # 平方根
exp(x)      # e的x次方
ln(x)       # 自然对数
log2(x)     # 以2为底的对数
log10(x)    # 以10为底的对数# 取整函数
floor(x)    # 向下取整
ceil(x)     # 向上取整
round(x, to_nearest) # 四舍五入# 三角函数
sin(x)      # 正弦
cos(x)      # 余弦
tan(x)      # 正切# 应用示例
# 将字节转换为GB并保留2位小数
round(node_memory_MemTotal_bytes / 1024 / 1024 / 1024, 0.01)# 计算磁盘使用率并向上取整
ceil((1 - node_filesystem_free_bytes / node_filesystem_size_bytes) * 100)

3.5 字符串和标签函数

# 标签操作函数
label_replace(v, dst_label, replacement, src_label, regex)
label_join(v, dst_label, separator, src_label1, src_label2, ...)# 示例应用
# 提取端口号作为新标签
label_replace(up, "port", "$1", "instance", ".*:([0-9]+)")# 组合多个标签注释lwh-csdn
label_join(up, "full_name", "_", "job", "instance")# 实际场景
# 从instance标签中提取主机名
label_replace(node_load1, "hostname", "$1", "instance", "([^:]+):.*"
)# 创建环境标签
label_replace(http_requests_total,"env","$1","job","(.*)-(prod|test|dev)"
)

四、高级查询技巧

4.1 子查询(Subqueries)

# 基本语法
<instant_query>[<range>:<resolution>]# 示例:计算过去1小时内每5分钟的平均CPU使用率
avg_over_time((100 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)[1h:5m]
)# 更复杂的子查询
# 计算过去24小时内每小时的最大QPS
max_over_time(sum(rate(http_requests_total[5m]))[24h:1h]
)# 检测异常值:当前值与过去一周同一时间的比较注释lwh-csdn
(http_requests_total -http_requests_total offset 1w
) / http_requests_total offset 1w * 100

4.2 时间范围聚合函数

# 聚合函数over_time系列
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)  # 时间范围内的计数
stddev_over_time(range-vector) # 时间范围内的标准差
stdvar_over_time(range-vector) # 时间范围内的方差
quantile_over_time(φ, range-vector) # 时间范围内的分位数# 实际应用
# 过去1小时的平均CPU使用率
avg_over_time(cpu_usage_percent[1h])# 过去5分钟的最大响应时间
max_over_time(http_request_duration_seconds[5m])# 过去1天的P95响应时间
quantile_over_time(0.95, http_request_duration_seconds[1d])# 检测服务可用性(过去1小时有多少次up为1)
count_over_time(up[1h])

4.3 直方图和分位数

# 直方图分位数计算
histogram_quantile(φ, rate(http_request_duration_seconds_bucket[5m]))# 常用分位数
histogram_quantile(0.50, rate(http_request_duration_seconds_bucket[5m])) # P50
histogram_quantile(0.90, rate(http_request_duration_seconds_bucket[5m])) # P90  
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) # P95
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) # P99# 按维度分组的分位数
histogram_quantile(0.95,sum by (le, job) (rate(http_request_duration_seconds_bucket[5m]))
)# 实际应用示例
# API响应时间P95,按endpoint分组
histogram_quantile(0.95,sum by (le, endpoint) (rate(http_request_duration_seconds_bucket{job="api"}[5m]))
)# 数据库查询延迟P99
histogram_quantile(0.99,sum by (le) (rate(mysql_query_duration_seconds_bucket[5m]))
)

4.4 预测和趋势分析

# 线性预测函数
predict_linear(range-vector, t)# 预测磁盘在4小时后的使用量
predict_linear(node_filesystem_free_bytes[1h], 4 * 3600)# 预测内存使用趋势
predict_linear(node_memory_MemAvailable_bytes[2h], 3600)# 线性回归斜率
deriv(range-vector)# 检测指标的变化趋势
deriv(http_requests_total[1h])# 实际应用:预测告警注释lwh-csdn
# 预测磁盘将在6小时内用完
(predict_linear(node_filesystem_free_bytes{fstype!="tmpfs"}[1h], 6 * 3600) <= 0
) * on(instance) group_left(nodename) node_uname_info

PromQL是Prometheus监控体系的核心查询语言,掌握它是有效使用Prometheus的关键。通过本文的深入学习和实践练习,相信您已经具备了编写复杂PromQL查询的能力,能够在实际工作中设计和实现高效的监控解决方案。注释lwh-csdn,记住,监控不仅仅是技术工具,更是保障系统稳定性和业务连续性的重要手段。

http://www.dtcms.com/a/440017.html

相关文章:

  • 芜湖做网站的公司排名30个适合大学生创业的项目
  • 精美网站汽配公司的网站要怎么做
  • 让客户留住更长时间访问你的网站网站和域名的区别
  • 网站制作在哪里比较好杭州门户网站开发
  • 单页网站 营销成都装修建材网站建设
  • 韶山市建设局网站环保网站建设开发
  • 河南省汝州市建设门户网站注册公司要花多少费用
  • 唐山网站制作工具新宁县建设局网站
  • 上海网站关键词优化如何做一个购物网站页面
  • 建设一个微信小说网站启动培训网站建设的请示
  • 酒店手机网站模板专业app网站建设
  • 企业管理的官方网站有哪些成都旅游景点攻略
  • 江苏城乡建设学院网站wordpress my vistors
  • pop()
  • 做建筑效果图最好的网站二维码转换成短链接在线
  • 【提示工程】Ch3-最佳实践(Best Practices)
  • 想让客户公司做网站的话语找别人做网站要考虑哪些
  • 【Python】一种红利低波交易策略的探索
  • AI大模型:(三)1.7 Dify chatflow快速搭建数据查询之智能助手
  • 做网站推广的销售电话开场白分类信息网站发布标题
  • 生物化学Learning Track(12)蛋白质的性质和研究方法
  • 网站服务器租用多少钱才合理呢网络媒体广告代理
  • 外贸网站建设视频教程旅游网站设计页面
  • 手机网站关键词优化软件企业宣传册模版
  • 自学php做网站昆明公司网站
  • 辽宁网站建设价格游戏网站模板
  • 建设网站设计重庆网站公司设计方案
  • 网站制作的建设大纲pptphp网站开发文档模板
  • 网站建设是怎么挣钱的wordpress怎么使用插件下载
  • 06_Pandas索引运算