diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml index b0f71dccdc6..f8c2c72029a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml @@ -172,11 +172,6 @@ javax.servlet-api true - - org.hibernate - hibernate-core - true - net.sf.ehcache ehcache @@ -238,6 +233,11 @@ jersey-container-servlet-core true + + org.hibernate + hibernate-core + true + org.hibernate.validator hibernate-validator diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfiguration.java index d3150479c14..024e8278a06 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfiguration.java @@ -30,23 +30,22 @@ import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.Simp import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; /** * {@link EnableAutoConfiguration Auto-configuration} for metrics on all available - * Hibernate {@link EntityManagerFactory entityManagerFactories} with statistics enabled. - *

- * {@link HibernateMetrics} can only monitor Hibernate {@link EntityManagerFactory} - * instances with statistics enabled (for instance, by setting JPA property - * hibernate.generate_statistics to true). + * Hibernate {@link EntityManagerFactory} instances that have statistics enabled. * * @author Rui Figueira + * @author Stephane Nicoll */ @Configuration @AutoConfigureAfter({ MetricsAutoConfiguration.class, HibernateJpaAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class }) +@ConditionalOnClass({ EntityManagerFactory.class, MeterRegistry.class }) @ConditionalOnBean({ EntityManagerFactory.class, MeterRegistry.class }) public class HibernateMetricsAutoConfiguration { @@ -61,13 +60,12 @@ public class HibernateMetricsAutoConfiguration { @Autowired public void bindEntityManagerFactoriesToRegistry( Map entityManagerFactories) { - entityManagerFactories.forEach(this::maybeBindEntityManagerFactoryToRegistry); + entityManagerFactories.forEach(this::bindEntityManagerFactoryToRegistry); } - private void maybeBindEntityManagerFactoryToRegistry(String beanName, + private void bindEntityManagerFactoryToRegistry(String beanName, EntityManagerFactory entityManagerFactory) { String entityManagerFactoryName = getEntityManagerFactoryName(beanName); - // HibernateMetrics internally checks if statistics are enabled before binding new HibernateMetrics(entityManagerFactory, entityManagerFactoryName, Collections.emptyList()).bindTo(this.registry); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/package-info.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/package-info.java new file mode 100644 index 00000000000..ecb62032914 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Auto-configuration for JDBC metrics. + */ +package org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfigurationTests.java index 338b291aa68..beff4b29646 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfigurationTests.java @@ -61,17 +61,18 @@ public class HibernateMetricsAutoConfigurationTests { .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, HibernateMetricsAutoConfiguration.class)) - .withUserConfiguration(BaseConfiguration.class).withPropertyValues( - "spring.jpa.properties.hibernate.generate_statistics:true"); + .withUserConfiguration(BaseConfiguration.class); @Test public void autoConfiguredEntityManagerFactoryWithStatsIsInstrumented() { - this.contextRunner.run((context) -> { - context.getBean(EntityManagerFactory.class).unwrap(SessionFactory.class); - MeterRegistry registry = context.getBean(MeterRegistry.class); - registry.get("hibernate.statements") - .tags("entityManagerFactory", "entityManagerFactory").meter(); - }); + this.contextRunner + .withPropertyValues( + "spring.jpa.properties.hibernate.generate_statistics:true") + .run((context) -> { + MeterRegistry registry = context.getBean(MeterRegistry.class); + registry.get("hibernate.statements") + .tags("entityManagerFactory", "entityManagerFactory").meter(); + }); } @Test @@ -89,7 +90,8 @@ public class HibernateMetricsAutoConfigurationTests { @Test public void entityManagerFactoryInstrumentationCanBeDisabled() { - this.contextRunner.withPropertyValues("management.metrics.enable.hibernate=false") + this.contextRunner.withPropertyValues("management.metrics.enable.hibernate=false", + "spring.jpa.properties.hibernate.generate_statistics:true") .run((context) -> { context.getBean(EntityManagerFactory.class) .unwrap(SessionFactory.class); @@ -101,6 +103,8 @@ public class HibernateMetricsAutoConfigurationTests { @Test public void allEntityManagerFactoriesCanBeInstrumented() { this.contextRunner + .withPropertyValues( + "spring.jpa.properties.hibernate.generate_statistics:true") .withUserConfiguration(TwoEntityManagerFactoriesConfiguration.class) .run((context) -> { context.getBean("firstEntityManagerFactory", @@ -118,13 +122,15 @@ public class HibernateMetricsAutoConfigurationTests { @Test public void entityManagerFactoryInstrumentationIsDisabledIfNotHibernateSessionFactory() { this.contextRunner + .withPropertyValues( + "spring.jpa.properties.hibernate.generate_statistics:true") .withUserConfiguration( NonHibernateEntityManagerFactoryConfiguration.class) .run((context) -> { // ensure EntityManagerFactory is not an Hibernate SessionFactory assertThatThrownBy(() -> context.getBean(EntityManagerFactory.class) .unwrap(SessionFactory.class)) - .isInstanceOf(PersistenceException.class); + .isInstanceOf(PersistenceException.class); MeterRegistry registry = context.getBean(MeterRegistry.class); assertThat(registry.find("hibernate.statements").meter()).isNull(); }); @@ -146,6 +152,7 @@ public class HibernateMetricsAutoConfigurationTests { @Id @GeneratedValue private Long id; + } @Configuration @@ -174,6 +181,7 @@ public class HibernateMetricsAutoConfigurationTests { new HibernateJpaVendorAdapter(), jpaProperties, null); return builder.dataSource(ds).packages(PACKAGE_CLASSES).build(); } + } @Configuration @@ -187,5 +195,7 @@ public class HibernateMetricsAutoConfigurationTests { .willThrow(PersistenceException.class); return mockedFactory; } + } + } diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc index 71fae7e69d5..e006f6f37dd 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc @@ -1768,32 +1768,34 @@ Also, Hikari-specific metrics are exposed with a `hikaricp` prefix. Each metric by the name of the Pool (can be controlled with `spring.datasource.name`). -[[production-ready-metrics-rabbitmq]] -==== RabbitMQ Metrics -Auto-configuration will enable the instrumentation of all available RabbitMQ connection -factories with a metric named `rabbitmq`. - [[production-ready-metrics-hibernate]] ==== Hibernate Metrics Auto-configuration enables the instrumentation of all available Hibernate -`EntityManagerFactory` objects that have statistics enabled with a metric named +`EntityManagerFactory` instances that have statistics enabled with a metric named `hibernate`. -Metrics are also tagged by the name of the `EntityManagerFactory` that is derived from +Metrics are also tagged by the name of the `EntityManagerFactory` that is derived from the bean name. -To enable statistics on Hibernate `EntityManagerFactory` instances, JPA property `hibernate.generate_statistics` must be set to `true`. For example, on the default -`EntityManagerFactory`, you need to set the following property: +To enable statistics, the standardJPA property `hibernate.generate_statistics` must be +set to `true`. You can enable that on the auto-configured `EntityManagerFactory` as shown +in the following example: -.application.properties [source,properties,indent=0] ---- - spring.jpa.properties.hibernate.generate_statistics=true + spring.jpa.properties.hibernate.generate_statistics=true ---- +[[production-ready-metrics-rabbitmq]] +==== RabbitMQ Metrics +Auto-configuration will enable the instrumentation of all available RabbitMQ connection +factories with a metric named `rabbitmq`. + + + [[production-ready-metrics-custom]] === Registering custom metrics To register custom metrics, inject `MeterRegistry` into your component, as shown in the