Prometheus实战教程 - 初识PromQL

初识PromQL

PromQL是Prometheus内置的数据查询语言,其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持。并且被广泛应用在Prometheus的日常应用当中,包括对数据查询、可视化、告警处理当中。可以这么说,PromQL是Prometheus所有应用场景的基础,理解和掌握PromQL是Prometheus入门的第一课。

PromQL 表达式的计算结果分为四种类型,适配不同查询场景:

  • 即时向量(Instant vector):多个时间序列的集合,每个序列仅含一个相同时间戳的样本。
  • 范围向量(Range vector):多个时间序列的集合,每个序列包含一段时间内的多个数据点。
  • 标量(Scalar):简单的浮点数值。
  • 字符串(String):纯文本值,目前暂未启用。

即时向量选择器

用于筛选特定时间戳下的时间序列,核心语法为 “指标名 {标签匹配器}”。

  • 基础用法:仅指定指标名,返回该指标下所有时间序列的最新样本(如 http_requests_total)。
  • 标签匹配:支持四种运算符,可组合筛选:
    • =:精确匹配标签值
    • !=:不匹配标签值
    • =~:正则匹配标签值(全锚定,如 env=~“foo” 等价于 ^foo$)
    • !~:非正则匹配标签值
  • 特殊规则:可通过__name__标签匹配指标名(如 {name=~“job:.*”} 匹配所有以 job: 开头的指标),向量选择器必须指定指标名或非空标签匹配器。
# 筛选job为prometheus、group为canary的http_requests_total序列
http_requests_total{job="prometheus",group="canary"}

# 筛选环境为staging/testing/development且方法非GET的序列
http_requests_total{environment=~"staging|testing|development",method!="GET"}

范围向量选择器

在即时向量选择器后添加时间范围(方括号内),筛选一段时间内的样本,区间为左开右闭。

# 筛选近5分钟内job为prometheus的http_requests_total所有样本
http_requests_total{job="prometheus"}[5m]

时间修饰符

  • offset:调整查询的时间偏移,需紧跟选择器后。示例:http_requests_total offset 5m(查询 5 分钟前的指标值)、rate (http_requests_total [5m] offset 1w)(查询一周前的 5 分钟速率)。
  • @:指定查询的具体时间戳(Unix 时间),支持 start ()/end () 特殊值(范围查询中对应起止时间,即时查询中均为评估时间)。示例:http_requests_total @ 1609746000(查询指定时间点的指标值)。

Metric类型

Prometheus定义了4中不同的指标类型(metric type):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。

Counter:只增不减的计数器

Counter类型的指标其工作方式和计数器一样,只增不减(除非系统发生重置)。常见的监控指标,如http_requests_total,node_cpu都是Counter类型的监控指标。 一般在定义Counter类型指标的名称时推荐使用_total作为后缀。

Counter是一个简单但有强大的工具,例如我们可以在应用程序中记录某些事件发生的次数,通过以时序的形式存储这些数据,我们可以轻松的了解该事件产生速率的变化。PromQL内置的聚合操作和函数可以用户对这些数据进行进一步的分析:

例如,通过rate()函数获取HTTP请求量的增长率:

rate(http_requests_total[5m])

查询当前系统中,访问量前10的HTTP地址:

topk(10, http_requests_total)

Gauge:可增可减的仪表盘

与Counter不同,Gauge类型的指标侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。常见指标如:node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)都是Gauge类型的监控指标。

对于Gauge类型的监控指标,通过PromQL内置函数delta()可以获取样本在一段时间返回内的变化情况。例如,计算CPU温度在两个小时内的差异:

delta(cpu_temp_celsius{host=“zeus”}[2h])

使用Histogram和Summary分析数据分布情况

除了Counter和Gauge类型的监控指标以外,Prometheus还定义分别定义Histogram和Summary的指标类型。Histogram和Summary主用用于统计和分析样本的分布情况。

在大多数情况下人们都倾向于使用某些量化指标的平均值,例如CPU的平均使用率、页面的平均响应时间。这种方式的问题很明显,以系统API调用的平均响应时间为例:如果大多数API请求都维持在100ms的响应时间范围内,而个别请求的响应时间需要5s,那么就会导致某些WEB页面的响应时间落到中位数的情况,而这种现象被称为长尾问题。

为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在010ms之间的请求数有多少而1020ms之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram和Summary都是为了能够解决这样问题的存在,通过Histogram和Summary类型的监控指标,我们可以快速了解监控样本的分布情况。

Summary

例如:

prometheus_notifications_latency_seconds 指标数据,反映了 Prometheus 向 Alertmanager 发送告警通知的延迟情况

# HELP prometheus_notifications_latency_seconds Latency quantiles for sending alert notifications.
# TYPE prometheus_notifications_latency_seconds summary
prometheus_notifications_latency_seconds{alertmanager="http://192.168.37.20:9093/api/v2/alerts",quantile="0.5"} 0.000472046
prometheus_notifications_latency_seconds{alertmanager="http://192.168.37.20:9093/api/v2/alerts",quantile="0.9"} 0.006467804
prometheus_notifications_latency_seconds{alertmanager="http://192.168.37.20:9093/api/v2/alerts",quantile="0.99"} 0.006705547
prometheus_notifications_latency_seconds_sum{alertmanager="http://192.168.37.20:9093/api/v2/alerts"} 1.3940739090000016
prometheus_notifications_latency_seconds_count{alertmanager="http://192.168.37.20:9093/api/v2/alerts"} 2510

  1. 分位数(Quantile)解读
    该指标记录了发送通知到 Alertmanager(地址:http://192.168.37.20:9093/api/v2/alerts)的延迟分布(单位:秒):
    quantile=“0.5”(中位数):0.000472046 秒 → 约 0.47 毫秒
    一半的通知发送延迟在 0.47 毫秒以内,速度极快。
    quantile=“0.9”(90% 分位):0.006467804 秒 → 约 6.47 毫秒
    90% 的通知发送延迟不超过 6.47 毫秒,即使是较多次数的延迟也处于极低水平。
    quantile=“0.99”(99% 分位):0.006705547 秒 → 约 6.71 毫秒
    99% 的通知发送延迟控制在 6.71 毫秒以内,仅有 1% 的极端情况可能稍长,但仍远低于毫秒级的常见阈值(通常认为 100 毫秒以内均属正常)。
  2. 总和(sum)与计数(count)解读
    sum(总延迟):1.394 秒 → 所有 2510 次通知的累计延迟总和。
    count(总次数):2510 次 → 累计发送通知的总次数。
    计算 平均延迟:平均延迟 = sum / count ≈ 1.394 / 2510 ≈ 0.000555 秒(约 0.56 毫秒)平均值略高于中位数,说明少数通知的延迟稍长,但整体仍处于高效水平。
histogram

在Prometheus Server自身返回的样本数据中,我们还能找到类型为Histogram的监控指标prometheus_tsdb_compaction_chunk_range_bucket。

# HELP prometheus_tsdb_compaction_chunk_range Final time range of chunks on their first compaction
# TYPE prometheus_tsdb_compaction_chunk_range histogram
prometheus_tsdb_compaction_chunk_range_bucket{le="100"} 0
prometheus_tsdb_compaction_chunk_range_bucket{le="400"} 0
prometheus_tsdb_compaction_chunk_range_bucket{le="1600"} 0
prometheus_tsdb_compaction_chunk_range_bucket{le="6400"} 0
prometheus_tsdb_compaction_chunk_range_bucket{le="25600"} 0
prometheus_tsdb_compaction_chunk_range_bucket{le="102400"} 0
prometheus_tsdb_compaction_chunk_range_bucket{le="409600"} 0
prometheus_tsdb_compaction_chunk_range_bucket{le="1.6384e+06"} 260
prometheus_tsdb_compaction_chunk_range_bucket{le="6.5536e+06"} 780
prometheus_tsdb_compaction_chunk_range_bucket{le="2.62144e+07"} 780
prometheus_tsdb_compaction_chunk_range_bucket{le="+Inf"} 780
prometheus_tsdb_compaction_chunk_range_sum 1.1540798e+09
prometheus_tsdb_compaction_chunk_range_count 780

与Summary类型的指标相似之处在于Histogram类型的样本同样会反应当前指标的记录的总数(以_count作为后缀)以及其值的总量(以_sum作为后缀)。不同在于Histogram指标直接反应了在不同区间内样本的个数,区间通过标签len进行定义。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值