跳到主要内容

PromQL选择器

PromQL(Prometheus Query Language)是Prometheus的核心查询语言,用于从时间序列数据库中提取和分析数据。选择器是PromQL中最基础且重要的概念之一,它允许你从海量时间序列中筛选出符合特定条件的序列。本文将详细介绍PromQL选择器的语法、用法以及实际应用场景。


什么是PromQL选择器?

PromQL选择器用于从Prometheus的时间序列数据库中筛选出符合特定标签和时间范围的时间序列。每个时间序列都由一个指标名称(metric name)和一组标签(labels)唯一标识。选择器通过匹配这些标签来过滤出所需的数据。

选择器的基本语法如下:

<metric_name>{<label_name>=<label_value>, ...}
  • <metric_name>:指标名称,例如 http_requests_total
  • {<label_name>=<label_value>, ...}:标签过滤条件,用于筛选特定标签值的时间序列。

选择器的类型

PromQL选择器主要分为两种类型:

  1. 即时向量选择器(Instant Vector Selector):用于查询当前时间点的数据。
  2. 范围向量选择器(Range Vector Selector):用于查询一段时间范围内的数据。

1. 即时向量选择器

即时向量选择器用于查询当前时间点的数据。它返回一个包含所有匹配时间序列的即时向量。

示例

假设我们有一个指标 http_requests_total,它记录了HTTP请求的总数,并且有以下标签:

  • method:请求方法(如 GETPOST)。
  • status:响应状态码(如 200404)。

以下查询将返回所有 http_requests_total 指标的当前值:

promql
http_requests_total

如果我们只想查询 method="GET"status="200" 的请求,可以使用以下选择器:

promql
http_requests_total{method="GET", status="200"}

输出示例

假设当前时间点的数据如下:

http_requests_total{method="GET", status="200", instance="localhost:8080"} 150
http_requests_total{method="POST", status="200", instance="localhost:8080"} 50

查询结果将返回:

http_requests_total{method="GET", status="200", instance="localhost:8080"} 150

2. 范围向量选择器

范围向量选择器用于查询一段时间范围内的数据。它返回一个包含所有匹配时间序列的范围向量。

示例

以下查询将返回过去5分钟内 http_requests_total 指标的所有值:

promql
http_requests_total[5m]

如果我们只想查询 method="GET"status="200" 的请求,可以使用以下选择器:

promql
http_requests_total{method="GET", status="200"}[5m]

输出示例

假设过去5分钟内的数据如下:

http_requests_total{method="GET", status="200", instance="localhost:8080"} @1622547600 150
http_requests_total{method="GET", status="200", instance="localhost:8080"} @1622547900 160
http_requests_total{method="GET", status="200", instance="localhost:8080"} @1622548200 170

查询结果将返回:

http_requests_total{method="GET", status="200", instance="localhost:8080"} @1622547600 150
http_requests_total{method="GET", status="200", instance="localhost:8080"} @1622547900 160
http_requests_total{method="GET", status="200", instance="localhost:8080"} @1622548200 170

标签匹配操作符

PromQL选择器支持多种标签匹配操作符,用于更灵活地筛选数据:

  • =:精确匹配。
  • !=:不等于。
  • =~:正则表达式匹配。
  • !~:正则表达式不匹配。

示例

以下查询将返回所有 methodG 开头的请求:

promql
http_requests_total{method=~"G.*"}

以下查询将返回所有 status 不为 200 的请求:

promql
http_requests_total{status!="200"}

实际应用场景

场景1:监控HTTP请求的成功率

假设我们想要监控 http_requests_total 指标中 status="200" 的请求占总请求的比例。可以使用以下查询:

promql
sum(rate(http_requests_total{status="200"}[5m])) / sum(rate(http_requests_total[5m]))

场景2:筛选特定实例的CPU使用率

假设我们有一个指标 node_cpu_seconds_total,记录了每个CPU核心的使用时间。以下查询将返回 instance="localhost:9100" 的CPU使用率:

promql
rate(node_cpu_seconds_total{instance="localhost:9100"}[5m])

总结

PromQL选择器是Prometheus查询语言的核心功能之一,它允许你通过指标名称和标签筛选出所需的时间序列数据。本文介绍了即时向量选择器和范围向量选择器的基本用法,并通过实际案例展示了如何在实际场景中应用这些选择器。

提示
  • 使用正则表达式匹配(=~!~)可以更灵活地筛选数据。
  • 范围向量选择器通常与聚合函数(如 rate())结合使用,以计算一段时间内的变化率。

附加资源


练习

  1. 编写一个PromQL查询,返回过去10分钟内 http_requests_total 指标中 method="POST" 的请求总数。
  2. 使用正则表达式匹配,筛选出所有 status4 开头的请求。

通过练习,你将更深入地理解PromQL选择器的用法!