4. 连接池指标暴露方式:应用内埋点、中间件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 连接超时总数
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配置的最大连接数 |
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的推荐架构如下:
Collector接口实现指标动态更新。避免在Describe方法中返回固定指标列表,而是根据采集到的数据源动态生成指标,以支持多目标巡检。
4.5 三类暴露方式的选择决策树
在实际巡检方案设计时,可按照以下决策顺序选择暴露方式:
- 中间件是否有官方Exporter? → 是:优先使用官方Exporter(如Redis Exporter、MySQL Exporter),零侵入、维护成本最低。
- 应用是否使用标准连接池(HikariCP、Tomcat JDBC)? → 是:通过Micrometer自动暴露,无需额外开发。
- 是否需要携带业务标签(如分片ID、读写类型)? → 是:在应用代码中使用Prometheus Client SDK进行埋点。
- 数据源为私有协议或老旧系统? → 是:开发自定义Exporter,封装私有协议为Prometheus指标。
- 需要从多个异构数据源聚合指标? → 是:使用自定义Exporter作为统一采集网关。
4.6 本章小结
连接池指标的暴露方式决定了巡检数据的完整性与可信度。中间件Exporter提供标准化的基础指标,适合作为水位巡检的主数据源;应用内埋点补充业务维度的精细化指标;自定义Exporter则填补私有协议与老旧系统的空白。在实际部署中,建议以“中间件Exporter为主、应用内埋点为辅、自定义Exporter兜底”的策略构建连接池指标采集体系,为后续的水位计算与告警规则设计奠定坚实的数据基础。