服务简介
Prometheus 是由 SoundCloud
使用 Go
语言开发的 时序数据库
(简称 TSDB
,时序数据指在一定时间内,通过重复测量而获得观测值的集合。如果将数据绘制在图形上,就会有一个数据轴和一个时间轴),是 Google BorgMon
监控系统的开源版本(Borg 的开源实现是 Kubernetes)。
2016 年 5 月云原生基金会(CNCF
,Cloud Native Computing Foundation)将 Prometheus 纳入其下第二大开源项目(Kubernetes 第一)。
同年 6 月正式发布 1.0 版本,2017 年底发布了基于全新存储层的 2.0 版本,能更好地与容器平台、云平台配合。
监控的目标
在《SRE: Google运维解密》一书中有提到,监控系统需要能够有效的支持 白盒
监控和 黑盒
监控。
通过白盒监控,能够了解其内部的实际运行状态,通过对监控指标的观察能够预判可能出现的问题,从而对潜在的不确定因素进行优化。
通过黑盒监控,比如 HTTP 探针,TCP 探针等,可以在系统或服务在发生故障时快速通知相关的人员进行处理。
一个完善的监控体系需要实现以下几个功能:
- 长期趋势分析
- 通过对监控样本数据的持续收集和统计,实现趋势分析。例如通过对磁盘空间增长率情况的分析,判断需要对资源进行扩容调整的时间。
- 对照分析
- 通过监控实现对系统的跟踪和比较,比如两个版本的系统运行资源使用情况的差异如何。
- 告警
- 当系统出现或即将出现故障时,监控系统能够迅速反应并通知管理员,从而对问题进行快速的处理或提前预防,避免影响业务。
- 故障分析与定位
- 当问题发生后,需要对问题进行调查和处理。通过对不同监控以及历史数据的分析,能够找到并解决根源问题。
- 数据可视化
- 通过可视化仪表盘能够直接获取系统的运行状态、资源使用情况、以及服务运行状态等直观的信息。
优势特点
与传统的监控软件,比如 Nagios,Zabbix 相比,Prometheus 主要包含以下几个特点:
- 易于管理
- Prometheus 是 Go 语言开发的,这意味着核心部分只有一个单独的二进制文件,不存在任何的第三方依赖,部署方便。
- 基于 Pull 模型的架构方式,可以在任何地方搭建。
- 可以通过 Prometheus 的服务发现(Service Discovery)能力动态管理监控目标。
- 易于集成和获取监控服务的内部运行状态
- 丰富的 Client 库,易于在应用程序中添加对 Prometheus 的支持,从而轻松的获取到服务和应用内部真正的运行状态。
- 良好的开放性使得 Client 库还能输出其它监控系统的格式化数据,不仅局限于 Prometheus。
- 强大的数据模型
- 监控数据以指标(metric)的形式保存在时间序列数据库中。除指标名称外,数据还包含一组用于描述特征的标签。用于实现对监控数据的聚合,过滤,裁剪。
- 强大的查询语言 PromQL
- 可以通过 PromQL 实现对监控数据的查询、聚合、数据可视化以及告警。
- 高效可扩展
- 能够处理数以百万的监控指标,并且可以通过分区(sharding)+ 联邦集群(federation)部署逻辑集群。
- 可视化
- 自带了一个 Prometheus UI,方便直接对数据进行查询,支持图形化展示。
- 提供了独立的基于 Ruby On Rails 的 Dashboard 解决方案 Promdash。
- 可视化工具 Grafana 也提供了完整的 Prometheus 支持。
生态组件
Prometheus 生态圈包含多个组件:
-
Pormetheus Server
:收集和存储时间序列数据,提供 PromQL 语言,实现对数据查询分析,内置的 Express Browser UI 提供了数据的可视化。 -
client Library
:客户端库,用于提供更便捷的开发途径。 -
Push Gateway
:用于接收短期作业生成的指标数据的网关。 -
Exporters
:用于暴露现有的应用程序或服务的指标数据给 Server 或者 Push Gateway。 -
Alertmanager
:从 Server 接收告警通知然后去发送告警信息。 -
Data Visualization
:图像化展示数据,如 Grafana,Dashboard UI 这种。
基本原理
通过 HTTP 协议周期性抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口就可以接入监控,不需要任何 SDK 或者其他的集成过程。
这种方式非常适合做虚拟化环境监控系统,比如 VM、Docker、Kubernetes 等。
输出被监控组件信息的 HTTP 接口被叫做 exporter
。目前常用的组件大部分都有现成的 exporter 可以直接使用。
它的主要服务过程如下:
- Prometheus Server 负责定时去目标暴露的 HTTP 服务的接口抓取 metrics 指标数据。
- 支持通过配置文件、文本文件、Zookeeper 等方式指定抓取目标。
- 采用 Pull 的方式进行监控,服务器可直接通过目标提供的接口 Pull 数据。
- 也可以通过 PushGateway,由 Client 主动推送 metrics 到 PushGateway,然后定时去 Gateway 上抓取数据。
- 在本地存储抓取的所有数据,然后通过一定规则进行清理和整理数据,并把结果存储到新的时间序列中。
- 通过 PromQL 和其他 API 可视化地展示收集的数据。
- 支持很多方式的图表可视化,例如 Grafana、自带的 Promdash 以及自身提供的模版引擎等。
- 提供 HTTP API 的查询方式,自定义所需要的输出。
- 使用 Alertmanager 提供十分灵活的报警方式。