0%

连接池监控

连接池

数据源是各种数据库,甚至你可以认为excel都是一个数据源。连接池是为了复用连接数据源的链接的管理池。
连接池的监控可以反应一部分的业务高峰,形成告警。持续的监控指标也能作为应用崩溃的复盘数据。

监控原理

公司平台使用普罗米修斯采集Java暴露的JMX数据,作为产品研发团队,只需要在程序启动后,将每个数据源包装一个Listener,多个数据源打包成map,交给MBeanExporter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MBeanExporter exporter = new MBeanExporter();
// 探测模式 0不自动 1当前IOC容器查找组件 2 根据的策略进行探测
exporter.setAutodetectMode(0);
Map<String, AtomikosDataSourceBean> dataSources = null; // 自行获取
Map<String, Object> map = new HashMap<String, Object>();
for (String key : dataSources.keySet()) {
AtomikosDataSourceBean dataSrouce = dataSources.get(key);
DataSourceListener listener = new DataSourceListener(dataSrouce);
map.put("Catalina:type=DatasourceConnectionPool,name=" + dataSrouce.getUniqueResourceName(), listener);
}

exporter.setBeans(map);
exporter.afterPropertiesSet();
exporter.afterSingletonsInstantiated();

指标设置

样例代码中,指标的计算是这样的:
最大上限: maxSize
当前创建: poolSize(池中总连接)
空闲数: available(池中可用连接)
已使用: poolSize - available
利用率: (poolSize - available) / poolSize

一开始我是觉得不太合理,监控的时候,不太好监控。仔细思考一下,也可以组合一下用当前暴露的指标做监控:

  1. 当前创建>90 (硬指标,不方便)
  2. 利用率在多个采集周期都>90% (持续高涨,当前创建数应该会增加)

其实如果不是非常学院派,常人理解的指标应该是这样计算:
最大上限: maxSize
当前创建: poolSize
空闲数: maxSize - poolSize
已使用: poolSize - available
利用率: poolSize / maxSize