服务简介

Prometheus 是由 SoundCloud 使用 Go 语言开发的 时序数据库(简称 TSDB,时序数据指在一定时间内,通过重复测量而获得观测值的集合。如果将数据绘制在图形上,就会有一个数据轴和一个时间轴),是 Google BorgMon 监控系统的开源版本(Borg 的开源实现是 Kubernetes)。

2016 年 5 月云原生基金会(CNCF,Cloud Native Computing Foundation)将 Prometheus 纳入其下第二大开源项目(Kubernetes 第一)。

同年 6 月正式发布 1.0 版本,2017 年底发布了基于全新存储层的 2.0 版本,能更好地与容器平台、云平台配合。

java prometheus 数据多副本 prometheus 数据库_数据

监控的目标

在《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 支持。

生态组件

java prometheus 数据多副本 prometheus 数据库_数据_02

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 可以直接使用。

它的主要服务过程如下:

  1. Prometheus Server 负责定时去目标暴露的 HTTP 服务的接口抓取 metrics 指标数据。
  • 支持通过配置文件、文本文件、Zookeeper 等方式指定抓取目标。
  • 采用 Pull 的方式进行监控,服务器可直接通过目标提供的接口 Pull 数据。
  • 也可以通过 PushGateway,由 Client 主动推送 metrics 到 PushGateway,然后定时去 Gateway 上抓取数据。
  1. 在本地存储抓取的所有数据,然后通过一定规则进行清理和整理数据,并把结果存储到新的时间序列中。
  2. 通过 PromQL 和其他 API 可视化地展示收集的数据。
  • 支持很多方式的图表可视化,例如 Grafana、自带的 Promdash 以及自身提供的模版引擎等。
  • 提供 HTTP API 的查询方式,自定义所需要的输出。
  1. 使用 Alertmanager 提供十分灵活的报警方式。