2. 连接池核心指标:活跃连接数、空闲连接数、等待队列长度、连接超时次数、连接创建速率、连接销毁速率
连接池是数据库、缓存、微服务 gRPC 等中间件与上游服务之间的关键资源层。水位巡检的核心在于持续观测连接池的 存量、流量 与 异常 三类指标。本章逐一拆解六个核心指标的定义、采集方式与 PromQL 表达。
2.1 指标全景图
下表从语义、典型 Prometheus Metric Name、数据类型与巡检价值四个维度对齐六个指标:
| 指标名称 | Prometheus Metric 示例 | 类型 | 巡检价值 |
|---|---|---|---|
| 活跃连接数 | db_connections_active |
Gauge | 当前正在执行查询的连接数,反映并发压力 |
| 空闲连接数 | db_connections_idle |
Gauge | 可被复用的连接数,过低则频繁创建新连接 |
| 等待队列长度 | db_connections_waiting |
Gauge | 请求排队等待连接的线程数,直接反映连接饥饿 |
| 连接超时次数 | db_connections_timeouts_total |
Counter | 获取连接超时的累计次数,异常信号 |
| 连接创建速率 | rate(db_connections_created_total[1m]) |
Counter → Rate | 每秒新建连接数,过高说明连接复用率低 |
| 连接销毁速率 | rate(db_connections_destroyed_total[1m]) |
Counter → Rate | 每秒关闭连接数,与创建速率配合判断连接抖动 |
巡检原则: 活跃 + 空闲 ≈ 总连接数;等待队列长度 > 0 且持续增长时,必须立即触发告警。
2.2 活跃连接数与空闲连接数
这两个 Gauge 指标构成连接池的 水位基础。活跃连接数代表正在被线程占用的连接;空闲连接数代表已建立但未被使用的连接。两者之和应接近连接池的 max_total 上限。
- 活跃连接数过高:接近
max_total时,新请求将进入等待队列或直接超时。 - 空闲连接数过低:接近 0 时,每次请求都可能触发创建新连接,增加延迟。
- 空闲连接数过高:超过
max_idle配置时,说明连接池收缩策略失效,浪费内存。
# 活跃连接占比(水位)
sum by (instance) (
db_connections_active
/ on (instance) (db_connections_active + db_connections_idle)
) > 0.85
2.3 等待队列长度
等待队列长度是连接池 饥饿程度 的直接体现。当所有连接都被占用且空闲连接数为 0 时,新请求会进入阻塞队列。该指标为 Gauge,正常值应为 0 或极低。
关键阈值: 等待队列长度 > 0 持续超过 10 秒,说明连接池容量不足或后端响应变慢。若队列长度持续增长,则可能引发级联超时。
# 等待队列瞬时告警
db_connections_waiting > 0
# 等待队列持续告警(5 分钟内均值 > 0)
avg_over_time(db_connections_waiting[5m]) > 0
2.4 连接超时次数
连接超时次数是 Counter 类型,记录从连接池获取连接时因等待超时而失败的累计次数。该指标通常由连接池客户端(如 HikariCP、Druid、JedisPool)暴露。
- 绝对值:
db_connections_timeouts_total在时间窗口内持续增加,说明连接池已无法满足并发需求。 - 速率:
rate(db_connections_timeouts_total[1m])应保持为 0;一旦 > 0,需立即定位。
# 超时速率告警(1 分钟内出现任何超时)
rate(db_connections_timeouts_total[1m]) > 0
2.5 连接创建速率与销毁速率
这两个速率指标通过 Counter 的 rate() 函数计算,反映连接池的 生命周期周转 情况。
| 场景 | 创建速率 | 销毁速率 | 诊断结论 |
|---|---|---|---|
| 正常 | 低且平稳 | 低且平稳 | 连接复用率高,池化效果良好 |
| 创建飙升 | 突然升高 | 不变或略升 | 空闲连接不足,大量请求触发新建 |
| 创建≈销毁 | 高 | 高 | 连接抖动(Connection Thrashing),需检查 max_lifetime 或后端稳定性 |
| 销毁 > 创建 | 低 | 高 | 连接池正在收缩,可能因空闲超时或后端主动断开 |
# 连接抖动检测:创建速率与销毁速率之比超过 1.5 倍
rate(db_connections_created_total[1m])
/
rate(db_connections_destroyed_total[1m]) > 1.5
2.6 六指标联动关系图
下图展示六个核心指标在连接池生命周期中的位置与数据流向:
2.7 指标采集注意事项
- Gauge 指标:活跃连接数、空闲连接数、等待队列长度应使用
avg_over_time或max_over_time降噪,避免瞬时抖动触发误告警。 - Counter 指标:连接超时次数、创建/销毁总数必须使用
rate()或increase()转换为速率,不能直接对原始 Counter 设置阈值。 - 标签对齐:确保
instance、pool_name、datasource等标签在指标间一致,否则比率计算会出错。
最佳实践: 在 Prometheus 的 recording rules 中预计算
rate(db_connections_created_total[1m]) 和 rate(db_connections_destroyed_total[1m]),避免告警规则中重复计算开销。