From 300358b2f7321abaf20a51d222c0c7790d7d6078 Mon Sep 17 00:00:00 2001 From: Toshiaki Maki Date: Wed, 18 Sep 2024 16:55:58 +0900 Subject: [PATCH] Convert the last key into tags and count the number of dropped attributes, when attributes with a duplicate key are set --- .../collector/otel/http/SpanTranslator.java | 4 +++- .../otel/http/SpanTranslatorTest.java | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/collector-http/src/main/java/zipkin2/collector/otel/http/SpanTranslator.java b/collector-http/src/main/java/zipkin2/collector/otel/http/SpanTranslator.java index 4e361c6..8aff626 100644 --- a/collector-http/src/main/java/zipkin2/collector/otel/http/SpanTranslator.java +++ b/collector-http/src/main/java/zipkin2/collector/otel/http/SpanTranslator.java @@ -70,7 +70,9 @@ static List translate(ExportTraceServiceRequest otelSpans) { private static zipkin2.Span generateSpan(Span spanData, InstrumentationScope scope, Resource resource) { long startTimestamp = nanoToMills(spanData.getStartTimeUnixNano()); long endTimestamp = nanoToMills(spanData.getEndTimeUnixNano()); - Map attributesMap = spanData.getAttributesList().stream().collect(Collectors.toMap(KeyValue::getKey, KeyValue::getValue)); + Map attributesMap = spanData.getAttributesList() + .stream() + .collect(Collectors.toMap(KeyValue::getKey, KeyValue::getValue, (a, b) -> b /* The latter wins */)); zipkin2.Span.Builder spanBuilder = zipkin2.Span.newBuilder(); byte[] traceIdBytes = spanData.getTraceId().toByteArray(); long high = bytesToLong(traceIdBytes, 0); diff --git a/collector-http/src/test/java/zipkin2/collector/otel/http/SpanTranslatorTest.java b/collector-http/src/test/java/zipkin2/collector/otel/http/SpanTranslatorTest.java index 02ec6f9..d90320b 100644 --- a/collector-http/src/test/java/zipkin2/collector/otel/http/SpanTranslatorTest.java +++ b/collector-http/src/test/java/zipkin2/collector/otel/http/SpanTranslatorTest.java @@ -429,4 +429,24 @@ void translate_WithRpcUnsetStatus() { assertThat(SpanTranslator.translate(data)) .containsExactly(expectedSpan); } + + + @Test + void translate_WithDuplicateKeys() { + ExportTraceServiceRequest data = requestBuilderWithSpanCustomizer(span -> span + .setKind(SpanKind.SPAN_KIND_SERVER) + .addAttributes(stringAttribute("foo", "bar1")) + .addAttributes(stringAttribute("foo", "bar2")) + .setStatus(Status.newBuilder().setCode(Status.StatusCode.STATUS_CODE_UNSET).build())) + .build(); + + Span expectedSpan = + zipkinSpanBuilder(Span.Kind.SERVER) + .putTag("foo", "bar2") + .putTag(SpanTranslator.OTEL_DROPPED_ATTRIBUTES_COUNT, "1") + .build(); + + assertThat(SpanTranslator.translate(data)) + .containsExactly(expectedSpan); + } }