Prometheus之终极指南(The Ultimate Guide to Prometheus)
Prometheus之终极指南
Prometheus 彻底改变了我们在现代 DevOps 生态系统中监控基础设施、应用程序和服务的方式。它不仅仅是一个工具;它是一个由指标收集、告警和实时监控组成的生态系统,受到 Uber、Google 和 SoundCloud 等组织的信任。在本文中,我们将探讨 Prometheus,包括其架构、高级用例和实际应用。通过本文,您不仅将了解 Prometheus 的工作原理,还将学会如何在项目中有效实施它。让我们开始吧!
什么是 Prometheus?
Prometheus 是一个开源的系统和服务的监控系统,最初由 SoundCloud 于 2012 年构建。自诞生以来,它已成为 云原生计算基金会 (CNCF) 的基石,与其他关键工具如 Kubernetes、Fluentd 和 Helm 并列。Prometheus 的受欢迎程度源于其在监控基础设施和应用程序指标方面的简单性、灵活性和可扩展性。它提供了强大的功能,包括:
-
收集和存储 时间序列指标,
-
实时查询数据,
-
告警和通知,
-
可视化(使用 Grafana 等工具)。
为什么选择 Prometheus?
Prometheus 是一个用于监控和可观测性的系统,提供了一个创新、强大且灵活的框架,专为复杂的云原生环境设计。随着现代基础设施的规模呈指数级增长,传统的监控工具往往在动态工作负载和分布式系统的压力下表现不佳。然而,Prometheus 重新定义了时间序列数据的收集、存储、查询和可视化方式,与 DevOps 理念无缝契合。
Prometheus 的关键特性和优势
-
基于拉取的监控:与传统的推送数据监控工具不同,Prometheus 使用拉取模型,使其更高效和可扩展。Prometheus 坚持 拉取模型,与推送导向的监控系统有所不同。Prometheus 服务器主动从目标系统暴露的指定端点定期抓取指标。
-
**强大的查询语言 (PromQL)**:Prometheus 查询语言 (PromQL) 使工程师和操作员能够从原始时间序列数据中提取有意义的见解。其表达式语法支持实时查询、数学计算和跨多维指标的动态告警。它允许您对指标进行切片和切块,以获得深入的洞察,并支持复杂的查询用于告警和仪表板。
-
可扩展性:可扩展性是 Prometheus 设计理念的核心,解决了监控大量 时间序列数据 的基本需求,既高效又精确。时间序列数据本质上是时间相关的,记录了系统的状态,如 CPU 利用率、磁盘 I/O 或网络延迟,并定期进行记录。随着数据集的增长,传统的监控系统可能会不堪重负,但 Prometheus 的架构决策确保了企业级工作负载的无缝扩展。
Prometheus 架构组件
Prometheus 的架构由多个组件协同工作,以收集、存储、处理和可视化指标。以下是关键组件的详细介绍:
Prometheus 架构的关键组件
1. Prometheus 服务器
Prometheus 服务器是 Prometheus 生态系统的核心。它执行三个主要任务:
-
数据收集:Prometheus 通过 HTTP 定期从目标端点或导出器抓取指标。
-
数据存储:它将收集到的指标存储在其本地的 时间序列数据库 (TSDB) 中,该数据库针对快速读写进行了优化。
-
查询处理:Prometheus 使用 PromQL(Prometheus 查询语言)处理查询,以提取和分析存储的数据。
Prometheus 服务器使用 拉取模型 来检索指标,定期抓取暴露指标的目标端点(例如 /metrics
)。
2. 数据模型
Prometheus 使用 多维数据模型 来高效存储和组织指标。
-
时间序列:指标作为时间序列数据存储,每个数据点都有一个 时间戳 和一个 值。
-
指标名称和标签:每个时间序列由一个 指标名称 和一组 键值对(标签) 标识。
指标示例:
http_requests_total{method="GET", status="200"}
-
指标名称:
http_requests_total
(表示 HTTP 请求总数) -
标签:
method="GET", status="200"
-
值:表示特定时间戳的指标的数值。
标签使 Prometheus 能够区分指标的不同维度,使数据模型高度灵活且可查询。
3. 时间序列数据库 (TSDB)
Prometheus 使用其本地的 时间序列数据库 来存储收集到的指标。TSDB 在追加新数据和快速查询现有数据方面非常高效。
-
存储机制:数据以块的形式存储,以实现高效的内存和磁盘使用。
-
内存索引:将指标名称和标签映射到相应的时间序列。
-
保留期:Prometheus 允许配置数据保留期。对于长期存储,可以使用 Thanos 或 Cortex 等工具扩展 Prometheus 的存储能力。
TSDB 的设计确保了大规模系统中读写的高性能。
4. 导出器
并非所有系统都原生暴露 Prometheus 格式的指标。导出器 通过将指标转换为 Prometheus 兼容的数据来填补这一空白。导出器是轻量级进程,将各种系统或应用程序的指标暴露为 Prometheus 可以抓取的格式。导出器通过 HTTP 端点暴露指标,Prometheus 可以抓取这些端点。
常见导出器:
-
Node Exporter:暴露系统级指标(CPU、内存、磁盘使用情况)。
-
Blackbox Exporter:测试外部端点的正常运行时间和延迟。
-
MySQL Exporter:从 MySQL 数据库收集指标。
-
应用程序特定导出器:适用于数据库、Web 服务器或自定义应用程序。
5. 服务发现
Prometheus 使用 服务发现 动态定位和监控目标,而无需手动配置。这在动态环境(如 Kubernetes、Consul 或静态配置)中特别有用。
服务发现方法:
-
静态配置:目标在配置文件中手动指定。
动态服务发现:
-
Kubernetes:发现 Pod、服务和端点。
-
云提供商:AWS、Azure 和 GCP 服务发现。
服务发现使 Prometheus 能够适应不断变化的环境,并确保目标始终是最新的。
6. 指标抓取
Prometheus 采用 拉取模型 来收集指标:
-
它以配置的间隔从目标端点抓取指标。
-
目标在 HTTP 端点上暴露指标,通常是
/metrics
。
指标端点示例:
# HELP http_requests_total Total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="GET", status="200"} 12345
-
Prometheus 获取上述数据并将其作为时间序列存储在 TSDB 中。
拉取模型确保更好地控制数据收集间隔,并使调试更加简单。
7. PromQL(Prometheus 查询语言)
用于无法直接抓取的短期作业或批处理过程的组件。Prometheus 提供了 PromQL,一种专门为时间序列数据分析设计的查询语言。PromQL 允许用户提取、过滤和聚合指标。
PromQL 功能:
-
时间序列选择:使用标签检索特定指标。
-
聚合:应用
sum()
、avg()
、count()
等函数。 -
速率计算:使用
rate()
等函数进行基于时间的更改。 -
过滤:基于特定标签值进行查询。
示例查询:
1. 基本查询:
http_requests_total
2. 返回指标的所有时间序列:
http_requests_total
3. 速率计算:
rate(http_requests_total[5m])
4. 按标签聚合:
sum(rate(http_requests_total[5m])) by (method)
8. Alertmanager
Prometheus 与 Alertmanager 集成,以处理和路由告警。Alertmanager 处理由 Prometheus 告警规则触发的告警。
global:resolve_timeout: 5m
route:receiver: 'team-X-mails'group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 3h
receivers:- name: 'team-X-mails'email_configs:- to: 'team-X+alerts@example.org'from: 'alertmanager@example.org'smarthost: 'smtp.example.org:587'auth_username: 'alertmanager@example.org'auth_identity: 'alertmanager@example.org'auth_password: 'password'
Alertmanager 功能:
-
去重:防止重复告警使系统过载。
-
分组:将相似的告警分组以便于管理。
-
路由:将通知告警发送到指定的接收者(例如电子邮件、Slack、PagerDuty)。
-
静音:暂时静音告警。
工作流程:
-
Prometheus 评估告警规则。
-
如果满足条件,则生成告警并发送至 Alertmanager。
-
Alertmanager 将告警路由到配置的通知渠道。
9. 可视化
Prometheus 支持基本的 表达式浏览器 用于查询指标。对于更高级的可视化,它与 Grafana 无缝集成。
-
Grafana:广泛使用的 Prometheus 数据可视化工具。
-
Prometheus 作为数据源添加到 Grafana 中。
-
仪表板可以使用 PromQL 查询显示实时指标和趋势。
Grafana 提供了灵活且视觉上吸引人的仪表板,用于分析指标和系统性能。
10. Pushgateway(可选)
虽然 Prometheus 主要使用 拉取模型,但 Pushgateway 用于无法持续暴露指标的系统(例如批处理作业)。
-
系统将其指标推送到 Pushgateway。
-
Prometheus 抓取 Pushgateway 以收集指标。
Pushgateway 对于 短期作业 和拉取模型不可行的环境非常有用。
Prometheus 的工作原理
1. 数据收集(抓取)
-
Prometheus 定期从配置的目标(例如导出器、应用程序)通过 HTTP 抓取指标。
-
目标以特定格式(通常是纯文本或 OpenMetrics 格式)暴露指标。
2. 数据存储
-
抓取的指标存储在 Prometheus 的时间序列数据库中。
-
每个指标作为时间序列存储,由唯一的指标名称和可选的键值对(标签)标识。
3. 查询和分析
-
用户使用 PromQL 查询存储的指标。
-
PromQL 允许进行复杂的查询,如聚合、过滤和数学操作,以分析数据。
4. 告警
-
Prometheus 定期评估告警规则。
-
如果满足规则条件,则触发告警并发送至 Alertmanager。
-
Alertmanager 处理告警并将其发送到配置的渠道。
5. 可视化
-
可以使用 Grafana 等工具可视化指标,Grafana 将 Prometheus 作为数据源连接。
-
仪表板提供了对系统性能、趋势和异常的洞察。
设置 Prometheus
安装
要开始使用,您可以从 官方网站[1] 下载最新的 Prometheus 版本。解压 tarball 并运行 Prometheus 服务器:
tar xvfz prometheus-*.tar.gz
cd prometheus-*
./prometheus --config.file=prometheus.yml
配置
prometheus.yml
文件是 Prometheus 配置的核心。以下是一个基本示例:
global:scrape_interval: 15s
scrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090']
服务发现
Prometheus 支持多种服务发现机制,如 Kubernetes、Consul 等。以下是 Kubernetes 服务发现的示例:
scrape_configs:- job_name: 'kubernetes-pods'kubernetes_sd_configs:- role: pod
Prometheus 的高级功能
导出器:扩展指标收集
导出器对于将第三方系统与 Prometheus 集成至关重要。例如,node_exporter
收集由 *NIX 内核暴露的硬件和操作系统指标。
wget https://github.com/prometheus/node_exporter/releases/download/v*/node_exporter-*.linux-amd64.tar.gz
tar xvfz node_exporter-*.linux-amd64.tar.gz
cd node_exporter-*
./node_exporter
将 node_exporter 添加到您的 Prometheus 配置中:
scrape_configs:- job_name: 'node_exporter'static_configs:- targets: ['localhost:9100']
监控 Kubernetes 集群
Kubernetes 是一个流行的编排平台,Prometheus 常用于监控其健康和性能。kube-prometheus
项目提供了一组全面的清单,用于监控 Kubernetes 集群。
1. 安装 kube-prometheus:
kubectl apply -f https://github.com/prometheus-operator/kube-prometheus/releases/download/v0.*/manifests-*.yaml
2. 访问 Prometheus:
kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090
监控微服务
在微服务架构中,监控单个服务及其交互至关重要。Prometheus 可以与各种微服务框架(如 Spring Boot、Django 等)集成。
1. Spring Boot 集成:
将 micrometer-registry-prometheus
依赖项添加到您的 pom.xml
中:
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
2. 暴露指标:
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
@BeanMeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {return registry -> registry.config().commonTags("application", "my-app");}
}
Prometheus 中的指标
在 Prometheus 中,指标是收集和存储的基本数据点。它们代表了关于您的服务、硬件和应用程序的各种类型的测量。Prometheus 指标有助于监控和分析系统的性能和健康状况。
Prometheus 中的指标类型
Prometheus 支持四种指标类型:
-
计数器:计数器是一种随时间递增的指标。它表示一个累积值,永远不会减少(例如,Web 服务器处理的请求数量或发生的错误数量)。
-
仪表:仪表是一种可以随时间上下波动的指标。它表示一个可以增加或减少的值(例如,当前内存使用量、温度或活动连接数)。
-
直方图:直方图对观察值(通常是持续时间或大小)进行分桶,并提供每个桶中的观察计数以及所有观察值的总和。这允许计算平均值、百分位数和其他统计指标。
-
摘要:摘要类似于直方图,因为它跟踪观察值并可以提供统计信息,例如分位数(例如,请求持续时间的第 95 百分位)。与直方图不同,摘要预先计算分位数(例如 0.5、0.9 和 0.99),这在某些用例中更高效。
在实践中,计数器 和 仪表 最常用于跟踪一般指标,而 直方图 和 摘要 更专业,用于处理分布或统计数据。根据用例,您可能会选择一种以获得最佳性能和分析便利性。
结论:
Prometheus 已成为现代分布式系统中可观测性的基石,提供了无与伦比的可扩展性、可靠性和分析能力。其拉取架构、PromQL 查询语言、Alertmanager、导出器以及与 Kubernetes 和 Grafana 的无缝集成,使其成为云原生监控策略的关键组件。
对于 DevOps 从业者来说,Prometheus 不仅仅是一个监控工具;它是系统弹性、性能优化和主动异常检测的推动者。随着软件架构变得越来越动态,Prometheus 已准备好应对未来基础设施的挑战。
❝准备好通过 Prometheus 增强您的可观测性了吗? 下载 Prometheus 并开始监控您的基础设施。将其与 Grafana 配对以创建仪表板,并与 Alertmanager 配对以进行主动告警。