4. 连接池指标暴露方式:应用内埋点、中间件Exporter与自定义Exporter

连接池指标的采集质量直接决定水位巡检的准确性与告警时效性。根据数据源与采集路径的不同,连接池指标的暴露方式可分为三大类:应用内埋点、中间件Exporter 与 自定义Exporter。三类方式在侵入性、维护成本、指标丰富度上各有优劣,实际生产环境通常混合使用。

核心原则:优先使用中间件Exporter获取基础连接池指标;对于业务自定义连接池或需要精细化业务标签的场景,采用应用内埋点或自定义Exporter补充。

4.1 三类暴露方式对比总览

暴露方式 典型实现 侵入性 指标粒度 维护成本 适用场景
应用内埋点 Micrometer、Prometheus Client SDK 高(需修改应用代码) 精细(可携带业务标签) 中(随应用版本迭代) Java/Go/Python应用自定义连接池、线程池
中间件Exporter Redis Exporter、MySQL Exporter、PgBouncer Exporter 低(旁路部署) 标准(中间件原生指标) 低(官方维护) Redis、MySQL、PostgreSQL等标准中间件
自定义Exporter 基于Prometheus Client自研Exporter 中(独立服务) 灵活(可聚合多数据源) 高(需自研与运维) 老旧系统、私有协议、多源聚合场景

4.2 应用内埋点:Micrometer与Prometheus Client

应用内埋点是最灵活的指标暴露方式,适用于业务自定义连接池或需要将连接池状态与业务标签(如数据库分片、读写类型)关联的场景。主流实现包括Micrometer(Java生态)和Prometheus Client SDK(多语言)。

4.2.1 Micrometer(Java/Spring Boot)

Micrometer是JVM生态的事实标准指标门面,与Spring Boot Actuator深度集成。通过Micrometer暴露连接池指标时,只需在配置中启用对应连接池的Metrics绑定:

// application.yml 示例:启用HikariCP连接池指标
management:
  metrics:
    export:
      prometheus:
        enabled: true
  endpoints:
    web:
      exposure:
        include: prometheus

// 自动暴露的HikariCP核心指标
// hikaricp_connections_active      当前活跃连接数
// hikaricp_connections_idle        当前空闲连接数
// hikaricp_connections_pending     等待获取连接的线程数
// hikaricp_connections_max         最大连接数
// hikaricp_connections_timeout_total 连接超时总数
最佳实践:对于Tomcat JDBC、Druid等连接池,Micrometer同样提供自动绑定。建议在Spring Boot应用中统一使用Micrometer,避免直接依赖Prometheus Client SDK,以保持指标门面的可替换性。

4.2.2 Prometheus Client SDK(Go/Python/Java)

对于非Java应用或需要自定义指标注册的场景,直接使用Prometheus Client SDK进行埋点。以Go语言为例,自定义连接池指标注册方式如下:

import (
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
    poolActive = prometheus.NewGauge(prometheus.GaugeOpts{
        Name: "custom_pool_connections_active",
        Help: "当前活跃连接数",
    })
    poolIdle = prometheus.NewGauge(prometheus.GaugeOpts{
        Name: "custom_pool_connections_idle",
        Help: "当前空闲连接数",
    })
    poolWaitCount = prometheus.NewCounter(prometheus.CounterOpts{
        Name: "custom_pool_connections_wait_total",
        Help: "等待连接累计次数",
    })
)

func init() {
    prometheus.MustRegister(poolActive, poolIdle, poolWaitCount)
}

// 在连接池获取/释放连接时更新指标
func onConnectionAcquired() {
    poolActive.Inc()
}

func onConnectionReleased() {
    poolActive.Dec()
}

4.3 中间件Exporter:Redis Exporter与MySQL Exporter

中间件Exporter是连接池水位巡检的主力采集方式。它们以旁路容器或进程方式运行,通过中间件管理协议(如Redis INFO、MySQL SHOW STATUS)获取连接池状态,转换为Prometheus指标格式。

4.3.1 Redis Exporter

Redis Exporter通过INFO clients和INFO stats命令采集连接池相关指标:

Prometheus指标名 对应Redis INFO字段 含义
redis_connected_clients connected_clients 当前已连接客户端数(活跃连接)
redis_blocked_clients blocked_clients 阻塞等待的客户端数(连接池排队)
redis_connections_received_total total_connections_received 累计接受连接数(连接创建速率)
redis_connections_rejected_total rejected_connections 累计拒绝连接数(连接池满)
redis_maxclients maxclients Redis配置的最大连接数
注意:Redis Exporter默认不暴露maxclients配置值,需在启动参数中添加--redis.metrics-only=connected_clients,blocked_clients,rejected_connections并配合配置文件开启include-config选项。否则水位告警无法计算连接池使用率。

4.3.2 MySQL Exporter

MySQL Exporter通过SHOW GLOBAL STATUS和SHOW VARIABLES采集连接池指标:

Prometheus指标名 对应MySQL状态/变量 含义
mysql_global_status_threads_connected Threads_connected 当前已连接线程数(活跃+空闲)
mysql_global_status_threads_running Threads_running 当前正在执行的线程数(真正活跃)
mysql_global_status_connections Connections 累计连接尝试次数
mysql_global_status_aborted_connects Aborted_connects 累计连接失败次数
mysql_global_variables_max_connections max_connections MySQL最大连接数配置

4.4 自定义Exporter:应对私有协议与老旧系统

当中间件未提供官方Exporter,或需要从多个异构数据源聚合连接池指标时,自定义Exporter是必要选择。典型场景包括:

  • 老旧中间件:如Oracle数据库、IBM MQ,官方Exporter缺失或功能不全。
  • 私有连接池:公司自研的连接池组件,无标准指标暴露接口。
  • 多源聚合:需要将多个Redis分片或MySQL实例的连接池指标合并为一个Exporter端点。

自定义Exporter的推荐架构如下:

自定义Exporter架构:多源连接池指标采集 Redis分片集群 INFO clients MySQL主从集群 SHOW STATUS 自研连接池 JMX / HTTP API 自定义Exporter(Go/Python) 指标聚合 · 标签注入 · 健康检查 Prometheus /metrics 端点 /metrics?target=redis-shard-01&pool=main Prometheus告警规则 · 水位巡检
实现建议:自定义Exporter应遵循Prometheus官方Exporter开发规范,使用Collector接口实现指标动态更新。避免在Describe方法中返回固定指标列表,而是根据采集到的数据源动态生成指标,以支持多目标巡检。

4.5 三类暴露方式的选择决策树

在实际巡检方案设计时,可按照以下决策顺序选择暴露方式:

  1. 中间件是否有官方Exporter? → 是:优先使用官方Exporter(如Redis Exporter、MySQL Exporter),零侵入、维护成本最低。
  2. 应用是否使用标准连接池(HikariCP、Tomcat JDBC)? → 是:通过Micrometer自动暴露,无需额外开发。
  3. 是否需要携带业务标签(如分片ID、读写类型)? → 是:在应用代码中使用Prometheus Client SDK进行埋点。
  4. 数据源为私有协议或老旧系统? → 是:开发自定义Exporter,封装私有协议为Prometheus指标。
  5. 需要从多个异构数据源聚合指标? → 是:使用自定义Exporter作为统一采集网关。
避坑提醒:不要在同一连接池上同时使用应用内埋点和中间件Exporter暴露相同语义的指标(如活跃连接数),否则会导致告警规则重复触发或指标值不一致。建议以中间件Exporter为主,应用内埋点仅补充业务标签。

4.6 本章小结

连接池指标的暴露方式决定了巡检数据的完整性与可信度。中间件Exporter提供标准化的基础指标,适合作为水位巡检的主数据源;应用内埋点补充业务维度的精细化指标;自定义Exporter则填补私有协议与老旧系统的空白。在实际部署中,建议以“中间件Exporter为主、应用内埋点为辅、自定义Exporter兜底”的策略构建连接池指标采集体系,为后续的水位计算与告警规则设计奠定坚实的数据基础。