Merge branch '3.4.x'

Closes gh-44417
This commit is contained in:
Stéphane Nicoll 2025-02-24 08:03:17 +01:00
commit ed5ec225a7
13 changed files with 20 additions and 19 deletions

View File

@ -27,8 +27,8 @@ url-gradle-dsl=https://docs.gradle.org/current/dsl
url-gradle-javadoc=https://docs.gradle.org/current/javadoc
url-kotlin-docs-kotlin-plugin={url-kotlin-docs}/using-gradle.html
url-micrometer-docs-concepts={url-micrometer-docs}/concepts
url-micrometer-docs-observation={url-micrometer-docs}/observation
url-micrometer-docs-implementations={url-micrometer-docs}/implementations
url-micrometer-docs-observation={url-micrometer-docs}/observation
url-native-build-tools-docs=https://graalvm.github.io/native-build-tools/{version-native-build-tools}
url-native-build-tools-docs-gradle-plugin={url-native-build-tools-docs}/gradle-plugin.html
url-native-build-tools-docs-maven-plugin={url-native-build-tools-docs}/maven-plugin.html

View File

@ -23,8 +23,8 @@ import jakarta.servlet.DispatcherType;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.observation.ObservationProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBooleanProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.web.servlet.ConditionalOnMissingFilterBean;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
@ -54,7 +54,7 @@ abstract class ObservationFilterConfigurations {
static class TracingHeaderObservation {
@Bean
@ConditionalOnProperty(prefix = "management.observations.http.server.requests", name = "write-trace-header")
@ConditionalOnBooleanProperty("management.observations.http.server.requests.write-trace-header")
@ConditionalOnBean(Tracer.class)
@ConditionalOnMissingFilterBean({ ServerHttpObservationFilter.class, TraceHeaderObservationFilter.class })
FilterRegistrationBean<TraceHeaderObservationFilter> webMvcObservationFilter(ObservationRegistry registry,

View File

@ -48,7 +48,7 @@ public class TraceHeaderObservationFilter extends ServerHttpObservationFilter {
*/
public TraceHeaderObservationFilter(Tracer tracer, ObservationRegistry observationRegistry) {
super(observationRegistry);
Assert.notNull(tracer, "Tracer must not be null");
Assert.notNull(tracer, "'tracer' must not be null");
this.tracer = tracer;
}
@ -62,7 +62,7 @@ public class TraceHeaderObservationFilter extends ServerHttpObservationFilter {
public TraceHeaderObservationFilter(Tracer tracer, ObservationRegistry observationRegistry,
ServerRequestObservationConvention observationConvention) {
super(observationRegistry, observationConvention);
Assert.notNull(tracer, "Tracer must not be null");
Assert.notNull(tracer, "'tracer' must not be null");
this.tracer = tracer;
}

View File

@ -30,6 +30,8 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link TraceHeaderObservationFilter}.
*
* @author Brian Clozel
*/
class TraceHeaderObservationFilterTests {

View File

@ -165,7 +165,7 @@ class WebMvcObservationAutoConfigurationTests {
}
@Test
void filterRegistrationBacksOffWithAnothertestTraceHeaderObservationFilter() {
void filterRegistrationBacksOffWithAnotherTraceHeaderObservationFilter() {
this.contextRunner.withConfiguration(AutoConfigurations.of(NoopTracerAutoConfiguration.class))
.withPropertyValues("management.observations.http.server.requests.write-trace-header=true")
.withUserConfiguration(TestTraceHeaderObservationFilterConfiguration.class)

View File

@ -77,7 +77,7 @@ class FreeMarkerServletWebConfiguration extends AbstractFreeMarkerConfiguration
@Bean
@ConditionalOnEnabledResourceChain
@ConditionalOnMissingFilterBean(ResourceUrlEncodingFilter.class)
@ConditionalOnMissingFilterBean
FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() {
FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>(
new ResourceUrlEncodingFilter());

View File

@ -98,7 +98,7 @@ public class JerseyAutoConfiguration implements ServletContextAware {
}
@Bean
@ConditionalOnMissingFilterBean(RequestContextFilter.class)
@ConditionalOnMissingFilterBean
public FilterRegistrationBean<RequestContextFilter> requestContextFilter() {
FilterRegistrationBean<RequestContextFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new RequestContextFilter());

View File

@ -134,7 +134,7 @@ public class ThymeleafAutoConfiguration {
@Bean
@ConditionalOnEnabledResourceChain
@ConditionalOnMissingFilterBean(ResourceUrlEncodingFilter.class)
@ConditionalOnMissingFilterBean
FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() {
FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>(
new ResourceUrlEncodingFilter());

View File

@ -371,7 +371,7 @@ public class WebMvcAutoConfiguration {
@Bean
@ConditionalOnMissingBean({ RequestContextListener.class, RequestContextFilter.class })
@ConditionalOnMissingFilterBean(RequestContextFilter.class)
@ConditionalOnMissingFilterBean
public static RequestContextFilter requestContextFilter() {
return new OrderedRequestContextFilter();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2023 the original author or authors.
* Copyright 2012-2025 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,6 @@ class ConditionalOnMissingFilterBeanTests {
@Test
void outcomeWhenValueIsOfMissingBeanReturnsMatch() {
this.contextRunner.withUserConfiguration(WithoutTestFilterConfig.class, OnMissingWithValueConfig.class)
.run((context) -> assertThat(context).satisfies(filterBeanRequirement("myOtherFilter", "testFilter")));
}

View File

@ -1190,8 +1190,6 @@
* xref:reference:actuator/metrics.adoc#actuator.metrics.supported.system[#actuator.metrics.supported.system]
* xref:reference:actuator/metrics.adoc#actuator.metrics.supported.system[#production-ready-metrics-system]
* xref:reference:actuator/metrics.adoc#actuator.metrics.supported.tasks[#actuator.metrics.supported.tasks]
* xref:reference:actuator/observability.adoc#actuator.observability.annotations[#actuator.metrics.supported.timed-annotation]
* xref:reference:actuator/observability.adoc#actuator.observability.annotations[#production-ready-metrics-timed-annotation]
* xref:reference:actuator/metrics.adoc#actuator.metrics.supported.tomcat[#actuator.metrics.supported.tomcat]
* xref:reference:actuator/metrics.adoc#actuator.metrics.supported.tomcat[#production-ready-metrics-tomcat]
* xref:reference:actuator/metrics.adoc#actuator.metrics.supported[#actuator.metrics.supported]
@ -1210,7 +1208,9 @@
* xref:reference:actuator/monitoring.adoc#actuator.monitoring.management-specific-ssl[#production-ready-management-specific-ssl]
* xref:reference:actuator/monitoring.adoc#actuator.monitoring[#actuator.monitoring]
* xref:reference:actuator/monitoring.adoc#actuator.monitoring[#production-ready-monitoring]
* xref:reference:actuator/observability.adoc#actuator.observability.annotations[#actuator.metrics.supported.timed-annotation]
* xref:reference:actuator/observability.adoc#actuator.observability.annotations[#actuator.observability.annotations]
* xref:reference:actuator/observability.adoc#actuator.observability.annotations[#production-ready-metrics-timed-annotation]
* xref:reference:actuator/observability.adoc#actuator.observability.common-tags[#actuator.observability.common-tags]
* xref:reference:actuator/observability.adoc#actuator.observability.opentelemetry[#actuator.observability.opentelemetry]
* xref:reference:actuator/observability.adoc#actuator.observability.preventing-observations[#actuator.observability.preventing-observations]

View File

@ -775,8 +775,8 @@ See the {url-spring-framework-docs}/integration/observability.html#observability
To add to the default tags, provide a javadoc:org.springframework.context.annotation.Bean[format=annotation] that extends javadoc:org.springframework.http.server.observation.DefaultServerRequestObservationConvention[] from the `org.springframework.http.server.observation` package.
To replace the default tags, provide a javadoc:org.springframework.context.annotation.Bean[format=annotation] that implements javadoc:org.springframework.http.server.observation.ServerRequestObservationConvention[].
If the application is using xref:actuator/tracing.adoc#actuator.micrometer-tracing[Tracing], you can configure the HTTP server observations to print an `X-Trace-Id`
HTTP response header containing the current trace Id. For that, you will need to enable the following configuration property: configprop:management.observations.http.server.requests.write-trace-header[].
If the application is using xref:actuator/tracing.adoc#actuator.micrometer-tracing[tracing], you can configure the HTTP server observations to include an `X-Trace-Id`
HTTP response header containing the current trace ID. For that, you will need to enable the following configuration property: configprop:management.observations.http.server.requests.write-trace-header[].
TIP: In some cases, exceptions handled in web controllers are not recorded as request metrics tags.
Applications can opt in and record exceptions by xref:web/servlet.adoc#web.servlet.spring-mvc.error-handling[setting handled exceptions as request attributes].

View File

@ -108,9 +108,9 @@ The next sections will provide more details about logging, metrics and traces.
[[actuator.observability.annotations]]
== Micrometer Observation Annotations support
To enable scanning of observability annotations like javadoc:io.micrometer.observation.annotation.Observed[format=annotation], javadoc:io.micrometer.core.annotation.Timed[format=annotation], javadoc:io.micrometer.core.annotation.Counted[format=annotation], javadoc:io.micrometer.core.aop.MeterTag[format=annotation] and javadoc:io.micrometer.tracing.annotation.NewSpan[format=annotation] annotations, you need to set the configprop:management.observations.annotations.enabled[] property to `true`.
To enable scanning of observability annotations like javadoc:io.micrometer.observation.annotation.Observed[format=annotation], javadoc:io.micrometer.core.annotation.Timed[format=annotation], javadoc:io.micrometer.core.annotation.Counted[format=annotation], javadoc:io.micrometer.core.aop.MeterTag[format=annotation] and javadoc:io.micrometer.tracing.annotation.NewSpan[format=annotation], you need to set the configprop:management.observations.annotations.enabled[] property to `true`.
This feature is supported by Micrometer directly.
Please refer to the {url-micrometer-docs-concepts}/timers.html#_the_timed_annotation[Micrometer], {url-micrometer-docs-observation}/components.html#micrometer-observation-annotations[Micrometer Observation] and {url-micrometer-tracing-docs}/api.html#_aspect_oriented_programming[Micrometer Tracing] reference docs.
NOTE: When you annotate methods or classes which are already instrumented (for example xref:reference:actuator/metrics.adoc#actuator.metrics.supported.spring-data-repository[Spring Data repositories] or xref:reference:actuator/metrics.adoc#actuator.metrics.supported.spring-mvc[Spring MVC controllers]), you will get duplicate observations.
In that case you can either disable the automatic instrumentation using xref:reference:actuator/observability.adoc#actuator.observability.preventing-observations[properties] or an javadoc:io.micrometer.observation.ObservationPredicate[] and rely on your annotations, or you can remove your annotation.
NOTE: When you annotate methods or classes which are already instrumented (for example, xref:reference:actuator/metrics.adoc#actuator.metrics.supported.spring-data-repository[Spring Data repositories] or xref:reference:actuator/metrics.adoc#actuator.metrics.supported.spring-mvc[Spring MVC controllers]), you will get duplicate observations.
In that case you can either disable the automatic instrumentation using xref:reference:actuator/observability.adoc#actuator.observability.preventing-observations[properties] or an javadoc:io.micrometer.observation.ObservationPredicate[] and rely on your annotations, or you can remove your annotations.