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

PromQL 快速上手

文章目录

  • 1.简介
  • 2.主要特点
  • 3.基本用法
  • 4.数据类型
  • 5.Prometheus 的四种指标类型
  • 6.常用函数
    • 聚合运算符 (Aggregation Operators)
    • 速率与增量 (Rate and Derivatives)
    • 计数器处理 (Counter Resets)
    • 时间操作 (Time and Date)
    • 标签操作 (Label Manipulation)
    • 数学运算 (Mathematical Functions)
    • 逻辑与过滤 (Logical and Filtering)
    • 特殊函数
    • 排序 (Sorting)
  • 参考文献

1.简介

PromQL 是 Prometheus 监控系统的查询语言,语法简洁且功能强大。

PromQL 的语法跟一般的 SQL 语言很不一样,初学者往往需要花费几个小时阅读 官方 PromQL 文档 才能理解它的工作原理。

这里请跟随我们的思路,一起快速理解 PromQL 的设计精髓并掌握 PromQL 的用法。

2.主要特点

功能性查询语言:

PromQL 提供了一种功能性查询语言,允许用户以一种声明式的方式来描述他们想要的数据,而不是以过程式的方式来一步一步地操作。

丰富的功能:

PromQL 支持各种运算符、函数和聚合函数,可以实现复杂的查询和计算逻辑。

广泛应用:

PromQL 被广泛应用于 Prometheus 监控系统中,用于数据查询、可视化、警报等场景。

3.基本用法

PromQL 查询的基本语法是:

[selector] [modifier]

selector 用于选择时间序列,例如:http_requests_total 或 http_requests_total{job=“my-web-app”}。

modifier 用于对选择的时间序列进行操作,例如聚合、过滤、计算等。

PromQL 的一些常见用法:

  • 查询特定指标:查询某个指标,例如 http_requests_total
  • 过滤指标:过滤掉特定标签的指标,例如 http_requests_total{status_code="200"}
  • 聚合指标:对指标进行聚合,例如 sum(http_requests_total)avg(node_cpu_seconds_total{mode="idle"})
  • 计算指标:对指标进行计算,例如 sum(rate(http_requests_total[5m]))
  • 警报规则:在 PromQL 表达式中定义警报规则,当表达式的结果满足一定条件时触发警报

4.数据类型

PromQL 支持四种数据类型:

  • 瞬时向量(Instant vector):一组时间序列,每个时间序列包含一个样本,都共享相同的时间戳。
  • 区间向量(Range vector):一组时间序列,其中包含每个时间序列随时间变化的一系列数据点。
  • 标量(Scalar):一个单独的值,例如数字。
  • 布尔值(Boolean):True 或 False。

其中 Prometheus 时序数据是其监控系统的核心存储对象,本质是带有时间戳的多维度量值。

数据结构模型:

type Sample struct {Metric    map[string]string // 标签键值对Value     float64           // 数值Timestamp int64             // Unix 毫秒时间戳
}

示例数据点:

{metric: {__name__="http_requests_total",method="POST",status="200",endpoint="/api/login"},value: 1845.0,timestamp: 1717254000000
}

5.Prometheus 的四种指标类型

Prometheus 主要定义了四种核心指标类型(Metric Types),它们在客户端库(如 Go、Java、Python 等)中实现,并在抓取时通过 HELP 和 TYPE 行提供给 Prometheus 服务器。理解这些类型对于正确查询和聚合数据至关重要。

计数器(Counter)跟踪只能增加的累计值。它们通常用于跟踪处理的请求、错误和传输的字节数等。

仪表盘 (Gauge) 。代表一个瞬时的、可升可降的测量值。它们通常用于跟踪内存用量、CPU 用
量和磁盘可用空间等。

直方图(Histogram)跟踪值的分布情况。它们通常用于跟踪请求延迟时间和响应大小等。

摘要(Summary)与直方图类似,但它们还跟踪分位数。因此,它们对于识别离群值和了解值的整体分布更有用。

6.常用函数

PromQL 提供了丰富的函数来处理和分析时间序列数据。

聚合运算符 (Aggregation Operators)

Prometheus 还提供了聚合操作符,这些操作符作用于瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。目前支持的聚合函数有:

  • sum (求和)
  • min (最小值)
  • max (最大值)
  • avg (平均值)
  • stddev (标准差)
  • stdvar (标准方差)
  • count (计数)
  • count_values (对value进行计数)
  • bottomk (后n条时序)
  • topk (前n条时序)
  • quantile (分位数)

速率与增量 (Rate and Derivatives)

计算时间序列的变化率:

  • rate(range_vector)

计算区间内每秒平均增长率(自动处理计数器重置)。适用于单调递增的计数器(如请求数)。

  • irate(range_vector)

计算区间内最后两个点的瞬时增长率(更敏感,适合快速变化)。

  • increase(range_vector)

计算区间内的绝对增长量(自动处理重置)。

  • delta(range_vector)

计算区间内样本值的差值(可正可负,适用于非计数器如温度)。

计数器处理 (Counter Resets)

处理计数器的重置(归零)问题:

  • resets(range_vector)

返回区间内计数器重置的次数。

示例:

// 1小时内CPU时间重置次数
resets(process_cpu_seconds_total[1h])

时间操作 (Time and Date)

  • time()

返回当前Unix时间戳(秒)。

  • year(timestamp_vector)

返回年份。

  • month/day/hour/minute/second(timestamp_vector)

返回时间成分值。

标签操作 (Label Manipulation)

修改时间序列的标签:

// 基于正则替换标签值。
label_replace(vector, "dst_label", "replacement", "src_label", "regex")// 将多个标签值连接为新标签。
label_join(vector, "dst_label", "separator", "src_label1", "src_label2", ...)

示例:从 instance=“1.2.3.4:9100” 提取主机名到新标签 host=“1.2.3.4”。

label_replace(up{job="node"}, "host", "$1", "instance", "(.*):\d+")

数学运算 (Mathematical Functions)

// 绝对值
abs(vector)// 四舍五入
round(vector, scalar)// 向上/向下取整。
- ceil/floor(vector)// 对数计算。
- ln/log2/log10(vector)// 指数/幂运算。
- exp/pow(vector, scalar)

示例:

// 内存使用量保留两位小数
round(avg_over_time(memory_usage[5m]), 0.01)

逻辑与过滤 (Logical and Filtering)

  • absent(vector)
    检测序列是否不存在(常用于告警)。

  • absent_over_time(range_vector)
    检测时间段内是否无数据。

  • clamp_max/clamp_min(vector, scalar)
    限制值的上下限。

示例:

// 若MySQL实例消失则触发
absent(up{job="mysql"} == 1)

特殊函数

  • histogram_quantile(φ, vector)
    直方图分位数计算:根据 _bucket 和 _sum 计算分位数(如P99)。

  • predict_linear(range_vector, scalar)
    基于线性回归预测未来值(如磁盘占满时间)。

示例:

// 计算P99请求延迟
histogram_quantile(0.99, sum by(le) (rate(http_request_duration_seconds_bucket[5m])))

排序 (Sorting)

  • sort(vector)
    升序排列。

  • sort_desc(vector)
    降序排列。

示例:

// 内存使用量最高的3个序列升序显示
sort(topk(3, memory_usage))

参考文献

官方 PromQL 文档
Prometheus 和 PromQL 是什么?

http://www.lqws.cn/news/69571.html

相关文章:

  • 4.RV1126-OPENCV 图像轮廓识别
  • 【SpringBoot】| 接口架构风格—RESTful
  • 什么是 CPU 缓存模型?
  • 深入探讨redis:缓存
  • vue-13(延迟加载路由)
  • Vue-6-前端框架Vue之基于Plotly.js绘制曲线
  • 【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
  • WebSocket与Reactor模式:构建实时交互应用
  • Qt OpenGL 实现交互功能(如鼠标、键盘操作)
  • 【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数
  • [Java恶补day13] 53. 最大子数组和
  • AI大数据模型如何与thingsboard物联网结合
  • 基于SpringBoot运动会管理系统设计和实现(源码+文档+部署讲解)
  • 20250602在荣品的PRO-RK3566开发板的Android13下打开关机对话框
  • 【LeetCode 题解】两数之和(C++/Python 双解法):从语法到算法的全面解析
  • (LeetCode 每日一题)135. 分发糖果 ( 贪心 )
  • 基于Python学习《Head First设计模式》第三章 装饰者模式
  • Spring Security入门:创建第一个安全REST端点项目
  • 好用的C/C++/嵌入式 IDE: CLion的下载安装教程(保姆级教程)
  • 黑马Java面试笔记之 微服务篇(SpringCloud)
  • 【图论 拓扑排序 贪心 临项交换】P5603 小 C 与桌游 题解|普及+
  • XML-BEANS compiled schema: Could not locate compiled schema resource
  • Day43打卡(补41+42) @浙大疏锦行
  • 123网盘SDK-npm包已发布
  • 电脑为什么换个ip就上不了网了
  • BiliNote部署实践
  • postman工具使用
  • Kotlin 中 companion object 扩展函数详解
  • Kotlin 中companion object {} 什么时候触发
  • 【iOS安全】使用LLDB调试iOS App | LLDB基本架构 | LLDB安装和配置