Merge branch '6.1.x'
This commit is contained in:
commit
6f09c21f05
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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]")
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in New Issue