Skip to content

Commit b0e1e08

Browse files
Merge branch '1.0.x' into 1.1.x
2 parents ff3eb5c + 091dbec commit b0e1e08

File tree

7 files changed

+113
-86
lines changed

7 files changed

+113
-86
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ task deleteLockFiles(type: Delete) {
343343
}
344344

345345
wrapper {
346-
gradleVersion = '8.2'
346+
gradleVersion = '8.2.1'
347347
}
348348

349349
defaultTasks 'build'

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

micrometer-tracing-bridges/micrometer-tracing-bridge-otel/src/main/java/io/micrometer/tracing/otel/bridge/OtelCurrentTraceContext.java

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public TraceContext context() {
5959
public Scope newScope(TraceContext context) {
6060
OtelTraceContext otelTraceContext = (OtelTraceContext) context;
6161
if (otelTraceContext == null) {
62-
return io.opentelemetry.context.Scope::noop;
62+
return new WrappedScope(io.opentelemetry.context.Scope.noop());
6363
}
6464
Context current = Context.current();
6565
Context old = otelTraceContext.context();
@@ -76,24 +76,20 @@ public Scope newScope(TraceContext context) {
7676
Baggage oldBaggage = Baggage.fromContext(old);
7777
boolean sameBaggage = sameBaggage(currentBaggage, oldBaggage);
7878
if (sameSpan && sameBaggage) {
79-
return io.opentelemetry.context.Scope::noop;
79+
return new WrappedScope(io.opentelemetry.context.Scope.noop());
8080
}
8181
Baggage updatedBaggage = mergeBaggage(currentBaggage, oldBaggage);
8282
Context newContext = old.with(fromContext).with(updatedBaggage);
8383
io.opentelemetry.context.Scope attach = newContext.makeCurrent();
8484
otelTraceContext.updateContext(newContext);
85-
return () -> {
86-
otelTraceContext.updateContext(old);
87-
attach.close();
88-
};
85+
return new WrappedScope(attach, otelTraceContext, old);
8986
}
9087

9188
private static Baggage mergeBaggage(Baggage currentBaggage, Baggage oldBaggage) {
9289
BaggageBuilder baggageBuilder = currentBaggage.toBuilder();
9390
oldBaggage.forEach(
9491
(key, baggageEntry) -> baggageBuilder.put(key, baggageEntry.getValue(), baggageEntry.getMetadata()));
95-
Baggage updatedBaggage = baggageBuilder.build();
96-
return updatedBaggage;
92+
return baggageBuilder.build();
9793
}
9894

9995
private boolean sameBaggage(Baggage currentBaggage, Baggage oldBaggage) {
@@ -104,7 +100,7 @@ private boolean sameBaggage(Baggage currentBaggage, Baggage oldBaggage) {
104100
public Scope maybeScope(TraceContext context) {
105101
if (context == null) {
106102
io.opentelemetry.context.Scope scope = Context.root().makeCurrent();
107-
return scope::close;
103+
return new WrappedScope(scope);
108104
}
109105
return newScope(context);
110106
}
@@ -129,4 +125,33 @@ public ExecutorService wrap(ExecutorService delegate) {
129125
return Context.current().wrap(delegate);
130126
}
131127

128+
static class WrappedScope implements Scope {
129+
130+
final io.opentelemetry.context.Scope scope;
131+
132+
final OtelTraceContext currentOtelTraceContext;
133+
134+
final Context oldContext;
135+
136+
WrappedScope(io.opentelemetry.context.Scope scope) {
137+
this(scope, null, null);
138+
}
139+
140+
WrappedScope(io.opentelemetry.context.Scope scope, OtelTraceContext currentOtelTraceContext,
141+
Context oldContext) {
142+
this.scope = scope;
143+
this.currentOtelTraceContext = currentOtelTraceContext;
144+
this.oldContext = oldContext;
145+
}
146+
147+
@Override
148+
public void close() {
149+
if (this.currentOtelTraceContext != null) {
150+
currentOtelTraceContext.updateContext(oldContext);
151+
}
152+
this.scope.close();
153+
}
154+
155+
}
156+
132157
}

micrometer-tracing-bridges/micrometer-tracing-bridge-otel/src/main/java/io/micrometer/tracing/otel/bridge/OtelSpan.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ public Span start() {
8686
@Override
8787
public Span name(String name) {
8888
this.delegate.updateName(name);
89-
return new OtelSpan(this.delegate);
89+
return this;
9090
}
9191

9292
@Override
9393
public Span event(String value) {
9494
this.delegate.addEvent(value);
95-
return new OtelSpan(this.delegate);
95+
return this;
9696
}
9797

9898
@Override
@@ -104,7 +104,7 @@ public Span event(String value, long time, TimeUnit timeUnit) {
104104
@Override
105105
public Span tag(String key, String value) {
106106
this.delegate.setAttribute(key, value);
107-
return new OtelSpan(this.delegate);
107+
return this;
108108
}
109109

110110
@Override
@@ -141,7 +141,7 @@ public Span remoteIpAndPort(String ip, int port) {
141141
public Span error(Throwable throwable) {
142142
this.delegate.recordException(throwable);
143143
this.delegate.setStatus(StatusCode.ERROR, throwable.getMessage());
144-
return new OtelSpan(this.delegate);
144+
return this;
145145
}
146146

147147
@Override

micrometer-tracing-bridges/micrometer-tracing-bridge-otel/src/main/java/io/micrometer/tracing/otel/bridge/OtelSpanInScope.java

Lines changed: 0 additions & 58 deletions
This file was deleted.

micrometer-tracing-bridges/micrometer-tracing-bridge-otel/src/main/java/io/micrometer/tracing/otel/bridge/OtelTracer.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ public Span nextSpan(Span parent) {
9292
@Override
9393
public Tracer.SpanInScope withSpan(Span span) {
9494
io.opentelemetry.api.trace.Span delegate = delegate(span);
95-
return new OtelSpanInScope((OtelSpan) span, delegate);
95+
CurrentTraceContext.Scope scope = this.otelCurrentTraceContext
96+
.maybeScope(OtelSpan.fromOtel(delegate).context());
97+
return new WrappedSpanInScope(scope);
9698
}
9799

98100
private io.opentelemetry.api.trace.Span delegate(Span span) {
@@ -195,4 +197,19 @@ public interface EventPublisher {
195197

196198
}
197199

200+
static class WrappedSpanInScope implements SpanInScope {
201+
202+
final CurrentTraceContext.Scope scope;
203+
204+
WrappedSpanInScope(CurrentTraceContext.Scope scope) {
205+
this.scope = scope;
206+
}
207+
208+
@Override
209+
public void close() {
210+
this.scope.close();
211+
}
212+
213+
}
214+
198215
}

micrometer-tracing-bridges/micrometer-tracing-bridge-otel/src/test/java/io/micrometer/tracing/otel/bridge/OtelTracingApiTests.java

Lines changed: 55 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,10 @@
1515
*/
1616
package io.micrometer.tracing.otel.bridge;
1717

18-
import java.util.Collections;
19-
import java.util.HashMap;
20-
import java.util.Map;
21-
import java.util.Queue;
22-
import java.util.concurrent.ExecutorService;
23-
import java.util.concurrent.Executors;
24-
25-
import io.micrometer.tracing.Baggage;
26-
import io.micrometer.tracing.BaggageInScope;
27-
import io.micrometer.tracing.Link;
28-
import io.micrometer.tracing.Span;
29-
import io.micrometer.tracing.Tracer;
18+
import io.micrometer.tracing.*;
3019
import io.opentelemetry.api.common.AttributeKey;
3120
import io.opentelemetry.context.Context;
21+
import io.opentelemetry.context.Scope;
3222
import io.opentelemetry.context.propagation.ContextPropagators;
3323
import io.opentelemetry.extension.trace.propagation.B3Propagator;
3424
import io.opentelemetry.sdk.OpenTelemetrySdk;
@@ -39,6 +29,13 @@
3929
import org.junit.jupiter.api.Test;
4030
import org.slf4j.MDC;
4131

32+
import java.util.Collections;
33+
import java.util.HashMap;
34+
import java.util.Map;
35+
import java.util.Queue;
36+
import java.util.concurrent.ExecutorService;
37+
import java.util.concurrent.Executors;
38+
4239
import static io.opentelemetry.sdk.trace.samplers.Sampler.alwaysOn;
4340
import static org.assertj.core.api.BDDAssertions.then;
4441

@@ -365,4 +362,50 @@ void should_add_links() throws InterruptedException {
365362
then(linkData.getAttributes().asMap()).containsEntry(AttributeKey.stringKey("tag"), "value");
366363
}
367364

365+
@Test
366+
void should_work_with_with_scope_for_tracer_and_current_trace_context() {
367+
Span span = tracer.nextSpan();
368+
369+
then(io.opentelemetry.api.trace.Span.current()).isSameAs(io.opentelemetry.api.trace.Span.getInvalid());
370+
then(tracer.currentSpan()).isNull();
371+
372+
try (Tracer.SpanInScope ws = tracer.withSpan(span.start())) {
373+
OtelCurrentTraceContext.WrappedScope wrappedScope = getScopeFromTracerScope(
374+
(OtelTracer.WrappedSpanInScope) ws);
375+
then(wrappedScope.scope).isNotSameAs(Scope.noop());
376+
then(io.opentelemetry.api.trace.Span.current()).isSameAs(OtelSpan.toOtel(span));
377+
then(tracer.currentSpan()).isEqualTo(span);
378+
try (Tracer.SpanInScope ws2 = tracer.withSpan(span)) {
379+
OtelCurrentTraceContext.WrappedScope wrappedScope2 = getScopeFromTracerScope(
380+
(OtelTracer.WrappedSpanInScope) ws2);
381+
then(wrappedScope2.scope).isSameAs(Scope.noop());
382+
then(io.opentelemetry.api.trace.Span.current()).isSameAs(OtelSpan.toOtel(span));
383+
then(tracer.currentSpan()).isEqualTo(span);
384+
}
385+
}
386+
387+
then(io.opentelemetry.api.trace.Span.current()).isSameAs(io.opentelemetry.api.trace.Span.getInvalid());
388+
then(tracer.currentSpan()).isNull();
389+
390+
try (CurrentTraceContext.Scope ws = otelCurrentTraceContext.maybeScope(span.context())) {
391+
Scope scope = ((OtelCurrentTraceContext.WrappedScope) ws).scope;
392+
then(scope).isNotSameAs(Scope.noop());
393+
then(io.opentelemetry.api.trace.Span.current()).isSameAs(OtelSpan.toOtel(span));
394+
then(tracer.currentSpan()).isEqualTo(span);
395+
try (CurrentTraceContext.Scope ws2 = otelCurrentTraceContext.maybeScope(span.context())) {
396+
Scope scope2 = ((OtelCurrentTraceContext.WrappedScope) ws2).scope;
397+
then(scope2).isSameAs(Scope.noop());
398+
then(io.opentelemetry.api.trace.Span.current()).isSameAs(OtelSpan.toOtel(span));
399+
then(tracer.currentSpan()).isEqualTo(span);
400+
}
401+
}
402+
403+
then(io.opentelemetry.api.trace.Span.current()).isSameAs(io.opentelemetry.api.trace.Span.getInvalid());
404+
then(tracer.currentSpan()).isNull();
405+
}
406+
407+
private static OtelCurrentTraceContext.WrappedScope getScopeFromTracerScope(OtelTracer.WrappedSpanInScope ws) {
408+
return (OtelCurrentTraceContext.WrappedScope) ws.scope;
409+
}
410+
368411
}

0 commit comments

Comments
 (0)