3. 连接池核心指标设计:活跃连接数、空闲连接数、等待队列长度、连接超时次数
连接池是后端服务与数据库、缓存、消息队列等下游资源之间的关键桥梁。水位巡检的核心在于通过 Prometheus 指标实时感知连接池的内部状态,从而在资源耗尽前触发告警或自动伸缩。本章聚焦四个最核心的指标:活跃连接数、空闲连接数、等待队列长度、连接超时次数,并给出对应的 Prometheus 指标配置与巡检阈值建议。
3.1 四类核心指标的定义与业务含义
下表从指标名称、Prometheus 类型、典型来源、业务含义四个维度进行对比,帮助你在巡检面板中快速定位每个指标的作用。
| 指标名称 | Prometheus 类型 | 典型来源(Java/HikariCP 示例) | 业务含义 |
|---|---|---|---|
| 活跃连接数 | Gauge | hikaricp_connections_active |
当前正在被线程占用的连接数,反映实时并发压力 |
| 空闲连接数 | Gauge | hikaricp_connections_idle |
池中可用但未被使用的连接数,反映资源冗余程度 |
| 等待队列长度 | Gauge | hikaricp_connections_pending |
等待获取连接的线程数,反映连接供给是否充足 |
| 连接超时次数 | Counter | hikaricp_connections_timeout_total |
累计超时失败次数,反映连接池配置或下游性能瓶颈 |
巡检要点:活跃连接数 + 空闲连接数 ≈ 总连接数(在稳定状态下)。当活跃连接数持续接近最大连接数且空闲连接数趋近于 0 时,说明连接池处于高水位运行状态,需要关注等待队列长度和超时次数。
3.2 指标间的联动关系与水位模型
四个指标并非孤立存在,它们共同构成连接池的“水位模型”。下图展示了从请求到达、获取连接到超时失败的全链路指标流转关系。
水位巡检黄金法则:当活跃连接数 ≥ 80% maxPoolSize 且空闲连接数 ≤ 10% maxPoolSize 时,应触发“高水位预警”;若等待队列长度持续大于 0 且超时次数在 5 分钟内增长超过阈值,则升级为“连接池枯竭告警”。
3.3 Prometheus 指标配置与告警规则
以下给出基于 HikariCP 连接池的 Prometheus 指标采集配置示例,以及对应的告警规则。实际部署时请根据连接池类型(Druid、Tomcat JDBC、Lettuce 等)调整 metric 名称。
3.3.1 指标采集配置(prometheus.yml)
# 通过 JMX Exporter 或 Micrometer 暴露的 HikariCP 指标
scrape_configs:
- job_name: 'hikaricp'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
# 确保以下指标被采集
# hikaricp_connections_active
# hikaricp_connections_idle
# hikaricp_connections_pending
# hikaricp_connections_timeout_total
3.3.2 告警规则(prometheus-rules.yml)
groups:
- name: connection_pool_alerts
rules:
# 高水位预警:活跃连接数超过最大连接数的 80%
- alert: ConnectionPoolHighWatermark
expr: |
hikaricp_connections_active /
(hikaricp_connections_active + hikaricp_connections_idle
+ on(instance) group_left hikaricp_connections_max)
> 0.8
for: 2m
labels:
severity: warning
annotations:
summary: "连接池高水位 (instance {{ $labels.instance }})"
description: "活跃连接占比超过 80%,当前值: {{ $value | humanizePercentage }}"
# 等待队列告警:等待队列长度持续大于 0
- alert: ConnectionPoolQueueBuilding
expr: hikaricp_connections_pending > 0
for: 1m
labels:
severity: warning
annotations:
summary: "连接池等待队列非空 (instance {{ $labels.instance }})"
description: "等待队列长度: {{ $value }},连接供给可能不足"
# 连接超时告警:5 分钟内超时次数增长超过 5 次
- alert: ConnectionPoolTimeoutSpike
expr: |
rate(hikaricp_connections_timeout_total[5m]) > 0.0167
for: 2m
labels:
severity: critical
annotations:
summary: "连接超时次数激增 (instance {{ $labels.instance }})"
description: "5 分钟超时速率: {{ $value | humanize }} 次/秒"
避坑提示:不要直接对
hikaricp_connections_timeout_total 设置绝对值阈值(如 > 10),因为 Counter 类型会持续累加。必须使用 rate() 或 increase() 函数计算单位时间内的增量,才能准确反映超时趋势。
3.4 指标可视化与巡检面板设计
在 Grafana 中,建议将四个核心指标组织在一个面板行中,形成“连接池水位总览”。下表给出每个面板的推荐图表类型和 Y 轴单位。
| 面板标题 | 图表类型 | 查询表达式 | Y 轴单位 |
|---|---|---|---|
| 活跃连接数 | Time series / 面积图 | hikaricp_connections_active |
short |
| 空闲连接数 | Time series / 面积图 | hikaricp_connections_idle |
short |
| 等待队列长度 | Time series / 柱状图 | hikaricp_connections_pending |
short |
| 连接超时速率 | Time series / 柱状图 | rate(hikaricp_connections_timeout_total[5m]) |
ops (每秒次数) |
同时,建议在面板上方添加一个“连接池水位状态”的 Singlestat 或 Stat 面板,通过公式 (active / max) * 100 实时显示当前水位百分比,并设置颜色阈值:绿色(0-60%)、黄色(60-80%)、红色(80-100%)。
3.5 典型巡检场景与应对策略
以下列表总结了四种常见的水位异常场景及其根因分析方向,帮助你快速定位问题。
- 场景一:活跃连接数持续高位,空闲连接数接近 0
- 可能原因:业务流量突增、慢查询导致连接占用时间过长、连接泄漏。
- 应对策略:检查慢 SQL、增加 maxPoolSize、排查未关闭的 Connection 对象。
- 场景二:等待队列长度持续增长,但活跃连接数未达上限
- 可能原因:连接获取锁竞争激烈、数据库端连接数限制、网络延迟。
- 应对策略:检查数据库 max_connections、优化连接获取超时时间、考虑连接池拆分。
- 场景三:连接超时次数突然飙升
- 可能原因:数据库宕机或重启、连接池配置的 connectionTimeout 过短、后端负载过高。
- 应对策略:确认数据库健康状态、适当延长 connectionTimeout、增加连接池或限流。
- 场景四:空闲连接数过高,但活跃连接数很低
- 可能原因:连接池初始化连接数过多、业务低峰期、连接未及时回收。
- 应对策略:调整 minimumIdle 参数、启用连接空闲超时回收(idleTimeout)。
最佳实践:建议将连接池的
maximumPoolSize 设置为数据库 max_connections 的 70%-80%,并配合 minimumIdle 等于 maximumPoolSize 的 10%-20%,以平衡资源利用与突发流量。同时,务必为连接池指标配置 Prometheus 记录规则(recording rules),将活跃连接占比等计算密集型查询预聚合,避免每次面板刷新都重复计算。