前言
当 Prometheus 通过 Exporter 采集到相应的监控指标样本数据后,我们就可以通过PromQL 对监控样本数据进行查询,从而对相应的数据样本进行分析以及制定报警规则。
1. PromQL的简介
PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言。支持用户进行实时的数据查询及聚合操作。
Prometheus 基于指标名称(metrics name)以及附属的标签集(labelset)唯一定义一条时间序列
●指标名称代表着监控目标上某类可测量属性的基本特征标识
●标签则是这个基本特征上再次细分的多个可测量维度
基于 PromQL 表达式,用户可以针对指定的特征及其细分的纬度进行过滤、聚合、统计等运算从而产生期望的计算结果
●PromQL 使用表达式(expression)来表述查询需求
●根据其使用的指标和标签,以及时间范围,表达式的查询请求可灵活地覆盖在一个或多个时间序列的一定范围内的样本之上,甚至是只包含单个时间序列的单个样本
2. PromQL数据样本信息的含义理解
2.1 Prometheus 数据模型
Prometheus 中,每个时间序列都由指标名称(Metric Name)和标签(Label)来唯一标识
格式为:<metric_name>{<label_name>=<label_value>, ...}
●指标名称:通常用于描述系统上要测定的某个特征
例如,prometheus_http_requests_total 表示接收到的 HTTP 请求总数
●标签:键值型数据,附加在指标名称之上,从而让指标能够支持多纬度特征;可选项
例如,prometheus_http_requests_total{code="200"} 和 prometheus_http_requests_total{code="302"} 代表着两个不同的时间序列
●双下划线的标签(例如 __address__ )是 Prometheus 系统默认标签,是不会显示在 /metrics 页面里面的;
●系统默认标签在 target 页面中也是不显示的,需要鼠标放到 label 字段上才会显示。
常见的系统默认标签:
__address__ 当前 target 实例的套接字地址 <host>:<port>
__scheme__ 采集当前 target 上指标数据时使用的协议(http 或 https)
__metrics_path__ 采集当前 target 上的指标数据时使用 URI 路径,默认为 /metrics
__param_<name> 传递的 URL 参数中第一个名称为 <name> 的参数的值
__name__
此标签是标识指标名称的预留标签,能够使用标签选择器对指标名称进行过滤
指标名称及标签使用注意事项:
●指标名称和标签的特定组合代表着一个时间序列;指标名称相同,但标签不同的组合分别代表着不同的时间序列;不同的指标名称自然更是代表着不同的时间序列
●PromQL支持基于定义的指标维度进行过滤和聚合;更改任何标签值,包括添加或删除标签,都会创建一个新的时间序列;应该尽可能地保持标签的稳定性,否则,则很可能创建新的时间序列,更甚者会生成一个动态的数据环境,并使得监控的数据源难以跟踪,从而导致建立在该指标之上的图形、告警及记录规则变得无效
2.2 样本数据格式
Prometheus 的每个数据样本由两部分组成
●毫秒精度的时间戳
●float64 格式的数据

2.3 PromQL 的数据类型
PromQL 的表达式中支持 4 种数据类型:
●瞬时向量 (Instant vector): 特定或全部的时间序列集合上,具有相同时间戳的一组样本值
●区间向量 (Range vector): 特定或全部的时间序列集合上,在指定的同一时间范围内的所有样本值
●标量数据 (Scalar): 一个浮点型的数据值
●字符串 (String): 一个字符串,支持使用单引号、双引号进行引用
2.4 时间序列选择器(Time series Selectors)
PromQL 的查询操作可能需要针对若干个时间序列上的样本数据进行,挑选出目标时间序列是构建表达式时最为关键的一步;
用户可使用向量选择器表达式来挑选出给定指标名称下的所有时间序列或部分时间序列的即时样本值或至过去某个时间范围内的样本值,前者称为瞬时向量选择器,后者称为区间向量选择器。
(1)瞬时向量选择器(Instant Vector Selectors)
瞬时向量选择器可以返回 0 个、1 个或多个时间序列上在给定时间戳(instant)上的各自的一个样本。
瞬时向量选择器由两部分组成:
◆指标名称:用于限定特定指标下的时间序列,即负责过滤指标;可选
◆标签选择器:用于过滤时间序列上的标签;定义在 {} 之中;可选
定义瞬时向量选择器时,以上两个部分应该至少给出一个;因此存在以下三种组合:
◆仅给定指标名称,或在标签名称上使用了空值的标签选择器:返回给定的指标下的所有时间序列各自的即时样本
例如,prometheus_http_requests_total 和 prometheus_http_requests_total{} 的功能相同,都是用于返回这个指标下各时间序列的即时样本
◆仅给定标签选择器:返回所有符合给定的标签选择器的所有时间序列上的即时样本
例如,{code="200", job="prometheus"} ,这样的时间序列可能会有着不同的指标名称
◆指标名称和标签选择器的组合:返回给定的指标下的,且符合给定的标签过滤器的所有时间序列上的即时样本
例如,prometheus_http_requests_total{code="200", job="prometheus"},用于返回这个指标 code 为 200, 并且 job 为 prometheus 的时间序列的即时样本
标签选择器用于定义标签过滤条件,目前支持如下4种匹配操作符:
= :完全相等
!= : 不相等
=~ : 正则表达式匹配
!~ : 正则表达式不匹配
注意事项:
◆匹配到空标签值的标签选择器时,所有未定义该标签的时间序列同样符合条件
◆正则表达式将执行完全锚定机制,它需要匹配指定的标签的整个值
◆向量选择器至少要包含一个指标名称,或者至少有一个不会匹配到空字符串的标签选择器
例如,{ job=""} 为非法的向量选择器
◆使用 __name__ 做为标签名称,还能够对指标名称进行过滤

PromQL是Prometheus的数据查询语言,用于实时数据查询和聚合操作。文章详细介绍了PromQL的数据模型,包括指标名称、标签、样本数据格式,以及数据类型如瞬时向量、区间向量。此外,还讲解了时间序列选择器、标签选择器的使用,如瞬时向量选择器和区间向量选择器,并通过示例展示了如何查询和分析监控指标。文章强调了正确选择和使用标签的重要性,以及如何利用PromQL进行聚合操作和时间序列分析。
最低0.47元/天 解锁文章
8万+

被折叠的 条评论
为什么被折叠?



