Browse Source

Merge branch '6.1.x'

pull/33566/head
Brian Clozel 1 year ago
parent
commit
6f09c21f05
  1. 1
      spring-webflux/spring-webflux.gradle
  2. 5
      spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java
  3. 21
      spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientObservationTests.java

1
spring-webflux/spring-webflux.gradle

@ -40,6 +40,7 @@ dependencies {
testImplementation(testFixtures(project(":spring-web"))) testImplementation(testFixtures(project(":spring-web")))
testImplementation("com.fasterxml:aalto-xml") testImplementation("com.fasterxml:aalto-xml")
testImplementation("com.squareup.okhttp3:mockwebserver") testImplementation("com.squareup.okhttp3:mockwebserver")
testImplementation("io.micrometer:context-propagation")
testImplementation("io.micrometer:micrometer-observation-test") testImplementation("io.micrometer:micrometer-observation-test")
testImplementation("io.projectreactor:reactor-test") testImplementation("io.projectreactor:reactor-test")
testImplementation("io.reactivex.rxjava3:rxjava") testImplementation("io.reactivex.rxjava3:rxjava")

5
spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java

@ -463,8 +463,9 @@ final class DefaultWebClient implements WebClient {
ClientRequest request = requestBuilder.build(); ClientRequest request = requestBuilder.build();
observationContext.setUriTemplate((String) request.attribute(URI_TEMPLATE_ATTRIBUTE).orElse(null)); observationContext.setUriTemplate((String) request.attribute(URI_TEMPLATE_ATTRIBUTE).orElse(null));
observationContext.setRequest(request); observationContext.setRequest(request);
Mono<ClientResponse> responseMono = filterFunction.apply(exchangeFunction) final ExchangeFilterFunction finalFilterFunction = filterFunction;
.exchange(request) Mono<ClientResponse> responseMono = Mono.defer(
() -> finalFilterFunction.apply(exchangeFunction).exchange(request))
.checkpoint("Request to " + .checkpoint("Request to " +
WebClientUtils.getRequestDescription(request.method(), request.url()) + WebClientUtils.getRequestDescription(request.method(), request.url()) +
" [DefaultWebClient]") " [DefaultWebClient]")

21
spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientObservationTests.java

@ -27,10 +27,12 @@ import io.micrometer.observation.ObservationHandler;
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
import io.micrometer.observation.tck.TestObservationRegistry; import io.micrometer.observation.tck.TestObservationRegistry;
import io.micrometer.observation.tck.TestObservationRegistryAssert; import io.micrometer.observation.tck.TestObservationRegistryAssert;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Hooks;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import reactor.test.StepVerifier; import reactor.test.StepVerifier;
@ -63,6 +65,7 @@ class WebClientObservationTests {
@BeforeEach @BeforeEach
void setup() { void setup() {
Hooks.enableAutomaticContextPropagation();
ClientResponse mockResponse = mock(); ClientResponse mockResponse = mock();
when(mockResponse.statusCode()).thenReturn(HttpStatus.OK); when(mockResponse.statusCode()).thenReturn(HttpStatus.OK);
when(mockResponse.headers()).thenReturn(new MockClientHeaders()); when(mockResponse.headers()).thenReturn(new MockClientHeaders());
@ -74,6 +77,11 @@ class WebClientObservationTests {
this.observationRegistry.observationConfig().observationHandler(new HeaderInjectingHandler()); this.observationRegistry.observationConfig().observationHandler(new HeaderInjectingHandler());
} }
@AfterEach
void cleanUp() {
Hooks.disableAutomaticContextPropagation();
}
@Test @Test
void recordsObservationForSuccessfulExchange() { void recordsObservationForSuccessfulExchange() {
this.builder.build().get().uri("/resource/{id}", 42) this.builder.build().get().uri("/resource/{id}", 42)
@ -148,6 +156,19 @@ class WebClientObservationTests {
verifyAndGetRequest(); verifyAndGetRequest();
} }
@Test
void setsCurrentObservationInScope() {
ExchangeFilterFunction assertionFilter = (request, chain) -> {
Observation currentObservation = observationRegistry.getCurrentObservation();
assertThat(currentObservation).isNotNull();
assertThat(currentObservation.getContext()).isInstanceOf(ClientRequestObservationContext.class);
return chain.exchange(request);
};
this.builder.filter(assertionFilter).build().get().uri("/resource/{id}", 42)
.retrieve().bodyToMono(Void.class).block(Duration.ofSeconds(5));
verifyAndGetRequest();
}
@Test @Test
void recordsObservationWithResponseDetailsWhenFilterFunctionErrors() { void recordsObservationWithResponseDetailsWhenFilterFunctionErrors() {
ExchangeFilterFunction errorFunction = (req, next) -> next.exchange(req).then(Mono.error(new IllegalStateException())); ExchangeFilterFunction errorFunction = (req, next) -> next.exchange(req).then(Mono.error(new IllegalStateException()));

Loading…
Cancel
Save