Skip to content

Commit d290684

Browse files
authored
Fix flaky spring webflux tests (#3150)
1 parent c3c5c11 commit d290684

File tree

1 file changed

+26
-6
lines changed
  • instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/server

1 file changed

+26
-6
lines changed

instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/server/AdviceUtils.java

+26-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.api.trace.StatusCode;
1212
import io.opentelemetry.context.Scope;
1313
import java.util.Map;
14+
import java.util.concurrent.atomic.AtomicBoolean;
1415
import java.util.function.Function;
1516
import org.reactivestreams.Publisher;
1617
import org.reactivestreams.Subscription;
@@ -79,17 +80,18 @@ static void finishSpanIfPresent(io.opentelemetry.context.Context context, Throwa
7980

8081
private static void finishSpanIfPresentInAttributes(
8182
Map<String, Object> attributes, Throwable throwable) {
82-
8383
io.opentelemetry.context.Context context =
8484
(io.opentelemetry.context.Context) attributes.remove(CONTEXT_ATTRIBUTE);
8585
finishSpanIfPresent(context, throwable);
8686
}
8787

88-
public static class SpanFinishingSubscriber<T> implements CoreSubscriber<T> {
88+
public static class SpanFinishingSubscriber<T> implements CoreSubscriber<T>, Subscription {
8989

9090
private final CoreSubscriber<? super T> subscriber;
9191
private final io.opentelemetry.context.Context otelContext;
9292
private final Context context;
93+
private final AtomicBoolean completed = new AtomicBoolean();
94+
private Subscription subscription;
9395

9496
public SpanFinishingSubscriber(
9597
CoreSubscriber<? super T> subscriber, io.opentelemetry.context.Context otelContext) {
@@ -99,9 +101,10 @@ public SpanFinishingSubscriber(
99101
}
100102

101103
@Override
102-
public void onSubscribe(Subscription s) {
104+
public void onSubscribe(Subscription subscription) {
105+
this.subscription = subscription;
103106
try (Scope scope = otelContext.makeCurrent()) {
104-
subscriber.onSubscribe(s);
107+
subscriber.onSubscribe(this);
105108
}
106109
}
107110

@@ -114,19 +117,36 @@ public void onNext(T t) {
114117

115118
@Override
116119
public void onError(Throwable t) {
117-
finishSpanIfPresent(otelContext, t);
120+
if (completed.compareAndSet(false, true)) {
121+
finishSpanIfPresent(otelContext, t);
122+
}
118123
subscriber.onError(t);
119124
}
120125

121126
@Override
122127
public void onComplete() {
123-
finishSpanIfPresent(otelContext, null);
128+
if (completed.compareAndSet(false, true)) {
129+
finishSpanIfPresent(otelContext, null);
130+
}
124131
subscriber.onComplete();
125132
}
126133

127134
@Override
128135
public Context currentContext() {
129136
return context;
130137
}
138+
139+
@Override
140+
public void request(long n) {
141+
subscription.request(n);
142+
}
143+
144+
@Override
145+
public void cancel() {
146+
if (completed.compareAndSet(false, true)) {
147+
finishSpanIfPresent(otelContext, null);
148+
}
149+
subscription.cancel();
150+
}
131151
}
132152
}

0 commit comments

Comments
 (0)