Skip to content

Commit a47c406

Browse files
wgy035laurit
andauthored
fix grpc set metadata multi-value (#11308)
Co-authored-by: Lauri Tulmin <[email protected]>
1 parent 0d9c9a7 commit a47c406

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/MetadataSetter.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ enum MetadataSetter implements TextMapSetter<Metadata> {
1313

1414
@Override
1515
public void set(Metadata carrier, String key, String value) {
16-
carrier.put(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER), value);
16+
Metadata.Key<String> metadataKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
17+
carrier.removeAll(metadataKey);
18+
carrier.put(metadataKey, value);
1719
}
1820
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.grpc.v1_6;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.grpc.Metadata;
11+
import io.opentelemetry.api.trace.Span;
12+
import io.opentelemetry.api.trace.SpanContext;
13+
import io.opentelemetry.api.trace.SpanId;
14+
import io.opentelemetry.api.trace.TraceFlags;
15+
import io.opentelemetry.api.trace.TraceId;
16+
import io.opentelemetry.api.trace.TraceState;
17+
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
18+
import io.opentelemetry.context.Context;
19+
import io.opentelemetry.context.propagation.TextMapGetter;
20+
import io.opentelemetry.context.propagation.TextMapPropagator;
21+
import javax.annotation.Nullable;
22+
import org.junit.jupiter.api.Test;
23+
24+
class MetadataSetterTest {
25+
26+
@Test
27+
void overwriteTracingHeader() {
28+
Metadata metadata = new Metadata();
29+
TextMapPropagator propagator = W3CTraceContextPropagator.getInstance();
30+
for (int i = 1; i <= 2; i++) {
31+
Context context =
32+
Context.root()
33+
.with(
34+
Span.wrap(
35+
SpanContext.create(
36+
TraceId.fromLongs(0, i),
37+
SpanId.fromLong(i),
38+
TraceFlags.getDefault(),
39+
TraceState.getDefault())));
40+
propagator.inject(context, metadata, MetadataSetter.INSTANCE);
41+
}
42+
43+
assertThat(metadata.getAll(Metadata.Key.of("traceparent", Metadata.ASCII_STRING_MARSHALLER)))
44+
.hasSize(1);
45+
46+
Context context =
47+
propagator.extract(
48+
Context.root(),
49+
metadata,
50+
new TextMapGetter<Metadata>() {
51+
@Override
52+
public Iterable<String> keys(Metadata metadata) {
53+
return metadata.keys();
54+
}
55+
56+
@Nullable
57+
@Override
58+
public String get(@Nullable Metadata metadata, String key) {
59+
return metadata.get(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER));
60+
}
61+
});
62+
63+
SpanContext spanContext = Span.fromContext(context).getSpanContext();
64+
assertThat(spanContext.getTraceId()).isEqualTo(TraceId.fromLongs(0, 2));
65+
assertThat(spanContext.getSpanId()).isEqualTo(SpanId.fromLong(2));
66+
}
67+
}

0 commit comments

Comments
 (0)