一、系统可观测性三要素
1.1 系统指标(metric)
1.2 日志(log)
1.3 全链路(trace)
二、Prometheus基本认识
2.1 指标抓取
Push和Pull,其实就是两种指标抓取模型,其中Push(推送),Pull(拉取)。
1. Push
Push模型:被监控服务主动将指标推送到监控服务,可能需要对指标做协议适配,必须得符合监控要求的指标格式。
2. Pull
Pull模型:监控服务主动拉取被监控服务的指标,被监控服务一般通过主动暴露metric端口或者通过Exporter的方式暴露指标,监控服务依赖服务发现模块发现被监控服务,从而去定期的抓取指标。
2.2 指标存储和可视化查询
指标抓取后会存储在内置的时序数据库中,Prometheus也提供了PromQL查询语言给我们做指标的查询,我们可以在Prometheus的WebUI上通过PromQL,可视化查询我们的指标,也可以很方便的接入第三方的可视化工具,例如Grafana。
2.3 指标监控告警
Prometheus提供了alertmanager基于PromQL来做系统的监控告警,当PromQL查询出来的指标超过我们定义的阈值时,Prometheus会发送一条告警信息到alertmanager,manager会将告警下发到配置好的邮箱或微信。
2.4 Prometheus原理
Prometheus原理解释
- Prometheus server定期从配置好的jobs或者exporters中拉取metrics,或者接受来自Pushgateway发过来的metric,或者从其他的Prometheus server中拉metrics。
- Prometheus server在本地存储收集到的metrics,并运行已定义好的alert.rules,记录新的时间序列或者向Alertmanager推送报警。
- Alertmanager根据配置文件,对接收到警报进行处理,发出告警。
- 在图形界面中,可视化采集数据。
三、Prometheus相关概念
3.1 数据模型
Prometheus中存储的数据为时间序列,是由metric的名字和一序列的标签(键值对)唯一标识的,不同的标签则代表不同的时间序列。
- metric名字:该名字应该具有语义,一般用于表示metirc的功能,例如:http_requests_total,表示http请求的总数。其中metric名字由ASCII字符,数字,下划线,以及冒号组成,且必须满足正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*
- 标签:使同一个时间序列有了不同纬度的识别。例如http_requests_total{method=“Get”}表示所有http请求中的Get请求。当method="post"时,则为新的一个metric,标签中的键由ASCII字符,数字,以及下划线组成,且必须满足正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*。
- 样本:实际的时间序列,每个序列包括一个float64的值和一个毫秒级的时间戳。
- 格式:{=,…},例如:http_requests_total{method=“POST”,endpoint=“/api/tracks”}。
3.2 四种metric(指标)类型
- Counter(基数器)
一种累加的metric,典型的应用如:请求个数,结束的任务数,出现的错误数。counter数据只增不减,同时可以结合increase和rate等函数统计变化速率。 - Gauge(仪表类型)
一种常规的metric,典型的应用如:温度,内存占用,CPU利用率,GC次数等数据。和counter不同,Gauge是可增可减,可以反映一些动态变化的数据,在Prometheus上通过Gauge,可以不用经过内置函数直观的反映数据的变化情况。 - Histogram(直方图类型)
可以理解为柱状图,典型的应用如:请求持续时间,响应大小
可以怼观察结果采样,分组和统计 - Smmary(摘要类型)
类似于Histogram,典型的应用如:请求持续时间,响应大小。
提供观测值的count和sum功能
提供百分位的功能,即可以按百分比划分跟踪结果
四、Prometheus PromQL使用(表达式)
PromQL(Prometheus Query Language)是Prometheus提供的函数式查询语言,可以查询实时数据和聚合时间序列的数据,在数据可视化和编写告警规则中使用。
4.1 瞬时查询
瞬间向量(Instant-Vector),一组时间序列,包含相同时间戳的单个样本,例如:http_requests_total
4.2 范围查询
区间向量(Range-Vector),一组时间序列,包含每个时间序列随时间变化的数据点范围,例如:http_requests_total[5m],在过去5分钟内指标名称为http_requests_total的所有时序
4.3 标量(Scalar)
Scalar(标量)通常为数值,可以将只有一个时序的Instance- Vector转换成Scalar。
4.4 String
简单字符串值
4.5 示例
1. 瞬时数据,即当前时刻的数据
mysql_slave_Seconds_Behind_Master
2. 区间数据,表示某一个时间范围内的数据,计量单位有以下这些:
ms:毫秒,s:秒,m:分,h:时,d:天,w:周,y:年
mysql_slave_Seconds_Behind_Master[1m]
查询从库延迟1分钟内的数据,采样周期是10s,可以看到1分钟内,每个指标有6个值
3. 条件匹配
匹配符:==,!=,=~,!~
其中=:是选择提供的字符串完全相同的数据,!=:选择不等于提供的字符串的数据
=~:选择与提供的字符串进行正则表达式匹配的数据,!~:选择与提供的字符串不匹配的数据
4. 算术运算
算术运算符有:+,-,*,/,%,^,与数学里面的算术运算符含义一样,分别是:加,减,乘,除,取余,幂次方,**这里需要注意的是:算术运算符的两个指标,必须标签完全一样。**
5. 聚合运算
sum和counter
min、avg、max
topk:取前面几个较大值
bottomk:取后面几个较小值
6. 匹配运算
on:关联标签,将两个指标进行算术运算时,如果两个指标的标签不完全相同,可以匹配相同的标签进行计算
mysql_variables_innodb_buffer_pool_size/on(db,ident,service) mem_total
ignoring: 忽略标签,与on关联标签相反,如果两个指标的标签不完全相同,可以忽略不一样的标签进行计算
by:以某一个标签进行运算,通常结合sum聚合函数运算
without:舍弃某个标签进行计算,通常结合sum聚合函数运算
7. 函数
increase、rate和irate
increase:求增长值
rate和itrate区别:求增长率
rate会取指定时间范围内所有样本数据点,然后计算平均增长速率,可能容易陷入“长尾问题”,无法反映突出变化,比如机器在一个时间窗口内,可能出现CPU占用100%的情况,但通过计算在时间窗口内的平均增长率,数据就会被平均,就无法反映出该问题。
irate是通过在指定时间范围内“最后/新/近两个样本数据”来计算区间增长率。这种方式可以避免在时间窗口范围内的“长尾问题”,体现出更好的灵敏度,通过irate函数绘制出的图标/图形更好的反映样本数据的瞬时变化状态。
虽然rate和irate都会用于计算某个指标在一定时间间隔内的变化速率,irate适合快速变化的计数器(counter),而rate适合缓慢变化的计数器(counter)。