开发者学堂课程【3天吃透 Prometheus:Prometheus 基础】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1244/detail/18453
Prometheus 基础
内容介绍:
一、上一课时回顾
二、PromQL 基础
三、Service Discovery
四、资源发现
五、对 target 重新打标
六、如何为 Prometheus 添加图形界面
一、 上一课时回顾
Prometheus 是一款非常正统的监控系统,它只具有一款监控系统本身应该具有的样本数据的采集、存储,可视化以及告警功能中的两者就是前两者。第三个功能是接下来要讲到的,它基于 Grafana 来实现,Grafana 的工作是基于 PromQL 来完成的,告警功能也同样基于内建的PromQL 来完成。要想使用好 Prometheus,掌握好 PromQL 是重中之重。今天的课程主要围绕着 PromQL 之上进行展开的,将会解释 PromQL 的基础使用,而后讲讲 PromQL 的一些进阶用法,后面会讲 Prometheus 的服务发现机制,也就是如何能够更好的在一个动态化的环境当中将更多的 target 纳入到监控体系中来,这就包括有一些 target 可能会不知何时冒出来,也可能不知何时就离去了,等等多种情形。
通过上节课的学习已经知道,Prom-server 是系统的最核心的组件,Prom-server 自己内建的组件支持周期性的数据采集,但采集的数据要么来自于 Exporters,要么来自于 Instrumetations,要么来自于 PushGateway,无论是是哪一种,Prometheus 都通通工作于拉群模式,叫做 pull 模式。Pull 模式可以理解为就是 Prometheus 自己主动的向每一个 Exporter,Instrumentation 或者 PushGateway 发起数据的采集请求,然后被请求方等待着 Prom-server 的请求就可以,这种模式叫 pull。Push 就是反过来的,就是被监控者自己主动把数据推送给Prom-server,pull 模式压力主要在 server 端,对 push 模式来讲,server 压力会减轻很多,但是为了能够更好的控制全局,Prom-server 选择了 pull 模式,Prom-server 上每一个被监控的组件叫 Target,在配置 Prom-server 中的时候有一个非常重点的概念叫做 Job,就是多种同类的 target,归结为一个组就叫做 Job,而在 Job 当中的 target 一般叫 Instance,在这些概念的基础上就可以继续今天的课程。
前面强调过,对于 Prometheus 来说,时间序列是它存储数据的格式,时间序列最重要的标识方式是 metric_name{label=”value”,…},label 可以有多个来进行标识,要想在Prometheus 抓取并存储的大量时间序列中过滤出来一部分,就要使用向量表达式来完成,即用时间过滤器以过滤的形式来完成,也用 metric_name{label=”value”},可以只给 metric_name,可以只给标签集label,也可以二者同时给出,但要求如果只给出标签集的时候不能完全的匹配空值的标签。对 Prometheus 而言,在构建向量表达式的时候,向量一般分为即时向量和范围向量两种。即时向量可以认为是在即时挑选出的向量之上每一个时间序列只取一个值;范维向量可以认为是每一个时间序列之上会选出来一到多个值,这两种向量在使用的时候要求是不尽相同的。
二、PromQL 基础
1、范围向量选择器
范围向量选择器同即时向量选择器的唯一不同之处在于,范围向量选择器需要在表达式之后紧跟一个方括号[]来表达需在时间序列上返回的样本所处的时间范围。
时间范围:对一个时间向量矩阵来讲,即时向量选择器对每一个时间序列只取当下这个时刻或者过去最近采样的时间样本,对于范围向量选择器则是逆回去一个时间,取这个范围内每一个时间序列上的一个或者多个值,组成了一个小矩阵,而方括号表达的就是时间范围,指过去的一个特定的时间长度,如[5m]就是指过去的五分钟之内。
时间格式:一般来讲,常见的时间单位有ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)、w(周)和y(年)。Prom-server 默认的存储数据时长只有一个月,所以年很少用,多数情况下使用的是分钟、小时、天,偶尔会使用周。必须使用整数时间,且能够将多个不同级别的单位进行串联组合,以时间单位由大到小为顺序,例如1h30m,但不能使用1.5h;
需要注意的是,范围向量选择器返回的是一定时间范围内的数据样本,虽然不同时间序列的数据抓取时间点相同,但它们的时间戳并不会严格对齐,这样可以缓解 Prom-server 在抓取众多指标时候的压力,多个 Target 上的数据抓取需要分散在抓取时间点前后一定的时间范围内,以均衡Pronetheus Server的负载;因而,Prometheus 在趋势上准确,但并非绝对精准。
2、偏移量修改器
获取即时向量的时候,可以获取过去某个时间点的一个值,而不是当下或者最近的一个样本值,可以向前逆回一个时间;范围向量也是一样的,可以指定过去的某个时间点并再次向前逆一段时间,这些功能通过偏移量修改器来实现。
默认情况下,即时向量选择器和范围向量选择器都以当前时间为基准时间,而偏移量修改器能够修改该基准;
偏移量修改器的使用方法是紧跟在选择器表达式之后使用“offset”关键字指定
“http_requests_total offset 5m",表示获取以http_requests_total为指标名称的所有时间序列在过去5分钟之时的即时样本;
“http_requests_total[5m] offset 1d",表示获取距此刻1天时间之前的5分钟之内的所有样本;
3、PromQL 的指标类型
PromQL有四个指标类型,它们主要由Prometheus的客户端库使用
Counter:计数器,单调递增的样本数据,即每一次数据采集都会比之前更大,除非重置(例如服务器或进程重启,也包括人为的重启);
Gauge:仪表盘,可增可减的数据,比如内存空间或者引用空间,显然运行程序多了引用空间就大,用的程序少了内存空间就小,这种仪表盘数据就叫gauge,它会随时间的发展可增可减;
Histogram:直方图,将时间范围内的数据划分成不同的时间段,并各自评估其样本个数及样本值之和,因而可计算出分位数;可用于分析因异常值而引起的平均值过大的问题;分位数计算要使用专用的histogram_quantile函数;例:评估过去一个小时的http请求的平均速率,在过去的五分钟里,可能过去第一分钟的时候有三个请求,第四分钟的时候有26个请求,取这五分钟内的样本取样的所有值的平均值,但平均值具有较大的迷惑性。例如:一条小河,深浅不一,标识牌写着平均水深0.2m,但很有可能有一个地方很深,游泳的人也会发生危险,网站访问的过程中也会产生类似的问题,所以平均值并不一定能够真实反映网站监控采样结果的状态。这个时候如果要取分位数,应该取0-0.1的有多少样本,0.1-0.2的有多少样本,0.2-0.8的有多少样本,即将水深分为不同的区间,针对不同的区间进行统计,得到直方图。对于Prometheus而言,它不是直接存储分位数,而是存储每一个区间的样本个数以及样本值之和,可以使用Prometheus的一个内建的函数histogram_quantile进行近似计算。
Summary:类似于Histogram,但客户端会直接计算并上报分位数,是一个精确的数。
Prometheus Server并不使用类型信息,而是将所有数据展平为时间序列
4、Counter 和 Gauge
通常,Counter的总数并没有直接作用,而是需要借助于rate、topk、increase和irate等函数来生成样本数据的变化状况(增长率),这些函数都是Promethues内置的简单的数据处理函数,比如rate表示速率;topk是取前n个最大值,可以认为是逆序排列后取前n个;increase表示步长,即最大值减最小值的区间长度;irate是比rate更精细的速率表示。例:rate(http_requests_total[2h]),获取2小内,该指标下各时间序列上的http总请求数的增长速率; topk(3,http_requests_total),获取该指标下http请求总数排名前3的时间序列;irate(http_requests_total[2h]),高灵敏度函数,用于计算指标的瞬时速率。
基于样本范围内的最后两个样本进行计算,相较于rate函数来说,irate更适用于短期时间范围内的变化速率分析;
Gauge用于存储其值可增可减的指标的样本数据,常用于进行求和、取平均值、最小值、最大值等聚合计算;也会经常结合PromQL的predict_linear(线性回归及预测)和delta函数使用;
predict linear(v range-vector.tscalat)函数可以预测时间序列v在t秒后的值,它通过线性回归的方式来预测样本数据的Gauge变化趋势;
delta(v range-vector)函数计算范围向量中每个时间序列元素的第一个值与最后一个值之差从而展示不同时间点上的样本值的差值;例:delta(cpu_temp_celsius{host="web01.magedu.com"}[2h]),返回该服务器上的CPU温度与2小时之前的差异。
5、Histogram
Promethues的直方图默认是累积直方图,是单调递增的,所以要展示为真正的直方图的时候还要进行数据的处理和计算
Histogram是一种对数据分布情况的图形表示,由一系列高度不等的长条图(bar)或线段表示,用于展示单个测度的值的分布,它一般用横轴表示某个指标维度的数据取值区间,用纵轴表示样本统计的频率或频数,从而能够以二维图的形式展现数值的分布状况
为了构建Histogram,首先要将值的范围进行分段,即将所有值的整个可用范围分成一系列连续、相邻(相邻出可以是等同值)但不重叠的间隔,而后统计每个间隔中有多少值。例如:某网站的主页的请求时长,从1ms-20s不等,可以把1ms-10ms划一个范围、10ms到100ms划一个范围、100ms-1s划一个范围、1s-3s划一个范围、3s-20s划一个范围
从统计学的角度看,分位数不能被聚合,也不能进行算术运算
Prometheus 的 Histograme 是一个累计直方图,每一个区间是包含了前一个区间的数据。如果把它换算成真正的直方图应该会满足正态分布。
对于 Prometheus 的 histograme 而言,每一个特定指标会存储多个时间序列,这是 histograme 比较麻烦的地方。第一,我们要存储观测桶的桶边界,或者叫做样本统测区间,分为多少个。然后,要把对应的可用取值范围划分成多个区间,接着,在每一个区间内有多少个样本,这个样本值很可能是单调递增的。因此,仅仅是划分成多个区间,每一个区间就是一个时间序列。接着,他还会统计所有样本值的总和为一个时间序列,以及总的观测次数为一个时间序列。因而,我们把一个指标分成了4个区间,那么,就会默认有4个时间序列,再额外加上 sum 和 count 后缀的时间序列用于统计对应的所有的在观测范围内所有的样本数或者样本总数和所有样本的和。
6、Summary
Summary 的作用和 histogram 一样,所不同的是 summary 不需要服务器端计算,而是由客户端直接上报,同样的,summary 一个指标下也会生成多个时间序列,这是 summary 和 histogram 比较麻烦的地方。
7、Prometheus 的聚合函数
Prometheus 内置的11个函数可以做聚合运算,但是这些运算仅支持运用于单个即时向量,聚合函数可以在即时向量上做聚合运算后返回的特定结果很有可能是一个标量值。
聚合表达式
要把聚合函数放入 ,接着,指明对哪些时间序列进行聚合,在对时间序列进行聚合时以哪一个标签为标准进行聚合。它有两种等同的使用格式,可以把 without|by 写后面,也可以把它写前面,而(【parameter,】)就是前面讲到的 promQL 的正常表达式。也可以做分组聚合,一般而言是先分组、后聚合。without 是从结果向量中删除由 without 子句指定的标签,未指定的那部分则用作分组标准。而 by 的功能刚好与 without 相反,它仅使用 by 子句中指定的标签进行聚合,结果向量中出现但未被 by 子句指定的标签则会被忽略。这是 Prometheus 聚合表达式的构建逻辑。
8、二元运算符
PromQL 支持基本的算数运算和逻辑运算,可以将两个表达式彼此之间做加法运算、减法运算、乘法运算、除法运算、取模和幂运算。也支持并比较运算,做等值、不等、大于小于、小于等于等比较,也可以做逻辑运算,与或非。