云原生监控利器:Prometheus全解析

Prometheus 是一款开源的时序数据监控与告警系统 ,由 SoundCloud 开发并捐赠给 CNCF(云原生计算基金会),现已成为云原生场景下监控的事实标准,广泛用于 Kubernetes、微服务、虚拟机等环境的指标监控。它的核心特点是 Pull 模式采集指标内置时序数据库强大的 PromQL 查询语言灵活的告警机制

一、核心架构与组件

复制代码
┌─────────────────────────────────────────────────────────────────────┐
│                            Prometheus Server                         │
│  ┌─────────────┐  ┌──────────────┐  ┌──────────────────────────┐  │
│  │ Retrieval   │  │  TSDB        │  │ HTTP Server              │  │
│  │ (拉取数据)  │◀-▶│ (时序数据库) │◀-▶│ (提供PromQL查询/管理API) │  │
│  └─────────────┘  └──────────────┘  └──────────────────────────┘  │
└───────────────────┬───────────────────────────────────────────────┘
                    │ HTTP Pull /metrics
    ┌───────────────┼─────────────────────────────────────┐
    │               ▼                                     │
    │  ┌─────────────────────┐  ┌─────────────────────┐  │
    │  │ 被监控目标           │  │   Pushgateway       │  │
    │  │ - 应用/服务         │  │   (推送网关)        │  │
    │  │    (内置/client库)  │  │                     │  │
    │  │ - Exporters         │  └─────────────────────┘  │
    │  │   (Node Exporter,   │            ▲              │
    │  │    MySQL Exporter)   │            │ Push         │
    │  └─────────────────────┘     ┌──────┴──────┐       │
    │                               │ 批处理/定时 │       │
    │                               │ 作业任务    │       │
    │                               └─────────────┘       │
    │                                                     │
    │  ┌─────────────────────┐  ┌─────────────────────┐  │
    │  │  Service Discovery  │  │    Alertmanager     │  │
    │  │   (服务发现)        │  │    (告警管理器)     │  │
    │  │ - K8s, Consul, etc  │  │                     │  │
    │  └─────────────────────┘  └─────────────────────┘  │
    │             │提供目标列表             ▲              │
    └─────────────┼─────────────────────────┼──────────────┘
                  ▼                         │
        ┌─────────────────┐        ┌───────┴───────┐
        │  Grafana        │        │ 告警接收端    │
        │  (可视化)       │        │ (Email, Slack,│
        │                 │        │  Webhook等)   │
        └─────────────────┘        └───────────────┘

Prometheus 的架构采用模块化设计,核心组件及作用如下:

  1. Prometheus Server系统的核心组件,负责三个核心功能:

    • 指标采集:通过 HTTP Pull 模式主动拉取 Exporters 或目标服务的指标数据。
    • 指标存储:将采集的时序数据存储在本地磁盘(支持持久化配置),也可对接远程存储(如 S3、Thanos)。
    • 查询与聚合:提供 PromQL 查询接口,支持实时指标分析和聚合计算。
  2. Exporters 指标采集的 "桥梁",用于将非 Prometheus 原生支持的系统 / 服务(如主机、MySQL、Redis)的指标转换为 Prometheus 可识别的格式。常见 Exporters 包括:

    • Node Exporter:采集主机(CPU、内存、磁盘、网络)指标。
    • MySQL Exporter:采集 MySQL 数据库(连接数、QPS、慢查询)指标。
    • Blackbox Exporter:主动探测 HTTP、TCP、ICMP 等服务的可用性(如接口响应时间、是否可达)。
    • 自定义 Exporter:通过 Prometheus 客户端库(Go、Java、Python 等)开发,采集业务系统自定义指标(如订单量、接口成功率)。
  3. Alertmanager专门处理告警的组件,与 Prometheus Server 配合使用:

    • 接收 Prometheus Server 发送的告警信息。
    • 提供告警分组 (按服务 / 集群分组)、抑制 (避免级联告警)、静默(临时关闭特定告警)功能。
    • 支持多种告警通知渠道:Email、Slack、钉钉 / 企业微信(通过 Webhook)、PagerDuty 等。
  4. Pushgateway 用于解决 Push 模式采集的场景(如短生命周期的任务、批处理任务)。这类任务存活时间短,Prometheus Server 无法主动拉取,可由任务将指标推送到 Pushgateway,再由 Prometheus Server 拉取。

    注意:Pushgateway 是指标缓存层,重启后数据会丢失,需合理规划使用场景。

  5. Prometheus 客户端库 用于在业务代码中埋点自定义指标 ,支持主流开发语言(Go、Java、Python、Node.js 等)。例如,在 Java 项目中使用 simpleclient 库,埋点接口响应时间、请求量等指标。

二、核心概念

  1. 时序数据(Time Series) Prometheus 存储的核心数据类型,由 指标名 + 标签集 + 时间戳 + 数值 组成。示例:http_requests_total{method="GET", path="/api/user"} 1200 1718000000

    • 指标名:http_requests_total(表示 HTTP 请求总数)。
    • 标签集:{method="GET", path="/api/user"}(用于区分不同维度的指标,支持多维度过滤)。
    • 数值:1200(指标值)。
    • 时间戳:1718000000(Unix 时间戳)。
  2. 指标类型Prometheus 定义了 4 种核心指标类型,需根据业务场景选择:

    指标类型 特点 适用场景
    Counter(计数器) 单调递增的数值,只能加不能减 请求数、错误数、任务完成数
    Gauge(仪表盘) 可增可减的数值,支持任意变化 内存使用率、CPU 负载、队列长度
    Histogram(直方图) 统计指标的分布情况(如分位数、总和、计数) 接口响应时间分布、请求大小分布
    Summary(摘要) 与 Histogram 类似,直接计算分位数(客户端计算) 小样本量的指标分布统计
  3. PromQL(Prometheus 查询语言) Prometheus 的核心查询语言,支持对时序数据进行过滤、聚合、计算,是监控分析和告警规则的基础。

    • 基础过滤:node_cpu_seconds_total{mode="idle"}(查询主机空闲 CPU 时间)。
    • 聚合计算:sum(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)(计算 5 分钟内各主机的 CPU 使用率)。
    • 趋势分析:predict_linear(node_memory_available_bytes[1h], 3600)(基于 1 小时数据预测 1 小时后可用内存)。

三、工作流程

  1. 配置采集目标 :在 Prometheus Server 的配置文件(prometheus.yml)中,定义需要采集的目标(如 Exporters 地址、Kubernetes 服务发现配置)。

    yaml

    复制代码
    scrape_configs:
      - job_name: 'node_exporter'
        static_configs:
          - targets: ['192.168.1.100:9100', '192.168.1.101:9100']  # Node Exporter 地址
        scrape_interval: 15s  # 采集间隔
  2. 指标采集 :Prometheus Server 按配置的间隔,主动向目标发送 HTTP 请求(/metrics 接口),拉取指标数据。

  3. 数据存储:将拉取的指标数据存储为时序数据,支持按时间范围查询。

  4. 查询与可视化:通过 Prometheus Web UI 或 Grafana 调用 PromQL 查询指标,生成可视化图表。

  5. 告警触发:Prometheus Server 根据预设的告警规则,判断指标是否触发阈值,若触发则发送告警到 Alertmanager。

  6. 告警通知:Alertmanager 对告警进行分组、去重后,通过配置的渠道发送通知给相关人员。

四、典型部署方案

1. 单机部署(测试 / 小型环境)

  • 直接部署 Prometheus Server + Node Exporter + Grafana,适用于小规模集群或测试环境。
  • 优点:部署简单、运维成本低;缺点:存在单点故障,存储容量受限。

2. 联邦集群部署(中大型环境)

  • 采用 Prometheus Federation 架构,分为 Leaf 节点和 Global 节点:
    • Leaf 节点:负责采集单个集群 / 区域的指标,存储本地数据。
    • Global 节点:通过 Pull 模式拉取所有 Leaf 节点的聚合指标,实现全局监控。
  • 优点:分担采集压力,支持水平扩展;缺点:架构复杂,需配置联邦规则。

3. 云原生部署(Kubernetes 环境)

  • 在 Kubernetes 中通过 StatefulSet 部署 Prometheus Server,结合 Kubernetes Service Discovery 自动发现 Pod/Service 指标。
  • 搭配 Thanos 实现指标的长期存储和跨集群查询,解决 Prometheus 本地存储的局限性。

五、与 Grafana 集成(可视化最佳实践)

Prometheus 内置的 Web UI 仅支持简单查询,Grafana 是 Prometheus 可视化的最佳搭档,步骤如下:

  1. 部署 Grafana 并启动,访问 Grafana Web 界面(默认端口 3000)。
  2. 添加数据源:选择 Prometheus,填写 Prometheus Server 的地址(如 http://prometheus:9090)。
  3. 导入仪表盘模板:在 Grafana 官网(Dashboards)搜索 Exporter 对应的模板(如 Node Exporter 的模板 ID:1860),导入后即可生成主机监控仪表盘。
  4. 自定义仪表盘:根据业务需求,添加 PromQL 查询,配置图表样式(如折线图、柱状图、仪表盘)。

六、最佳实践

  1. 合理设置采集间隔 :根据指标变化频率调整 scrape_interval(如主机指标 15s,业务指标 30s),避免过短的间隔导致 Prometheus Server 压力过大。
  2. 规范标签设计 :统一标签命名(如 instance 表示主机 IP、service 表示服务名),便于多维度过滤和聚合。
  3. 告警规则优化:设置合理的告警阈值和持续时间(如 CPU 使用率 > 80% 持续 5 分钟告警),避免抖动导致的误告警。
  4. 指标持久化与备份:对接远程存储(如 Thanos、S3),实现指标长期存储;定期备份 Prometheus 数据目录,防止数据丢失。
  5. 监控自身健康状态 :通过 prometheus_self_metrics 指标监控 Prometheus Server 的采集成功率、内存使用率等,确保监控系统自身稳定。

七、常见问题与解决方案

问题 解决方案
指标采集失败 检查目标 /metrics 接口是否可达;核对 Prometheus 配置文件的 targets 地址;检查防火墙规则
数据查询缓慢 减少 PromQL 查询的时间范围;避免使用 * 匹配所有指标;对高频查询的指标进行预聚合
磁盘空间不足 配置 retention.time 清理过期数据;对接远程存储;使用 Thanos 实现分层存储
告警风暴 在 Alertmanager 中配置告警分组和抑制规则;调整告警阈值的持续时间
相关推荐
家乡的落日2 天前
微服务监控和简单日志系统搭建grafana+prometheus+node_exporter+promtail+loki
微服务·grafana·prometheus
Gold Steps.2 天前
Prometheus+Grafana+Alertmanager:云原生部署的 K8s 集群监控架构方案
云原生·grafana·prometheus
学Linux的语莫5 天前
prometheus、grafana的docker搭建
docker·容器·prometheus
为什么不问问神奇的海螺呢丶5 天前
服务器巡检报告-基于categraf 采集数据-存入Prometheus-写入mysql后生成报告
服务器·mysql·prometheus
一枚正在学习的小白5 天前
prometheus监控mysql服务
linux·运维·mysql·prometheus
chen_note6 天前
监控——普罗米修斯
grafana·prometheus
闲人编程6 天前
Prometheus监控指标集成指南
prometheus·监控·promql·仪表盘··cncf·codecapsule
木子欢儿7 天前
Prometheus Blackbox域名SSL证书监控并设置AlertManager告警
网络·网络协议·ssl·prometheus
wxjlkh8 天前
docker 搭建 grafana+prometheus 监控主机资源之node_exporter
docker·grafana·prometheus