Skip to content

Commit

Permalink
Disable HTTP Observations for Actuator
Browse files Browse the repository at this point in the history
Closes gh-34801
  • Loading branch information
jonatan-ivanov committed Aug 10, 2023
1 parent d1449fb commit d102e8b
Show file tree
Hide file tree
Showing 5 changed files with 440 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@

package org.springframework.boot.actuate.autoconfigure.observation.web.reactive;

import java.nio.file.Path;

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationPredicate;
import io.micrometer.observation.ObservationRegistry;

import org.springframework.beans.factory.ObjectProvider;
Expand All @@ -29,18 +32,22 @@
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties;
import org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints;
import org.springframework.boot.autoconfigure.AutoConfiguration;
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.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.web.reactive.WebFluxProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.reactive.observation.DefaultServerRequestObservationConvention;
import org.springframework.http.server.reactive.observation.ServerRequestObservationContext;
import org.springframework.http.server.reactive.observation.ServerRequestObservationConvention;
import org.springframework.web.filter.reactive.ServerHttpObservationFilter;

Expand All @@ -51,6 +58,7 @@
* @author Brian Clozel
* @author Jon Schneider
* @author Dmytro Nosan
* @author Jonatan Ivanov
* @since 3.0.0
*/
@AutoConfiguration(after = { MetricsAutoConfiguration.class, CompositeMeterRegistryAutoConfiguration.class,
Expand Down Expand Up @@ -97,4 +105,33 @@ MeterFilter metricsHttpServerUriTagFilter(MetricsProperties metricsProperties,

}

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "management.observations.http.server.actuator.enabled", havingValue = "false")
static class ActuatorWebEndpointObservationConfiguration {

@Bean
ObservationPredicate actuatorWebEndpointObservationPredicate(WebFluxProperties webFluxProperties,
PathMappedEndpoints pathMappedEndpoints) {
return (name, context) -> {
if (context instanceof ServerRequestObservationContext serverContext) {
String endpointPath = getEndpointPath(webFluxProperties, pathMappedEndpoints);
return !serverContext.getCarrier().getURI().getPath().startsWith(endpointPath);
}
return true;
};

}

private static String getEndpointPath(WebFluxProperties webFluxProperties,
PathMappedEndpoints pathMappedEndpoints) {
String webFluxBasePath = getWebFluxBasePath(webFluxProperties);
return Path.of(webFluxBasePath, pathMappedEndpoints.getBasePath()).toString();
}

private static String getWebFluxBasePath(WebFluxProperties webFluxProperties) {
return (webFluxProperties.getBasePath() != null) ? webFluxProperties.getBasePath() : "";
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@

package org.springframework.boot.actuate.autoconfigure.observation.web.servlet;

import java.nio.file.Path;

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationPredicate;
import io.micrometer.observation.ObservationRegistry;
import jakarta.servlet.DispatcherType;

Expand All @@ -30,19 +33,25 @@
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties;
import org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints;
import org.springframework.boot.autoconfigure.AutoConfiguration;
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.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.autoconfigure.web.ServerProperties.Servlet;
import org.springframework.boot.autoconfigure.web.servlet.ConditionalOnMissingFilterBean;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.server.observation.DefaultServerRequestObservationConvention;
import org.springframework.http.server.observation.ServerRequestObservationContext;
import org.springframework.http.server.observation.ServerRequestObservationConvention;
import org.springframework.web.filter.ServerHttpObservationFilter;
import org.springframework.web.servlet.DispatcherServlet;
Expand All @@ -54,14 +63,16 @@
* @author Brian Clozel
* @author Jon Schneider
* @author Dmytro Nosan
* @author Jonatan Ivanov
* @since 3.0.0
*/
@AutoConfiguration(after = { MetricsAutoConfiguration.class, CompositeMeterRegistryAutoConfiguration.class,
SimpleMetricsExportAutoConfiguration.class, ObservationAutoConfiguration.class })
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({ DispatcherServlet.class, Observation.class })
@ConditionalOnBean(ObservationRegistry.class)
@EnableConfigurationProperties({ MetricsProperties.class, ObservationProperties.class })
@EnableConfigurationProperties({ MetricsProperties.class, ObservationProperties.class, ServerProperties.class,
WebMvcProperties.class })
public class WebMvcObservationAutoConfiguration {

@Bean
Expand Down Expand Up @@ -97,4 +108,39 @@ MeterFilter metricsHttpServerUriTagFilter(ObservationProperties observationPrope

}

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "management.observations.http.server.actuator.enabled", havingValue = "false")
static class ActuatorWebEndpointObservationConfiguration {

@Bean
ObservationPredicate actuatorWebEndpointObservationPredicate(ServerProperties serverProperties,
WebMvcProperties webMvcProperties, PathMappedEndpoints pathMappedEndpoints) {
return (name, context) -> {
if (context instanceof ServerRequestObservationContext serverContext) {
String endpointPath = getEndpointPath(serverProperties, webMvcProperties, pathMappedEndpoints);
return !serverContext.getCarrier().getRequestURI().startsWith(endpointPath);
}
return true;
};
}

private static String getEndpointPath(ServerProperties serverProperties, WebMvcProperties webMvcProperties,
PathMappedEndpoints pathMappedEndpoints) {
String contextPath = getContextPath(serverProperties);
String servletPath = getServletPath(webMvcProperties);
return Path.of(contextPath, servletPath, pathMappedEndpoints.getBasePath()).toString();
}

private static String getContextPath(ServerProperties serverProperties) {
Servlet servlet = serverProperties.getServlet();
return (servlet.getContextPath() != null) ? servlet.getContextPath() : "";
}

private static String getServletPath(WebMvcProperties webMvcProperties) {
WebMvcProperties.Servlet servletProperties = webMvcProperties.getServlet();
return (servletProperties.getPath() != null) ? servletProperties.getPath() : "";
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2054,6 +2054,12 @@
"level": "error"
}
},
{
"name": "management.observations.http.server.actuator.enabled",
"type": "java.lang.Boolean",
"description": "Whether to enable HTTP observations for actuator endpoints.",
"defaultValue": false
},
{
"name": "management.otlp.tracing.compression",
"defaultValue": "none"
Expand Down
Loading

0 comments on commit d102e8b

Please sign in to comment.