PromQL基础

前言

  时间序列数据: 按照时间顺序记录系统, 设备状态变化的数据, 每个数据称为一个样本.

  数据采集以特定的时间周期进行, 因而, 随着时间流逝, 将这些样本数据记录下来, 将生成一个离散的样本数据序列.

  该序列也称为(向量Vector), 而将多个序列放在同一个坐标系内(以时间为横轴, 以序列为纵轴), 将形成一个数据点组成的矩阵.

简介

Prometheus 基于指标名称(metrics name) 以及附属标签 (labelset) 唯一定义一条时间序列.

  • 指标名称代表着监控目标上某类可测量竖向的基本特征标识.
  • 标签则是这个特征上再次细分的多个测量纬度

基于 PromeQL 表达式, 可以针对特定的特征及其细分的纬度进行过滤, 聚合, 统计运算等从而产生期望的计算结果.

PromeQL (Prometheus Query Lanaguage) 是 Prometheus Server 内置数据查询语言.

  • Prometheus 使用表达式 (expression)来标书查询需求.
  • 根据其使用的指标标签, 以及时间范围,表达式的查询请求可灵活的覆盖在一个或者多个时间序列的一定范围内的样本之上, 甚至是只包含单个时间序列的单个样本.

PromeQL 的数据类型

PromeQL的表达式中支持四种数据类型

  • 即时向量 (Instant Vector)
    • 特定或全部的时间序列集合上 具有相同时间戳的一组样本值即为即时向量.
  • 范围向量 (Range Vector)
    • 特定或全部的时间序列集合上, 在指定的同一时间范围内的所有样本值.
  • 标量 (Scalar)
    • 一个浮点型的数据值.
  • 字符串(string)
    • 支持使用单引号, 双引号或反引号进行引用, 单反引号中不会对转义字符串进行转义.

向量表达式使用要点

    表达式的返回值类型亦是即时向量、范围向量、标题或字符串4种数据类型其中之一,但是,有些使用场景要求表达式返回值必须满足特定的条件,例如
  • 需要将返回值绘制成图形时,仅支持即时向量类型的数据;
  • 对于诸如rate一类的速率函数来说,其要求使用的却又必须是范围向量型的数据;
由于范围向量选择器的返回的是范围向量型数据,它不能用于表达式浏览器中图形绘制功能,否则,表达式浏览器会返回“Error executing query: invalid expressiontype "range vector" for range query, must be Scalar or instant Vector”一类的错误
  • 事实上,范围向量选择几乎总是结合速率类的函数rate一同使用

选择器

时间序列选择器 (Time Series Selectors)

PromeQL 的查询需要针对有限哥时间序列上的样本数据进行, 挑选出目标时间序列是构建表达式时最为关键的一步.

用户可使用向量选择器表达式来挑选出给定指标名称下的所有时间序列或者部分时间序列, 后者称为范围向量选择器.

  • 即时向量选择器 (Instant Vector Selectors)
    • 返回0个,1个或者多个时间序列上在给定时间戳(instant)上的各自的一个样本值, 该样本也称为即时样本.
  • 范围向量选择器 (Range Vector Selectors)
    • 返回0个, 一个或多个时间序列上在给定时间范围内的一组数据样本.

 

 即使向量选择器

即时向量选择器由两部分组成

  • 指标名称
    • 用于限定特定指标下的时间序列, 即负责过滤的指标, 可选值.
  • 匹配器(Matcher)
    • 或者称为标签选择器, 用于过滤时间序列上的标签, 定义在 {} 之中, 可选.

定义即时向量的三种组合

 

  • 仅给定指标名称,或在标签名称上使用了空值的匹配器:返回给定的指标下的所有时间序列各自的即时样本;
    • 例如,http_requests_total和http_requests_total{}的功能相同,都是用于返回 http_requests_total 指标下各时间序列的即时样本;
  • 仅给定匹配器:返回所有符合给定的匹配器的所有时间序列上的即时样本;
    • 注意:这些时间序列可能会有着不同的指标名称;
    • 例如, {job=".*", method="get"}
  • 指标名称和匹配器的组合:返回给定的指定下的,且符合给定的标签过滤器的所有时间序列上的即时样本;
    • 例如, http_requests_total{method="get"}

匹配器

匹配器用于定义标签过滤条件,目前支持如下4种匹配操作符;
  • =: Select labels that are exactly equal to the provided string.
  • !=: Select labels that are not equal to the provided string.
  • =~: Select labels that regex-match the provided string.
  • !~: Select labels that do not regex-match the provided string.

注意事项

  • 匹配到空标签值的匹配器时,所有未定义该标签的时间序列同样符合条件;
    • 例如,http_requests_total{env= ""},则该指标名称上所有未使用该标签(env)的时间序列也符合条件,比如时间序列http_requests_total{method ="get"} ;
  • 正则表达式将执行完全锚定机制,它需要匹配指定的标签的整个值;
  • 向量选择器至少要包含一个指标名称,或者至少有一个不会匹配到空字符串的匹配器;
    • 例如,{job=""}为非法的选择器;
  • 使用“__name__”做为标签名称,还能够对指标名称进行过滤;
    • 例如,{__name__=~"http_requests_.*"}能够匹配所有以“ http_requests_ ”为前缀的所有指标;

范围向量选择器

同即时向量选择器的唯一不同之处在于,范围向量选择器需要在表达式后紧跟一个方括 [ ] 来表达需在时间时序上返回的样本所处的时间范围;
时间范围:以当前时间为基准时间点,指向过去一个特定的时间长度;例如[5m]便是指过去5分钟之内;
时间格式:一个整数后紧跟一个时间单位,例如“5m”中的“m”即是时间单位
  • 可用的时间单位有ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)、w(周)和 y(年);
  • 必须使用整数时间,且能够将多个不同级别的单位进行串联组合,以时间单位由大到小为顺序,例如1h30m,但不能使用1.5h;
需要注意的是,范围向量选择器返回的是一定时间范围内的数据样本,虽然不同时间序列的数据抓取时间点相同,但它们的时间戳并不会严格对齐;
  • 多个Target上的数据抓取需要分散在抓取时间点前后一定的时间范围内,以均衡Prometheus Server的负载;
  • 因而,Prometheus在趋势上准确,但并非绝对精准;

偏移量修改器

默认情况下,即时向量选择器和范围向量选择器都以当前时间为基准时间点,而偏移量修改器能够修改该基准;
偏移量修改器的使用方法是紧跟在选择器表达式之后使用“offset”关键字指定
  • “http_requests_total offset 5m”,表示获取以http_requests_total为指标名称的所有时间序列在过去5分钟之时的即时样本;
  • “http_requests_total[5m] offset 1d”,表示获取距此刻1天时间之前的5分钟之内的所有样本;

 

posted @ 2021-11-01 23:01  闫世成  阅读(363)  评论(0编辑  收藏  举报