认识
一、认识
Prometheus
是一个开源的监控与告警系统,专为现代分布式系统和微服务架构设计。它最初由 SoundCloud
开发,并且现在已经成为 CNCF
(云原生计算基金会)的一部分。Prometheus
的核心功能包括:
-
数据采集:周期性从目标系统收集时序数据(如
CPU
使用率、内存占用、请求次数等)。 -
数据存储:使用时序数据库(
TSDB
)存储这些数据。 -
数据查询:提供强大的查询语言(
PromQL
)来查询和分析存储的数据。 -
可视化:集成了与
Grafana
等工具兼容的可视化功能,能够生成仪表盘。 -
告警管理:内置了告警规则,可以触发报警并与外部系统(如
Alertmanager
)进行集成。
Prometheus
作为一个现代化的监控系统,能够通过拉取模型实时收集数据、使用高效的时序数据库存储数据,并且提供强大的查询与告警能力。其数据库的特点包括高效的压缩、列式存储和面向时序数据的优化,使其在处理大规模、长时间存储的监控数据时表现出色。
二、工作
Prometheus
的工作流程可以分为以下几个主要步骤:
-
数据采集(数据抓取)
-
数据存储
-
数据查询与分析
-
可视化与告警
2.1 数据采集
Prometheus
是一个 拉模式(Pull-based
) 监控系统, 使用 拉取(Pull
) 模型来收集监控数据。它会周期性地主动从目标应用中拉取数据,而不是像传统的推模式监控系统(Push-based
)那样由目标主动将数据推送到监控系统。每个被监控的系统或服务暴露一个 HTTP
服务,提供一个特定的端点(通常是 /metrics``),Prometheus
就会通过 HTTP
请求获取该端点的数据。
-
这些端点返回的数据通常是以
Prometheus
格式(类似于key-value
的文本格式)暴露的指标。 -
采集间隔通常为每隔
15
秒到1
分钟。 -
Prometheus
不依赖外部代理或者推送机制(虽然也可以通过Pushgateway
等工具间接支持推送)。 -
通过周期性抓取,
Prometheus
可以保持较高的数据完整性,避免由于目标系统自身的故障而导致的监控数据丢失。
Prometheus
支持多种数据抓取方式:
-
静态配置:可以通过配置文件列出目标地址。
-
服务发现:支持与各种服务发现机制(如
Kubernetes
、Consul
、EC2
)集成,动态获取目标。
2.2 数据存储
Prometheus
使用的是一种 时序数据库(TSDB
)。时序数据库非常适合于存储随时间变化的数据,在存储结构上与传统的关系型数据库有所不同。每次抓取到的指标都会被存储到 TSDB
中,指标数据按时间戳顺序排列。它的核心数据结构包括:
-
时间序列:每个指标(如
cpu_usage
)会有一个或多个时间序列,记录该指标在不同时间点的值。 -
标签(
Labels
):每个时间序列可以通过多个标签来区分不同的实例,例如服务名称、地域、主机名等。 -
时间戳(
Timestamp
):每个数据点都有一个时间戳,表示该值被采集的时刻。
Prometheus
数据库的存储特点:
-
高效存储与压缩:
Prometheus
使用了Tombstone
和Delta Encoding
等技术来减少存储占用。对于相同值的时间序列数据,Prometheus
会采用压缩存储。 -
自适应存储管理:
Prometheus
使用块(Block
)来组织存储。每个块包含了特定时间范围内的所有数据,这些数据会根据设置的保留策略被清理或者压缩。 -
查询优化:由于时序数据的特殊性,
Prometheus
的查询引擎针对时序数据进行了优化,支持高效的时间窗口操作、聚合函数以及多维度的查询。 -
高可扩展性:尽管
Prometheus
是一个单节点系统,但可以通过 联邦(Federation
) 模式将多个Prometheus
实例的数据聚合在一起,实现横向扩展。 -
不可变数据:一旦数据被写入数据库,它是不可变的,这确保了数据的一致性和可靠性,避免了数据被修改或篡改的风险。
2.3 数据查询
Prometheus
提供了强大的查询语言 PromQL(Prometheus Query Language)
,用于从数据库中检索、聚合和处理时序数据。PromQL
允许用户执行复杂的查询,包括但不限于:
-
单一指标的查询
-
多个指标的聚合操作(如求和、平均、最大值等)
-
时间范围和时间函数的计算(如时间窗口、速率、延迟等)
例如,使用 PromQL
可以查询 CPU
使用率的变化趋势,计算每秒请求的数量,甚至进行跨服务的指标关联分析。
2.4 可视化与告警
可视化:Prometheus
自带一些基础的 Web UI
来显示查询结果,但通常会与 Grafana
集成,后者提供了更加丰富和可定制的仪表盘来展示 Prometheus
的监控数据。
告警:Prometheus
允许定义 告警规则,并通过集成的告警管理系统(如 Alertmanager``)来处理触发的告警。Alertmanager
会根据配置将告警通知通过电子邮件、Slack
、PagerDuty
等方式发出。