fix grpc set metadata multi-value (#11308)

Co-authored-by: Lauri Tulmin <ltulmin@splunk.com>
This commit is contained in:
wgy035 2024-06-05 05:27:22 +08:00 committed by GitHub
parent 0d9c9a70bb
commit a47c406e57
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 70 additions and 1 deletions

View File

@ -13,6 +13,8 @@ enum MetadataSetter implements TextMapSetter<Metadata> {
@Override @Override
public void set(Metadata carrier, String key, String value) { public void set(Metadata carrier, String key, String value) {
carrier.put(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER), value); Metadata.Key<String> metadataKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
carrier.removeAll(metadataKey);
carrier.put(metadataKey, value);
} }
} }

View File

@ -0,0 +1,67 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.grpc.v1_6;
import static org.assertj.core.api.Assertions.assertThat;
import io.grpc.Metadata;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.SpanId;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.TraceId;
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapGetter;
import io.opentelemetry.context.propagation.TextMapPropagator;
import javax.annotation.Nullable;
import org.junit.jupiter.api.Test;
class MetadataSetterTest {
@Test
void overwriteTracingHeader() {
Metadata metadata = new Metadata();
TextMapPropagator propagator = W3CTraceContextPropagator.getInstance();
for (int i = 1; i <= 2; i++) {
Context context =
Context.root()
.with(
Span.wrap(
SpanContext.create(
TraceId.fromLongs(0, i),
SpanId.fromLong(i),
TraceFlags.getDefault(),
TraceState.getDefault())));
propagator.inject(context, metadata, MetadataSetter.INSTANCE);
}
assertThat(metadata.getAll(Metadata.Key.of("traceparent", Metadata.ASCII_STRING_MARSHALLER)))
.hasSize(1);
Context context =
propagator.extract(
Context.root(),
metadata,
new TextMapGetter<Metadata>() {
@Override
public Iterable<String> keys(Metadata metadata) {
return metadata.keys();
}
@Nullable
@Override
public String get(@Nullable Metadata metadata, String key) {
return metadata.get(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER));
}
});
SpanContext spanContext = Span.fromContext(context).getSpanContext();
assertThat(spanContext.getTraceId()).isEqualTo(TraceId.fromLongs(0, 2));
assertThat(spanContext.getSpanId()).isEqualTo(SpanId.fromLong(2));
}
}