Browse Source

Add metrics support for idle jdbc connections

See gh-17504
pull/17557/head
ayudovin 7 years ago committed by Stephane Nicoll
parent
commit
9acc02b5cc
  1. 2
      spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/jdbc/DataSourcePoolMetrics.java
  2. 6
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/CommonsDbcp2DataSourcePoolMetadata.java
  3. 11
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/DataSourcePoolMetadata.java
  4. 13
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/HikariDataSourcePoolMetadata.java
  5. 6
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/TomcatDataSourcePoolMetadata.java
  6. 6
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/metadata/AbstractDataSourcePoolMetadataTests.java
  7. 11
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/metadata/CommonsDbcp2DataSourcePoolMetadataTests.java
  8. 12
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/metadata/HikariDataSourcePoolMetadataTests.java
  9. 11
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/metadata/TomcatDataSourcePoolMetadataTests.java

2
spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/jdbc/DataSourcePoolMetrics.java

@ -38,6 +38,7 @@ import org.springframework.util.ConcurrentReferenceHashMap; @@ -38,6 +38,7 @@ import org.springframework.util.ConcurrentReferenceHashMap;
*
* @author Jon Schneider
* @author Phillip Webb
* @author Artsiom Yudovin
* @since 2.0.0
*/
public class DataSourcePoolMetrics implements MeterBinder {
@ -68,6 +69,7 @@ public class DataSourcePoolMetrics implements MeterBinder { @@ -68,6 +69,7 @@ public class DataSourcePoolMetrics implements MeterBinder {
bindPoolMetadata(registry, "active", DataSourcePoolMetadata::getActive);
bindPoolMetadata(registry, "max", DataSourcePoolMetadata::getMax);
bindPoolMetadata(registry, "min", DataSourcePoolMetadata::getMin);
bindPoolMetadata(registry, "idle", DataSourcePoolMetadata::getIdle);
}
}

6
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/CommonsDbcp2DataSourcePoolMetadata.java

@ -24,6 +24,7 @@ import org.apache.commons.dbcp2.BasicDataSource; @@ -24,6 +24,7 @@ import org.apache.commons.dbcp2.BasicDataSource;
* {@link DataSourcePoolMetadata} for an Apache Commons DBCP2 {@link DataSource}.
*
* @author Stephane Nicoll
* @author Artsiom Yudovin
* @since 2.0.0
*/
public class CommonsDbcp2DataSourcePoolMetadata extends AbstractDataSourcePoolMetadata<BasicDataSource> {
@ -57,4 +58,9 @@ public class CommonsDbcp2DataSourcePoolMetadata extends AbstractDataSourcePoolMe @@ -57,4 +58,9 @@ public class CommonsDbcp2DataSourcePoolMetadata extends AbstractDataSourcePoolMe
return getDataSource().getDefaultAutoCommit();
}
@Override
public Integer getIdle() {
return getDataSource().getNumIdle();
}
}

11
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/DataSourcePoolMetadata.java

@ -23,6 +23,7 @@ import javax.sql.DataSource; @@ -23,6 +23,7 @@ import javax.sql.DataSource;
* {@link DataSource} implementations.
*
* @author Stephane Nicoll
* @author Artsiom Yudovin
* @since 2.0.0
*/
public interface DataSourcePoolMetadata {
@ -49,6 +50,16 @@ public interface DataSourcePoolMetadata { @@ -49,6 +50,16 @@ public interface DataSourcePoolMetadata {
*/
Integer getActive();
/**
* Return the number of established but idle connections. Can also return {@code null}
* if that information is not available.
* @return the number of established but idle connections or {@code null}
* @since 2.2.0
*/
default Integer getIdle() {
return null;
}
/**
* Return the maximum number of active connections that can be allocated at the same
* time or {@code -1} if there is no limit. Can also return {@code null} if that

13
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/HikariDataSourcePoolMetadata.java

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.boot.jdbc.metadata;
import java.util.Objects;
import javax.sql.DataSource;
import com.zaxxer.hikari.HikariDataSource;
@ -27,6 +29,7 @@ import org.springframework.beans.DirectFieldAccessor; @@ -27,6 +29,7 @@ import org.springframework.beans.DirectFieldAccessor;
* {@link DataSourcePoolMetadata} for a Hikari {@link DataSource}.
*
* @author Stephane Nicoll
* @author Artsiom Yudovin
* @since 2.0.0
*/
public class HikariDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata<HikariDataSource> {
@ -45,6 +48,16 @@ public class HikariDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata @@ -45,6 +48,16 @@ public class HikariDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata
}
}
@Override
public Integer getIdle() {
HikariPool pool = getHikariPool();
if (Objects.nonNull(pool)) {
return pool.getIdleConnections();
}
return null;
}
private HikariPool getHikariPool() {
return (HikariPool) new DirectFieldAccessor(getDataSource()).getPropertyValue("pool");
}

6
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/TomcatDataSourcePoolMetadata.java

@ -23,6 +23,7 @@ import org.apache.tomcat.jdbc.pool.DataSource; @@ -23,6 +23,7 @@ import org.apache.tomcat.jdbc.pool.DataSource;
* {@link DataSourcePoolMetadata} for a Tomcat DataSource.
*
* @author Stephane Nicoll
* @author Artsiom Yudovin
* @since 2.0.0
*/
public class TomcatDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata<DataSource> {
@ -57,4 +58,9 @@ public class TomcatDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata @@ -57,4 +58,9 @@ public class TomcatDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata
return getDataSource().isDefaultAutoCommit();
}
@Override
public Integer getIdle() {
return getDataSource().getNumIdle();
}
}

6
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/metadata/AbstractDataSourcePoolMetadataTests.java

@ -29,6 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat; @@ -29,6 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*
* @param <D> the data source pool metadata type
* @author Stephane Nicoll
* @author Artsiom Yudovin
*/
abstract class AbstractDataSourcePoolMetadataTests<D extends AbstractDataSourcePoolMetadata<?>> {
@ -67,6 +68,11 @@ abstract class AbstractDataSourcePoolMetadataTests<D extends AbstractDataSourceP @@ -67,6 +68,11 @@ abstract class AbstractDataSourcePoolMetadataTests<D extends AbstractDataSourceP
});
}
@Test
void getIdle() {
assertThat(getDataSourceMetadata().getIdle()).isEqualTo(Integer.valueOf(1));
}
@Test
void getPoolSizeTwoConnections() {
final JdbcTemplate jdbcTemplate = new JdbcTemplate(getDataSourceMetadata().getDataSource());

11
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/metadata/CommonsDbcp2DataSourcePoolMetadataTests.java

@ -19,6 +19,9 @@ package org.springframework.boot.jdbc.metadata; @@ -19,6 +19,9 @@ package org.springframework.boot.jdbc.metadata;
import org.apache.commons.dbcp2.BasicDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import static org.assertj.core.api.Assertions.assertThat;
/**
@ -83,6 +86,9 @@ class CommonsDbcp2DataSourcePoolMetadataTests @@ -83,6 +86,9 @@ class CommonsDbcp2DataSourcePoolMetadataTests
BasicDataSource dataSource = createDataSource();
dataSource.setMinIdle(minSize);
dataSource.setMaxTotal(maxSize);
this.initPool(dataSource);
return new CommonsDbcp2DataSourcePoolMetadata(dataSource);
}
@ -90,4 +96,9 @@ class CommonsDbcp2DataSourcePoolMetadataTests @@ -90,4 +96,9 @@ class CommonsDbcp2DataSourcePoolMetadataTests
return initializeBuilder().type(BasicDataSource.class).build();
}
private void initPool(BasicDataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute((ConnectionCallback<Void>) (connection) -> null);
}
}

12
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/metadata/HikariDataSourcePoolMetadataTests.java

@ -18,12 +18,16 @@ package org.springframework.boot.jdbc.metadata; @@ -18,12 +18,16 @@ package org.springframework.boot.jdbc.metadata;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link HikariDataSourcePoolMetadata}.
*
* @author Stephane Nicoll
* @author Artsiom Yudovin
*/
public class HikariDataSourcePoolMetadataTests
extends AbstractDataSourcePoolMetadataTests<HikariDataSourcePoolMetadata> {
@ -54,7 +58,15 @@ public class HikariDataSourcePoolMetadataTests @@ -54,7 +58,15 @@ public class HikariDataSourcePoolMetadataTests
HikariDataSource dataSource = initializeBuilder().type(HikariDataSource.class).build();
dataSource.setMinimumIdle(minSize);
dataSource.setMaximumPoolSize(maxSize);
this.initPool(dataSource);
return dataSource;
}
private void initPool(HikariDataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute((ConnectionCallback<Void>) (connection) -> null);
}
}

11
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/metadata/TomcatDataSourcePoolMetadataTests.java

@ -18,6 +18,9 @@ package org.springframework.boot.jdbc.metadata; @@ -18,6 +18,9 @@ package org.springframework.boot.jdbc.metadata;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import static org.assertj.core.api.Assertions.assertThat;
/**
@ -58,7 +61,15 @@ public class TomcatDataSourcePoolMetadataTests @@ -58,7 +61,15 @@ public class TomcatDataSourcePoolMetadataTests
// Avoid warnings
dataSource.setInitialSize(minSize);
dataSource.setMaxIdle(maxSize);
this.initPool(dataSource);
return dataSource;
}
private void initPool(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute((ConnectionCallback<Void>) (connection) -> null);
}
}

Loading…
Cancel
Save