如何监控Golang数据库连接池及导出DBStats指标?
- 内容介绍
- 文章标签
- 相关推荐
本文共计792个文字,预计阅读时间需要4分钟。
sqlDB.Stats() 返回的是 sql.DBStats 结构体,它反映了连接池当前的实时快照,而不是历史累计值。
关键字段包括:
导出 DBStats 到 Prometheus 的常见错误
直接在 HTTP handler 里调用 db.Stats() 并返回指标,容易踩两个坑:一是没加锁(Stats() 内部是原子读,安全);二是误把瞬时值当速率用,比如对 WaitCount 做 rate() 计算——这是错的,WaitCount 是单调递增计数器,Prometheus 客户端应使用 prometheus.NewCounterFunc 包装,而不是 Gauge。
- 用
prometheus.NewCounterFunc暴露WaitCount和MaxOpenConnections这类只增或固定值 - 用
prometheus.NewGaugeFunc暴露OpenConnections、InUse、Idle这类可升可降的瞬时状态 - 避免每秒调用
db.Stats()多次——它轻量,但高频采集无意义;10s 间隔足够
为什么 MaxIdleConns 设太小会导致 WaitCount 突增
MaxIdleConns 控制空闲连接上限,但它和连接复用效率强相关。
本文共计792个文字,预计阅读时间需要4分钟。
sqlDB.Stats() 返回的是 sql.DBStats 结构体,它反映了连接池当前的实时快照,而不是历史累计值。
关键字段包括:
导出 DBStats 到 Prometheus 的常见错误
直接在 HTTP handler 里调用 db.Stats() 并返回指标,容易踩两个坑:一是没加锁(Stats() 内部是原子读,安全);二是误把瞬时值当速率用,比如对 WaitCount 做 rate() 计算——这是错的,WaitCount 是单调递增计数器,Prometheus 客户端应使用 prometheus.NewCounterFunc 包装,而不是 Gauge。
- 用
prometheus.NewCounterFunc暴露WaitCount和MaxOpenConnections这类只增或固定值 - 用
prometheus.NewGaugeFunc暴露OpenConnections、InUse、Idle这类可升可降的瞬时状态 - 避免每秒调用
db.Stats()多次——它轻量,但高频采集无意义;10s 间隔足够
为什么 MaxIdleConns 设太小会导致 WaitCount 突增
MaxIdleConns 控制空闲连接上限,但它和连接复用效率强相关。

