1. Exporter 概述

1.1 Exporter 在 Prometheus 生态中的角色

Prometheus 采用“拉取(Pull)”模式采集监控指标。然而,大多数业务系统、中间件或硬件设备并不原生暴露 Prometheus 格式的 HTTP /metrics 端点。Exporter 正是填补这一鸿沟的适配器:它负责从目标系统中获取原始状态数据,将其转换为 Prometheus 可识别的指标格式,并在 HTTP 端口上等待 Prometheus Server 定期抓取。

核心定位: Exporter 是 Prometheus 生态中“数据采集的最后一公里”,是连接目标系统与监控平台的桥梁。

下图展示了 Exporter 在 Prometheus 整体架构中的位置与数据流向:

Exporter 在 Prometheus 生态中的角色 目标系统 业务应用 数据库 / 中间件 Exporter 数据转换 & 聚合 HTTP /metrics 端点 Prometheus Server 定期 Pull 抓取 存储 & 告警 原始状态 /metrics 指标 关键说明 1. Exporter 不存储数据,只做实时转换与暴露。 2. 每个 Exporter 通常对应一类目标系统(如 MySQL、Nginx)。 3. Prometheus Server 通过配置中的 targets 列表发现 Exporter 端点。

1.2 常见 Exporter 类型

根据采集目标的不同,Exporter 可分为以下几大类。实际生产环境中,通常需要组合部署多种 Exporter 以覆盖完整的监控面。

类别 代表 Exporter 采集目标 典型端口
基础设施 node_exporter CPU、内存、磁盘、网络、系统负载 9100
数据库 mysqld_exporter / pg_exporter / mongodb_exporter 连接数、查询性能、复制状态、缓存命中率 9104 / 9187 / 9216
中间件 / 消息队列 kafka_exporter / rabbitmq_exporter / redis_exporter 吞吐量、队列深度、延迟、连接数 9308 / 9419 / 9121
Web 服务器 / 反向代理 nginx_exporter / apache_exporter 请求速率、连接状态、响应时间 9113 / 9117
云原生 / 容器 cadvisor / kube-state-metrics / blackbox_exporter 容器资源、K8s 对象状态、网络探测 8080 / 8081 / 9115
硬件 / 网络设备 snmp_exporter / ipmi_exporter SNMP OID、传感器温度、电源状态 9116 / 9290
自定义业务 自定义 Exporter(本课程重点) 业务指标:订单量、用户活跃、支付成功率 自定义
选型建议: 优先使用官方或社区成熟的 Exporter,避免重复造轮子。仅在标准 Exporter 无法满足业务指标采集需求时,才考虑开发自定义 Exporter。

1.3 Exporter 工作原理

Exporter 的内部工作流程可以抽象为三个核心阶段:连接与采集 → 数据转换与指标构建 → HTTP 暴露与响应。下面通过一个通用流程图展示其完整生命周期:

Exporter 工作原理 — 三阶段流程 阶段一:连接与采集 建立连接 → 执行查询 阶段二:数据转换 解析 → 构建 Metric 对象 阶段三:HTTP 暴露 注册 Handler → 响应 /metrics 各阶段详细子步骤 阶段一: 根据目标类型(TCP/HTTP/DB/SNMP)建立连接; 执行采集命令或查询语句,获取原始响应数据(JSON/XML/Table/SNMP Walk)。 阶段二: 解析原始数据,提取数值型指标; 使用 Prometheus 客户端库构建 Counter、Gauge、Histogram、Summary 等 Metric 对象; 附加标签(Labels)以区分维度。 阶段三: 注册 HTTP Handler 到指定路径(通常为 /metrics); Prometheus Server 发起 GET 请求时,Exporter 序列化所有 Metric 并返回 text/plain 响应。

1.4 核心概念:指标类型与标签

Exporter 输出的每个指标都遵循 Prometheus 数据模型。理解以下四个核心概念是开发 Exporter 的基础:

  • Metric Name(指标名称): 唯一标识,如 http_requests_total、node_cpu_seconds_total。
  • Labels(标签): 键值对,用于区分同一指标的不同维度,如 method="GET"、status="200"。
  • Value(值): 一个 float64 数值,代表当前采样点的实际数据。
  • Timestamp(时间戳): 可选,由 Prometheus Server 在抓取时自动添加,Exporter 通常不主动设置。
常见误区: 不要在指标名称中编码维度信息(如 http_requests_get_total),应使用标签(http_requests_total{method="GET"})。前者会导致指标基数爆炸,后者更灵活且符合 Prometheus 最佳实践。

1.5 Exporter 开发的核心原则

在开始编写自定义 Exporter 之前,需要牢记以下原则,它们将贯穿本课程始终:

  1. 幂等性: 每次抓取都是独立的,Exporter 不应依赖上一次采集的状态。
  2. 轻量无状态: Exporter 不存储历史数据,只做实时转换,避免内存泄漏。
  3. 并发安全: 多个抓取请求可能同时到达,指标更新必须使用线程安全的数据结构。
  4. 错误隔离: 单个目标采集失败不应影响其他指标的暴露,使用 up 指标标记采集状态。
  5. 可观测性: Exporter 自身也应暴露运行指标(如采集耗时、错误计数),便于运维监控。