PromQL的简单使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PromQL的简单使用相关的知识,希望对你有一定的参考价值。
参考技术A在 prometheus 中存在各种时间序列数据,那么我们如何根据时间序列查询想要的数据呢?prometheus为我们提供了强大的 PromQL ,借助 PromQL 我们可以查询到自己想要的数据。
注意:
1、如果我们要绘制图形,那么必须返回 Instant vector 类型的数据。
字符串可以使用 \'\'(单引号),""(双引号),``(反引号)来表示。在单引号和双引号中,反斜杠成为了转义字符,后面可以跟着a,b, f, n, r, t, v或者\\。
eg:
浮点数可以写成以下这种格式
eg:
即时向量选择器允许在给定的时间戳(即时)上选择一组时间序列和每个样本的单个样本值。
1、只给定指标名称,或者在指标名称上指定空匹配器,这将返回给定指标下的所有时间序列的即时样本数据。
eg:
2、只给定匹配器,返回符合该匹配器的所有时间序列的即时样本。
eg:
3、同时指定指标名称和匹配器,返回符合给定指标名称和匹配器的即时样本。
eg:
注意:
1、 指标名称 和 匹配器 必须要选择一个。
匹配器主要是用于标签过滤,目前支持如下4种格式。
eg:
1、查询出指标名称 up 中标签 job 等于 prometheus 的时间序列数据
2、查询出指标名称 up 中标签 job 不等于 prometheus 的时间序列数据
3、查询出指标名称 up 中标签 job 以 pro 开头的的时间序列数据
4、查询出指标名称 up 中标签 job 不以 pro 开头的的时间序列数据
5、查询出指标名称 up 中不存在标签 env 的时间序列数据
5、查询指标名称是以 prometheus 开头的所有的时间序列数据
注意:
区间向量选择器和即时向量选择器大致类似,唯一的不同在于表达式之后需要跟一个 [] 表达需要返回那个区间范围的时间序列数据。
ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)、w(周)、y(年)
d 表示一天总是24小时
w 表示一周总是7天
y 表示一年总是365天
默认情况下,即时向量和区间向量选择器都是以当前时间为准,但是偏移量修改器 offset 可以修改该基准。偏移量选择器是紧跟在表达式之后使用 offset 来指定的。
eg:
1、表示获取指标名称prometheus_http_requests_total的所有时间序列在过去1分钟的即时样本。
2、表示获取指标名称prometheus_http_requests_total的所有时间序列在距离此刻1分钟之前的5分钟之内的样本。
Prometheus 的查询语言支持基本的逻辑和算术运算符。
支持的算术运算符:
+(加)、-(减)、*(乘)、/(除)、%(取模)、^(幂等)
二元运算操作符可以在scalar/scalar(标量/标量)、vector/scalar(向量/标量)、和vector/vector(向量/向量)之间运算。
支持的比较运算符:
== (等于)、!=(不等于)、>(大于)、<(小于)、>=(大于或等于)、<=(小于或等于)
比较二元运算符被应用于scalar/scalar(标量/标量)、vector/scalar(向量/标量) ,和 vector/vector(向量/向量)之间。比较运算符得到的结果是 bool 布尔类型值,返回1或者0值。
集合运算符只支持在2个即时变量之间的运算。
支持的集合运算符:
and(并且-交集)、or(或者-并集)、unless(除非-补集)
vector1 and vector2: 会产生一个由 vector1 的元素组成的新的向量。该向量包含 vector1 中完全匹配 vector2 中的元素组成。其它的元素会被删除,指标名称和值从左侧即 vector1 继承。
vector1 or vector2: 生成的向量包含 vector1 中所有的原始数据(标签+值),以及 vector2 在 vector1 中没有匹配到的数据。
vector1 unless vector2: 结果产生一个新的向量,新向量中的元素由 vector1 中没有与 vector2 匹配的元素组成。匹配到的元素都会被删除。
运算符优先级从高到低依次为:
注意:
优先级相同的运算符,依次从左往右进行运算,但是 ^ 是从右开始的。
eg:
向量之间的运算尝试为左侧的每个条目在右侧向量中找到匹配的元素。
匹配行为有两种基本类型: 一对一 和 一对多 或 多对一 。
1、向量之间的匹配是在2个即时向量之间进行匹配,不能是区间向量。
2、那么2个向量如何算匹配上呢?
3、找不到匹配的值会被忽略,不会出现在比较的结果中。
示例数据是从prometheus官网上抄的。
一对一从操作的每一侧查找一对唯一的条目。如果两个条目具有完全相同的标签集和相应的值,则它们匹配。
ignoring :允许在匹配时忽略某些标签。
on :允许在匹配时只匹配指定的标签。
1、method_code:http_errors:rate5mcode="500"可以查询出如下数据
2、method:http_requests:rate5m可以查询出如下数据
3、ignoring(code)的作用
因为 method_code:http_errors:rate5m 比 method:http_requests:rate5m 多了 一个 code 的标签,正常匹配匹配不上,如果忽略code标签的匹配,那么那边的标签一样且标签的值也一样,所有就可以匹配上。
4、比较的结果
只有2边都能匹配上的数据才会出现。method等于put和del的样本找不到匹配项,所以没有出现在结果集中。
5、为什么没有出现 method=del 和method=put的数据
因为method="del"在method_code:http_errors:rate5m中没有查询出来,所以在结果中忽略了。即没有在2边都存在并且相匹配上。
一对多和多对一匹配指的是:“一”的一侧的每个向量元素可以与“多”侧的多个元素进行匹配。必须使用 group_left 或 group_right 修饰符显式请求,其中left/right确定哪个向量具有更高的基数。
1、ignoring(code) 表示比较的时候,忽略code标签。
2、group_left表示,左侧即 method_code:http_errors:rate5m 为 多 的一侧,右侧为 一 的一侧。
3、没有匹配的直接从结果集中删除。
4、结果如下:
注意:
group 修饰符只能在比较和数学运算符中使用。在逻辑运算 and , unless 和 or 操作中默认与右向量中的所有元素进行匹配。
Prometheus 提供了如下内置的聚合操作符,这些操作符作用于即时向量。
label list: 是未加引号的标签列表,比如(code,method)等。
without: 用于从计算结果中移除列举的标签,而保留其它标签。
by: 和 without 的作用想法,表示用于从计算结果中保留列举的标签,而移除其它标签。
parameter: 只能在count_values、quantile、topk和bottomk中使用。
count_values: 用于时间序列中每一个样本值出现的次数。count_values 会为每一个唯一的样本值输出一个时间序列,并且每一个时间序列包含一个额外的标签。这个标签的名字由聚合参数指定,同时这个标签值是唯一的样本值。
quantile: 用于计算当前样本数据值的分布情况 quantile(φ, express) ,其中 0 ≤ φ ≤ 1。
1、在prometheus_http_requests_total指标中根据code来分组求和
2、获取 HTTP 请求数前 5 位的时序样本数据
Prometheus 提供了其它大量的内置函数,可以对时许数据进行一些处理。有些函数有默认参数,例如 year(v=vector(time()) instant-vector) 。这意味着有一个参数 v ,它是一个即时向量,如果没有提供它,它将默认为表达式vector(time())的值。
abs(v instant-vector) 返回输入向量的所有样本的绝对值。
absent(v instant-vector)
有值:**不返回数据
没有值:**可能返回指标名称,值返回 1
示例:
ceil(v instant-vector) 将 v 中所有元素的样本值向上四舍五入到最接近的整数。
changes(v range-vector)
注意:
该函数一般使用在 gauge 类型的时间序列上。
increase 的返回值类型只能是计数器类型,主要作用是增加图表和数据的可读性。使用 rate 函数记录规则的使用率,以便持续跟踪数据样本值的变化。
注意:
irate 函数是通过区间向量中 最后两个样本数据 来计算区间向量的增长速率,能够体现出更好的灵敏度,通过irate函数绘制的图标能够更好的反应样本数据的瞬时变化状态。
注意:
predict_linear(v range-vector, t scalar) 预测时间序列v在t秒后的值。它基于简单线性回归的方式,对时间窗口内的样本数据进行统计,从而可以对时间序列的变化趋势做出预测。该函数的返回结果 不带有度量指标 ,只有标签列表。
注意:
1、 https://github.com/google/re2/wiki/Syntax
2、 https://prometheus.io/docs/prometheus/latest/querying/basics/
Etcd-Etcd快速入门及PromQL查询etcd指标
一、Etcd快速入门
1.1、 etcd 介绍
- 2013 年 6 月,CoreOS 发起了 etcd 项目。etcd 使用 Go 语言实现,是分布式系统中重要的基础组件,目前最新版本为 V3.4.9。etcd 可以用来构建高可用的分布式键值数据库,根据官网介绍,总结来说有如下的特点:
- 简单:etcd 的安装简单,且为用户提供了 HTTP API,用户使用起来也很简单
- 存储:etcd 的基本功能,数据分层存储在文件目录中,类似于我们日常使用的文件系统
- Watch 机制:Watch 指定的键、前缀目录的更改,并对更改时间进行通知
- 安全通信:SSL 证书验证
- 高性能:etcd 单实例可以支持 2k/s 读操作,官方也有提供基准测试脚本
- 一致可靠:基于 Raft 共识算法,实现分布式系统数据的高可用性、一致性
- etcd 是一个分布式键值存储数据库,支持跨平台,拥有强大的社区。etcd 的 Raft 算法,提供了可靠的方式存储分布式集群涉及的数据。etcd 广泛应用在微服务架构和 Kubernates 集群中,不仅可以作为服务注册与发现,还可以作为键值对存储的中间件。从业务系统 Web 到 Kubernetes 集群,都可以很方便地从 etcd 中读取、写入数据。
1.2、etcd 应用场景
- etcd 在稳定性、可靠性和可伸缩性表现极佳,同时也为云原生应用系统提供了协调机制。etcd 经常用于服务注册与发现的场景,此外还有键值对存储、消息发布与订阅、分布式锁等场景。
1.2.1、 键值对存储
- 如下是官方对 etcd 的描述:
❝❝❝❝
A highly-available key value store for shared configuration and service discovery.
一个用于配置共享和服务发现的键值存储系统。
❞❞❞❞
从其定义来看,etcd 是一个「键值存储」的组件,存储是 etcd 最基本的功能,其他应用场景都是建立在 etcd 的可靠存储上。etcd 的存储有如下特点:
采用键值对数据存储,读写性能一般高于关系型数据库;
etcd 集群分布式存储,多节点集群更加可靠;
etcd 的存储采用类似文件目录的结构:
叶子节点存储数据,其他节点不存储,这些数据相当于文件;
非叶节点一定是目录,这些节点不能存储数据。
比如 Kubernetes 将一些元数据存储在 etcd 中,将存储状态数据的的复杂工作交给 etcd,Kubernetes 自身的功能和架构能够更加专注。
二、PromQL查询etcd指标
以上是关于PromQL的简单使用的主要内容,如果未能解决你的问题,请参考以下文章