diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfiguration.java index f3ab0f7827b..400f19c0397 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricFilterAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 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. @@ -46,7 +46,7 @@ import org.springframework.web.servlet.HandlerMapping; @ConditionalOnClass({ Servlet.class, ServletRegistration.class, OncePerRequestFilter.class, HandlerMapping.class }) @AutoConfigureAfter(MetricRepositoryAutoConfiguration.class) -@ConditionalOnProperty(name = "endpoints.metrics.filter.enabled", matchIfMissing = true) +@ConditionalOnProperty(prefix = "endpoints.metrics.filter", name="enabled", matchIfMissing = true) @EnableConfigurationProperties({ MetricFilterProperties.class }) public class MetricFilterAutoConfiguration { diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/TraceWebFilterAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/TraceWebFilterAutoConfiguration.java index aee07ad61d9..25dd7022429 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/TraceWebFilterAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/TraceWebFilterAutoConfiguration.java @@ -28,6 +28,7 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.web.servlet.error.ErrorAttributes; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -40,10 +41,11 @@ import org.springframework.web.servlet.DispatcherServlet; * * @author Dave Syer */ +@Configuration @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, ServletRegistration.class }) @AutoConfigureAfter(TraceRepositoryAutoConfiguration.class) +@ConditionalOnProperty(prefix = "endpoints.trace.filter", name = "enabled", matchIfMissing = true) @EnableConfigurationProperties(TraceProperties.class) -@Configuration public class TraceWebFilterAutoConfiguration { private final TraceRepository traceRepository; diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/LoggersMvcEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/LoggersMvcEndpoint.java index fc8e15aabf1..c774ce1ab95 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/LoggersMvcEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/LoggersMvcEndpoint.java @@ -22,7 +22,6 @@ import org.springframework.boot.actuate.endpoint.LoggersEndpoint; import org.springframework.boot.actuate.endpoint.LoggersEndpoint.LoggerLevels; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.logging.LogLevel; -import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -33,6 +32,7 @@ import org.springframework.web.bind.annotation.ResponseBody; * * @author Ben Hale * @author Kazuki Shimizu + * @author Eddú Meléndez * @since 1.5.0 */ @ConfigurationProperties(prefix = "endpoints.loggers") @@ -68,10 +68,17 @@ public class LoggersMvcEndpoint extends EndpointMvcAdapter { // disabled return getDisabledResponse(); } - String level = configuration.get("configuredLevel"); - LogLevel logLevel = level == null ? null : LogLevel.valueOf(level.toUpperCase()); + LogLevel logLevel; + try { + String level = configuration.get("configuredLevel"); + logLevel = level == null ? null : LogLevel.valueOf(level.toUpperCase()); + } + catch (IllegalArgumentException ex) { + return ResponseEntity.badRequest().build(); + } + this.delegate.setLogLevel(name, logLevel); - return HttpEntity.EMPTY; + return ResponseEntity.ok().build(); } } diff --git a/spring-boot-actuator/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-actuator/src/main/resources/META-INF/additional-spring-configuration-metadata.json index d09303797f9..4ad754d3695 100644 --- a/spring-boot-actuator/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-actuator/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -80,6 +80,12 @@ "type": "java.lang.String", "description": "Endpoint URL path." }, + { + "name": "endpoints.trace.filter.enabled", + "type": "java.lang.Boolean", + "description": "Enable the trace servlet filter.", + "defaultValue": true + }, { "name": "info", "type": "java.util.Map", diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/TraceWebFilterAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/TraceWebFilterAutoConfigurationTests.java index 91cd9c7bcb4..3e232b42de9 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/TraceWebFilterAutoConfigurationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/TraceWebFilterAutoConfigurationTests.java @@ -18,12 +18,14 @@ package org.springframework.boot.actuate.autoconfigure; import java.util.Map; +import org.junit.After; import org.junit.Test; import org.springframework.boot.actuate.trace.TraceProperties; import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.actuate.trace.WebRequestTraceFilter; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -34,28 +36,54 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link TraceWebFilterAutoConfiguration}. * * @author Phillip Webb + * @author Stephane Nicoll */ public class TraceWebFilterAutoConfigurationTests { + private AnnotationConfigApplicationContext context; + + @After + public void close() { + if (this.context != null) { + this.context.close(); + } + } + @Test public void configureFilter() { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( - PropertyPlaceholderAutoConfiguration.class, - TraceRepositoryAutoConfiguration.class, - TraceWebFilterAutoConfiguration.class); - assertThat(context.getBean(WebRequestTraceFilter.class)).isNotNull(); - context.close(); + load(); + assertThat(this.context.getBean(WebRequestTraceFilter.class)).isNotNull(); } @Test public void overrideTraceFilter() throws Exception { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( - CustomTraceFilterConfig.class, PropertyPlaceholderAutoConfiguration.class, - TraceRepositoryAutoConfiguration.class, - TraceWebFilterAutoConfiguration.class); - WebRequestTraceFilter filter = context.getBean(WebRequestTraceFilter.class); + load(CustomTraceFilterConfig.class); + WebRequestTraceFilter filter = this.context.getBean(WebRequestTraceFilter.class); assertThat(filter).isInstanceOf(TestWebRequestTraceFilter.class); - context.close(); + } + + @Test + public void skipsFilterIfPropertyDisabled() throws Exception { + load("endpoints.trace.filter.enabled:false"); + assertThat(this.context.getBeansOfType(WebRequestTraceFilter.class).size()) + .isEqualTo(0); + } + + private void load(String... environment) { + load(null, environment); + } + + private void load(Class config, String... environment) { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(ctx, environment); + if (config != null) { + ctx.register(config); + } + ctx.register(PropertyPlaceholderAutoConfiguration.class, + TraceRepositoryAutoConfiguration.class, + TraceWebFilterAutoConfiguration.class); + ctx.refresh(); + this.context = ctx; } @Configuration diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/LoggersMvcEndpointTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/LoggersMvcEndpointTests.java index 82e573a7883..83f824851e1 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/LoggersMvcEndpointTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/LoggersMvcEndpointTests.java @@ -63,6 +63,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * * @author Ben Hale * @author Phillip Webb + * @author Eddú Meléndez */ @RunWith(SpringRunner.class) @SpringBootTest @@ -168,6 +169,14 @@ public class LoggersMvcEndpointTests { verifyZeroInteractions(this.loggingSystem); } + @Test + public void setLoggerWithWrongLogLevel() throws Exception { + this.mvc.perform(post("/loggers/ROOT").contentType(MediaType.APPLICATION_JSON) + .content("{\"configuredLevel\":\"other\"}")) + .andExpect(status().is4xxClientError()); + verifyZeroInteractions(this.loggingSystem); + } + @Configuration @Import({ JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 1ebe2f50ad4..c5e251d99d5 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -1065,6 +1065,7 @@ content into your application; rather pick only the properties that you need. endpoints.shutdown.path= # Endpoint path. endpoints.shutdown.sensitive= # Mark if the endpoint exposes sensitive information. endpoints.trace.enabled= # Enable the endpoint. + endpoints.trace.filter.enabled=true # Enable the trace servlet filter. endpoints.trace.id= # Endpoint identifier. endpoints.trace.path= # Endpoint path. endpoints.trace.sensitive= # Mark if the endpoint exposes sensitive information.