Hyperf 通过 PoolFactory 获取数据库连接池状态并上报 Prometheus 指标,结合 mysqld_exporter 实现 PHP 层与 MySQL 层连接数的交叉监控闭环。

Hyperf 本身不直接提供数据库连接池连接数的实时监控页面,但可以通过代码主动采集 + Prometheus 指标上报的方式,把连接池当前使用量、空闲数、最大容量等关键状态暴露出去,再接入 Grafana 查看图表或设置告警。
获取连接池运行时状态
Hyperf 的 PoolFactory 提供了标准接口读取连接池内部统计信息。在服务中注入 Hyperf\DbConnection\Pool\PoolFactory 即可调用:
-
$pool->getCurrentConnections():当前已创建的总连接数(含空闲+正在使用) -
$pool->getConnectionsInChannel():当前空闲连接数量(即未被借出的连接) -
$pool->getMaxConnections():配置中的max_connections值 -
$pool->getMinConnections():配置中的min_connections值
将连接池指标注册为 Prometheus metric
在 app/Service/PoolMonitorService.php 或一个独立的监听器中,用 Hyperf Metric 组件上报指标:
- 定义三个 Gauge 类型指标:
hyperf_db_pool_current_connections、hyperf_db_pool_idle_connections、hyperf_db_pool_in_use_connections - 每 10 秒调用一次
getDbPoolStats()并更新指标值 - 确保该逻辑在常驻协程中执行(如通过
Hyperf\Contract\OnStartInterface启动定时任务)
关联 MySQL 实例原生指标
仅看 PHP 层连接池不够,必须和数据库真实连接数对齐:
- 部署
mysqld_exporter,用最小权限账号(仅PROCESS、REPLICATION CLIENT、SELECT)连接 MySQL - 重点关注
mysql_global_status_threads_connected(当前客户端连接数),它应 ≤hyperf_db_pool_current_connections+ 其他应用连接 - 若前者远大于后者,说明有连接泄漏或非 Pool 连接(比如手动 new PDO)
- 若两者持续接近
max_connections,且hyperf_db_pool_in_use_connections长期满载,说明需扩容连接池或优化 SQL
快速验证是否生效
启动服务后访问 /metrics(默认路径),搜索 hyperf_db_pool_ 关键字,确认有数值输出;同时用 curl http://mysql-exporter:9104/metrics | grep threads_connected 确认 MySQL 层数据可采集。两个数据源能交叉比对,才构成完整监控闭环。


















