彻底理解Prometheus查询语法

写在前面

主要参考:https://github.com/yunlzheng/prometheus-book

本文档主要分为两部分,分别讲解PromQL和Grafana的基础使用,在阅读PromQL部分时,建议不要联想Grafana中要怎么使用这些查询表达式,又是怎么根据查询结果绘图的,因为PromQL对于Grafana来说和SQL并没有区别,都是查询出结果,然后根据各种指定配置进行绘图,所以阅读和理解PromQL部分,应关注查询结果是什么样的,不要关注这些结果在Grafana中是怎么绘图的。

1、理解时间序列

1.1指标

​ 指标就是要监控的目标。

​ 在形式上,所有的指标(Metric)都通过如下格式标示:

<metric name>{<label name>=<label value>, ...}

​ 指标名称(metric name)一般反映被监控样本的含义(比如,http_request_total - 表示当前系统接收到的HTTP请求总量)。

​ 标签(label)反映了当前样本的特征维度,通过这些维度可以对样本数据进行过滤,聚合等。

1.2样本

​ Prometheus会定时到指定的Exportor上pull当前的样本数据,然后根据pull的时间以时间序列的方式保存在内存数据库中,并且定时持久化到硬盘上,Exportor只维护指标的值。每条时间序列由指标名称(metrics)和一组标签集(labelset)确定并命令,也就是说一个指标名称可能对应很多条时间序列。

​ 可以将时间序列理解为一个以时间为轴的矩阵,如下所示,有三个时间序列在时间轴上分别对应不同的值:

  ^
  │     . . . . . . . . . .   node_cpu{cpu="cpu0",mode="idle"}
  │     . . . . . . . . . .   node_cpu{cpu="cpu0",mode="system"}
  │     . . . . . . . . . .   node_load1{}
  v
    <------- 时间 ---------->

​ 每一个点称为一个样本(sample),样本由以下三部分组成:

  • 指标(metric):metric name和描述当前样本特征的labelsets;
  • 时间戳(timestamp):一个精确到毫秒的时间戳;
  • (value):表示该时间的样本的值。
<--------------- metric ---------------------><-timestamp -><-value->
http_request_total{status="200", method="GET"}@1434417560938 => 94355
http_request_total{status="200", method="GET"}@1434417561287 => 94334
http_request_total{status="404", method="GET"}@1434417560938 => 38473
http_request_total{status="404", method="GET"}@1434417561287 => 38544
http_request_total{status="200", method="POST"}@1434417560938 => 4748
http_request_total{status="200", method="POST"}@1434417561287 => 4785

​ 所以查询值的where条件就是指标、标签和时间戳(区间)。

2、查询语法

2.1指标查询(瞬时向量查询)

通过指标名称和标签进行查询,可以查询该指标下的所有时间序列距离当前系统时间最新的值,无时间概念,所以查询的结果称为瞬时向量(instant vector),如下图所示:

在这里插入图片描述
而且可以看到查询到的多条时间序列都包含指定的标签。单独使用指标名称,相当于不使用标签进行过滤,同样独单使用标签查询也可以。

标签过滤支持使用=!=两种完全匹配模式:

  • 通过使用label=value可以选择那些标签满足表达式定义的时间序列;
  • 反之使用label!=value则可以根据标签匹配排除时间序列;

除了使用完全匹配的方式对时间序列进行过滤以外,还支持使用正则表达式作为匹配条件,多个正则表达式之间使用|进行分离:

  • 使用label=~regx表示选择符合正则表达式定义的时间序列;
  • 反之使用label=!~regx进行反向选择;

例如,如果想查询多个环境下的请求数统计,可以使用如下表达式:

http_requests_total{environment=~"prodect|test|development",method!="GET"}

每个正则表达式就是简单的字符串。

2.2时间范围查询(区间向量查询)

​ 如果我们想过去一段时间范围内的样本数据时,我们则需要使用区间向量表达式。区间向量表达式和瞬时向量表达式之间的差异在于需要定义时间范围,通过时间范围选择器[]进行定义。例如查询距离当前系统时间最近5分钟内的所有样本数据

在这里插入图片描述
可以看到结果中每个时间序列都有5个值并且@了不同的时间戳(因为该prometheus每分钟pull一次,所以5分钟有5个结果)。

除了使用m表示分钟以外,PromQL的时间范围选择器支持其它时间单位:

  • s - 秒
  • m - 分钟
  • h - 小时
  • d - 天
  • w - 周
  • y - 年

2.3时间位移

在瞬时向量表达式或者区间向量表达式中,都是以prometheus当前系统时间为基准进行查询:

http_request_total{} # 瞬时向量表达式,选择当前最新的数据
http_request_total{}[5m] # 区间向量表达式,选择以当前时间为基准过去5分钟内的所有数据

而如果我们想查询5分钟之前的最新数据,或者想查询昨天的所有数据呢?

这个时候我们就可以使用位移操作,位移操作的关键字为offset,例如:

 http_request_total{} offset 5m
 http_request_total{}[1d] offset 1d

2.4操作符

除了能够方便的查询和过滤时间序列以外,还支持丰富的操作符,用户可以使用这些操作符进一步的对事件序列进行二次加工。这些操作符包括:数学运算符,逻辑运算符,布尔运算符等等。

数学运算符

操作数可以是一个常数,也可以是一个查询表达式,比如:

bet_amount_total / 100 : bet_amount是投注金额的总计,经常单位是分,为了转成元,可以除以100

http_requests_total{api=“/bet“} + http_requests_total{api=”/login“} 计算投注和登录请求的和

支持的所有数学运算符如下所示:

  • + (加法)
  • - (减法)
  • * (乘法)
  • / (除法)
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值