Prometheus内部实现(一)

Prometheus在监控界为什么这么🔥?

Prometheus具体是怎么实现的?

人如其名,产品亦是!Prometheus就是火种,照耀在当前的监控世界!

Prometheus这把火,在我看来,火在三个方面:

  1. 系出名门:CNCF的第二个项目,CNCF的老大叫K8S,老大对老二很照顾,监控首选。
  2. 门庭若市:开源,大厂竞相争用。
  3. 简单易用:架构简单,配置简单,上下游打通。

大家都在用,而且用起来很方便的确是我们选择产品的方法,但是作为开发人员,还是需要了解一下其内部的实现。这个系列,主要根据Prometheus的代码和文档,梳理Prometheus的内部实现。

总体架构

prometheus_architecture

Prometheus从配置的jobs中抓取metrics,存储在本地存储或者外部存储中,在metrics上运行规则聚合多维度的数据或者生成告警。Grafana或者自带的web UI能够方便的展示数据。

Prometheus的组件包括:

  • server:负责抓取metrics,存储metrics,分析、聚合metrics
  • client library:多种语言的客户端库,方便实现
  • push gateway:短期存活服务metrics推送网关
  • exporters:比如监控节点的node_exporter,监控MySQL的mysqld_expoter等等
  • alertmanager:alertmanager负责告警的发送

从总体架构,我们可以了解各种组件,以及数据的流向,现在我们开始研究Prometheus server的内部实现。

Server实现架构

prometheus_internal_architecture

server启动的时候,根据配置文件prometheus.yml和flag决定各种配置,配置文件包括全局配置、抓取目标配置和规则配置等等。scrape_configs配置了抓取的目标,Prometheus支持动态获取目标,Service discovery读取静态配置的目标或者周期更新动态目标,添加到scrape manager,scrape manager负责抓取目标,抓取实际是一个HTTP请求,即各种exporters实际上就是一个简单的HTTP服务,负责暴露各种应用的指标。scrape manager抓取指标后,将数据交给fanout storage,fanout storage负责数据存储,支持本地存储和外部存储。rule manager根据规则,聚合指标存储到fanout storage,或者生成告警发送给alert manager。Prometheus也实现了各种web接口,使用promQL进行数据的查询。

server的组件包括:

  • Termination handler.
  • Scrape discovery manager.
  • Notify discovery manager.
  • Scrape manager.
  • Reload handler.
  • Rule manager.
  • TSDB.
  • Web handler.
  • Notifier.

了解了server的基本架构,下面开始研究server的配置。

Prometheus.yml

1
2
3
4
5
6
7
8
9
10
11
12
global:
scrape_interval: 15s
evaluation_interval: 15s

rule_files:
# - "first.rules"
# - "second.rules"

scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']

这是官网提供的一个简单的配置文件,包含了三个部分:全局配置、规则配置和抓取配置。global包括全局的配置,rule_files配置规则文件,这里没有配置,scrape_configs配置抓取目标。抓取目标是一个列表,包括多个job,每个job有一个job_name,目标配置以及其他配置,目标配置因为支持多种目标源,所以这块在代码中的实现比较复杂。

下一篇我们开始研究Prometheus server的启动源代码。

分享到