目录
一、PromQL简介
PromQL(Prometheus Query Language)是Prometheus内置的数据查询语言。支持用户进行实时的数据查询及聚合操作。
Prometheus基于指标名称(metrics name)以及附属的标签集(labelset)唯一定义一条时间序列
- 指标名称代表着监控目标上某类可测量属性的基本特征标识
- 标签则是这个基本特征上再次细分的多个可测量维度
指标名称相同,但是标签不同也是不同的时间序列
基于PromQL表达式,用户可以针对指定的特征及其细分的纬度进行过滤、聚合、统计等运算从而产生期望的计算结果
- PromQL 使用表达式(expression)来表述查询需求
- 根据其使用的指标和标签,以及时间范围,表达式的查询请求可灵活地覆盖在一个或多个时间序列的一定范围内的样本之上,甚至是只包含单个时间序列的单个样本
二、Prometheus 数据模型
2.1 简介
Prometheus 中,每个时间序列都由指标名称(Metric Name)和标签(Label)来唯一标识格式为:{
-
指标名称:通常用于描述系统上要测定的某个特征
例如,prometheus_http_requests_total表示接收到的HTTP请求总数
-
标签:键值型数据,附加在指标名称之上,从而让指标能够支持多纬度特征;可选项
例如,prometheus_http_requests_total{code=“200”}和prometheushttp_requests_total{code=“302”}代表着两个不同的时间序列
-
双下划线的标签(例如address)是Prometheus系统默认标签,是不会显示在/metrics页面里面的;
-
系统默认标签在target页面中也是不显示的,需要鼠标放到Labels字段上才会显示。
-
常见的系统默认标签:
__address:当前target 实例的套接字地址:
__scheme:采集当前target 上指标数据时使用的协议(http或https)
__metrics_path:采集当前target 上的指标数据时使用URI路径,默认为/metrics
___param:传递的URL参数中第一个名称为的参数的值
__name:此标签是标识指标名称的预留标签,能够使用标签选择器对指标名称进行过滤
2.2 指标名称及标签使用注意事项
-
指标名称和标签的特定组合代表着一个时间序列;指标名称相同,但标签不同的组合分别代表着不同的时间序列;不同的指标名称自然更是代表着不同的时间序列
-
PromQL支持基于定义的指标维度进行过滤和聚合;更改任何标签值,包括添加或删除标签,都会创建一个新的时间序列;应该尽可能地保持标签的稳定性,否则,则很可能创建新的时间序列,更甚者会生成一个动态的数据环境,并使得监控的数据源难以跟踪,从而导致建立在该指标之上的图形、告警及记录规则变得无效
2.3 样本数据格式
Prometheus 的每个数据样本由两部分组成
- 毫秒精度的时间戳
- float64格式的数据
三、PromQL 的数据类型
- 瞬时向量 (Instant vector): 特定或全部的时间序列集合上,具有相同时间戳的一组样本值
- 区间向量 (Range vector): 特定或全部的时间序列集合上,在指定的同一时间范围内的所有样本值
- 标量数据 (Scalar): 一个浮点型的数据值
- 字符串 (String): 一个字符串,支持使用单引号、双引号进行引用
3.1 时间序列选择器(Time series Selectors)
PromQL 的查询操作可能需要针对若干个时间序列上的样本数据进行,挑选出目标时间序列是构建表达式时最为关键的一步;
用户可使用向量选择器表达式来挑选出给定指标名称下的所有时间序列或部分时间序列的即时样本值或至过去某个时间范围内的样本值,前者称为瞬时向量选择器,后者称为区间向量选择器。
3.1.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种匹配操作符:
操作符 | 过滤条件 |
---|---|
= | 完全相等 |
!= | 不相等 |
=~ | 正则表达式匹配 |
!~ | 正则表达式不匹配 |
注意事项:
◆匹配到空标签值的标签选择器时,所有未定义该标签的时间序列同样符合条件
例如,prometheus_http_requests_total{handler= “”},则该指标名称上所有未使用该标签(handler)的时间序列也符合条件
◆正则表达式将执行完全锚定机制,它需要匹配指定的标签的整个值
◆向量选择器至少要包含一个指标名称,或者至少有一个不会匹配到空字符串的标签选择器
例如,{ job=“”}为非法的向量选择器
◆使用____name____ 做为标签名称,还能够对指标名称进行过滤
例如,{name=~“.*http_requests_total”}能够匹配所有以 http_requests_total 为后缀的所有指标
3.1.2 区间向量选择器(Range Vector Selectors)
区间向量选择器可以返回0个、1个或多个时间序列上在给定时间范值围内的各自的一组样本。
区间向量选择器的不同之处在于,需要通过在瞬时向量选择器表达式后面添加包含在 [] 里的时长来表达需在时间时序上返回的样本所处的时间范围。
时间范围:以当前时间为基准时间点,指向过去一个特定的时间长度;例如,[5m] 是指过去5分钟之内。
- 可用的时间单位有 ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)、w(周)和 y(年)
- 必须使用整数时间,且能够将多个不同级别的单位进行串联组合,以时间单位由大到小为顺序,例如 1h30m,但不能使用 1.5h
3.1.3 偏移向量选择器
前面介绍的选择器默认都是以当前时间为基准时间,偏移修饰器用来调整基准时间,使其往前偏移一段时间。偏移修饰器紧跟在选择器后面,使用关键字 offset 来指定要偏移的量。(查询的不是当前时间为起点的)
例如:
prometheus_http_requests_total offset 5m ,表示获取以 prometheus_http_requests_total 为指标名称的所有时间序列在过去 5 分钟之时的即时样本;
prometheus_http_requests_total[5m] offset 1d ,表示获取距此刻 1 天时间之前的 5 分钟之内的所有样本
3.2 向量表达式使用要点
表达式的返回值类型亦是即时向量、范围向量、标题或字符串4种数据类型其中之一,但是,有些使用场景要求表达式返回值必须满足特定的条件,例如:
- 需要将返回值绘制成图形时,仅支持瞬时向量类型的数据;
- 对于诸如 rate、irate 之类的速率函数来说,其要求使用的却又必须是区间向量型的数据
-
由于区间向量选择器的返回的是区间向量型数据,它不能用于表达式浏览器中图形绘制功能
-
区间向量选择器通常会结合速率类的函数 rate、irate 一同使用