介绍
Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。
作为新一代的监控框架,Prometheus 具有以下特点:
- 强大的多维度数据模型:
- 时间序列数据通过 metric 名和键值对来区分。
- 所有的 metrics 都可以设置任意的多维标签。
- 数据模型更随意,不需要刻意设置为以点分隔的字符串。
- 可以对数据模型进行聚合,切割和切片操作。
- 支持双精度浮点类型,标签可以设为全 unicode。
- 灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个metrics 进行乘法、加法、连接、取分数位等操作。
- 易于管理:Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。
- 高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。
- 使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。
- 可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。
- 可以通过服务发现或者静态配置去获取监控的 targets。
- 有多种可视化图形界面。
- 易于伸缩。
需要指出的是,由于数据采集可能会有丢失,所以 Prometheus 不适用对采集数据要 100% 准确的情形。但如果用于记录时间序列数据,Prometheus 具有很大的查询优势,此外,Prometheus 适用于微服务的体系架构。
架构
Prometheus 的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面。
- Prometheus Server: 用于收集和存储时间序列数据。
- Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus Server。当 Prometheus Server 来 pull 时,直接返回实时状态的 metrics。
- Pushgateway: 主要用于短期的 jobs。Jobs 可以直接向Pushgateway 推送它们的 metrics,Prometheus Server定期从 Pushgateway pull 数据。
- Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。
- Alertmanager: 从 Prometheus Server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
- 一些其他的工具。
工作流程
- Prometheus Server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus Server 中拉 metrics。
- Prometheus Server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
- Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
- 在图形界面中,可视化采集数据。
说明
按照官方文档的说明部署 Prometheus 监控报警框架,本文主要介绍使用 Prometheus 客户端库实现监控,即指标计算,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus Server。Prometheus Server 获取 metrics 主要有两种途径:
- Prometheus Server 来 pull 时,Exporters 用于暴露已有的第三方服务的 metrics ,直接返回实时状态的 metrics;
- 主要用于短期的 jobs,由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,jobs 可以直接向 Pushgateway 推送它们的 metrics,而 Prometheus Server 定期从 Pushgateway pull 数据。这种方式主要用于服务层面的 metrics,对于机器层面的 metrics,需要使用 node exporter,但使用 Pushgateway 存在单点故障问题。
Prometheus 监控报警框架的核心部分使用Go语言开发。编译后的Prometheus 是一个单独的二进制文件,可以直接在本地工作,无需安装依赖库(并不是所有Go语言开发的系统都不需要依赖库)。
对于第一种途径,官方网站已提供多种 node exporter,如监控 MySQL 数据库的 node exporter。另外,可以根据需求使用客户端库做定制的开发。
对于第二种途径,需要根据需求使用客户端库做定制开发,jobs 可以直接向 Pushgateway 推送它们的 metrics,而 Prometheus Server 定期从 Pushgateway pull 数据。
可以使用 Grafana 替代 Prometheus 原生 Web UI 实现数据可视化。
示例
示例程序使用客户端库实现了将 Gauge 指标推送至 Pushgateway 的功能。
# -*- coding: utf-8 -*-
from __future__ import print_function
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
import ConfigParser
import argparse
import os
class Monitor(object):
push_gateway_url = u"ip:port"
def __init__(self):
pass
def get_monitor_data(self):
data = None
return data
def push_monitor_data(self, data):
registry = CollectorRegistry(auto_describe=False)
g = Gauge(..., registry=registry)
g.labels(...).set(data)
push_to_gateway(Monitor.push_gateway_url, job=u"monitor", registry=registry)
def main(config):
m = Monitor()
data = m.get_monitor_data()
if data:
m.push_monitor_data(data)
else:
print(u"Get data failed.")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=u"监控")
parser.add_argument('--what', type=str, default=u"what", help=u"what")
config = parser.parse_args()
main(config)