Prometheus 监控入门指南(超详细新手版)

一、基本概念:什么是 Prometheus?

1.1 用「记体温」理解 Prometheus

想象你每天记录体温:

  • 时间序列数据:每次记录都包含「时间戳 + 体温值」,比如2024-09-05 10:00 36.5℃,这些数据按时间顺序排列,就是时间序列数据。
  • Prometheus:相当于一个智能笔记本,专门收集、存储这些时间数据,并能帮你分析(比如计算一周平均体温、预测明天体温趋势)。

1.2 核心定位:3 句话讲清楚

  • 监控系统:实时跟踪服务器、应用的状态(CPU 使用率、内存占用、接口请求量等)。
  • 报警系统:当指标异常(如 CPU 超过 80%)时自动发通知。
  • 时间序列数据库:特别擅长存储带时间戳的数据,查询速度极快。

1.3 关键术语解释

  • Exporter:每个设备 / 应用的「报告员」,比如 MySQL Exporter 负责收集数据库状态,Nginx Exporter 收集 Nginx 的访问数据。
  • Target:被监控的目标,比如一台服务器、一个微服务。
  • 指标(Metric):具体的监控项,如http_requests_total(总请求数)、node_cpu_usage(CPU 使用率)。

二、基本原理:Prometheus 如何监控你的系统?

2.1 核心工作逻辑

  1. 数据采集:Prometheus 主动向 Exporter 发送 HTTP 请求(拉取模式),比如每 10 秒问一次:「你的 CPU 使用率是多少?」例外:如果目标只能主动上报数据(如短期任务),可以通过Push Gateway中转(先推送到中转服务器,再由 Prometheus 拉取)。
  2. 数据存储:收到的数据按时间序列格式存储在TSDB(时间序列数据库),类似 Excel 表格,但专门优化了时间维度的查询,比如快速找到「昨天 10 点到 11 点的内存占用数据」。
  3. 数据分析与报警:通过PromQL 查询语言分析数据(如计算平均请求耗时),当指标触发预设规则(如请求耗时超过 500ms 且持续 10 分钟),通过Alertmanager发送报警(邮件、钉钉、微信等)。

2.2 为什么选择 Prometheus?

  • 简单易用:无需复杂 SDK,Exporter 直接提供 HTTP 接口,开箱即用(常用组件如 Nginx、MySQL 都有官方 Exporter)。
  • 灵活强大:PromQL 支持复杂查询,比如「过去 1 小时 CPU 使用率超过 80% 的服务器列表」。
  • 开源免费:适合中小团队和个人项目,社区生态丰富(Grafana 可视化、多种报警渠道)。

三、基础架构:Prometheus 的 4 大核心组件

3.1 Prometheus Server:整个系统的「大脑」

  • 作用:收集数据、存储数据、提供查询接口。
  • 3 大模块
    • Retrieval(采集器):按配置定期从 Exporter 或 Push Gateway 拉取数据(像快递员定期去各个站点取件)。
    • TSDB(数据库):存储时间序列数据,支持高效的时间范围查询(如查上周的内存数据)。
    • HTTP Server:对外提供查询接口,Grafana、Alertmanager 都是通过这个接口获取数据。

3.2 Push Gateway:解决「推送数据」的中转站

  • 场景:有些短期任务(如一次性脚本)运行时间短,Prometheus 来不及主动拉取数据,就需要任务主动把数据推送到 Push Gateway(相当于临时存放点),再由 Prometheus 定期来取。
  • 类比:你出差时快递无法送上门,先寄到小区驿站(Push Gateway),你再去驿站取(Prometheus 拉取)。

3.3 Service Discovery:自动找到「需要监控的目标」

  • 作用:动态获取需要监控的 Target 列表(IP + 端口),比如 Kubernetes 集群中新增了一台服务器,Service Discovery 会自动告诉 Prometheus:「快去监控这台新机器!」
  • 支持方式:DNS、文件配置、云平台 API(如 AWS EC2、阿里云 ECS)。

3.4 Alertmanager:专业的「报警管家」

  • 工作流程
    1. Prometheus 发现指标异常(如请求失败率 > 5%),生成告警信号。
    2. Alertmanager 接收信号,负责「去重」(避免重复报警)、「分组」(把相关报警归类)、「路由」(根据规则发送到不同渠道,如数据库报警发 DBA,接口报警发开发组)。
  • 支持报警方式:邮件、Slack、钉钉、PagerDuty 等。

四、工作流程:数据从采集到展示的完整路径

  1. 数据采集阶段
    • Prometheus Server 按配置文件(prometheus.yml)中的scrape_configs,定期从 Exporter 拉取数据(如http://localhost:9090/metrics)。
    • 短期任务通过 Push Gateway 推送数据,Prometheus 再从 Gateway 拉取。
  1. 数据存储阶段:数据以时间序列格式(指标名+标签+时间戳+值)存储在 TSDB,默认存储 15 天(可配置延长)。
  2. 数据分析阶段
    • 通过 PromQL 查询指标,比如在 Prometheus 控制台输入node_cpu_usage,查看 CPU 使用率。
    • 复杂分析:如计算「过去 5 分钟平均请求耗时」avg(rate(http_request_duration_seconds_sum[5m]))
  1. 报警与展示阶段
    • 报警:在 Prometheus 中配置alert.rules,当指标触发条件(如http_request_errors > 100),Alertmanager 发送报警。
    • 可视化:Grafana 接入 Prometheus 数据源,绘制仪表盘(如实时请求量折线图、服务器负载热力图)。

五、PromQL 查询语言:从入门到实战

5.1 基本用法:3 分钟学会基础查询

场景:查询 Prometheus 自身的 HTTP 请求总数
  1. 启动 Prometheus:访问http://localhost:9090,进入 Graph 页面。
  2. 输入表达式prometheus_http_requests_total,点击 Execute。
  3. 结果解读:返回带method(GET/POST)、code(200/404)等标签的多条数据,每条代表一类请求的总数。
关键语法:指标名{标签=值}
  • 例:查询状态码为 200 的请求 prometheus_http_requests_total{code="200"}
  • 排除 200 的请求 prometheus_http_requests_total{code!="200"}!=表示不等于)

5.2 正则匹配:更灵活的筛选

场景:查询所有以/api/v1/开头的接口请求
  • 正向匹配(包含):prometheus_http_requests_total{handler=~"/api/v1/.*"}=~表示正则匹配,.*代表任意字符)
  • 反向匹配(排除):prometheus_http_requests_total{handler!~"/api/v1/.*"}

5.3 范围查询:分析一段时间的数据

场景:查看最近 5 分钟的请求趋势
  • 语法:指标名[时间范围](时间单位:m分钟,h小时,d天)
  • 示例:prometheus_http_requests_total[5m]
  • 结果:返回每个时间点的样本值,可在 Grafana 中绘制折线图。

5.4 时间位移:查询历史数据

场景:查询 5 分钟前的瞬时数据
  • 语法:表达式 offset 时间
  • 示例:prometheus_http_requests_total offset 5m
  • 进阶:查询昨天全天的数据 prometheus_http_requests_total[1d] offset 1d

5.5 聚合操作:快速计算总和、平均值

函数

作用

示例(计算总请求数)

sum

求和

sum(prometheus_http_requests_total)

avg

平均值

avg(node_memory_used)(平均内存使用)

topk(5)

前 5 大的值

topk(5, node_cpu_usage)(CPU 使用率最高的 5 台服务器)

bottomk(3)

后 3 小的值

bottomk(3, http_response_time)(响应最快的 3 个接口)

5.6 内置函数:处理增长率和预测

(1)计算增长率(3 种方式对比)
  • increase(v[5m]):计算 5 分钟内的总增长量(适合缓慢变化的指标,如磁盘容量)。示例:increase(node_disk_written_bytes[1h])(1 小时内磁盘写入总量)。
  • rate(v[5m]):计算 5 分钟内的平均增长速率(每秒增长多少)。示例:rate(http_requests_total[10m])(最近 10 分钟平均每秒请求数)。
  • irate(v[5m]):计算最新两个样本的瞬时增长率(反应突发变化,如突发流量)。示例:irate(node_cpu[2m])(实时 CPU 使用率波动)。
(2)增长预测:提前发现资源瓶颈
  • 场景:预测服务器磁盘空间将在多久后占满。
  • 语法:predict_linear(v[时间范围], 预测秒数)
  • 示例:基于 2 小时数据,预测 4 小时后磁盘是否可用:

predict_linear(node_filesystem_free[2h], 4*3600) < 0

(结果为1表示 4 小时后空间不足,触发报警)

六、新手实战:3 个常见监控场景

场景 1:监控 Nginx 访问量

  1. 安装 Nginx Exporterdocker run -d -p 9113:9113 prom/nginx-exporter
  2. 配置 Prometheus:在prometheus.yml中添加:

scrape_configs:

  - job_name: "nginx"

    static_configs:

      - targets: ["localhost:9113"]  # Exporter地址

  1. 查询指标nginx_http_requests_total(总请求数)、nginx_http_status_2xx(200 状态码数量)。

场景 2:监控服务器 CPU 和内存

  1. 安装 Node Exporterdocker run -d -p 9100:9100 prom/node-exporter
  2. 查询指标
    • CPU 使用率:100 - avg(node_cpu{mode="idle"}) by (instance)
    • 内存使用率:(node_memory_total - node_memory_free) / node_memory_total * 100

场景 3:设置接口报警

  1. 在 Prometheus 中配置报警规则(alert.rules

groups:

- name: api_alert

  rules:

  - alert: HighErrorRate

    expr: http_request_errors_total / http_requests_total > 0.05  # 错误率>5%

    for: 5m  # 持续5分钟触发报警

    labels:

      severity: critical

    annotations:

      summary: "接口错误率过高"

      description: "错误率达到5%,请检查接口状态"

  1. 配置 Alertmanager 发送钉钉报警(详见官方文档)。

七、新手避坑指南

1. 数据采集失败?

  • 检查 Exporter 是否正常运行(访问http://Exporter地址/metrics,看是否返回数据)。
  • 确认 Prometheus 配置文件中的targets地址和端口正确(prometheus.ymlstatic_configs部分)。
  • 重启 Prometheus:prometheus --config.file=prometheus.yml

2. PromQL 查询没结果?

  • 检查指标名是否正确(区分大小写,Prometheus 指标名是小写字母 + 下划线)。
  • 确认标签匹配是否正确(如{code="200"}中的引号是英文引号)。

3. 报警不触发?

  • 确保expr表达式在控制台手动执行时返回1(表示条件成立)。
  • 检查for持续时间是否足够(如指标只超标 1 分钟,而for: 5m,需要持续 5 分钟才报警)。

总结:新手必记 3 个核心点

  1. 核心价值:Prometheus 是一套「数据采集 - 存储 - 分析 - 报警」的完整监控方案,尤其适合分布式系统。
  2. 入门路径:先学会安装 Exporter(如 Node Exporter、Nginx Exporter),再在 Prometheus 控制台练习 PromQL 基础查询,最后配置简单报警规则。
  3. 关键工具:Grafana 用于可视化,Alertmanager 用于报警,Service Discovery 用于动态管理监控目标。

按照这个指南一步步实践,即使是零基础也能快速上手 Prometheus 监控!遇到问题时,多利用官方文档和社区资源,祝你顺利搭建起自己的监控系统~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值