Skip to content

Commit 58f3a01

Browse files
Merge branch '1.0.x' into 1.1.x
2 parents c43314a + 366dcb0 commit 58f3a01

File tree

5 files changed

+188
-41
lines changed

5 files changed

+188
-41
lines changed

micrometer-tracing-bridges/micrometer-tracing-bridge-brave/src/main/java/io/micrometer/tracing/brave/bridge/BraveBaggageInScope.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package io.micrometer.tracing.brave.bridge;
1717

18+
import brave.Span;
19+
import brave.Tags;
1820
import brave.baggage.BaggageField;
1921
import io.micrometer.common.lang.Nullable;
2022
import io.micrometer.common.util.internal.logging.InternalLogger;
@@ -23,6 +25,8 @@
2325
import io.micrometer.tracing.BaggageInScope;
2426
import io.micrometer.tracing.TraceContext;
2527

28+
import java.util.List;
29+
2630
/**
2731
* Brave implementation of a {@link BaggageInScope}.
2832
*
@@ -37,13 +41,21 @@ class BraveBaggageInScope implements Baggage, BaggageInScope {
3741

3842
private final String previousBaggage;
3943

44+
private final List<String> tagFields;
45+
4046
@Nullable
4147
private brave.propagation.TraceContext traceContext;
4248

43-
BraveBaggageInScope(BaggageField delegate, @Nullable brave.propagation.TraceContext traceContext) {
49+
@Nullable
50+
private final Span span;
51+
52+
BraveBaggageInScope(BaggageField delegate, @Nullable brave.propagation.TraceContext traceContext,
53+
@Nullable Span span, List<String> tagFields) {
4454
this.delegate = delegate;
4555
this.traceContext = traceContext;
4656
this.previousBaggage = delegate.getValue();
57+
this.tagFields = tagFields;
58+
this.span = span;
4759
}
4860

4961
@Override
@@ -70,14 +82,25 @@ public Baggage set(String value) {
7082
else {
7183
this.delegate.updateValue(value);
7284
}
85+
tagSpanIfOnTagList();
7386
return this;
7487
}
7588

89+
private void tagSpanIfOnTagList() {
90+
if (this.span != null) {
91+
this.tagFields.stream()
92+
.filter(s -> s.equalsIgnoreCase(name()))
93+
.findFirst()
94+
.ifPresent(s -> Tags.BAGGAGE_FIELD.tag(this.delegate, span));
95+
}
96+
}
97+
7698
@Override
7799
@Deprecated
78100
public Baggage set(TraceContext traceContext, String value) {
79101
brave.propagation.TraceContext braveContext = updateBraveTraceContext(traceContext);
80102
this.delegate.updateValue(braveContext, value);
103+
tagSpanIfOnTagList();
81104
return this;
82105
}
83106

@@ -105,13 +128,15 @@ public BaggageInScope makeCurrent(String value) {
105128
else {
106129
this.delegate.updateValue(value);
107130
}
131+
tagSpanIfOnTagList();
108132
return makeCurrent();
109133
}
110134

111135
@Override
112136
public BaggageInScope makeCurrent(TraceContext traceContext, String value) {
113137
brave.propagation.TraceContext braveContext = updateBraveTraceContext(traceContext);
114138
this.delegate.updateValue(braveContext, value);
139+
tagSpanIfOnTagList();
115140
return makeCurrent();
116141
}
117142

micrometer-tracing-bridges/micrometer-tracing-bridge-brave/src/main/java/io/micrometer/tracing/brave/bridge/BraveBaggageManager.java

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,19 @@
1515
*/
1616
package io.micrometer.tracing.brave.bridge;
1717

18-
import java.io.Closeable;
19-
import java.util.Map;
20-
18+
import brave.Span;
2119
import brave.Tracing;
2220
import brave.baggage.BaggageField;
2321
import io.micrometer.tracing.Baggage;
2422
import io.micrometer.tracing.BaggageInScope;
2523
import io.micrometer.tracing.BaggageManager;
2624
import io.micrometer.tracing.TraceContext;
2725

26+
import java.io.Closeable;
27+
import java.util.Collections;
28+
import java.util.List;
29+
import java.util.Map;
30+
2831
/**
2932
* Brave implementation of a {@link BaggageManager}.
3033
*
@@ -33,6 +36,24 @@
3336
*/
3437
public class BraveBaggageManager implements Closeable, BaggageManager {
3538

39+
private final List<String> tagFields;
40+
41+
/**
42+
* Create an instance of {@link BraveBaggageManager}.
43+
* @param tagFields fields of baggage keys that should become tags on a span
44+
*/
45+
public BraveBaggageManager(List<String> tagFields) {
46+
this.tagFields = tagFields;
47+
}
48+
49+
/**
50+
* Create an instance of {@link BraveBaggageManager} that uses no tag fields (span
51+
* will not be tagged with baggage entries).
52+
*/
53+
public BraveBaggageManager() {
54+
this.tagFields = Collections.emptyList();
55+
}
56+
3657
@Override
3758
public Map<String, String> getAllBaggage() {
3859
return BaggageField.getAllValues();
@@ -57,7 +78,8 @@ public Baggage getBaggage(TraceContext traceContext, String name) {
5778
if (baggageField == null) {
5879
return null;
5980
}
60-
return new BraveBaggageInScope(baggageField, BraveTraceContext.toBrave(traceContext));
81+
Span span = currentSpan();
82+
return new BraveBaggageInScope(baggageField, BraveTraceContext.toBrave(traceContext), span, this.tagFields);
6183
}
6284

6385
@Override
@@ -67,17 +89,21 @@ public Baggage createBaggage(String name) {
6789
}
6890

6991
private BraveBaggageInScope baggage(String name, TraceContext traceContext) {
70-
return new BraveBaggageInScope(BaggageField.create(name), BraveTraceContext.toBrave(traceContext));
92+
Span span = currentSpan();
93+
return new BraveBaggageInScope(BaggageField.create(name), BraveTraceContext.toBrave(traceContext), span,
94+
tagFields);
7195
}
7296

7397
private BraveBaggageInScope baggage(String name) {
74-
return new BraveBaggageInScope(BaggageField.create(name), currentTraceContext());
98+
Span span = currentSpan();
99+
return new BraveBaggageInScope(BaggageField.create(name), span != null ? span.context() : null, span,
100+
this.tagFields);
75101
}
76102

77103
// Taken from BraveField
78-
private static brave.propagation.TraceContext currentTraceContext() {
104+
private static Span currentSpan() {
79105
Tracing tracing = Tracing.current();
80-
return tracing != null ? tracing.currentTraceContext().get() : null;
106+
return tracing != null ? tracing.tracer().currentSpan() : null;
81107
}
82108

83109
@Override

micrometer-tracing-bridges/micrometer-tracing-bridge-brave/src/test/java/io/micrometer/tracing/brave/bridge/BaggageTests.java

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,11 @@
1515
*/
1616
package io.micrometer.tracing.brave.bridge;
1717

18-
import java.time.Duration;
19-
import java.util.HashMap;
20-
import java.util.Map;
21-
import java.util.concurrent.ExecutionException;
22-
import java.util.concurrent.ExecutorService;
23-
import java.util.concurrent.Executors;
24-
import java.util.concurrent.Future;
25-
import java.util.concurrent.TimeUnit;
26-
import java.util.concurrent.TimeoutException;
27-
2818
import brave.Tracing;
2919
import brave.baggage.BaggageField;
3020
import brave.baggage.BaggagePropagation;
3121
import brave.baggage.BaggagePropagationConfig;
32-
import brave.handler.SpanHandler;
22+
import brave.handler.MutableSpan;
3323
import brave.propagation.B3Propagation;
3424
import brave.propagation.StrictCurrentTraceContext;
3525
import brave.sampler.Sampler;
@@ -39,10 +29,7 @@
3929
import io.micrometer.context.ContextRegistry;
4030
import io.micrometer.observation.ObservationRegistry;
4131
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
42-
import io.micrometer.tracing.BaggageInScope;
43-
import io.micrometer.tracing.CurrentTraceContext;
44-
import io.micrometer.tracing.Span;
45-
import io.micrometer.tracing.Tracer;
32+
import io.micrometer.tracing.*;
4633
import io.micrometer.tracing.contextpropagation.ObservationAwareSpanThreadLocalAccessor;
4734
import org.assertj.core.api.Assertions;
4835
import org.junit.jupiter.api.AfterAll;
@@ -54,6 +41,12 @@
5441
import reactor.core.scheduler.Scheduler;
5542
import reactor.core.scheduler.Schedulers;
5643

44+
import java.time.Duration;
45+
import java.util.Collections;
46+
import java.util.HashMap;
47+
import java.util.Map;
48+
import java.util.concurrent.*;
49+
5750
import static org.assertj.core.api.BDDAssertions.then;
5851

5952
class BaggageTests {
@@ -64,7 +57,11 @@ class BaggageTests {
6457

6558
public static final String VALUE_1 = "value1";
6659

67-
SpanHandler spanHandler = new TestSpanHandler();
60+
public static final String TAG_KEY = "tagKey";
61+
62+
public static final String TAG_VALUE = "tagValue";
63+
64+
TestSpanHandler spanHandler = new TestSpanHandler();
6865

6966
StrictCurrentTraceContext braveCurrentTraceContext = StrictCurrentTraceContext.create();
7067

@@ -76,6 +73,7 @@ class BaggageTests {
7673
.traceId128Bit(true)
7774
.propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)
7875
.add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(KEY_1)))
76+
.add(BaggagePropagationConfig.SingleBaggageField.local(BaggageField.create(TAG_KEY)))
7977
.build())
8078
.sampler(Sampler.ALWAYS_SAMPLE)
8179
.addSpanHandler(this.spanHandler)
@@ -85,7 +83,8 @@ class BaggageTests {
8583

8684
BravePropagator propagator = new BravePropagator(tracing);
8785

88-
Tracer tracer = new BraveTracer(this.braveTracer, this.bridgeContext, new BraveBaggageManager());
86+
Tracer tracer = new BraveTracer(this.braveTracer, this.bridgeContext,
87+
new BraveBaggageManager(Collections.singletonList(TAG_KEY)));
8988

9089
ObservationRegistry observationRegistry = ObservationThreadLocalAccessor.getInstance().getObservationRegistry();
9190

@@ -238,4 +237,46 @@ static void clear() {
238237
ContextRegistry.getInstance().removeThreadLocalAccessor(ObservationAwareSpanThreadLocalAccessor.KEY);
239238
}
240239

240+
@Test
241+
void baggageTagKey() {
242+
ScopedSpan span = this.tracer.startScopedSpan("call1");
243+
try {
244+
try (BaggageInScope scope7 = this.tracer.createBaggageInScope(TAG_KEY, TAG_VALUE)) {
245+
// span should get tagged with baggage
246+
}
247+
}
248+
catch (RuntimeException | Error ex) {
249+
span.error(ex);
250+
throw ex;
251+
}
252+
finally {
253+
span.end();
254+
}
255+
256+
then(spanHandler.spans()).hasSize(1);
257+
MutableSpan mutableSpan = spanHandler.spans().get(0);
258+
then(mutableSpan.tags().get(TAG_KEY)).isEqualTo(TAG_VALUE);
259+
}
260+
261+
@Test
262+
void baggageTagKeyWithLegacyApi() {
263+
ScopedSpan span = this.tracer.startScopedSpan("call1");
264+
try {
265+
try (BaggageInScope scope7 = this.tracer.createBaggage(TAG_KEY, TAG_VALUE).makeCurrent()) {
266+
// span should get tagged with baggage
267+
}
268+
}
269+
catch (RuntimeException | Error ex) {
270+
span.error(ex);
271+
throw ex;
272+
}
273+
finally {
274+
span.end();
275+
}
276+
277+
then(spanHandler.spans()).hasSize(1);
278+
MutableSpan mutableSpan = spanHandler.spans().get(0);
279+
then(mutableSpan.tags().get(TAG_KEY)).isEqualTo(TAG_VALUE);
280+
}
281+
241282
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ class OtelBaggageInScope implements io.micrometer.tracing.Baggage, BaggageInScop
6363
this.mutatedTraceContext.set((OtelTraceContext) currentTraceContext.context());
6464
this.tagFields = tagFields;
6565
this.entry.set(entry);
66+
if (entry.value != null) {
67+
updateAttributesForBaggage(entry.value, Span.current());
68+
}
6669
}
6770

6871
OtelBaggageInScope(OtelBaggageManager otelBaggageManager, CurrentTraceContext currentTraceContext,
@@ -129,14 +132,18 @@ private io.micrometer.tracing.Baggage doSet(TraceContext context, String value)
129132
Context withBaggage = current.with(baggage);
130133
ctx.updateContext(withBaggage);
131134
contextWithBaggage.set(withBaggage);
132-
if (this.tagFields.stream().map(String::toLowerCase).anyMatch(s -> s.equals(entry().getKey()))) {
133-
currentSpan.setAttribute(entry().getKey(), value);
134-
}
135+
updateAttributesForBaggage(value, currentSpan);
135136
Entry previous = entry();
136137
this.entry.set(new Entry(previous.getKey(), value, previous.getMetadata()));
137138
return this;
138139
}
139140

141+
private void updateAttributesForBaggage(String value, Span currentSpan) {
142+
if (this.tagFields.stream().anyMatch(s -> s.equalsIgnoreCase(entry().getKey()))) {
143+
currentSpan.setAttribute(entry().getKey(), value);
144+
}
145+
}
146+
140147
private Entry entry() {
141148
return this.entry.get();
142149
}

0 commit comments

Comments
 (0)