深入理解Prometheus监控系统
上QQ阅读APP看书,第一时间看更新

1.1 Prometheus 0.1.0(首个版本)

Prometheus目前在GitHub上公开的首个版本为0.1.0版本,发布于2014年3月份前后。相较于首个长期支持版本(2.37版本),0.1.0版本的功能并不少,只不过每项功能要简单得多,使用的数据库也不是后来Prometheus开发者官方开发的TSDB,而是基于LevelDB的本地存储开发的数据库,同时0.1.0版本支持OpenTSDB作为远程存储。如果用一句话概括0.1.0版本,可以说是麻雀虽小,五脏俱全。

在模块方面,0.1.0版本主要包含配置信息处理、采样管理器、监控目标管理器、基于LevelDB的本地存储、支持OpenTSDB的远程存储、告警规则管理器、转录规则管理器、通知器、Web API、Web 用户界面和工具箱共11个模块。上述模块的实现分布在代码文件目录的不同文件夹中,如代码清单1-1所示。相比于2.37版本,0.1.0版本缺少PromQL模块,但是规则模块(rules文件夹)中具有的数据查询功能在后期独立出来形成了PromQL模块。

代码清单1-1 Prometheus-0.1.0主要代码文件目录

.
|-- coding           # 底层模块,提供时间戳的编码和解码功能
|-- config           # 配置信息处理模块,实现了配置信息的结构定义和解析,以及配置文件的加载等
|-- documentation    # 配置文件及说明文档
|-- main.go          # 主程序文件
|-- model            # ProtoBuf消息定义,定义了标签和监控项等核心消息
|-- notification     # 通知器模块,仅支持以HTTP POST方式发送通知
|-- retrieval        # 采样管理器模块和监控目标管理器模块
|-- rules            # 告警规则管理器模块、转录规则管理器模块,以及数据查询功能
|-- stats            # 计时器模块(底层模块,用于上层模块的性能监控)
|-- storage          # 基于LevelDB的本地存储模块和支持OpenTSDB的远程存储模块
|-- tools            # 工具箱,包含数据导出、数据压缩和规则检查共3种工具,后发展为Promtool模块
|-- utility          # 底层数据结构模块,包含LRU缓存、集合、列表、时间处理、字符串处理等
`-- web              # Web API和Web UI用户界面模块

首个版本中各个模块的功能尚不完善。配置信息处理模块能够实现对配置信息的加载,但是此时使用的配置文件为ProtoBuf格式,而非YAML格式,并且不支持运行时动态加载。在监控目标管理方面,0.1.0版本实现了采样管理器模块,该模块可以从配置文件中加载监控目标数据以及从监控目标中采集样本数据,相当于具有非常初级的监控目标自动发现功能和采样过程管理功能。本地存储模块则是基于LevelDB的分级存储,它先将数据写入内存,然后每15 min进行一次持久化。由于数据模型的特殊性,本地存储的这一实现方式在数据量较大的情况下容易遇到瓶颈。远程存储模块实现了OpenTSDB客户端,但是仅支持对OpenTSDB数据库的远程写入,不能进行远程读取。告警规则管理器模块和转录规则管理器模块通过读取本地存储中的样本数据进行计算并将计算结果写入存储或者生成告警。虽然该版本不具备独立的PromQL模块,但是告警规则管理器模块和转录规则管理器模块内部定义了一套通用的规则表达式句法来实现规则定义和数据查询,这一句法后来演变为PromQL模块的基础,而句法本身也发生了很大变化。通知器模块实现了发送警报消息的功能,但是只能通过HTTP的POST方法发送JSON格式的消息。Web API模块实现了监控数据查询功能,能够对外提供数据查询服务,同时实现了监控目标更新功能(此时还不具备主动发现监控目标的能力,只能被动地接收监控目标数据)。该版本的Web 用户界面模块主要利用Go语言的html/template包所提供的功能来实现,功能相对简单。首个版本中的工具箱模块包含3种工具,可以实现数据导出、数据压缩和规则检查,相较于后期发展出的Promtool工具,其功能要少得多。

在样本类型方面,0.1.0版本仅支持Counter、Gauge和Summary这3种类型,并不支持Histogram类型。该版本支持的样本数据格式只有ProtoBuf和JSON两种,这意味着监控目标返回的样本数据的格式须为这两种格式之一。