深入浅出Prometheus:原理、应用、源码与拓展详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.8 本书主角——Prometheus

1.简介

Prometheus是由SoundCloud开发的开源监控告警系统并且带时序数据库,基于Go语言,是Google BorgMon监控系统的开源版本。2016年,由Google发起的Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation,CNCF)将Prometheus纳入其第二大开源项目。Prometheus在开源社区也十分活跃,在GitHub上拥有两万多Star,并且系统每隔一两周就会有一个小版本的更新。

随着 Kubernetes 在容器调度和管理上确定领头羊的地位,Prometheus 也成为Kubernetes容器监控的标配。

2.优点

Prometheus的优点有很多,如下所述。

(1)提供多维度数据模型和灵活的查询方式,通过将监控指标关联多个tag,来将监控数据进行任意维度的组合,并且提供简单的PromQL查询方式,还提供HTTP查询接口,可以很方便地结合Grafana等GUI组件展示数据。

(2)在不依赖外部存储的情况下,支持服务器节点的本地存储,通过Prometheus自带的时序数据库,可以完成每秒千万级的数据存储;不仅如此,在保存大量历史数据的场景中,Prometheus可以对接第三方时序数据库如OpenTSDB等。

(3)定义了开放指标数据标准,以基于HTTP的Pull方式采集时序数据,只有实现了Prometheus监控数据格式的监控数据才可以被Prometheus采集、汇总,并支持以Push方式向中间网关推送时序列数据,能更加灵活地应对多种监控场景。

(4)支持通过静态文件配置和动态发现机制发现监控对象,自动完成数据采集。Prometheus目前已经支持Kubernetes、etcd、Consul等多种服务发现机制,可以减少运维人员的手动配置环节,在容器运行环境中尤为重要。

(5)易于维护,可以通过二进制文件直接启动,并且提供了容器化部署镜像。

(6)支持数据的分区采样和联邦部署,支持大规模集群监控。

3.架构

下面简单介绍Prometheus的架构。

Prometheus的基本原理是通过 HTTP周期性抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口并且符合 Prometheus 定义的数据格式,就可以接入Prometheus监控。

如图1-9所示为 Prometheus 的整体架构图(来自 Prometheus 官网),展现了Prometheus内部模块及相关的外围组件之间的关系。

图1-9

Prometheus Server负责定时在目标上抓取metrics(指标)数据,每个抓取目标都需要暴露一个HTTP服务接口用于Prometheus定时抓取。这种调用被监控对象获取监控数据的方式被称为Pull(拉)。Pull方式体现了Prometheus独特的设计哲学与大多数采用了Push(推)方式的监控系统不同。

Pull方式的优势是能够自动进行上游监控和水平监控,配置更少,更容易扩展,更灵活,更容易实现高可用。展开来说就是Pull方式可以降低耦合。由于在推送系统中很容易出现因为向监控系统推送数据失败而导致被监控系统瘫痪的问题,所以通过Pull方式,被采集端无须感知监控系统的存在,完全独立于监控系统之外,这样数据的采集完全由监控系统控制,增强了整个系统的可控性。

Prometheus 通过 Pull 方式采集数据,那么它如何获取监控对象呢?Prometheus支持两种方式:第1种是通过配置文件、文本文件等进行静态配置;第2种是支持ZooKeeper、Consul、Kubernetes等方式进行动态发现,例如对于Kubernetes的动态发现,Prometheus使用Kubernetes的API查询和监控容器信息的变化,动态更新监控对象,这样容器的创建和删除就都可以被Prometheus感知。

Storage通过一定的规则清理和整理数据,并把得到的结果存储到新的时间序列中,这里有两种存储方式。

◎ 一种是本地存储。通过 Prometheus 自带的时序数据库将数据保存到本地磁盘,为了性能考虑,建议使用SSD。但本地存储的容量毕竟有限,建议不要保存超过一个月的数据。

◎ 另一种是远端存储,适用于存储大量监控数据。通过中间层的适配器的转化,目前Prometheus支持OpenTSDB、InfluxDB、Elasticsearch等后端存储,通过适配器实现Prometheus存储的remote write和remote read接口,便可以接入Prometheus作为远端存储使用。如图1-10所示展现了Prometheus当前支持的远端数据库。

图1-10

Prometheus通过PromQL和其他 API可视化地展示收集的数据。Prometheus支持多种方式的图表可视化,例如Grafana、自带的PromDash及自身提供的模版引擎等。Prometheus还提供HTTP API查询方式,自定义所需要的输出。

Prometheus通过Pull方式拉取数据,但某些现有系统是通过 Push方式实现的,为了接入这些系统,Prometheus提供了对 PushGateway的支持,这些系统主动推送metrics到PushGateway,而Prometheus只是定时去Gateway上抓取数据。

AlertManager 是独立于 Prometheus 的一个组件,在触发了预先设置在Prometheus 中的高级规则后,Prometheus 便会推送告警信息到 AlertManager。AlertManager提供了十分灵活的告警方式,可以通过邮件、slack或者钉钉等途径推送。并且 AlertManager支持高可用部署,为了解决多个AlertManager重复告警的问题,引入了Gossip,在多个AlertManager之间通过Gossip同步告警信息。

AlertManager的整体工作流程如图1-11所示。

图1-11