Prometheus 是一个开源的系统监控和警报工具包,最初由 SoundCloud 构建。自 2012 年创建以来,许多公司和组织已经采用了 Prometheus,该项目拥有非常活跃的开发者和用户社区。现在,Prometheus 是一个独立的开源项目,独立于任何公司进行维护。为了强调这一点,并阐明项目的治理结构,Prometheus 于 2016 年加入了云原生计算基金会(Cloud Native Computing Foundation,简称 CNCF),成为继 Kubernetes 之后的第二个托管项目。
Prometheus 的特点
Prometheus 的主要特点包括:
- 多维数据模型:通过指标名称和键/值对来标识时间序列数据。
- PromQL:一种灵活的查询语言,利用这种多维性。
- 不依赖分布式存储:单个服务器节点是自治的。
- 通过 HTTP 的拉取模型:用于时间序列数据收集。
- 推送时间序列:通过中介网关支持。
- 通过服务发现或静态配置发现目标。
- 多种图形和仪表板支持模式。
什么是指标?
指标是通俗术语中的数值测量。术语“时间序列”指的是随时间记录的变化。用户想要测量的内容因应用程序而异。对于 Web 服务器,它可能是请求时间;对于数据库,它可能是活动连接数或活动查询数,等等。
指标在理解应用程序为何以某种方式工作方面扮演着重要角色。假设你正在运行一个 Web 应用程序,并发现它运行缓慢。为了了解你的应用程序发生了什么,你需要一些信息。例如,当请求数量很高时,应用程序可能会变慢。如果你有请求计数指标,你可以确定原因并增加服务器数量以处理负载。
组件
Prometheus 生态系统由多个组件组成,其中许多是可选的:
- 主要的 Prometheus 服务器,用于抓取和存储时间序列数据。
- 用于仪器化应用程序代码的 客户端库。
- 用于支持短期作业的 推送网关。
- 用于服务如 HAProxy、StatsD、Graphite 等的专门 导出器。
- 用于处理警报的 alertmanager。
- 各种支持工具。
大多数 Prometheus 组件都是用 Go 编写的,这使得它们易于构建和部署为静态二进制文件。
架构
这个图表说明了 Prometheus 及其一些生态系统组件的架构:
Prometheus 从经过仪器化的作业中抓取指标,对于短期作业,可以直接抓取或通过中介推送网关。它在本地存储所有抓取的样本,并在此数据上运行规则,以从现有数据中聚合并记录新的时序数据或生成警报。Grafana 或其他 API 消费者可用于可视化收集的数据。
何时适用?
Prometheus 适用于记录任何纯数值时间序列。它适用于机器中心监控以及高度动态的面向服务的架构监控。在微服务的世界中,它对多维数据收集和查询的支持是一个特别的强项。
Prometheus 旨在可靠,是在停机期间让你快速诊断问题的那个系统。每个 Prometheus 服务器都是独立的,不依赖于网络存储或其他远程服务。当其他基础设施部分出现故障时,你可以依赖它,而且你不需要设置广泛的基础设施即可使用它。
何时不适用?
Prometheus 重视可靠性。即使在故障条件下,你总是可以查看有关系统的可用统计信息。如果你需要 100% 的准确性,例如按请求计费,Prometheus 不是一个好选择,因为收集的数据可能不够详细和完整。在这种情况下,你最好使用其他系统来收集和分析计费数据,而 Prometheus 用于其余的监控。