Prometheus 监控系统|学习笔记(四)

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
可观测监控 Prometheus 版,每月50GB免费额度
简介: 快速学习 Prometheus 监控系统

开发者学堂课程【3天吃透 PrometheusPrometheus 监控系统】学习笔记,与课程紧密联系,让用户快速学习知识。

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


Prometheus 监控系统

四、 PromQL 基础

1. Prometheus 时间序列
通过我们刚才的描述,想必大家已然知道了 Prometheus 内部采集的每一个能吐数据的位置,就称之为一个指标,这每一个指标都会形成很多数据,这些我们就称为叫一个指标序列,各位都已经知道了。

图片1.png

每一个指标序列我们使用指标名称加标签来进行标示,而后这些指标序列中间可能会有断的,因为它有些地方可能没采集到,但只要采集到了,由于我们抓取很有可能是在某一时间点同时进行的,他们在同一个时刻可能都有指标数据,所有指标都有一个样本,但是这样会导致我的 Prometheus 在采集的时候压力过大你可以想象一下,我们有万个监控指标,到了一个时间周期后, Prometheus 一次发出万个请求采取指标,对 Prometheus 压力大,对我们网络流量或者网络带宽压力很大,因而我们 Prometheus 通常会把它们散开到一个周期以后,他会利用一个所谓叫随机的方式,在这个时间点提前一点时间,或者是延后一点时间把这万个指标给散开,因而这里的样本并不是精确的同一个非常精确的时间点的。这个大家一定要记得但是我们可以认为他们是同一个时间戳上的数据。另外数据采集以特定的时间周期进行,所以随着时间流逝,这些样本数据记录下来会有很多,那么过滤样本数据越大,将来我们过滤起来越难。 Prometheus 有一个特点,它不会把所有的样本数据一直存下来,默认它只存一个月,一个月前的数据都会自动被删除了。那有同学说了,我将要想做机器学习做事先监控,要做人工智能运维,那该怎么搞这些指标数据,这些历史数据肯定是特别重要的,因为只有这些基于这些数据才能继续继续学习挖掘出来所谓的趋势。 Prometheus 要想能够长时间存数据,一般建议我们要使用外置的第三方的更加专业的 TSDB 来进行存放,我们把它称为叫remote stretch ,后面的话题当中我会解释解释的概念,眼下我先把它过去

该时间序列也称为向量,看清楚这个时间序列所生产的所有的样本值离散样本值落在特定的时间点上所组成的就成为了一个向量而且这个向量很独特的地方在于将多个序列放在同一个坐标系内,以序列为纵轴,以时间为横轴将会形成一个矩阵接着我们将来期望从这里边获得我们关注的指标数据,就是刚才一直给大家讲,我们需要对它们进行过滤,过滤的时候很可能过滤的是每一个指标数据最新时刻就是最近一次所采集的所有的样本或者是其中的某些个指标的样本,我们把它称为叫即时向量在一个序列上只取一个样本值,有些没有样本值的那就只能留空了。我们也可以在一个时间序列上取过去一个特定时间范围内的向量,每一个序列都取一个范围,当然你也可以指定是特定几个序列的特定时间范围的样本,我们就称为叫做范围向量,也叫区间向量。他们都称为叫做向量,理解了这个向量,我们才知道 PromQL 怎么写。

 

2. PromQL 简介

Prometheus 基于指标名称以及附属的标签集来唯一定义每一个时间序列。

图片1.png

指标名称是什么?标签是什么我已经介绍过了,所以我就不再解释,而 PromQL 则是我们的 Prometheus 自己内置的一个查询语言,这个查询语言是我们学习 Prometheus 特别键的一个点, PromQL 又使用表达式让我们去表达查询需求或者叫表示查询需求,前面用了很多次了,比如像这个 node_load 1就是一个查询需求,还有包括我们此前一直在用的 node_cpu _Seconds_total 也是,然后我们可以指定一个匹配器来进行过滤,比如我定义之前所使用过的 node=idle ,就表示过滤能满足这个条件的时间序列怎么过滤的?首先一定是这个名称之下的,其次一定拥有这个标签,而且它的值与这里所指定的表达式相匹配的就可以,这是等值比较马上有同学想到了我们是不是也可以做不等值比较比如我们使用 node 不等于 idle 的,可不可以?当然可以各位看到了 idle 之外的我们都能写出来所以这其实是一个所谓的叫做匹配器,也叫标签匹配器,或者称为叫标签过滤器,在 K8S 当中也有标签过滤器的概念,它的功能是很相像的,这是一种机制当然我们也可以做模式匹配,这个时候就可以使用正则表达式模式。来自动匹配了。比如我的 mode 的值是以s开头的,那就是s* 类似这种格式,它要匹配整个值,那所以我们不用写什么开头和结尾,就s.*,不能选s*,后面跟任意字符串的我们都可以叫s.*, 。它匹配的时候是对于你的标签值做整体匹配的,你就不写也是匹配从开始到结尾,这个大家一定要注意它不会只匹配其中的一些子串。正则表达式匹配的模式匹配,叹号那就表示取反了,这就是叫不匹配,大家看到这就是所谓的 PromQL 一种简单的叫做匹配器的表达,或者叫做标签选择器的表达,它支持这样几种过滤机制这就叫做标签过滤器其实它没什么特别难的地方,但是要注意的是它表示一个时间序列的时候是正常的表示格式,我们也可以使用同种类型的格式来表达一个过滤条件他俩很相像,所以以至于很多人在这都比较容易混淆掉。这是最基础的表表达条件,那这个我们就把它称之为叫做 PromQL 要想能够用好 PromQL 那什么叫指标名称?什么叫标签?大家一定要搞清楚,那我们有几种数据类型以及我们的样本数据格式大家一定要搞清楚

3. 指标名称及标签使用注意事项

另外我们需要说明的是指标数据的名称及标签有这样几个使用注意事项

图片1.png

第一,指标名称相同,但标签不同的组合分别代表着不同的时间序列。同一个名称,现在各位明白了,只要标签不同,它其实就是不同的世界序列,而不同的指标名称显然更不是同一个时间序列的。Okay。所以这这个大家要记得这个

第二, PromQL 支持基于定义的指标维度进行过滤和聚合,更改任何标签值,对于包括添加或者删除标签都会创建新时间序列的因为我刚才讲了,对于任何一个时间序列来讲,它就是靠标签集合或者标签组合或者说叫标签集加上质量名称来进行标识和过滤所以你一改,那就意味着时间序列就换成别的时间序列了。因而应该尽可能要保持标签的稳定,否则你要会生成动态时间序列,这将来就没法过滤了,就乱套了。大家一定要明白

4. PromQL 的数据类型

PromQL 种数据类型

图片1.png

第一叫即时向量,刚才给大家说过了什么叫即时向量第二叫范围向量给大家说过了;第三叫标量,标量就是一个浮点型的数据值叫字串字串,就是支持使用单引号双引号,反引号进行引用,但是反引号不会对转义字符进行转义。这这三种引用机制,这个对于懂 Python 编程的同学应该就更容易理解了,没什么复杂的地方。

5. 时间序列选择器

接下来表达式当中一个非常关键点叫做时间序列选择器怎么选其实刚才已经表示过了,即时向量选择器就表示在每个时间序列上或在符合标签选择器所匹配到的时间序列上的每一个时间序列,取当前取一个样本值单个样本值,这个取出来的结果就叫做一个即时向量。然后我们如果过滤出来多个时间序列,而每一个时间序列还输出是一定时间范围内的样本值,像这个矩阵它就叫一个范围向量,也叫区间向量。

图片1.png

接着我们也可以取过去某一时刻的即时向量,或者是过去某一个时间范围内的区间向量都可以,反正是你一定要得到一堆向量才可以,向量和向量之间是可以做计算的。小学的时候是不是学过多项式相乘多项式相除这种概念。你明白了向量到底代表着什么?后面我们讲向量的一对一匹配,一对多匹配多对一匹配,你才能知道他的语句到底在写什么,否则的话后面所谓的 PromQL 的高级表达方式来可能就理解不了了,一定要理解这概念再重复一遍什么叫及时向量?选择器选出来的就是即时向量。

6. 向量表达式使用要点

图片1.png

表达式的结果返回值,返回的结果也有可能是即时的向量,也可能是范围向量,也可能是标量这里图上写错了,或者是字串这四种数据类型大家都一定要注意的是有些使用场景要求表达式返回必须满足特定的条件比如需要将返回值绘制成图形的时候,就必须使用即时向量型数据。

图片1.png

比如点下这个标签 Graph ,大家有没有发现这里其实有多个序列,每个序列都画了一条线,这就绘成图了。我们讲过如果想取即时向量在后面加个时间范围就行比如五分钟表示去过去分钟这些符合条件的时间序列上过去分钟的所有样本,这是一个时间序列,这是他过去分钟所有样本值以及那个样本值所属的时间戳,对于这种它就有范围向量,而范围向量是不能绘图的。我 Graph 他告诉你范围向量没法绘图为什么?因为这个绘图本身已经有了所谓的范围向量的概念了,你看这它有一个叫zone,你看里面叫镜头的远近,他们告诉我们要取多大时间范围内的样本值,已经表示告诉我们显示的就是过去一个小时内的每一个时间序列的样本值,你虽然取的是即时向量,但绘图的时候它会把过去你所指定的时间范围的所有的几十项都给取出来这也就意味着它自身就需要将集成量转换为特定时间范围的范围向量才能绘图的。因此本身这个范围他自己再加个范围,那就成了3D的了,就成了三维的了因而他没法定义这个概念怎么取到当天时间范围,这个我们需要记忆时间戳来进行表达了,或者你要过去一天最简单,同时要去为了取当天的之类的,就没有必要这里说你不能绘图,但可以一天之内的所有的向量数据ed就可以了。这是我们的所谓第一个要注意的点。

第二个范围向量选择选择器的返回是范围向量数据,所以它不能用于表达式浏览器中的图形绘制功能,这个刚才给大家说过了但是范围向量其实返回来那么多数据对我们来讲没有什么用,他有这么多数据,么多数据对我们来讲有什么用?你看了头晕眼花的对不对如果想看这么多数据直接绘图就行了,使用即时向量于是它有什么用?一般而言,几乎不可避免的所有的范围量都会跟聚合数据聚合函数一块,比如 rate ,我们要去计算它的速率。那聚合速率你可以理解为就是一个值减去前一个值它的变化状态。我跟前面讲过了,当前值减去前一个,然后我们取出来变化之差,我们称为叫△值。

图片1.png

图片中的其实就是一个即时向量,对这个即时向量我们是可以绘图

图片1.png

大家可以看到,大体上就绘制出来了,node_cpu_seconds_total 、以s开始的所有时间序列,在过去分钟之内所谓的变化速率这就是我们向量表达式当中使用时各位要注意的要点

7. 即时向量选择器

今天只讲即时向量选择器。剩余的选择器,包括我们怎么报警怎么绘图,我会放在明天的课程中来讲。

 

来看看基本使用逻辑即时向量选择器两部分组成第一叫指标名称第二叫匹配器指标名称就是过滤指标。匹配器其实就是在同一个指定的指标下或者在没没有指定指标的时候,只通过标签匹配来过滤时间序列,因而它两个可以各自单独用,也可以组合起来使用所以正常情况下定义即时向量选择器的时候,以上两部分应该至少给出一个,于是这样存在以下三种组合第一只给指标名称,那就是该名称下的所有的标签集,对应的时间序列都会显示出来。那这个时候后面那个花括号你带不带都行它的意义是一样的,比如说 http-requests_total 、 http_requests_total { }就表示返回该指标下的所有时间序列,也可以只给定匹配器,就像{job =”.”,method=”get”}示你用的指标名叫什么,但凡有这个标签任意值有这个指标,它的值是get,那我都给它返回来,这叫仅给定匹配器我把这两者同时给出来也可以,它表示在这个指标下,并且能满足所谓的叫做匹配器也叫标签选择器的条件。这叫即时向量选择一些一个基本使用逻辑

 

8. 匹配器

匹配器其实刚才也解释过了,一共有种比较操作符或者定义过滤条件的种匹配操作服务,它们分别是什么?我已经写过了注意事项一定要注意,第一匹配到空的标签值的匹配器d的时候,所有未定义该标签时间序列同样符合条件什么意思?比如 http_request _tptal{env=” ”},等于空值,这意味着但凡这个指标下,哪怕没有这个标签的,照样符合条件。大家注意这一点,他并不是说是等于空值的,不仅仅是等于空值的,而且没有这个标签也都符合条件

正则表达式将执行完全锚定机制这个已经跟大家说过了,完全锚定就是匹配你的标签值所有内容整体部分它需要匹配指定的标签的整个值。

向量选择器需要至少包含一个指标名称,或者至少有一个不会匹配的空字串的匹配器,意思就是说你不能把所有的指标序列一下子取出来,他不支持取所有的时间序列,那就意味着我们必须得有个过滤条件,你要么过滤指标名,要么过滤标签所以很显然只有{job=” ”}这么一个表达式,是非法的,因为我们没有指定指标名称,其实这相当于也没指什么标签,因为所有没有 job 的都符合条件,这叫空值。而这种PromQL 中是不被允许的。

另外 PromQL 表达式当中有一个特殊的标名:__name__ 注意他是下个_,就是杠杠name杠杠 签名,它还能用来对名称本身进行匹配。这是我们所讲到的匹配器的基本逻辑。

我们再讲一个简单的匹配器,算是结束今天的内容剩余的更加关键的内容,我们会放在明天再去给大家描述,以便给大家留点时间能够消化

所以我们来看 node_cpu 仍然以这个为例node_cpu_seconds_total 我们刚刚一直用这个对这个而言它是一个counter类型的指标,一般言我们是需要取时间范围或者做速率计算类的,这里不说那么复杂,我们只是说怎么去过滤
我们可以去过滤 CPU=0,这个核心就使用 CPU =0。而对于文本内容来讲,对字符串来讲,我们要使用单引号双引号或者是反引号引起来,这就只有 CPU =0的内容或者0核心内容上的所有相关指标了我们还可以再附加条件用逗号隔开,比如在指明我们只显示 mode 应的是 I开头的。那表示”I.*”。我们再看,这就表示CPU=0上对应的 mode 是以0开头的,大家看我们的过滤条件就越来越多了你可以组合多个条件,甚至于我们也可以把这个指标名去了,这表示但凡有 CPU=0的标签,能够符合这个条件的都能显出来,有 mode 标签能够符合这里的条件的都能显示出来。

图片1.png

 

当然事实上我们当前的节点也只有 node_cpu_seconds_total 拥有这样的标签,而且也不会出现更多的其他信息大家明白这样写也是可以的但是如果写个 CPU =” ”等于空,这样标签是不被允许的,这里大家要注意。分析器执行错误了,我们的向量选择器在指定的时候,要至少给这个指标名称或者一个不会匹配到空值的标签选择器。

这是我们刚才讲到的即时向量表达式选择器,对于此前没有学过 Prometheus 的同学来讲,可能讲的过于深入了。你可以通过看我们的视频回放再了解当然对于已经有相当有基础的同学来讲,那么可能要讲的过于浅显了,个人觉得你可以当做回顾了对 Prometheus 所学习的一些概念,没准我的理解可能对于有技术同学来讲,或许也有那么一点点有用的启发

我们这里其实就是让各位快速了解 Prometheus 全貌的一个课程,真正精细的内容还得去通过我们的完整的课程内容去学习,有兴趣的同学可以去问一下我们的这个课程顾问,他们会给你提供更完整的概念

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
相关文章
|
21天前
|
Prometheus 监控 Kubernetes
prometheus学习笔记之简介与安装
prometheus学习笔记之简介与安装
prometheus学习笔记之简介与安装
|
1天前
|
Prometheus Kubernetes 监控
prometheus学习笔记之集群内服务发现环境准备
本文介绍了在Kubernetes集群中部署Prometheus监控系统的详细步骤。首先创建用于监控的命名空间,并配置Docker以顺利下载镜像。接着,通过DaemonSet方式在集群中部署Node Exporter,确保每个节点上的指标都能被收集。然后,安装并配置NFS存储类别,以便为Prometheus提供持久化存储。最后,详细展示了如何在Kubernetes中部署Prometheus服务器,包括创建相关的配置文件、部署服务、设置角色权限以及暴露服务等
|
3天前
|
存储 Prometheus 监控
在Ubuntu系统上安装与配置Prometheus的步骤
通过以上步骤,您应该已经成功在Ubuntu系统上安装并配置了Prometheus。您现在可以开始使用Prometheus收集和分析您的系统和应用程序的指标数据了。
12 1
|
21天前
|
Prometheus 监控 Cloud Native
prometheus学习笔记之cAdvisor
prometheus学习笔记之cAdvisor
|
21天前
|
存储 Prometheus Cloud Native
prometheus学习笔记之PromQL
prometheus学习笔记之PromQL
|
21天前
|
Prometheus 监控 Cloud Native
prometheus学习笔记之Grafana安装与配置
prometheus学习笔记之Grafana安装与配置
|
21天前
|
存储 Prometheus 监控
Grafana 与 Prometheus 集成:打造高效监控系统
【8月更文第29天】在现代软件开发和运维领域,监控系统已成为不可或缺的一部分。Prometheus 和 Grafana 作为两个非常流行且互补的开源工具,可以协同工作来构建强大的实时监控解决方案。Prometheus 负责收集和存储时间序列数据,而 Grafana 则提供直观的数据可视化功能。本文将详细介绍如何集成这两个工具,构建一个高效、灵活的监控系统。
86 1
|
27天前
|
运维 Prometheus 监控
在Linux中,如何进行系统性能监控?
在Linux中,如何进行系统性能监控?
|
1月前
|
Prometheus 监控 Cloud Native
简单搭建基本Prometheus监控系统
简单搭建基本Prometheus监控系统
|
1月前
|
存储 数据采集 Prometheus
Prometheus 监控系统常见技术问题大曝光!解决之道让你意想不到!
【8月更文挑战第5天】Prometheus是一款强大的监控工具,但在应用中常遇技术难题。案例一中,因配置错误导致CPU使用率数据不准,调整`metrics_path`可解决。案例二涉及告警规则不触发,修正表达式即可。案例三关于数据存储溢出,设置保留策略如`30d`能缓解。案例四是监控指标丢失,增强网络稳定性和添加重试机制有助于恢复。面对这些问题,细致排查与合理配置是关键。
151 0