4. Java应用连接池指标暴露(以HikariCP为例)

HikariCP 作为 Spring Boot 2.x/3.x 的默认连接池,原生集成了 Micrometer 指标门面。只需在项目中引入 Micrometer 注册表依赖,HikariCP 便会自动将连接池的核心水位指标暴露给 Prometheus。本章将详细说明配置步骤、指标清单及验证方法。

前置条件:应用已集成 Spring Boot Actuator 和 Micrometer Prometheus 注册表。若未集成,请先添加以下依赖(以 Maven 为例)。

4.1 依赖配置

在 pom.xml 中添加以下两个依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

Spring Boot 自动配置会检测到 HikariCP 在类路径中,并自动创建 HikariPoolMXBean 的 Micrometer 绑定器。无需额外编写代码。

4.2 暴露 Prometheus 端点

在 application.yml 中确保 Actuator 暴露 Prometheus 端点:

management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus
  metrics:
    export:
      prometheus:
        enabled: true

重启应用后,访问 /actuator/prometheus 即可看到以 hikaricp_ 为前缀的指标。

4.3 核心指标清单

HikariCP 通过 Micrometer 暴露以下关键水位指标:

指标名称 类型 含义 水位判断依据
hikaricp_connections_active Gauge 当前活跃连接数(正在被使用的连接) 接近 maximumPoolSize 时告警
hikaricp_connections_idle Gauge 当前空闲连接数 持续为 0 表示池耗尽
hikaricp_connections_pending Gauge 等待获取连接的线程数(排队数) > 0 表示连接不足
hikaricp_connections_timeout_total Counter 连接超时总次数(累计值) 任何非零值均需排查
hikaricp_connections_max Gauge 配置的最大连接数 用于计算使用率
hikaricp_connections_min Gauge 配置的最小空闲连接数 用于判断池缩容下限
hikaricp_connections_creation_seconds Histogram 连接创建耗时分布 P99 过高说明数据库响应慢
巡检重点:日常水位巡检应重点关注 hikaricp_connections_active 与 hikaricp_connections_pending 两个指标。当 pending > 0 且持续上升时,说明连接池已无法满足并发请求,需要扩容或优化 SQL。

4.4 指标暴露流程架构

下图展示了从 HikariCP 连接池到 Prometheus 的完整指标暴露链路:

HikariCP 指标暴露链路 HikariCP 连接池 HikariPoolMXBean Micrometer MeterRegistry Actuator /actuator/prometheus Prometheus Server scrape /actuator/prometheus Grafana 看板 指标前缀:hikaricp_ 无需额外代码,自动绑定

4.5 配置示例与验证

以下是一个完整的 HikariCP 连接池配置示例(application.yml):

spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      idle-timeout: 300000
      connection-timeout: 20000
      max-lifetime: 1200000
      pool-name: MyServicePool

配置完成后,通过 curl 验证指标是否正常暴露:

curl -s http://localhost:8080/actuator/prometheus | grep hikaricp

预期输出示例:

# HELP hikaricp_connections_active Current active connections
# TYPE hikaricp_connections_active gauge
hikaricp_connections_active{pool="MyServicePool",} 3.0
# HELP hikaricp_connections_idle Current idle connections
# TYPE hikaricp_connections_idle gauge
hikaricp_connections_idle{pool="MyServicePool",} 5.0
# HELP hikaricp_connections_pending Pending threads waiting for a connection
# TYPE hikaricp_connections_pending gauge
hikaricp_connections_pending{pool="MyServicePool",} 0.0
常见问题:如果 /actuator/prometheus 端点返回 404,请检查:
1. management.endpoints.web.exposure.include 是否包含 prometheus。
2. 是否引入了 micrometer-registry-prometheus 依赖(注意版本与 Spring Boot 版本兼容)。
3. 如果使用 Spring Boot 3.x,需确保 io.micrometer:micrometer-registry-prometheus 版本为 1.11+。

4.6 自定义指标标签

有时需要为连接池指标添加自定义标签(如环境、机房),可通过 MeterFilter 实现:

@Configuration
public class MetricsConfig {
    @Bean
    public MeterFilter customMeterFilter() {
        return MeterFilter.commonTags(
            Tags.of("env", "production", "region", "cn-east-1")
        );
    }
}

添加后,Prometheus 指标会携带 env="production",region="cn-east-1" 标签,便于多环境统一监控。

4.7 小结