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

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

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

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


PromQL 使用基础


2. Histogram

接下来详细介绍histogram。其实每一个我都连续介绍好几遍,因为 prom ql 是我们学习 prometheus的根本。能从这里看出大体上位于某个数值之下的有多少,位于某个数值之上有多少,所以它比平均值好很多。

image.png

而且更重要的是它其实展开给我们的结果是以这里,这是一个刻度,叫一个bucket,是一个时间范围,可能这里有好几个时间范围。每一个范围内的平均值是多少,每个范围的值是多少?这个值不一定是平均值,需要看自己的需要,所以它是一种对数据分布的情况。数据在整个范围内是如何分布的,哪个范围内的实际数据多,哪个范围内数据少,意思叫数据的分布情况的图形展示。有一系列高度不等的长条图,这就叫一个长条图,叫 bar 来或者线段来表示,用于展示单个侧度值的分布比如这是我们的指标,我们统计黄石公园5年内每个月到访的客户数所以 5 年前,比如 2015 年1月,大概有这么多人访问, 2 月份大概有这么多, 3 月份天暖和人更多,可能是这样一个情况,到 8 月份,可能人又少,这是4月5月所以这叫分布的情况你知道能看出来不同的时间段内数据量是多少?但是我们所测量的也只不过是黄石公园平均每个月的到访人数,不对,是每个月的总到访人数或者叫游客数。因而它能够使用二维图的形式来展现数据的分布情况。

纵轴表示总体的统计数据,横轴表示时间范围的分配。于是为了构建 Histogram 直方图,首先需要将值的范围进行分段。注意值的范围正常情况下,对于监控系统来讲,它实际上不是一个时间范围,而是一个值的范围。即将所有取值的整个可用范围分成一系列连续相邻但不重叠的是间隔。只是我们这里是用时间。像刚才举例,月份几月份几月份几月份是用时间范围,统计每个间隔中有多少值。从统计的角度看,分位数是不能被聚合的,也不能进行算术运算。但很多时候我们可能可以统计总共有多少样本,这还是聚合计算。所有样本的和也是聚合,在监控系统中是可以的。

对于prometheus , histogram 会在一段时间范围内对数据进行采样。对于 prometheus ,确实指事件范围,通常是请求持续时长或响应大小等,并将其计入可配置的存储桶,这就叫桶。你的范围是多大?这一个范围就叫一个桶。接着histogram 事先将测度的可能取值范围分割成多个桶,并对通过落入桶内的观测值进行计数,以进行求和操作。要注意的是与常规方式不同的地方,prometheus的取值间隔划分的是累积区间,累积区间,所以它是一个累积直方图。看右侧图每一个直方的结果都是当前这个桶加上前一个桶当中的结果的和,所以叫累积,所以它一定是递增的,因为你当前区间只要有值,前面区间有值,一定是往不断的往上增加的,所以就要累积直方图。这样做的优点是能降低 Histogram 指标的维护成本,支持粗略计算样本的分位数。注意叫粗略计算。因为不精准,只是采用了几个时间点,单独提供在 bucket 内部所有的样本之和样本计数,从而支持计算平均值,因为和取除以计数就是平均值。

可以看到histogram在一个指标下是多个时间序列,一个桶就是一个时间序列。所以你要分成 5 个桶。在指标上先有 5 个桶时间序列,其次还单独提供桶上的样本之和序列和样本数量时间序列来查看。页面查找,叫做 histogram, histogram 没有,那就查找 9090 ,能看见上面字吗?这是 Prometheus http请求的duration。 seconds duration 叫请求的持续时长以秒钟为单位,因此持续时长。问题是我们现在怎么统计你的持续时长?有的持续短,所以他是怎么去统计的?又来关注,第一,对于特定的 URL 来讲,我们表示所有的请求持续时长小于等于 0. 1 秒的有多少个? l e 表示小于等于 0. 2 秒的有多少个?小于等于 0. 4 秒的有多少个?小于等于 1 秒的有多少个?所以我们说这是对样本值的分布,强行划分成多个桶。桶的边界在何处,我们可以自己指定,这叫桶边界。 l e 小于等于比方我指的边界是上边界还是下边界?对于你的取值范围,我们指定小于等于什么?小于等于目标值。我们的上边界对不对?最大不能超过这个值。接着小于等于 8 秒,小于等于 20 秒,小于等于 60 秒,小于等于 180 秒,以及小于等于无穷大的,各有多少个。

 image.png

大家发现这里所有都是一个意味着其实只有一个请求,这个请求一定它要小于等于 0. 1,它一定会小于等于 0. 2。我们说叫累积直方图,还记不记得这叫累积直方图,只不过大于 0. 2 没有,大于 0. 4 也没有,大于 1 也没有,大于 3 也没有,这个值只是 0. 1 的。我说清楚了吗?再看sum 表示所我们的样本之和,叫样本的值的和。会发现所有样本的值之和你只有一次取样,这就表示这个样本值它是不是小于等于 0. 00001 的响应时长,因而是在这个区间范围内的,接着一共有多少次取样?这里显得很清楚,这 count 只有一次。

我给大家再画个图描述,我们可以想象成我们这一次要取的值。看我们的 HDD 的请求响应时间是多长,还有一个请求响应时间,或者叫请求的持续时间。Duration,一共多少秒钟?有的请求可能只持续了 0. 1 秒不到,有的请求持续 0. 2 秒,有的请求可能持续10 秒。我想知道持续不到 0. 1 秒有多少个?持续不到 0. 2 秒的有多少个?持续不到 10 秒有多少个?现在可以明白,所以我现在一共取样 5 次,或者取了50 次,我就以 5 次为例,我想知道这五次请求当中, 5 次采样当中有几次是它的响应时长是小于等于 0. 1 的,所以化为一个桶,这是第一个。比如是两次,有多少次是小于等于 0. 2 的,它是这个范围,可能会有三次,因为小于等于 0. 1 的一定会小于等于 0. 2,因为它是累积的,小于等于 10 的有几次?可能是 5 次,其中有 3 次小于等零点二,有两次大于等于大于零点二,这就我们所谓的桶。

这里有三个桶,这是第一个桶,第二个桶,第三个桶,所以它被称为这个桶。每一个桶都包含前面那个桶的范围和这区间,所以被称为叫累积。这意思正常的桶不应该是这样的,正常的应该是这样,各自是不重叠的,这种才叫直方图。所以我说累积直方图是不行的,我们需要给它真正换算成真正性的直方图,所以这个结果是它换算为转换为直方图怎么转换?把前面累积的给它去掉就行所以第二个区间表示所有值减去第一个区间,第三个区间表示所有值减去前两个区间的。我们用这种方式来进行计算。不过我们这里采样的结果会发现,它可能不支持那么复杂的计算。因为我们每一次取值只反映了每一个统当中有多少个样本,以及总共有多少个样本,和所有样本的和计算三位数,只能粗略算出,这是 Histograb。这跟统计学有关。下一个我们看它的表示格式刚才各位看通过我们的实例,看到了它大体上有这样几种格式每一个指标,对于每一个histogram 类型的指标来讲,它会有 n 个时间序列其中 base name 就指的指标名加上下划线 8K 的后缀,并指定边界,上边界的观测桶,或者叫桶的上面,或叫存储桶上边界的区间。每一个边界就是一个比如刚才我所讲 0. 1 小于等于 0. 1这是第一个,小于等于 0. 2第三个,小于等于 0. 5第四个我们定义的桶边界小于等于 0. 1 是一个序列,小于等于 0. 2 是一个序列,小于等于 0. 5 是一个序列,最大的上边界是小于等于无穷大。这个是所有样本观测值的总和,是整个范围内的样本观测值的总和。而后是总共观测多少次总的样本,观测值的次数。我们通过计算,能得出来每一个桶内大概有多少次是用当前桶已有的,我们只能逆向推过去,或者叫正向推过去也行第一桶假如是1,第二桶是3,那就意味着真正的第二个桶是3减1第三个桶是5,刚才说过,就意味着真正第三个桶的值是5减去3再减一不用 5- 3 ,减前面的一个就行还有点说错,每一个桶,它的真实数据减去前面一个就行,而不是减去前面累加,减去累加就不够减,需要纠正一下。于是我们要计算出来每一个桶的值,就用当前桶减去前一桶就行。就意味着这里边有多少个数我就知道或者有多少个样本数量我们就知道。

接着我们来看累积间隔机制生成的样本数据需要额外使用内置的 Haste corn tail,不需要自己计算,它有一个内置函数,直接可以根据 Histogram 的指标来计算相应的分位数,即某个 bucket 样本数所在的所有样本数据中所占据的比例就叫分位数。比如对于 bucket 而言,它自己所占用数据量在整个桶当中大概多少个,所以我们就称为叫分位数。根据我们刚才揣测说过,它的预测结果只是一个预估值,并不完全准确。因为它是离散的采样点,我并不能得到里边所有值。而且各位应该能理解的出,桶的化盆力度越大及准确度也就越低,因为它是估算出来,通过线性回归的方式。

3.summary

我要想得到精确值,就是用summary,跟 his gram 一样,唯一的区别就在于 summary 直接在客户端,因为你的数据采集是客户端送上来的,克兰自己直接用自己本地的实际数据算可以,算好直接上报,就不用再估算。因此 summary 是一种类似于 his Grammar 指标类型。但是它是在客户端与一段时间内的每个采样点进行统计计算,而不是一部分采样点。所以计算并存储分位数的数值。server 端只要拿到就可以,不用计算。但是 summary 不支持 sum 或者 AVG 一类的聚合计算,因为它的分位数是由客户端生成的,没有做二次计算。所以从某种形式来讲,histogram 有更好的灵活性。但是 summer 对服务集团的压力更小,至少你不需要服务器计算。那么复杂的操作。

看分位数,来看 summary 的表示方法。对于每一个指标, summary 以 base name 为前缀,生成以下几个 base name 叫count。分位数级值是多少?分数级值是多少?总和是多少?总数是多少?他就不会你给你把每个统的数据都给拿过来,而是直接算好几个分位点。比如 0. 25,0. 5,0. 75 和几个分位点,或者使用 0. 5,0. 9 和0.99几个分位点。 10. 0. 050. 50. 9 和零点九九几个分位点,他们是百分位点。

所谓 0.25 指的是 25% ,所谓 0. 99 指的是99%。大概就是我 99% 的数据位于哪个区间内,可以这么理解。这就表示 25% 的数据有多少个。一共我们采样了 100 次,其中 0 到百分之二十五这区间占多少个?有多少个数据位于最小那段百分之二五的区间内?四分之一区间内能离了吗?你如果是中位数50%,表示有多少样本是位于 0 到 50% 区这个小区间内,所以这叫50。分位数99,表示对应的 99% 的数据位于哪个区间内。可以反过来表述,也是一样的逻辑。

prometheus 的 4 个数据类型,大家有没有发现histogram 和 summary 太复杂。每一个指标会生成好多时间序列,这些时间序列我们要想利用起来,可能还需要使用函数进行计算。得到一些结构,我们才能明白它到底怎么回事。生产起来可能确实会有一点复杂,对于而言,我们过多数情况下取得特定区间的分位数的值,我们只需要关注 99% 的值在哪个区间内。比如像请求时间一样,如果我们认为每一次请求响应 1 秒钟是我们认识的合理范围,我们看是不是 99% 的请求都在 1 秒钟之内就能得到响应,而只有 1% 的可能大于 1 秒,我们可以认为这是正常的。能明白我说的意思吗?我分为这样的作用,我们就看一看差不多是不是 99% 的都满足我们所期望的结果,所以它有时候会有这样几个分位点。有时候你可能只评估 90% 就行,比如是不是 90% 的请求都能小于 1 秒,就使用九十分位数就行。因而你只要记住一个关键点,所分位数就是指我们可以统计在每一个区间内落入进来的样板的数量。我们常用它来评估请求时间的磁盘,也是你的磁盘写入请求大概有多少次,多大比例的请求是小于我们能接受的时间的比如我们认为接受的请求是 1 秒钟,如果有 50% 的请求都大于 1 秒,你可能认为你的磁盘一定出问题,故性能故障,或者叫性有性能问题。

我们的网站也是一样,我们做一个分位数统计,我们认为 3 秒钟超过我们客户都会流失的最好一秒钟之内,用户都能打开所有网站,打开我们所有页面我们统计如果我们的网站 90% 的请求一秒钟之内都能返回给客户端,我认为网站是正常的但是我们后来做一下分位式统计,小一秒钟的只占25%,那就很麻烦。

所以这就是我们刚才在统一边界的时候,使用histogram 统计上边界的作用很多时候我们可以自己指定边界,所以可以灵活计算各种分位数但是对 summer 而言,你的分位数是界定的。客户端报哪些分位数,你就只能得到哪些分位数他报了 4 分位, 3/ 4 分位就是中位 3/ 4 分位、 1/ 4 分位和百分位,他可能报了九九分位, 90 分位。他报哪一个,你就只能用哪一个而 histogram 我们可以自己计算各种分位,因为你有上边界,我可以粗略估算各种分位数, 50% 的、 51% 的, 55% 的, 80% 的我都能算出来。

有了这样的数据,接下来我们就可以讲 promQL 即它的表达式当中的一些高级用法,比如我们可以使用一些复杂的函数计算做一些分析,把分析的结果进行报警。,后面我们会讲如何去在样本统计结果上做聚合计算,和使用 prometheus的内置函数做高级的分析计算,更重要的是分析的结果我们还可以拿来绘图和报警,所以我们说没有这些,你没办法画图,也没法报警,真的需要把这些东西理解。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
相关文章
|
Prometheus 监控 Cloud Native
Prometheus PromQL语法
Prometheus PromQL语法
435 0
|
2月前
|
监控
PromQL常见的使用场景
【10月更文挑战第14天】PromQL 的核心价值体现在时序数据的筛选与计算上。面对海量时序数据,PromQL 通过查询选择器实现高效过滤,满足特定监控图表渲染或告警规则处理的需求。
|
4月前
|
Prometheus 监控 Cloud Native
Prometheus 查询语言(PromQL):深入解析
【8月更文第29天】Prometheus 是一款开源的监控系统和时间序列数据库,广泛应用于各种系统的监控和告警。PromQL(Prometheus Query Language)是 Prometheus 用来查询和聚合时间序列数据的一种强大语言。本文将详细介绍 PromQL 的功能和语法,包括基本查询、向量操作、聚合函数等,并提供具体的代码示例。
616 2
|
4月前
|
存储 Prometheus Cloud Native
prometheus学习笔记之PromQL
prometheus学习笔记之PromQL
|
4月前
|
应用服务中间件 nginx Docker
[loki]轻量级日志聚合系统loki快速入门
[loki]轻量级日志聚合系统loki快速入门
183 5
|
4月前
|
存储 Prometheus 监控
PromQL 快速入门:理解基本查询语法
【8月更文第29天】PromQL (Prometheus Query Language) 是 Prometheus 监控系统中用于查询和聚合时间序列数据的一种表达式语言。PromQL 具有丰富的语法和功能,可以轻松地从 Prometheus 存储的数据中提取有用的信息。本文将介绍 PromQL 的基础知识,包括如何构造简单的查询语句,并通过代码示例来演示这些概念。
196 0
|
4月前
|
Prometheus Cloud Native Go
解析Prometheus PromQL
解析Prometheus PromQL
58 1
|
7月前
|
Prometheus Cloud Native
「译文」如何使用 PromQL join 来更有效地查询大规模的 Prometheus 指标
「译文」如何使用 PromQL join 来更有效地查询大规模的 Prometheus 指标
|
7月前
|
存储 Prometheus Cloud Native
「译文」Prometheus 查询语言 PromQL 简介
「译文」Prometheus 查询语言 PromQL 简介
|
SQL 数据采集 Prometheus
PromQL计算原理详解
## 背景 PromQL是Prometheus项目针对时序场景提供的一种查询语言,而PromQL的设计与常规意义上的SQL语句区别较大,其执行引擎的计算逻辑同样也大相径庭。在日常的客服解答中,发现较多客户对PromQL的执行原理有误解,故整理此篇文章对PromQL的原理与执行逻辑进行详细介绍。 ## 对时序的认识 时序场景下的观测对象是 “Metric”,例如这项表示“进程的常驻内存使用量
1476 2

热门文章

最新文章