Prometheus学习系列(六)之Prometheus 查询说明

前言

本文来自Prometheus官网手册和 Prometheus简介

Prothetheus查询

Prometheus提供一个函数式的表达式语言PromQL (Prometheus Query Language),可以使用户实时地查找和聚合时间序列数据。表达式计算结果可以在图表中展示,也可以在表达式浏览器中以表格形式展示,或者作为数据源, 以HTTP API的方式提供给外部系统使用。

一、例子

本文档仅供参考, 对于学习,从几个例子开始可能更容易。

二、表达式语言数据类型

在Prometheus的表达式语言中,任何表达式或者子表达式都可以归为四种类型:

  • instant vector 瞬时向量:它是指在同一时刻,抓取的所有度量指标数据。这些度量指标数据的key都是相同的,也即相同的时间戳
  • range vector 范围向量:它是指在任何一个时间范围内,抓取的所有度量指标数据
  • scalar 标量:一个简单的浮点值
  • string 字符串:一个当前没有被使用的简单字符串

根据用例(例如在绘制图形或显示表达式的输出时),由于用户指定的表达式的结果,其中只有某些类型是合法的。 例如,返回瞬时向量的表达式是唯一可以直接绘制图形的类型。

三、字面量

3.1 字符串字面量

字符串可以用单引号,双引号或反引号指定为文字。PromQL遵循与Go相同的转义规则。在单引号,双引号中,反斜杠成为了转义字符,后面可以跟着a,b, f, n, r, t, v或者\。 可以使用八进制(\nnn)或者十六进制(\xnn, \unnnn\Unnnnnnnn)提供特定字符。在反引号内不处理转义字符。与Go不同,Prometheus不会丢弃反引号中的换行符。例如:

"this is a string"
‘these are unescaped: \n \\ \t‘
`these are not unescaped: \n ‘ " \t"‘`

3.2 浮点数字面量

标量浮点值可以直接写成形式[-](digits)[.(digits)]

-2.43

四、时间序列选择器

4.1 瞬时向量选择器

瞬时向量选择器允许在给定时间戳(即时)为每个选择一组时间序列和单个样本值:在最简单的形式中,仅指定度量名称。 这会生成包含具有此度量标准名称的所有时间序列的元素的即时向量。

下面这个例子选择所有时间序列度量名称为http_requests_total的样本数据:

http_requests_total

通过在度量指标后面增加{}一组标签可以进一步地过滤这些时间序列数据。

此示例仅选择具有http_requests_total度量标准名称的时间系列,该名称也将job标签设置为prometheus,并将其group标签设置为canary

http_requests_total{job="prometheus",group="canary"}

可以采用不匹配的标签值也是可以的,或者用正则表达式不匹配标签。标签匹配操作如下所示:

  • =  : 精确地匹配标签给定的值
  • != : 不等于给定的标签值
  • =~ : 正则表达匹配给定的标签值
  • !~ : 给定的标签值不符合正则表达式

例如:度量指标名称为http_requests_total,正则表达式匹配标签environmentstaging, testing, development的值,且http请求方法不等于GET

http_requests_total{environment=~"staging|testing|development",method!="GET"}

匹配空标签值的标签匹配器也可以选择没有设置任何标签的所有时间序列数据。正则表达式完全匹配。 可以为同一标签名称提供多个匹配器。

向量选择器必须指定一个名称或至少一个与空字符串不匹配的标签匹配器。 以下表达式是非法的:

{job=~".*"} # Bad!

相反,这些表达式是有效的,因为它们都有一个与空标签值不匹配的选择器。

{job=~".+"}              # Good!
{job=~".*",method="get"} # Good!

标签匹配器能够被应用到度量指标名称,使用__name__标签筛选度量指标名称。例如:表达式http_requests_total等价于{__name__="http_requests_total"}。 其他的匹配器,如:= ( !=, =~, !~)都可以使用。下面的表达式选择了度量指标名称以job:开头的时间序列数据:

{__name__=~"job:.*"}

Prometheus中的所有正则表达式都使用RE2语法

4.2 范围向量选择器

范围向量的工作方式与即时向量相同,不同之处在于它们从当前即时选择回采样范围。 在语法上,范围持续时间附加在向量选择器末尾的方括号([])中,指定为每个结果范围向量元素提取多长时间值。持续时间指定为数字,单位为:

  • s - seconds
  • m - minutes
  • h - hours
  • d - days
  • w - weeks
  • y - years

在此示例中,我们选择在过去5分钟内为度量标准名称为http_requests_totaljob标签设置为prometheus的所有时间序列记录的所有值:

http_requests_total{job="prometheus"}[5m]

4.3 偏移修饰符

这个offset偏移修饰符允许在查询中改变单个瞬时向量和范围向量中的时间偏移。例如,以下表达式返回过去相对于当前查询评估时间5分钟的http_requests_total值:

http_requests_total offset 5m

注意:offset偏移修饰符必须直接跟在选择器后面,例如:以下是正确的:

sum(http_requests_total{method="GET"} offset 5m) // GOOD.

然而,下面这种情况是不正确的:

sum(http_requests_total{method="GET"}) offset 5m // INVALID.

同样适用于范围向量。 这将返回http_requests_total一周前的5分钟费率:

rate(http_requests_total[5m] offset 1w)

五、子查询

子查询允许针对给定范围和分辨率运行即时查询。 子查询的结果是范围向量。

语法:<instant_query>‘[‘<range>‘:‘[<resolution>]‘]‘[offset <duration>]

  • <resolution>是可选的。 默认值是全局评估间隔。

六、操作符

Prometheus支持二元和聚合操作符。详见表达式语言操作符

七、函数

Prometheus提供了一些函数列表操作时间序列数据。详见表达式语言函数

八、注释

PromQL支持以#开头的行注释。 如:

#这是一条评论

九、陷阱

9.1 旧数据

运行查询时,独立于当前时间序列的数据选择采样数据的时间戳。这主要是为了支持聚合(总和,平均等)这样的情况,其中多个聚合时间序列在时间上不完全对齐。由于它们的独立性,Prometheus需要在每个相关时间序列的时间戳上分配值。它只需在此时间戳之前采用最新的样本即可。

如果目标抓取或规则评估不再返回先前存在的时间序列的样本,则该时间序列将被标记为旧数据。如果目标被移除,之前很快就会将其先前返回的时间序列标记为旧数据。

如果在时间序列标记为过时后,在采样时间戳处评估查询,则不会为该时间系列返回任何值。如果随后在该时间序列中摄取新样本,它们将照常返回。

如果在采样时间戳前5分钟未找到任何样本(默认情况下),则此时间点不返回该时间序列的值。这实际上意味着时间序列在其最新收集的样本超过5分钟或标记为旧数据之后从图表“消失”。对于在其抓取中包含时间戳的时间序列,不会标记旧数据。在这种情况下,仅应用5分钟的阈值。

9.2 避免慢查询和过载

如果查询需要对大量数据进行操作,则绘制图表可能会超时或使服务器或浏览器过载。因此,在构建对未知数据的查询时,始终在Prometheus表达式浏览器的表格视图中开始构建查询,直到结果集看起来合理(最多数百个,而不是数千个时间序列)。只有在您充分过滤或汇总数据后,才能切换到图表模式。如果表达式仍然需要很长时间来绘制ad-hoc图形,请通过录制规则预先录制它。

这与Prometheus的查询语言尤其相关,其中像api_http_requests_total这样的简单度量标准名称选择器可以扩展到具有不同标签的数千个时间序列。还要记住,即使输出只是少量的时间序列,聚合在许多时间序列上的表达式也会在服务器上产生负载。这类似于在关系数据库中对列的所有值求和的速度很慢,即使输出值只是一个数字。

原文地址:https://www.cnblogs.com/zhoujinyi/p/11951779.html

时间: 2024-08-01 21:05:59

Prometheus学习系列(六)之Prometheus 查询说明的相关文章

prometheus学习系列十一: Prometheus 安全

prometheus安全 我们这里说的安全主要是基本认证和https2种, 目前这2种安全在prometheus中都没有的, 需要借助第三方软件实现, 这里以nginx为例. 基本认证 配置基本认证 在前面的部署中,我们部署完毕prometheus server 后, 可以通过对应的http://192.168.100.10:9090就可以访问到我们的 表达式浏览器, 进行promql的查询了. 这是很不安全, 必要情况下,我们需要加入基本认证, 只有认证过的用户才能访问页面,进行数据的查询.

prometheus学习系列一: Prometheus简介

Prometheus简介 prometheus受启发于Google的Brogmon监控系统(相似kubernetes是从Brog系统演变而来), 从2012年开始由google工程师Soundcloud以开源形式进行研发,并且与2015年早起对外发布早期版本. 2016年5月继kubernetes之后成为第二个加入CNCF基金会的项目,童年6月正式发布1.0版本.2017年底发布基于全兴存储层的2.0版本,能更好地与容器平台.云平台配合. prometheus的优势 prometheus是基于一

Prometheus学习系列(八)之Prometheus HTTP API说明

前言 本文来自Prometheus官网手册 和 Prometheus简介 HTTP API 在Prometheus服务器上的/api/v1下可以访问当前稳定的HTTP API. 将在该端点下添加任何非中断添加项. 一.格式概述 API返回是JSON格式,每个请求成功的返回值都是以2xx开头的编码.如果API处理的是无效请求,返回一个JSON错误对象,并返回下面的错误码: 400 Bad Request.当参数错误或者丢失时. 422 Unprocessable Entity.当一个表达式不能被执

Prometheus学习系列(九)之Prometheus 联盟、迁移

前言 本文来自Prometheus官网手册 和 Prometheus简介 FEDERATION 允许Prometheus服务器从另一台Prometheus服务器抓取选定的时间序列. 一,用例 联盟有不同的用例.通常,它用于实现可扩展的Prometheus监控设置或将相关指标从一个服务的Prometheus拉到另一个服务. 1.1 分层联盟 分层联盟使Prometheus可以扩展到具有数十个数据中心和数百万个节点的环境.在此用例中,联合拓扑就像一棵树,更高级别的Prometheus服务器从大量从属

IBatis.Net学习笔记六--再谈查询

在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的方式.在上一篇文章中我提到了三种方式,都是各有利弊:第一种方式当数据关联很多的情况下,实体类会很复杂:第二种方式比较灵活,但是不太符合OO的思想(不过,可以适当使用):第三种方式最主要的问题就是性能不太理想,配置比较麻烦. 下面是第四种多表查询的方式,相对第二种多了一点配置,但是其他方面都很好(当然

oracle学习篇六:子查询

-- 1.查询比7654工资要高的员工 select * from emp where sal>(select sal from emp where empno=7654); ---2.查询最低工资的员工信息 select * from emp where sal=(select min(sal) from emp); ------------查询出,部门名称,部门员工数,部门平均工资,部门最低收入的人员姓名,和最高收入的人员 select d.dname,t1.c,t1.avgSal,t1.m

STL学习系列六:List容器

List简介 list是一个双向链表容器,可高效地进行插入删除元素. list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符.it++(ok), it+5(err) #include <list> 1.list对象的默认构造 list采用采用模板类实现,对象的默认构造形式:list<T> lstT;  如: list<int> lstInt;            //定义一个存放int的list容器. list<float> lstFloa

[jQuery学习系列六]6-jQuery实际操作小案例

前言最后在这里po上jQuery的几个小案例. Jquery例子1_占位符使用需求: 点击第一个按钮后 自动去check 后面是否有按钮没有选中, 如有则提示错误消息. <html> <head> <script type="text/javascript"> function check() { String.prototype.format = function(){ var args = arguments; return this.repla

activemq 学习系列(六) activemq 集群

activemq 集群 activemq 是可以通过 networkConnectors 来实现集群的. 首页准备多台 activemq 1:端口号:8161,服务端口号:61616 2:端口号:8162,服务端口号:61617 3:端口号:8163,服务端口号:61618 然后在任意一台的 /conf/activemq.xml 的 broker 节点中加入一个子节点 <networkConnectors> <networkConnector uri="static:(tcp: