查看原文
其他

下一代应用监控指标采集器Prometheus核心介绍

The following article is from 码农小胖哥 Author 码农小胖哥



1
Prometheus简介

Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包 。自2012年成立以来,许多公司和组织都采用Prometheus,该项目拥有一个非常活跃的开发人员和用户社区。它现在是一个独立的开源项目。Prometheus于2016年加入谷歌主导的顶级开源社区云原生计算基金会(CNCF),成为第二个顶级托管项目。第一是大名鼎鼎的k8s。prometheus是属于下一代监控。可用来监控操作系统、应用、容器等。


2
特征    

普罗米修斯的主要特点是:

  • 多维度数据模型(时序由metric名称和k/v结构的labels构成)。

  • 灵活的查询语句(PromQL)。

  • 无依赖存储,支持本地和远程。

  • 采用http协议,使用pull模式拉取数据。

  • 监控目标,可以采用服务发现或静态配置的方式。

  • 支持多种统计数据模型,图形化友好。



3
常用组件

Prometheus生态系统由多个组件组成,其中许多组件是可选的,主要有:

  • Prometheus server - 收集和存储时间序列数据

  • client library - 用于client访问server/pushgateway

  • pushgateway - 对于短暂运行的任务,负责接收和缓存时间序列数据,同时也是一个数据源

  • exporter - 各种专用exporter,面向硬件、存储、数据库、HTTP服务等

  • alertmanager - 告警管理器,用以监控指标告警



4
架构    

此图说明了Prometheus的体系结构及其一些生态系统组件:



Prometheus直接或者间接拉取应用的监控指标,汇总并转化成自有的时间序列数据模型或者生成告警信息。提供api给具有可视化的一些UI展现层。


5
适用场景

Prometheus在记录时间序列的数据方面表现非常好。它既适用于面向服务器等硬件指标的监控,也适用于高动态的面向服务架构的监控。对于现在流行的微服务,Prometheus的多维度数据收集和数据筛选查询语言也是非常的强大。Prometheus是为服务的可靠性而设计的,当服务出现故障时,它可以使你快速定位和诊断问题。它的搭建过程对硬件和服务没有很强的依赖关系。

Prometheus的价值在于可靠性,甚至在很恶劣的环境下,你都可以随时访问它和查看系统服务各种指标的统计信息。如果你对统计数据需要百分之百的精确,那么Prometheus不是一个很好的选择。


6
即时向量选择器

Prometheus存储的是时序数据, 即按照相同时序(相同的名字和标签),以时间维度存储连续的数据的集合。时间序列由metric名称和label组成,因为随着时间而改变,所以时序数据都是向量。

  •  metric 监控的指标名称。名称可以包含ASCII字母、数字、下划线和冒号,必须满足正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*, 其名字应该具有语义化,一般表示一个可以度量的指标。假如我们来度量http请求的总数,我们可以用http_requests_total来表示。

  • label  用来标识其所属的metric的特性。由kv匹配表达式组成。比如上面的`http_requests_total`,如果我们需要监控来自应用名称为myapp的应用时,我们就可以这样来过滤出我们想要的数据:http_requests_total{ appliaction="myapp",} 。如果有多个label用逗号隔开并以逗号结尾。


综上所述,可以归纳出即时向量选择器通用pattern为:

[metric name]{[label name]=[label value], ...}


7
匹配运算符

上面提到label是一个kv匹配表达式。并不局限于 `=` 匹配。以下是label的匹配运算符:


  •  =  选择相同匹配。

  •  != 选择不等于匹配。

  • =~ 选择正则表达式匹配。

  •  !~ 选择正则表达式不匹配。


如下例子:

http_requests_total{environment=~"prod|testing",method!="GET"}


用来匹配生产或者测试环境,而且不是get请求的总请求数。


8
标题

范围向量选择器与即时向量选择器工作原理相同,只不过返回当前时间以前的一系列采样。时间范围由附加在向量选择器尾部的[]指定,具体的值由数字和单位组成,时间单位包括:


  • s - 秒

  •  m - 分钟

  •  h - 小时

  • d - 天

  • w - 星期

  • y - 年



例如,返回5分钟内metric名为http_requests_total、job是prometheus的全部时间序列:


http_requests_total{job="prometheus"}[5m]


也就是如果我们对即时向量要做范围度量,可以在其后用[rangTime] 来定义。


9
偏移修改器

offset修饰符允许在单个即时向量或范围向量查询中设置相对于当前时间的时间偏移。下面的表达式返回http_requests_total5分钟前的值:


http_requests_total offset 5m


请注意语法上offset修饰符应紧跟在selector后面。


10
内置函数

内置函数很多,说几个使用过的,其他函数可参考 官方网站 。

函数功能
rate 
计算每秒平均值,仅适用于Counter,例如统计QPS
sum求和计算
abs求绝对值


11
时序类型

Prometheus的时序数据分为 Counter, Gauge, Histogram, Summary 四种类型:


  •  Counter:计数器。只允许重置或者增加。我们往往用它记录服务请求总量,错误总数等。例如 Prometheus server 中 http_requests_total, 表示 Prometheus 处理的 http 请求总数,我们可以使用data, 很容易得到任意区间数据的增量。

  •  Gauge:表示搜集的数据是一个瞬时的,与时间没有关系,可以任意变高变低,往往可以用来记录内存使用率、磁盘使用率等。表达一个瞬时的状态。

  •  Histogram:采样观测值,可进行分位计算和数据聚合,计算在server端完成。一个名为<basename>的metric,其histogram有3个固定的时间序列: 

                  

                1.   <basename>_bucket 不同bucket下的观测值的累加数量

                2.   <basename>_sum 观测值的总和

                3.   <basename>_count 观测值的数量

  • Summary:不是根据区间计算出来的而是直接统计一段区间的采样结果。如请求持续时间或响应大小。不同于Histogram,该数值是在客户端直接统计计算。因为没有最初值,故而不能聚合。



12
注意事项
  •  时间要对齐  大多数聚合的时间序列数据所对应的时间戳没有对齐。由于它们的独

    立性,我们需要在这些时间戳中选择一个时间戳,并已这个时间戳为基准,获取小

    于且最接近这个时间戳的时间序列数据。

  • 数据过期 如果5分钟内,没有获取到任何的时间序列数据,则这个时间戳不会存在。那么在图表中看到的数据都是在当前时刻5分钟前的数据

  • 避免慢查询和过载 如果一个查询需要操作非常大的数据量,图表绘制很可能会

    超时,或者服务器负载过高。所以对于一个选择器指标来说需要尽可能的精确度。

    简而言之就是要尽可能通过label来进行标记。


往期回顾

java必学核心知识总结——注解

ArrayList 的全面突击

学并发编程,透彻理解这三个核心是关键



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存