Prometheus:云原生时代的监控利器
在当今快速发展的云原生和微服务架构时代,传统的监控系统面临着巨大的挑战:如何高效地收集海量、动态变化的指标?如何实时告警并快速定位问题?如何实现灵活的可视化和强大的数据查询能力?Prometheus,作为 CNCF(云原生计算基金会)的毕业项目,凭借其强大的功能和云原生友好的设计,已成为监控领域的事实标准。
本文将带你深入了解 Prometheus 的核心概念、架构、优势以及如何快速上手。
一、什么是 Prometheus?
Prometheus 是一个开源的系统监控和告警工具包,最初由 SoundCloud 开发,并于 2016 年加入 CNCF。它特别适用于记录任意纯数字时间序列数据,即按时间顺序记录的数值。
核心特点:
- 多维数据模型: 数据由指标名称(metric name)和键值对(标签/labels)唯一标识。例如:
http_requests_total{method="POST", endpoint="/api/users", status="200"}
。这种模型使得查询和聚合极其灵活。 - 灵活的查询语言(PromQL): Prometheus Query Language (PromQL) 允许用户以强大的方式选择和聚合时间序列数据。
- 不依赖分布式存储: 单个 Prometheus 服务器是自治的,本地存储其抓取的所有数据,无需依赖外部存储(如 HDFS)。
- 通过 HTTP 拉取(Pull)模式收集数据: Prometheus 周期性地从配置的目标(targets)的 HTTP 接口拉取(scrape)指标数据。这与传统的推送(Push)模式(如 StatsD)不同。
- 服务发现: 支持动态发现监控目标,与 Kubernetes、Consul、etcd 等集成,自动管理目标列表。
- 强大的告警功能: 通过
Alertmanager
组件,支持基于 PromQL 的复杂告警规则,并能对告警进行分组、抑制、静默和路由到多种通知渠道(邮件、Slack、PagerDuty 等)。 - 图形化和仪表板: 虽然自带简单的图形界面,但通常与 Grafana 等专业可视化工具集成,创建丰富的仪表板。
二、Prometheus 核心组件与架构
一个典型的 Prometheus 监控系统包含以下核心组件:
-
Prometheus Server: 核心组件,负责:
- 抓取(Scraping): 从配置的 HTTP endpoints 拉取指标数据。
- 存储(Storage): 将收集到的时间序列数据存储在本地磁盘。
- 查询(Querying): 通过 PromQL 提供数据查询接口。
- 规则处理(Rule Processing): 计算预定义的记录规则(Recording Rules)和告警规则(Alerting Rules)。
-
Exporters: 这是 Prometheus 生态的关键。由于 Prometheus 本身不直接监控应用程序,需要由 Exporter 将第三方系统的指标暴露为 Prometheus 可读的格式(通常是
/metrics
的 HTTP 端点)。- 官方/社区 Exporter: 如
node_exporter
(监控主机)、mysqld_exporter
(MySQL)、redis_exporter
(Redis)、blackbox_exporter
(黑盒探测) 等。 - 应用内嵌 Exporter: 许多现代应用(如 Kubernetes 组件、etcd)直接内置了 Prometheus metrics 端点。
- 官方/社区 Exporter: 如
-
Pushgateway: 用于处理来自短生命周期作业(如批处理任务、Cron Jobs)的指标。这些作业在 Prometheus 完成抓取前可能已经结束,因此需要先将指标推送到 Pushgateway,再由 Prometheus 从 Pushgateway 拉取。
-
Alertmanager: 专门处理由 Prometheus Server 发送的告警。它负责:
- 去重(Deduplication)
- 分组(Grouping)
- 路由(Routing)到正确的接收者
- 抑制(Inhibition)
- 静默(Silences)
- 发送通知(通过邮件、Webhook、Slack 等)
-
客户端库(Client Libraries): 用于在应用程序代码中直接暴露自定义指标(如计数器 Counter、仪表 Gauge、直方图 Histogram、摘要 Summary)。支持多种语言(Go, Java, Python, Ruby, .NET 等)。
-
可视化工具(如 Grafana): 虽然不是 Prometheus 的一部分,但 Grafana 是最流行的与 Prometheus 集成的可视化平台,用于创建交互式仪表板。
[应用程序/服务] --> (通过客户端库暴露指标 或 Exporter)|v[Prometheus Server]/ \/ \(抓取数据) / \ (发送告警)/ \v v[本地时间序列数据库] [Alertmanager]| || v| [通知渠道 (邮件, Slack...)]|v[Grafana (可视化)]
三、快速上手:部署一个简单的 Prometheus
1. 下载并运行 Prometheus
# 下载 Prometheus (以 Linux 为例)
wget https://github.com/prometheus/prometheus/releases/download/v2.50.0/prometheus-2.50.0.linux-amd64.tar.gz
tar xvfz prometheus-2.50.0.linux-amd64.tar.gz
cd prometheus-2.50.0.linux-amd64/# 查看配置文件 (prometheus.yml)
# 默认配置会监控自己
cat prometheus.yml# 启动 Prometheus
./prometheus --config.file=prometheus.yml
Prometheus 默认在 http://localhost:9090
提供 Web UI。
2. 配置监控目标
编辑 prometheus.yml
,添加一个 node_exporter
目标:
global:scrape_interval: 15s # 默认抓取间隔scrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090'] # 监控 Prometheus 自身- job_name: 'node' # 监控主机static_configs:- targets: ['your-server-ip:9100'] # 假设 node_exporter 运行在 9100 端口
重启 Prometheus 服务,访问 Web UI 的 Status
-> Targets
页面,应该能看到新的目标处于 UP
状态。
3. 使用 PromQL 查询
在 Prometheus Web UI 的 Graph
标签页,尝试一些简单的 PromQL 查询:
up{job="node"}
:查看node
任务的监控目标是否在线(1=在线,0=离线)。node_memory_MemAvailable_bytes{job="node"}
:查看主机可用内存。rate(node_cpu_seconds_total{job="node",mode="idle"}[5m])
:计算过去 5 分钟 CPU 空闲时间的平均使用率(注意:idle 时间减少代表 CPU 使用增加)。node_filesystem_avail_bytes{job="node",mountpoint="/"} / node_filesystem_size_bytes{job="node",mountpoint="/"}
:计算根分区的可用空间百分比。
4. 集成 Grafana
- 安装并启动 Grafana。
- 在 Grafana 中添加 Prometheus 作为数据源(URL:
http://<your-prometheus-host>:9090
)。 - 导入或创建仪表板。例如,导入
Node Exporter Full
仪表板 (ID: 1860) 可以全面监控主机状态。
prometheus doc
prometheus与k8s的结合
真实的生产环境往往很复杂,并不能通过单一的prometheus解决整个系统的监控,因此这里推荐一个工业级别的项目
kube-prometheus
接下来对于prometheus的学习也是基于kube-prometheus开源库进行的,可以这样说,只要你把这个库掌握了你就可以直接去找与prometheus相关的工作了