@PostConstruct public void initialize() { DataSource primaryDataSource = getPrimaryDataSource(); DataSourcePoolMetadataProvider provider = new DataSourcePoolMetadataProviders( this.providers); for (Map.Entry<String, DataSource> entry : this.applicationContext .getBeansOfType(DataSource.class).entrySet()) { String beanName = entry.getKey(); DataSource bean = entry.getValue(); String prefix = createPrefix(beanName, bean, bean.equals(primaryDataSource)); DataSourcePoolMetadata poolMetadata = provider .getDataSourcePoolMetadata(bean); if (poolMetadata != null) { this.metadataByPrefix.put(prefix, poolMetadata); } } }
DataSourceMetricsHolder(String dataSourceName, DataSourcePoolMetadata poolMetadata, MeterRegistry registry) { connectionObtainTimer = Timer.builder("data.source.connections.wait") .tags("pool", dataSourceName) .register(registry); connectionUsageTimer = Timer.builder("data.source.connections.usage") .tags("pool", dataSourceName) .register(registry); connectionCreatedCounter = Counter.builder("data.source.connections.created") .tags("pool", dataSourceName) .register(registry); connectionFailedCounter = Counter.builder("data.source.connections.failed") .tags("pool", dataSourceName) .register(registry); Gauge.builder("data.source.connections.active", this, metrics -> activeConnections.doubleValue()) .tags("pool", dataSourceName) .register(registry); Gauge.builder("data.source.connections.pending", this, metrics -> pendingConnections.doubleValue()) .tags("pool", dataSourceName) .register(registry); if (poolMetadata != null) { Gauge.builder("data.source.connections.max", this, metrics -> poolMetadata.getMax()) .tags("pool", dataSourceName) .register(registry); Gauge.builder("data.source.connections.min", this, metrics -> poolMetadata.getMin()) .tags("pool", dataSourceName) .register(registry); } }
public DataSourceMetricsHolder getMetrics(String dataSourceName) { return dataSourceMetrics.computeIfAbsent(dataSourceName, beanName -> { DataSource dataSource = applicationContext.getBean(beanName, DataSource.class); DataSourcePoolMetadataProviders providers = new DataSourcePoolMetadataProviders(metadataProviders); DataSourcePoolMetadata dataSourcePoolMetadata = providers.getDataSourcePoolMetadata(dataSource); DataSourceMetricsHolder dataSourceMetricsHolder = new DataSourceMetricsHolder(beanName, dataSourcePoolMetadata, registry); return dataSourceMetricsHolder; }); }
@Test public void testReturnDataSourcePoolMetadataProviderForHikari() { EnvironmentTestUtils.addEnvironment(context, "spring.datasource.type:" + HikariDataSource.class.getName()); context.register(DataSourceAutoConfiguration.class, DataSourceDecoratorAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class); context.refresh(); DataSource dataSource = context.getBean(DataSource.class); Assertions.assertThat(dataSource).isInstanceOf(DecoratedDataSource.class); DataSourcePoolMetadataProviders poolMetadataProvider = new DataSourcePoolMetadataProviders(context.getBeansOfType(DataSourcePoolMetadataProvider.class).values()); DataSourcePoolMetadata dataSourcePoolMetadata = poolMetadataProvider.getDataSourcePoolMetadata(dataSource); Assertions.assertThat(dataSourcePoolMetadata).isInstanceOf(HikariDataSourcePoolMetadata.class); }
@Test public void testReturnDataSourcePoolMetadataProviderForTomcat() { context.register(DataSourceAutoConfiguration.class, DataSourceDecoratorAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class); context.refresh(); DataSource dataSource = context.getBean(DataSource.class); Assertions.assertThat(dataSource).isInstanceOf(DecoratedDataSource.class); DataSourcePoolMetadataProviders poolMetadataProvider = new DataSourcePoolMetadataProviders(context.getBeansOfType(DataSourcePoolMetadataProvider.class).values()); DataSourcePoolMetadata dataSourcePoolMetadata = poolMetadataProvider.getDataSourcePoolMetadata(dataSource); Assertions.assertThat(dataSourcePoolMetadata).isInstanceOf(TomcatDataSourcePoolMetadata.class); }
@Test public void testReturnDataSourcePoolMetadataProviderForDbcp2() { EnvironmentTestUtils.addEnvironment(context, "spring.datasource.type:" + org.apache.commons.dbcp2.BasicDataSource.class.getName()); context.register(DataSourceAutoConfiguration.class, DataSourceDecoratorAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class); context.refresh(); DataSource dataSource = context.getBean(DataSource.class); Assertions.assertThat(dataSource).isInstanceOf(DecoratedDataSource.class); DataSourcePoolMetadataProviders poolMetadataProvider = new DataSourcePoolMetadataProviders(context.getBeansOfType(DataSourcePoolMetadataProvider.class).values()); DataSourcePoolMetadata dataSourcePoolMetadata = poolMetadataProvider.getDataSourcePoolMetadata(dataSource); Assertions.assertThat(dataSourcePoolMetadata).isInstanceOf(CommonsDbcp2DataSourcePoolMetadata.class); }
private DataSourcePoolMetadata getDataSourcePoolMetadata(DataSource dataSource) { return dataSource instanceof DruidDataSource ? new DruidDataSourcePoolMetadata((DruidDataSource) dataSource) : null; }
private String getValidationQuery(DataSource source) { DataSourcePoolMetadata poolMetadata = this.poolMetadataProvider .getDataSourcePoolMetadata(source); return (poolMetadata == null ? null : poolMetadata.getValidationQuery()); }