prometheus监控介绍原创
Prometheus 是一个开源的系统监控和报警工具,最初由SoundCloud开发,现为Cloud Native Computing Foundation的一部分。它特别适用于监控分布式系统和微服务架构。
版本说明
本文写于 2022-03,2026-08 复核。
文中的架构、数据模型与拉取式采集机制在 Prometheus 2.x / 3.x 上均未变。
需要注意的版本差异:Prometheus 3.0(2024-11 发布)改用了新的 Web UI、移除了若干长期弃用的命令行 flag,并默认启用 UTF-8 指标名支持;--storage.tsdb.retention(无后缀)等旧 flag 已删除,请改用 --storage.tsdb.retention.time。文中的下载链接为写作当时的版本号,实际部署请取最新 release。
# Prometheus 的基本架构
Prometheus 的架构由多个组件组成,每个组件可以独立运行。主要组件包括:
Prometheus Server:
- 负责数据采集和存储。
- 通过HTTP拉取方式从各种目标收集时间序列数据。
- 存储收集到的数据并提供查询能力。
Exporters:
- 监控目标的代理程序,用于暴露指标数据。
- 常见的 Exporters 有 Node Exporter(监控主机硬件和操作系统指标)、MySQL Exporter、Redis Exporter等。
Pushgateway:
- 用于短生命周期的作业将指标推送到 Prometheus。
- 例如,批处理作业在完成时将结果发送到 Pushgateway,然后由 Prometheus 拉取这些结果。
Alertmanager:
- 处理来自 Prometheus Server 的警报。
- 支持告警去重、分组和路由,并可以将警报发送到不同的通知渠道(如邮件、Slack、PagerDuty等)。
客户端库:
- 允许用户在自己的应用程序中埋点,生成自定义指标。
- 支持多种编程语言,如Go、Java、Python、Ruby等。
# 数据模型
Prometheus 使用多维数据模型来存储时间序列数据。每个时间序列由唯一的指标名称和一组键值对(标签)标识。标签用于区分不同来源或维度的同一类型指标。
例如:
http_requests_total{method="GET", handler="/api"} 1027 1395066363000
http_requests_total是指标名称。{method="GET", handler="/api"}是标签。1027是指标值。1395066363000是时间戳。
# Prometheus 的工作流程
数据收集: Prometheus Server 定期从配置的目标上拉取数据。这些目标通过 HTTP 暴露指标接口,通常为
/metrics端点。数据存储: Prometheus 使用本地存储将时间序列数据存储在磁盘上。数据采用基于时间的块存储,每个块包含一个时间范围内的所有数据。
数据查询: 使用 PromQL(Prometheus Query Language)进行数据查询。PromQL 是一种功能强大的查询语言,可以聚合、筛选和转换时间序列数据。
警报: Prometheus 根据定义的规则评估数据,并生成警报。警报通过 Alertmanager 发送到相应的通知渠道。
# Prometheus 安装与配置
以下是 Prometheus 的基本安装和配置步骤:
下载并安装 Prometheus:
wget https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.linux-amd64.tar.gz tar xvfz prometheus-2.37.0.linux-amd64.tar.gz cd prometheus-2.37.0.linux-amd641
2
3配置 Prometheus: 编辑
prometheus.yml文件,配置监控目标:global: scrape_interval: 15s # 默认抓取间隔 scrape_configs: - job_name: 'node' static_configs: - targets: ['localhost:9100'] # Node Exporter 目标1
2
3
4
5
6
7启动 Prometheus:
./prometheus --config.file=prometheus.yml1安装 Exporter: 以 Node Exporter 为例,下载并启动 Node Exporter:
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz cd node_exporter-1.3.1.linux-amd64 ./node_exporter1
2
3
4访问 Prometheus: 打开浏览器访问
http://localhost:9090可以看到 Prometheus 的仪表盘,可以进行数据查询和监控配置。
# PromQL 示例
查询一分钟内每秒的 HTTP 请求总数:
rate(http_requests_total[1m])1查询每台主机的 CPU 使用率(百分比):
100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 1001这里有一个高频写错的地方:很多教程写成
avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance),看着合理,结果是错的。node_cpu_seconds_total的标签里既有cpu也有mode,mode!="idle"会保留 user / system / iowait / irq / softirq / steal / nice 共 7 个 mode 的独立时间序列,avg是把这 7 个 mode 求平均,得到的是「单个 mode 的平均占用」,比真实使用率小了约 7 倍。正确的思路只有两种:一是像上面那样用
1 - idle(idle 只有一个 mode,avg跨的是 CPU 核,语义正确);二是显式做比值:sum by (instance) (rate(node_cpu_seconds_total{mode!="idle"}[5m])) / sum by (instance) (rate(node_cpu_seconds_total[5m])) * 1001
2
3怎么确认自己没写错:任何时刻,一台机器所有 mode 的 rate 之和应该约等于它的逻辑核数。拿
sum by (instance) (rate(node_cpu_seconds_total[5m]))查一下,8 核机器应该得到接近 8 的数字。如果你的使用率表达式算出来的值除以核数才对得上,说明聚合函数选错了。