PromQL 使用基础|学习笔记(一)

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
简介: 快速学习 PromQL 使用基础

开发者学堂课程3天吃透 PrometheusPromQL 使用基础学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/1244/detail/18447


PromQL 使用基础

 

内容介绍:

一、对抓取到的 metric 重新打标

二、Prometheus 相关知识及 PromQL 简介

三、PromQL 的数据类型及匹配器

四、PromQL 指标类型

 

一、对抓取到的 metric 重新打标

对于重新打标这个话题,我们已经结束relabel configure,其还剩一个叫做 metric relabel configure,它的执行逻辑和刚才我们所讲 reliable config 大致相同,所不同的地方仅在于它实现的是对抓取到的 metric 进行重新打标,而不是对target,是我们在这展示的各个 target 进行打标。而对 target 打标,各位发现是直接反映在这。

对于 metric 的打标,很可能是我们自己使用qlprometheus的查询语言,在查询时,你所能够获得的时间序列可能就会有所不同。同样的逻辑,我们可以删除指标,可以修改指标名称,可以修改或者创建新的指标标签,并给它赋予一个值。这些操作和在 target 上的指标操作是一样的,操作语法也相同。所以我这儿仅给各位看一个简单的示例就结束。

这里为 metric relabel示例之删除指标。比如某个指标我不想要怎么办?方法很简单,比如下面实例就用于在相应的 job ,在发现各 target 之上删除以 go in for 为名称前缀的指标,他的做法是对每一个指标而言也有一个叫做系统标签,叫做—name--。注意,这里直接保存有指标名,所以我们要想删除指标,匹配起来就不用匹配指标的标签,直接使用这个名称。

使用正则表达式 go in for .*。明白这个表是匹配所有 go info 开头的指标名 action drop匹配到的就删除。它能够试图用正则表达式过滤这一组 target 之上的每一个 target 上的这一类的指标名称,很简单的一个示例,也没有其他更复杂的地方。所以,它的使用逻辑跟前面 relabel config 相同。于是这个话题刚才未进的地方,我这里补充。

示例:

job_name:'nodes'  

file_sd_configs:

- files:

- targets/prometheus/node*.yaml

metric_relabel_configs:

- source labels:

- name regex: "go_info.*"  

action: drop

二、Prometheus 相关知识及 PromQL 简介

1. prometheus 时间序列

接下来我们就是我们的 PromQL。我们说过,使用 prometheus 最为关键的地方所在就是操作 prometheus 的时间序列。

image.png 

如图,它基本上代表我们 prometheus 保存时间序列的结果。假如这是prometheus 的存储,我们可以想象,当然,它存储时并不是这么存,我们来想象每一行代表一个序列,每一列代表我们时间流逝的时间点。假如这是方向,这是纵轴,等于是对于第一个来说,它的时间序列大概有这么多个样本值。

这是第二个,其实我们曾经解释过,这会形成一个矩阵,一个matrics,而在矩阵上,每一个序列它的标示符,我们为了引用序列里边的值,你需要可以标示哪个序列在识别每个序列。而每一个序列刚才解释过,都是以指标名加特定于指标序时间序列的标签来定义。所以看同一个指标名 request total,它对应于不同的标签 pass method ,代表着不同的序列。所以大家一定要记得同一名称下标签不同,分别代表不同的序列,而后每一个序列我们也可以称为一个向量,将多个序列放在同一个坐标系内,就形成一个矩阵。这种 prometheus 的时间序列我们怎么去理解它?

就来看看 PromQL。PromQL 其就是我们让我们去表达如何从这样一个矩阵当中筛选出我们所感兴趣的数据的。前面给大家或多或少提到什么叫感兴趣的数据。比如我们想找这么 3个指标最新的样本,这是一种方式,或者找这几个指标最新的样本。这其实就是表示我们叫挑感兴趣的。你可以纵着挑,也可以横着挑。比如我们去找这一个序列这个范围内的值,或者是这两个序列范围内的这三个序列这个范围内的值都可以。这就是我们要写的 PromQL 要达到的目的。我们不仅要将这些值挑选出,我们通常可能还要对挑出来的结果进行做计算。前面应该演示过如做算术运算、比较运算、逻辑运算等。因而我们可以认为PromQL 它其就是在矩阵当中查询出我们所感兴趣的样本值,并且在这个基础之上并做一些运算,得到我们所期望的结果的一种表达式。

2.promQL 简介

prometheus基于指标名称及其附属的标签,唯一定义一条时间序列,各位应该能理解。所以从某种意义上来讲,指标名称代表着监控目标上某类可测量属性的基本特征标识,而标签则是基本特征之上再次划分的多个可测量维度。现在各位应该有一个应该能有一个更加深入一点的理解。

而基于PromQL表达式,用户可以针对指定的特征即指标名,这叫指定的特征及其细分维度,就表示我们需要指定标签,进行过滤、聚合、统计等运算,并从而产生所期望的计算结果。其实从某种意义上来讲,有一定的分析的意义在里数据分析更好。

而 PromQL 是 Prometheus server 内置的数据查询语言,它有内建的这样一个 PromQL 引擎,我们将使用表达式来表达查询需求。表达式什么是表达式?我相信对各位来讲应该不难理解,我们学过 shell 脚本编程,应该也知道什么叫表达式。根据其使用的指标和标签以及时间范围,表达式的查询请求可以灵活的覆盖一个或多个时间序列的一定时间范围的样本之上,甚至是只包含单个序列的单个样本。刚才给大家描述过,你可以使用表达式,比如只获取单个系列的单个样本,甚至都可以,单个序列的一定范围内的样本也行。但对我们而言,默认获取或者大多数情况,我们期望获取的应该都是这样,都是以及时,当下这个时间为基准点进入概念。所以我们所获取的即时向量,或者我们每指定时间的时候,大多都是指最新的样本,或者是如果我们讲过它的数据类型有两种,一个叫即时向量,一个叫范围向量。即时向量就是时间序列上的最新样本值。范围向量以当前时间为基准,时间点往前延。一个时间延多长时间,我们可以指定时长,比如 5 分钟, 10 分钟, 20 分钟之类,按我们自己的需要来进行定义。各位应明白,时间长度不同,其内部的样本数量不同,就算时间长度相同,其内部的样本数量也未必相同。因为大家知道抓取周期可能会有不一样,有的 15 秒抓一次,有的 30 秒抓一次,这种可能性是存在的,只不过默认我们在配置文件中可以写上都是 15 秒或者 1 分钟之类。

3. prometheus 数据模型

我们说 Prometheus 的每个时间序列都有指标名称。这概念我们又重复一遍,希望重复这么多遍各位能记住。因为这是最基本的概念和标签。标识格式为 “{< label name>= ,┅}”,指标名称,例如http_requests_ total 就表示接收到的http请求的总数,这是某个基本特征。而指标名只能使用字母数字下划线和冒号,这可以使用冒号,而且必须能匹配RE2。RE 叫 a regular expression 的正则表达式,规范的正则表达式2,你可以搜RE2代表什么?给我学个 awk side 的vm 正则表达式已经被正则表达式蹂躏过多少遍。所以应该能够很清楚的理解正则表达到底是什么。

标签都是键值型数据,附加在指标名称之后,从而指标能够支持更多维度的特征。但是它们是可选项,指的是你不给做表达式来挑选的时候,是指标下的所有时间序列,所以指的是这个意思。可选项,比如像 http_request _total {method= GET} 和 {method =POST},就代表两个不同的时间序列。因为一个统计的是 get 这个方法的所有请求数,一个代表的是 pose 这个方法的所有请求数量,他们分别进行统计。所以我们说它代表两个不同的时间序列。因而再回头理解,标签是用来描述多维度特征的。这个意思,标签名可以使用字母数字下划线,且必须能匹配RE2 规范的正则表达式一样的。而以双下划线为前缀的名称,在 Prometheus 中是系统预留使用的。我们一般不要自己随便用这种标签。而且我们说过这种标签。以 target 为例,以 metric 为例,一旦重新标记完是不是都删掉了?所以尽量不要使用这种标签。 但是 metric 对指标名而言,它的表示方式有两种。其实刚才在讲到 metric 删除特定指标时候,第一指标名标签。我们可以把指标名当做是一个标签。我们所有的表达式都写在括号中。我们用使用__ name__ 来引用来判定标签名。在这来指定标签,意思就是指标下的拥有这两个标签的时间序列,一样的逻辑。但后边这种方式 http_request _total 更强大,因为我们可以对这个名称做什么,对第一种方式而言,我们只能通过变化后面的标签的判定条件来获取这一个指标下的多个不同的时间序列来过滤。但是这种方式甚至可以对指标名做表达式模式匹配,或者对其他更高级的匹配方式,我可以获取到多个指标名下的多个时间序列。

4.样本数据的格式

我们讲过,当我们指定Prometheus 实现数据拉取后,它的每一个样本数据都是单独存放的。我们它并不表示跟其他样本之间有什么关系。因此在其内部,每一个样本数据内部都是 k v 数据,注意每一个样本都是 KV 型的数据。

image.png

k 是什么?这是他的k,这是它的v。 k 就是指标名加标签,所代表的什么,时间序列标示并带上时间戳,是在哪个时间点采集的,这个时间戳意思就是指标序列或者时间序列在这个时间点采集的样本,所以这整个的被当作是k,这后面这是采集的样本值,叫value。所以每一个样本数据,每一个样本应该或者叫做采样。后来的结果都保存为 k v 格式。 k 是整个的 v 这么长,只不过对于我们的 k 而言,我们可以再分开来理解。我们讲这叫指标名,这叫标签,这叫时间戳。因此我们过滤时,就相当于在这里边把每一个时间点拿来进行分析,看看它对应的 k 是不是符合你的条件,符合条件就把它的样本值拿出,这叫样本数据格式。其中这是 float 64 双精度浮点型的数据,而后毫秒精度的时间戳,这精确的毫秒,这就意味着同一个即便是看上去所谓是同一个时间点采集的数据,大家不一定是对齐的,可能会有那么一点点漂移和偏差。

5.指标名及标签的使用注意事项

首先,指标名和标签的特定组合代表时间序列,所以指标名相同,但标签不同,分别代表不同的时间序列。接着,不同指标名称自然代表不同的时间序列。而 prom q l 支持基于定义的指标维度进行过滤和聚合。所以你一定要记得更改

任何标签池,包括添加或删除标签,都会创建新的时间序列。因为标签是它的唯一标示,或者叫标签加指标名的组合是它的唯一标示。所以我们在使用的时候应该尽可能保持标签的稳定性,否则很有可能会创建新的时间序列。而且可能会生成动态时间序列。比如你的标签值,标签不变,标签值来回变,你每一次的值变化都会生成不同的新的时间序列的。所以你标签只是动态生成就麻烦,就生成这种结果了。这样子最恶劣的结果就会生成一个动态的数据环境,并使得监控数据源难以跟踪,从而导致建立的该指标上的图形无效。因为你的每一个图形都是针对于特定的时间序列来完成的。你时间序列加个标签变一次,加个标签变一次它无法追踪,告警也没法追踪因为告警也是通过表达式来获取的技术规则也是通过表达式来获取的。所以一定要记得要尽可能保持时间序列标签的稳定性。就算重写,大家知道我们刚才可以重写它的标签,重写没问题但重写完以后不要反复重写,我们重写一两次是没有问题的。

相关文章
|
SQL Oracle 关系型数据库
sqoop的导入导出以及where条件过滤数据导出
sqoop的导入导出以及where条件过滤数据导出
|
Python Windows Linux
配置国内PIP源方法
python开发者都知道,当我们pip install安装扩展库的时候,经常遇到安装失败(超时)等,有时候是因为国外镜像被屏蔽了,带来不少麻烦, 随着国内python开发的增多,越来越多企业都开放了自己的pip源: #阿里云 http://mirrors.
11117 1
|
关系型数据库 MySQL Linux
性能分析之解决 jbd2 引起 IO 高问题
【8月更文挑战第19天】性能分析之解决 jbd2 引起 IO 高问题
1316 0
|
监控 Shell Linux
Linux的Shell脚本详解
Linux的Shell脚本详解
|
11月前
|
Web App开发 网络协议 安全
网络编程懒人入门(十六):手把手教你使用网络编程抓包神器Wireshark
Wireshark是一款开源和跨平台的抓包工具。它通过调用操作系统底层的API,直接捕获网卡上的数据包,因此捕获的数据包详细、功能强大。但Wireshark本身稍显复杂,本文将以用抓包实例,手把手带你一步步用好Wireshark,并真正理解抓到的数据包的各项含义。
2938 2
|
自然语言处理 运维 Cloud Native
运维大模型探索之 Text2PromQL 问答机器人
本文主要介绍将AIGC技术运用到可观测领域的探索。
1620 100
|
SQL 数据库 Python
实时数仓 Hologres操作报错合集之在建表时遇到报错,该怎么处理
在使用阿里云实时数仓Hologres时,可能会遇到不同类型的错误。例如:1.内存超限错误、2.字符串缓冲区扩大错误、3.分区导入错误、4.外部表访问错误、5.服务未开通或权限问题、6.数据类型范围错误,下面是一些常见错误案例及可能的原因与解决策略的概览。
|
Prometheus Cloud Native Linux
Linux|错误集锦|prometheus Error on ingesting samples that are too old or are too far into the future的解决
Linux|错误集锦|prometheus Error on ingesting samples that are too old or are too far into the future的解决
840 0
Linux|错误集锦|prometheus Error on ingesting samples that are too old or are too far into the future的解决
|
存储 JSON API
Postman 如何使用数据文件参数化?
Postman 如何使用数据文件参数化?
1066 0
|
机器学习/深度学习 机器人 vr&ar
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF(1)
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF
596 0
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF(1)