Prometheus PromQL入门

news2024/11/17 23:27:15

一、Prometheus简介和架构

Prometheus 是由 SoundCloud 开源监控告警解决方案。架构图如下: 

如上图,Prometheus主要由以下部分组成:

  • Prometheus Server:用于抓取和存储时间序列化数据
  • Exporters:主动拉取数据的插件
  • Pushgateway:被动拉取数据的插件
  • Altermanager:告警发送模块
  • Prometheus web UI:界面化,也包含结合Grafana进行数据展示或告警发送

prometheus本身是一个以进程方式启动,之后以多进程和多线程实现监控数据收集、计算、查询、更新、存储的这样一个C/S模型运行模式。

三、PromQL 

1、什么是PromQL

PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,它能实现对事件序列数据的查询、聚合、逻辑运算等。它并且被广泛应用在 Prometheus 的日常应用当中,包括对数据查询、可视化、告警处理当中。

简单地说,PromQL 广泛存在于以 Prometheus 为核心的监控体系中。所以需要用到数据筛选的地方,就会用到 PromQL。例如:监控指标的设置、报警指标的设置等等。

2、PromQL基础用法

当 Prometheus 通过 Exporter 采集到相应的监控指标样本数据后,我们就可以通过 PromQL 对监控样本数据进行查询。

当我们直接使用监控指标名称查询时,可以查询该指标下的所有时间序列。我们这里启动 Prometheus 服务器,并打开 http://localhost:9090/graph
地址。在查询框中,我们输入:prometheus_http_requests_total 并点击执行。

可以看到我们查询出了所有指标名称为 prometheus_http_requests_total 的数据。

PromQL 支持户根据时间序列的标签匹配模式来对时间序列进行过滤,目前主要支持两种匹配模式:完全匹配正则匹配

3、完全匹配

PromQL 支持使用 = 和!= 两种完全匹配模式。

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

例如:上面查询出了所有指标名称为 prometheus_http_requests_total 的数据。这时候我们希望只查看错误的请求,即过滤掉所有 code 标签不是 200 的数据。那么我们的 PromQL 表达式可以修改为:prometheus_http_requests_total{code!="200"}

查询出的结果已经过滤掉了所有 code 不为 200 的数据。

4、正则匹配 

PromQL 还可以使用正则表达式作为匹配条件,并且可以使用多个匹配条件。

  • 正向匹配。使用 label=~regx 表示选择那些标签符合正则表达式定义的时间序列。
  • 反向匹配。使用 label!~regx 进行排除。

例如:查询指标 prometheus_http_requests_total 中,所有 handler 标签以 /api/v1 开头的记录,那么表达式为:prometheus_http_requests_total{handler=~"/api/v1/.*"}

5、范围查询

上面直接通过类似 prometheus_http_requests_total 表达式查询时间序列时,同一个指标同一标签只会返回一条数据。这样的表达式我们称之为瞬间向量表达式,而返回的结果称之为瞬间向量

而如果我们想查询一段时间范围内的样本数据,那么我们就需要用到区间向量表达式,其查询出来的结果称之为区间向量时间范围通过时间范围选择器 [] 进行定义。例如,通过以下表达式可以选择最近 5 分钟内的所有样本数据。

prometheus_http_requests_total{}[5m]

 

通过查询结果可以看到,此时我们查询出了所有的样本数据,而不再是一个样本数据的统计值。

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

s - 秒

m - 分钟

h - 小时

d - 天

w - 周

y - 年

6、时间位移操作

在瞬时向量表达式或者区间向量表达式中,都是以当前时间为基准:

# 瞬时向量表达式,选择当前最新的数据
prometheus_http_requests_total{} 

# 区间向量表达式,选择以当前时间为基准,5分钟内的数据
prometheus_http_requests_total{}[5m] 

如果查询 5 分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢?这个时候我们就可以使用位移操作,位移操作的关键字为 offset。

# 查询 5 分钟前的最新数据
http_request_total{} offset 5m

# 往前移动 1 天,查询 1 天前的数据
# 例如现在是 2020-10-07 00:00:00
# 那么这个表达式查询的数据是:2020-10-05 至 2020-10-06 的数据
http_request_total{}[1d] offset 1d

7、聚合操作

一般情况下,我们通过 PromQL 查询到的数据都是很多的。PromQL 提供的聚合操作可以用来对这些时间序列进行处理,形成一条新的时间序列。

以我们的 prometheus_http_requests_total{code!="200"} 指标为例,不加任何条件我们查询到的数据为:

从上图可以看出,一共有3条数据,这3条数据的value综合为:26

第一个表达式,计算一共有几条数据count(prometheus_http_requests_total{code!="200"})

第二个表达式,计算所有数据的 value 总和:sum(prometheus_http_requests_total{code!="200"})

8、标量 

在 PromQL 中,标量是一个浮点型的数字值,没有时序。例如:26

需要注意的是,当使用表达式 count(http_requests_total),返回的数据类型,依然是瞬时向量。用户可以通过内置函数 scalar () 将单个瞬时向量转换为标量。

如上图所示,我们将 sum 操作的值用 scalar 转换了一下,最终的结果就是一个标量了。

三、PromQL 操作符

PromQL 还支持丰富的操作符,用户可以使用这些操作符对进一步的对事件序列进行二次加工。这些操作符包括:数学运算符,逻辑运算符,布尔运算符等等。

1、数学运算符

数学运算符比较简单,就是简单的加减乘除等。

例如我们通过 prometheus_http_response_size_bytes_sum 可以查询到 Prometheus 这个应用的 HTTP 响应字节总和。但是这个单位是字节,我们希望用 MB 显示。那么我们可以这么设置:prometheus_http_response_size_bytes_sum/8/1024

 最终显示的数据就是以 MB 作为单位的数值。

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

  • + (加法)
  • - (减法)
  • * (乘法)
  • / (除法)
  • % (求余)
  • ^ (幂运算)

2、布尔运算符

布尔运算符支持用户根据时间序列中样本的值,对时间序列进行过滤。例如我们可以通过 prometheus_http_requests_total 查询出每个接口的请求次数,但是如果我们想筛选出请求次数超过 20 次的接口呢?

此时我们可以用下面的 PromQL 表达式:

prometheus_http_requests_total > 100

可以看到我们将所有 value 值超过 100 的数据都筛选了出来,从其指标名称可以看出对应的接口名。

从上面的图中我们可以看到,value 的值还是具体的数值。但如果我们希望对符合条件的数据,value 变为 1。不符合条件的数据,value 变为 0。那么我们可以使用 bool 修饰符。

我们使用下面的 PromQL 表达式:

prometheus_http_requests_total > bool 100

从下面的执行结果可以看到,这时候并不过滤掉数据,而是将 value 的值变成了 1 或 0。

目前,Prometheus 支持以下布尔运算符如下:

  • * == (相等)
  • != (不相等)
  • > (大于)
  • < (小于)
  • >= (大于等于)
  • <= (小于等于)

3、集合运算符

通过集合运算,可以在两个瞬时向量与瞬时向量之间进行相应的集合操作。目前,Prometheus 支持以下集合运算符:

  • and 与操作
  • or 或操作
  • unless 排除操作

3.1 and 与操作

vector1 and vector2 进行一个与操作,会产生一个新的集合。该集合中的元素同时在 vector1 和 vector2 中都存在。

例如:我们有 vector1 为 A B C,vector2 为 B C D,那么 vector1 and vector2 的结果为:B C。

3.2 or 或操作

vector1 and vector2 进行一个或操作,会产生一个新的集合。该集合中包含 vector1 和 vector2 中的所有元素。

例如:我们有 vector1 为 A B C,vector2 为 B C D,那么 vector1 or vector2 的结果为:A B C D。

3.3 unless 排除操作

vector1 and vector2 进行一个或操作,会产生一个新的集合。该集合首先取 vector1 集合的所有元素,然后排除掉所有在 vector2 中存在的元素。

例如:我们有 vector1 为 A B C,vector2 为 B C D,那么 vector1 unless vector2 的结果为:A。

四、PromQL 聚合操作 

Prometheus 还提供了聚合操作符,这些操作符作用于瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。目前支持的聚合函数有:

  • sum (求和)
  • min (最小值)
  • max (最大值)
  • avg (平均值)
  • stddev (标准差)
  • stdvar (标准方差)
  • count (计数)
  • count_values (对 value 进行计数)
  • bottomk (后 n 条时序)
  • topk (前 n 条时序)
  • quantile (分位数)

1、sum 求和

用于对记录的 value 值进行求和。

例如:sum(prometheus_http_requests_total) 表示统计所有 HTTP 请求的次数。

2、min 最小值

返回所有记录的最小值。

 当我们执行如下 PromQL 时,会筛选出最小的记录值。

min(prometheus_http_requests_total)

3、max 最大值 

返回所有记录的最大值。

当我们执行如下 PromQL 时,会筛选出最大的记录值。

max(prometheus_http_requests_total)

4、avg 平均值 

avg 函数返回所有记录的平均值。

当我们执行如下 PromQL 时,会筛选出最大的记录值。

avg(prometheus_http_requests_total)

5、count 计数 

count 函数返回所有记录的计数(即:有多少条记录)。

例如:count(prometheus_http_requests_total) 表示统计所有 HTTP 请求记录的技数。

6、bottomk 后几条

bottomk 用于对样本值进行排序,返回当前样本值后 N 位的时间序列。

例如:获取 HTTP 请求量后 5 位的请求,可以使用表达式:

bottomk(5, prometheus_http_requests_total)

7、topk 前几条 

topk 用于对样本值进行排序,返回当前样本值前 N 位的时间序列。

例如:获取 HTTP 请求量前 5 位的请求,可以使用表达式:

topk(5, prometheus_http_requests_total)

五、PromQL 内置函数 

 PromQL 提供了大量的内置函数,可以对时序数据进行丰富的处理。例如 irate () 函数可以帮助我们计算监控指标的增长率,不需要我们去手动计算。

1、rate 增长率

我们知道 counter 类型指标的特点是只增不减,在没有发生重置的情况下,其样本值是不断增大的。为了能直观地观察期变化情况,需要计算样本的增长率。

increase(v range-vector) 函数是 PromQL 中提供的众多内置函数之一。其中参数 v 是一个区间向量,increase 函数获取区间向量中的第一个后最后一个样本并返回其增长量。因此,可以通过以下表达式 Counter 类型指标的增长率:

increase(node_cpu[2m]) / 120

 这里通过 node_cpu [2m] 获取时间序列最近两分钟的所有样本,increase 计算出最近两分钟的增长量,最后除以时间 120 秒得到 node_cpu 样本在最近两分钟的平均增长率。并且这个值也近似于主机节点最近两分钟内的平均 CPU 使用率。

除了使用 increase 函数以外,PromQL 中还直接内置了 rate (v range-vector) 函数,rate 函数可以直接计算区间向量 v 在时间窗口内平均增长速率。因此,通过以下表达式可以得到与 increase 函数相同的结果:

rate(node_cpu[2m])

需要注意的是使用 rate 或者 increase 函数去计算样本的平均增长速率,容易陷入「长尾问题」当中,其无法反应在时间窗口内样本数据的突发变化。

例如:对于主机而言在 2 分钟的时间窗口内,可能在某一个由于访问量或者其它问题导致 CPU 占用 100% 的情况,但是通过计算在时间窗口内的平均增长率却无法反应出该问题。

为了解决该问题,PromQL 提供了另外一个灵敏度更高的函数 irate(v range-vector)。irate 同样用于计算区间向量的计算率,但是其反应出的是瞬时增长率。irate 函数是通过区间向量中最后两个样本数据来计算区间向量的增长速率。

这种方式可以避免在时间窗口范围内的「长尾问题」,并且体现出更好的灵敏度,通过 irate 函数绘制的图标能够更好的反应样本数据的瞬时变化状态。

irate(node_cpu[2m])

irate 函数相比于 rate 函数提供了更高的灵敏度,不过当需要分析长期趋势或者在告警规则中,irate 的这种灵敏度反而容易造成干扰。因此在长期趋势分析或者告警中更推荐使用 rate 函数。

2、predict_linear 增长预测 

在一般情况下,系统管理员为了确保业务的持续可用运行,会针对服务器的资源设置相应的告警阈值。例如,当磁盘空间只剩 512MB 时向相关人员发送告警通知。这种基于阈值的告警模式对于当资源用量是平滑增长的情况下是能够有效的工作的。

但是如果资源不是平滑变化的呢?比如有些某些业务增长,存储空间的增长速率提升了高几倍。这时,如果基于原有阈值去触发告警,当系统管理员接收到告警以后可能还没来得及去处理问题,系统就已经不可用了。

因此阈值通常来说不是固定的,需要定期进行调整才能保证该告警阈值能够发挥去作用。那么还有没有更好的方法吗?

PromQL 中内置的 predict_linear(v range-vector, t scalar) 函数可以帮助系统管理员更好的处理此类情况,predict_linear 函数可以预测时间序列 v 在 t 秒后的值。

它基于简单线性回归的方式,对时间窗口内的样本数据进行统计,从而可以对时间序列的变化趋势做出预测。例如,基于 2 小时的样本数据,来预测主机可用磁盘空间的是否在 4 个小时候被占满,可以使用如下表达式:

predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0

六、Metric 指标

在 Prometheus 中,我们所有的信息都以 Metrics(指标) 的形式存在。

Metrics 由 metric name 和 label name 组成。

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

 例如:下面的 api_http_requests_total 就是 metrics name(指标名称),而 method 就是 label name(标签)。而 metric name 加上 label name 就是一个完整的 Metric。

api_http_requests_total{method="POST", handler="/messages"}

1、Metric Type 指标类型 

Prometheus 中主要有四种不同的指标类型,用来适应不同的指标类型。

  • counter 计数器
  • gauges 计量器
  • histogram 柱状图
  • summary 汇总

counter 计数器

数据从 0 开始累计,理想状态下应该是永远增长或者是不变。

适用于例如机器开机时间、HTTP 访问量等数值。

gauges 量器

获取一个返回值,采集回来是多少就是多少。数值可能升高,也可能降低。

适用于例如硬盘容量、CPU 内存使用率等数值。

histogram 柱状图

counter 和 gauges 反应的是数值的情况,而 histogram 则是反应数值的分布情况。

histogram 柱状图反映了样本的区间分布梳理,经常用来表示请求持续时间、响应大小等信息。

例如我们 1 分钟内有 1000 个 http 请求,我们想要知道大多数的请求耗时是多少。这时我们使用评价耗时可能不太准,但是我们使用 histogram 柱状图就可以看出这些请求大多数都是分布在哪个耗时区间。

Histogram 与 summary

为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在 010ms 之间的请求数有多少而 1020ms 之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram 和 Summary 都是为了能够解决这样问题的存在,通过 Histogram 和 Summary 类型的监控指标,我们可以快速了解监控样本的分布情况。

Histogram 指标直接反应了在不同区间内样本的个数,区间通过标签 len 进行定义。而 summary 则是使用中位数反映样本的情况。

这篇文章我们介绍了 Prometheus 的几个关键概念:

  • Metric 指标
  • Metric Type 指标类型
  • 工作 (Job)和实例(Instance)

它们之间的关系如下图所示:

一个任务(Job)可以有多个实例(Instance),一个实例上可以有多个指标(Metric),一个指标只会有一个指标类型(Metric Type)。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chrome开发者工具:利用网络面板做性能分析

Chrome 开发者工具&#xff08;简称 DevTools&#xff09;是一组网页制作和调试的工具&#xff0c;内嵌于 Google Chrome 浏览器中。 Chrome 开发者工具有很多重要的面板&#xff0c;比如与性能相关的有网络面板、Performance 面板、内存面板等&#xff0c;与调试页面相关的有…

字符串匹配 - 模式预处理:BM 算法 (Boyer-Moore)

各种文本编辑器的"查找"功能&#xff08;CtrlF&#xff09;&#xff0c;大多采用Boyer-Moore算法&#xff0c;效率非常高。算法简介在 1977 年&#xff0c;Robert S. Boyer (Stanford Research Institute) 和 J Strother Moore (Xerox Palo Alto Research Center) 共…

SpringCloud(二)负载均衡服务调用Ribbon、服务接口调用OpenFeign案例详解

五、负载均衡服务调用Ribbon 技术版本Spring Cloud版本Hoxton.SR1Spring Boot版本2.2.2RELEASECloud Alibaba版本2.1.0.RELEASE Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 简单的说&#xff0c;Ribbon是Netflix发布的开源项目&#xff0c;主…

DOS经典软件,落下帷幕,新型国产平台,蓬勃发展

提起DOS时代&#xff0c;总让人难以忘怀&#xff0c;陷入深深回忆中&#xff0c;风靡一时的许多软件&#xff0c;如今早已不在&#xff0c;这几款被称为DOS必装的软件&#xff0c;更是让人惋惜。 你还记得这图吗&#xff1f;堪称DOS系统最经典的软盘复制与映像生成软件&#xf…

八十九——一三三

八十九、JavaScript——数组的简介 一、数组 数组(Array) - 数组也是一中复合数据类型&#xff0c;在数组可以存储多个不同类型的数据 - 数组中存储的是有序的数据&#xff0c;数组中的每个数据有一个唯一的索引 可以通过索引来操作获取数据 - 数据中存储的数据叫元素 - 索引&…

从 MVC 架构到三层(3-Tier)架构

一、MVC 存在的痛点问题 对于业务逻辑不甚复杂的场景&#xff0c;MVC 尚能胜任。但随着前端 MVVM&#xff08;Model-View-View-Model&#xff09;开发模式的兴起&#xff0c;尤其是前端框架如 Vue、React 的普及&#xff0c;服务端的 MVC 设计模式使用场景变得越来越少&#x…

NetSuite Intercompany Framework 101

今朝&#xff0c;谈一谈Intercompany Framework&#xff0c;这是一个彰显NetSuite市场野心的基础功能框架。从20.2开始逐渐浮出水面&#xff0c;虽然经过过往的几个版本&#xff0c;不断推出组成功能&#xff0c;但目前仍然未见其全貌。 作为顾问&#xff0c;你必须关注它&…

详解JavaScript的形参,实参以及传参

文章目录 前言一、参数是什么&#xff1f;二、形参和实参 1.形参 2.实参三、传参 1.参数传递的对应关系2.两个传参的例子 总结前言 编程初学者在接触JavaScript这门语言时&#xff0c;很难搞懂里面的逻辑&#xff0c;这就会导致入门慢&#xff0c;入门难。这种难度一般…

Banana Pi BPI-R3 评测:详细信息、功能

Banana Pi BPI-R3 路由板著名的 Banana Pi 品牌背后的公司 Sinovoip Co., Ltd 刚刚宣布了一款名为 Banana Pi BPI-R3 的带有两个 SFP 端口的新型开源路由器。它可能是市场上首批具有内置光接口的单板路由器之一。这种出色的产品对于连接到快速光纤互联网的用户特别有益&#xf…

【PyTorch学习4】《PyTorch深度学习实践》——线性回归(Linear Regression)

目录一、实现框架二、程序实现三、代码讲解1.self.linear torch.nn.Linear(1, 1)2.model(x_data)3.criterion torch.nn.MSELoss(reductionsum)&#xff0c;loss criterion(y_pred, y_data)一、实现框架 1、Prepare dataset 2、Design model using Class (inherit from nn.M…

【Leedcode】顺序表必备的三道面试题(附图解)

顺序表必备的三道面试题&#xff08;附图解&#xff09; 文章目录顺序表必备的三道面试题&#xff08;附图解&#xff09;前言一、第一题1.题目2.思路图解3.源码二、第二题1.题目2.思路图解3.源码三、第三题1.题目2.思路图解3.源码总结前言 本文给大家介绍三道顺序表学习过程中…

【项目精选】javaEE土地档案管理系统(源码+论文+视频)

技术&#xff1a;java、jsp、struts、spring、hibernate 数据库&#xff1a;oracle 集成开发工具&#xff1a;eclipse 点击下载源码 本土地项目管理系统在可行性研究的基础上&#xff0c;是为了进一步明确土地项目管理系统的软件需求&#xff0c;以便安排项目规划和进度&#x…

ARM+LINUX嵌入式学习路线

嵌入式学习是一个循序渐进的过程&#xff0c;如果是希望向嵌入式软件方向发展的话&#xff0c;目前最常见的是嵌入式Linux方向&#xff0c;关注这个方向&#xff0c;大概分3个阶段&#xff1a; 1、嵌入式linux上层应用&#xff0c;包括QT的GUI开发 2、嵌入式linux系统开发 3、…

Python|每日一练|字符串|递归|链表|单选记录:字符串转换整数 (atoi)|阶乘后的零| K 个一组翻转链表

1、字符串转换整数 (atoi)&#xff08;字符串&#xff09; 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃…

Golang 方法笔记

Golang中的方法是作用在指定的数据类型上的&#xff0c;因此自定义类型都可以有方法。方法定义func (recevier type) methodName (参数列表) (返回值列表) {方法体return 返回值}基本申明和调用type A struct {Num int}func (a A) test() {fmt.Println(a.Num)}说明&#xff1a;…

Python快速上手系列--邮件发送--详解篇

本章就来一起学习一下跑完自动化脚本后如何自动的发送邮件到指定的邮箱。zmail操作&#xff1a;1. 导包 import zmail2. 邮件内容&#xff0c;包含&#xff1a;主题(subject)、正文(content_text)、附件(attachments)3. 发件人信息&#xff0c;包含&#xff1a;发件人账号&…

什么牌的运动耳机比较好、运动耳机排行榜10强

现在运动健身的潮流持续不下&#xff0c;而且人们长期坐于办公室办公&#xff0c;严重影响身体的健康&#xff0c;这时不论是去健身房锻炼&#xff0c;还是户外跑步都是非常必要的了&#xff0c;而蓝牙耳机作为运动必备的一款数码产品&#xff0c;更是受到了大家的青睐&#xf…

2023/02/18 ES6对象属性的解读

1 属性的可枚举性和遍历 <script>const obj {userName: zhaoshuai-lc,userAge: 26,userSex: male}let res Object.getOwnPropertyDescriptors(obj);console.log(res); </script>描述对象的 [ enumerable ] 属性, 称为“可枚举性”, 如果该属性为 [ false ], 就表…

如何实现外网访问内网ip?公网端口映射或内网映射来解决

本地搭建服务器应用&#xff0c;在局域网内可以访问&#xff0c;但在外网不能访问。如何实现外网访问内网ip&#xff1f;主要有两种方案&#xff1a;路由器端口映射和快解析内网映射。根据自己本地网络环境&#xff0c;结合是否有公网IP&#xff0c;是否有路由权限&#xff0c;…

0.4如何使用cmake来管理项目

如何使用cmake来管理项目 【opencv源码解析0.1】VS如何优雅的配置opencv环境 【opencv源码解析0.2】如何编译opencv库源码 【opencv源码解析0.3】调试opencv源码以及使用cmake来管理项目 前面几篇文章我们都是围绕Visual Studio 2019这个IDE来展开的&#xff0c;IDE为我们做了…