Skip to content

WebClient instrumentation fails with IllegalArgumentException when adapting to WebClientExchangeTagsProvider #33483

@bdeneuter

Description

@bdeneuter

We are upgrading to Spring Boot 3.0 and Spring framework 6.0.2. We have observability activated in our services and are using DataDog and Prometheus.
When using the WebClient, we receive the following Exception:

java.lang.IllegalArgumentException: ClientRequest must not be null
	at org.springframework.util.Assert.notNull(Assert.java:204)
	Suppressed: The stacktrace has been enhanced by Reactor, refer to additional information below: 
Original Stack Trace:
		at app//org.springframework.util.Assert.notNull(Assert.java:204)
		at app//org.springframework.web.reactive.function.client.DefaultClientRequestBuilder.<init>(DefaultClientRequestBuilder.java:72)
		at app//org.springframework.web.reactive.function.client.ClientRequest.from(ClientRequest.java:134)
		at app//org.springframework.boot.actuate.autoconfigure.observation.web.client.ClientObservationConventionAdapter.mutateClientRequest(ClientObservationConventionAdapter.java:66)
		at app//org.springframework.boot.actuate.autoconfigure.observation.web.client.ClientObservationConventionAdapter.getLowCardinalityKeyValues(ClientObservationConventionAdapter.java:58)
		at app//org.springframework.boot.actuate.autoconfigure.observation.web.client.ClientObservationConventionAdapter.getLowCardinalityKeyValues(ClientObservationConventionAdapter.java:36)
		at app//io.micrometer.observation.SimpleObservation.start(SimpleObservation.java:134)
		at app//org.springframework.web.reactive.function.client.DefaultWebClient$DefaultRequestBodyUriSpec.lambda$exchange$9(DefaultWebClient.java:465)
		at app//reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:47)
		at app//reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64)
		at app//reactor.core.publisher.FluxRetryWhen.subscribe(FluxRetryWhen.java:77)
		at app//reactor.core.publisher.MonoRetryWhen.subscribeOrReturn(MonoRetryWhen.java:46)
		at app//reactor.core.publisher.Mono.subscribe(Mono.java:4429)
		at app//reactor.core.publisher.Mono.block(Mono.java:1709)

It seems that WebClient starts an Observation:
https://github.com/spring-projects/spring-framework/blob/main/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java#L465

observation
     .parentObservation(contextView.getOrDefault(ObservationThreadLocalAccessor.KEY, null))
     .start();

This observation uses the ClientRequest in:

ClientRequest clientRequest = ClientRequest.from(context.getRequest())
				.attribute(URI_TEMPLATE_ATTRIBUTE, context.getUriTemplate()).build();

But it is set afterwards in:
https://github.com/spring-projects/spring-framework/blob/main/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java#L468

ClientRequest request = requestBuilder.build();
				observationContext.setUriTemplate((String) request.attribute(URI_TEMPLATE_ATTRIBUTE).orElse(null));
				observationContext.setRequest(request);

Causing this IllegalArgumentException.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions