@@ -436,22 +436,23 @@ public <V> Flux<V> exchangeToFlux(Function<ClientResponse, ? extends Flux<V>> re
436
436
437
437
private Mono <ClientResponse > exchange () {
438
438
ClientRequest .Builder requestBuilder = initRequestBuilder ();
439
- ClientRequestObservationContext observationContext = new ClientRequestObservationContext (requestBuilder );
440
439
return Mono .deferContextual (contextView -> {
441
440
Observation observation = ClientHttpObservationDocumentation .HTTP_REACTIVE_CLIENT_EXCHANGES .observation (observationConvention ,
442
- DEFAULT_OBSERVATION_CONVENTION , () -> observationContext , observationRegistry );
441
+ DEFAULT_OBSERVATION_CONVENTION , () -> new ClientRequestObservationContext ( requestBuilder ) , observationRegistry );
443
442
observation
444
443
.parentObservation (contextView .getOrDefault (ObservationThreadLocalAccessor .KEY , null ))
445
444
.start ();
446
- ExchangeFilterFunction filterFunction = new ObservationFilterFunction (observationContext );
445
+ ExchangeFilterFunction filterFunction = new ObservationFilterFunction (observation . getContext () );
447
446
if (filterFunctions != null ) {
448
447
filterFunction = filterFunctions .andThen (filterFunction );
449
448
}
450
449
contextView .getOrEmpty (COROUTINE_CONTEXT_ATTRIBUTE )
451
450
.ifPresent (context -> requestBuilder .attribute (COROUTINE_CONTEXT_ATTRIBUTE , context ));
452
451
ClientRequest request = requestBuilder .build ();
453
- observationContext .setUriTemplate ((String ) request .attribute (URI_TEMPLATE_ATTRIBUTE ).orElse (null ));
454
- observationContext .setRequest (request );
452
+ if (observation .getContext () instanceof ClientRequestObservationContext observationContext ) {
453
+ observationContext .setUriTemplate ((String ) request .attribute (URI_TEMPLATE_ATTRIBUTE ).orElse (null ));
454
+ observationContext .setRequest (request );
455
+ }
455
456
final ExchangeFilterFunction finalFilterFunction = filterFunction ;
456
457
Mono <ClientResponse > responseMono = Mono .defer (
457
458
() -> finalFilterFunction .apply (exchangeFunction ).exchange (request ))
@@ -464,7 +465,8 @@ private Mono<ClientResponse> exchange() {
464
465
.doOnNext (response -> responseReceived .set (true ))
465
466
.doOnError (observation ::error )
466
467
.doFinally (signalType -> {
467
- if (signalType == SignalType .CANCEL && !responseReceived .get ()) {
468
+ if (signalType == SignalType .CANCEL && !responseReceived .get () &&
469
+ observation .getContext () instanceof ClientRequestObservationContext observationContext ) {
468
470
observationContext .setAborted (true );
469
471
}
470
472
observation .stop ();
@@ -728,15 +730,19 @@ public Mono<? extends Throwable> apply(ClientResponse response) {
728
730
729
731
private static class ObservationFilterFunction implements ExchangeFilterFunction {
730
732
731
- private final ClientRequestObservationContext observationContext ;
733
+ private final Observation . Context observationContext ;
732
734
733
- ObservationFilterFunction (ClientRequestObservationContext observationContext ) {
735
+ ObservationFilterFunction (Observation . Context observationContext ) {
734
736
this .observationContext = observationContext ;
735
737
}
736
738
737
739
@ Override
738
740
public Mono <ClientResponse > filter (ClientRequest request , ExchangeFunction next ) {
739
- return next .exchange (request ).doOnNext (this .observationContext ::setResponse );
741
+ Mono <ClientResponse > exchange = next .exchange (request );
742
+ if (this .observationContext instanceof ClientRequestObservationContext clientContext ) {
743
+ exchange = exchange .doOnNext (clientContext ::setResponse );
744
+ }
745
+ return exchange ;
740
746
}
741
747
}
742
748
0 commit comments