微言码道 · 手记

走马观花云原生技术(13):度量与监控 Prometheus

—— 介绍CNCF(云原生计算基金会)官方项目 -- 度量与监控 Prometheus

但凡是分布式系统而言,可度量性是在技术层面必须与实现的目标。而可度量性细分下来,包括了日志度量以及链接追踪三个维度。

在前面的文章中,针对日志,在CNCF官方项目中,可以使用Fluent;而针对链接追踪,可以使用Jagger;而这一次,我要聊到的,就是关于支持度量的技术了。

这就是Prometheus,Prometheus就是对各种度量数据进行收集,存储与支持查询,甚至是配置告警的技术。

什么是度量

英文中,指的是Metric,翻译过来就是指标,度量的意思。

那首先理清的一个概念是,在系统中,什么数据才称的上度量数据,或者说在一个系统中我们想要收集什么样的数据?

举例说明如下:

  • 服务器状态相关的数据,比如内存或CPU的使用情况
  • 业务上的一些有价值的数据,比如活跃用户数等

在系统中,不管是与部署相关的硬件或资源数据,还是业务上有价值的一些数据,都可以进行度量与存储。

而Prometheus就是支持对这些度量数据进行存储,查询,告警的技术。

Prometheus是什么

Prometheus是一个存储度量数据的时序数据库。它通过定时的主动式的接口调用,来实现对度量数据的收集与存储。在此基础之上,提供类SQL时序数据的查询与分析能力,支持配置告警,进一步支持将数据导出给其它工具,以支持可视化的数据展示。

这里有几个关键词需要特别说明,分别是时序数据定时主动式接口调用配置式告警,以及数据导出以支持数据的可视化。理解这些词语,你就基本上理解了Prometheus这个技术。

时序数据库

任何数据库都是存储数据的,只是存储方式与维度并不一致。我们最熟悉的MyQL是关系型数据库,它的最大特点是以表的行与列来存储数据,而近些年流行的Mongo等文档型数据,以则文档(类JSON或其它)的方式来存储数据;这两者的存储模式不同。

而时序数据,特点在于它在存储数据的维度上添加了时间这一个维度。也就是数据是有时序的,所以时序数据中,一定有一个维度的数据就是时间。

举例说明,你可以查询过去一小时的内存平均使用情况,也可以查询过去七天的内存平均使用情况,时序数据库基本上都支持类似的时间维度的查询,这是因为每次收集的内存度量数据,都额外存储了时间这一数值。

当然,如果仅是存储时间,并非有多大意义,关键是时序存储都支持基于时间维度的查询与分析统计能力,这才是更关键的。

而度量数据,刚好需要时序存储,Prometheus做为专门的度量技术,当然得是时序存储了。

主动式接口调用

收集数据有两种方式,也就是推或拉模式。推模式是说数据是由被收集方在适当的时间推给收集方,而拉模式是指收集方通过调用API或其它方式从被收集方拉取数据。

Prometheus使用的是拉模式(PULL),Prometheus会定时(依据配置而定)通过HTTP的方式调用对应的API(依据配置而定)来获取要收集的数据。

这种模式的优点在于:

  • 适应场景广泛,通用性强;只需提供一个HTTP接口,返回JSON格式的数据就可,几乎适合任何语言,框架及服务。

缺点与不足在于:

  • 数据的精准度存在问题,由于是定时收集,意味着一些特别时间点的意外情况不一定收集得到
  • 需要收集的数据过多时存在服务调用的负载压力

PromQL查询

Prometheus是一个时序数据,存取了大量的数据,理所当然的得提供查询能力;Prometheus提供的查询能力称为PromSQL。

这里列几个基于PromSQL查询

# 过去6小时的内存占用数据,这个语句会把符合条件的数据全列出来
memory_consumption[6h]
# 过去6小时内存占用的平均值计算
avg_over_time(memory_consumption[6h])
# 过去6小时内存占用的最大值
max_over_time(memory_consumption[6h])
# 过去6小时内存占用的最小值
min_over_time(memory_consumption[6h])

可见,除了提供基于时间维度的查询能力以外,PromSQL还支持一些计算,分析与统计等复杂逻辑。

配置式告警

Prometheus还支持告警。

有了数据,当然可以设置一些告警的值,当数据高于或低于这个值时,就触发告警,这也是一个非常有价值的能力。

比如当内存使用超过一定的限度,就触发警告信息。

由于Prometheus是一个通用的工具,所以它也支持挺多方式告警,比如通过邮件,通过调用webhook,甚至有第三方工具比如Slack的插件来支持告警,非常灵活。

当然,前提是你需要设置一些告警规则(Rules)

数据导出

Prometheus本身提供了一个WebUI,这个WebUI上可以看到所有收集的数据,也可以使用PromQL进行查询。

但Prometheus本身并不支持基于数据的可视化展示。Prometheus只是存储与查询这些时序数据,这种通常比较原始。而可能大多数情况下,我们更需要的是一个可视化的数据页面,这就需要另外的工具来实现了。

Prometheus的exporters能力了,最流行的搭配就是通过exporters把数据导出给grafana这个专业的开源的可视化数据工具了。

grafana专门负责对数据进行可视化的配置与展示。比如柱柱图,曲线图等各种图形都是小case。

所以,实际使用中,Prometheus都会与grafana搭配。

成熟的生态

Prometheus是一个成熟的工具,使用率非常高,这也意味着使用它时,大多数情况下,有很好的生态来搭配。

比如各种语言的metrics收集,已经有成熟的类库来支持;各种框架比如MySQL或Mongo都有现成的可用的metrics搭配,并不需要你来实现相关的metrics api。

而我在前面讲的fluentd这个工具,也有支持Prometheus的metrics。

当然,唯一需要你自己实现的是,业务上你需要关注的一些度量数据,你需要自行实现API来提供这样的度量数据给Prometheus。

End

好了,关于Prometheus这个,它是什么以及能做什么,我想我说的这些应该足够了。我很多年前就在使用这个工具,它很多年前就非常流行了。

但直到最近我才发现它也成了CNCF的官方已毕业的项目之一了。