Spring Boot + HikariCPでコネクションプールのMetricsを取得する
HikariCPは人気のあるコネクションプールライブラリの一つです
Spring Bootからも簡単に使えるようになっています
こんな感じ
@Configuration
public class AppConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
final HikariDataSource ds = new HikariDataSource();
ds.setDriverClassName(driverClassName);
ds.setJdbcUrl(jdbcUrl);
ds.setUsername(userName);
ds.setPassword(password);
return ds;
}
}
コネクションプールのベンチマークは以前取りました。ご参考まで
コネクションプールを使うとJMXでMetricsを取りたくなりますよね?
HikariCPにはその機能がちゃんとあります
MBean (JMX) Monitoring and Management
以下の2つを設定すればコネクションプールのMBeanが登録されます
- registerMbeans
- poolName
ですが、Springと一緒に使う場合この設定をしただけではコネクションプールのMBeanが登録されませんでした
こんな感じでDataSourceの一部の設定しか取れず、肝心のコネクションプールのMetricsはわからない状態になってます
なんでコネクションプールのMBeanが登録されてないかと言うと、
アプリケーション起動時にSpringがコンポーネントの中から
MBeanを探して登録してるからです
HikariCPのDataSource(HikariDataSource)はコンポーネントとして登録されてるけど、
コネクションプール(HikariPool)はコンポーネントとして登録されてません
Springのソースコードの該当箇所は以下です
-
Spring BootのJmxAutoConfigurationでMBeanExporterが無ければ、AnnotationMBeanExporterのコンポーネントが生成される
-
AnnotationMBeanExporterの親クラスであるMBeanExporterのメソッドでMBeanに登録される
では、どうすればコネクションプールのMBeanを登録してMetricsが取れるようになるかというと、
MBeanの登録はSpringでは行わず、HikariCPにまかせればOKです
具体的なソースコードは以下になります
@Configuration
public class AppConfig {
// 追加
@Autowired
MBeanExporter mBeanExporter;
@Bean(destroyMethod = "close")
public DataSource dataSource() {
final HikariDataSource ds = new HikariDataSource();
ds.setDriverClassName(driverClassName);
ds.setJdbcUrl(jdbcUrl);
ds.setUsername(userName);
ds.setPassword(password);
// 追加
ds.setRegisterMbeans(true);
ds.setPoolName("dataSource");
// 追加
// Bean名を指定する
// (Beanアノテーションのname属性 or Beanアノテーションを付けたメソッド名)
mBeanExporter.addExcludedBean("dataSource");
return ds;
}
}
MBeanExporterのexcludedBeansにコンポーネント名を追加しておけば、ここでMBean登録対象から除外される様になってます
設定後はこんな感じでコネクションプールのMetricsが取れます
Metricsを取得するためのObjectNameはこれです
com.zaxxer.hikari:type=Pool (データソース名)