From 772c39129649b3e7b44825ff9683a2ee261913e3 Mon Sep 17 00:00:00 2001 From: Markus Hintersteiner Date: Thu, 7 Mar 2024 12:02:05 +0100 Subject: [PATCH] Populate span tags with metric tags --- .../java/io/sentry/metrics/MetricsApi.java | 5 ++++ .../java/io/sentry/metrics/MetricsApiTest.kt | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/sentry/src/main/java/io/sentry/metrics/MetricsApi.java b/sentry/src/main/java/io/sentry/metrics/MetricsApi.java index ee273eb061..86896f466b 100644 --- a/sentry/src/main/java/io/sentry/metrics/MetricsApi.java +++ b/sentry/src/main/java/io/sentry/metrics/MetricsApi.java @@ -559,6 +559,11 @@ public void timing( aggregator.getLocalMetricsAggregator(); final @Nullable ISpan span = aggregator.startSpanForMetric("metric.timing", key); + if (span != null && tags != null) { + for (final @NotNull Map.Entry entry : tags.entrySet()) { + span.setTag(entry.getKey(), entry.getValue()); + } + } try { aggregator .getMetricsAggregator() diff --git a/sentry/src/test/java/io/sentry/metrics/MetricsApiTest.kt b/sentry/src/test/java/io/sentry/metrics/MetricsApiTest.kt index 1d2c71673b..71a07bb7f3 100644 --- a/sentry/src/test/java/io/sentry/metrics/MetricsApiTest.kt +++ b/sentry/src/test/java/io/sentry/metrics/MetricsApiTest.kt @@ -2,11 +2,13 @@ package io.sentry.metrics import io.sentry.IMetricsAggregator import io.sentry.ISpan +import io.sentry.MeasurementUnit import io.sentry.metrics.MetricsApi.IMetricsInterface import org.mockito.kotlin.any import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.eq import org.mockito.kotlin.mock +import org.mockito.kotlin.never import org.mockito.kotlin.verify import kotlin.test.Test import kotlin.test.assertEquals @@ -319,6 +321,27 @@ class MetricsApiTest { verify(fixture.lastSpan!!).finish() } + @Test + fun `timing applies metric tags as span tags`() { + val span = mock() + val api = fixture.getSut( + spanProvider = { + span + }, + defaultTags = mapOf( + "release" to "1.0" + ) + ) + // when timing is called + api.timing("key", { + // no-op + }, MeasurementUnit.Duration.NANOSECOND, mapOf("a" to "b")) + + // the last span should have the metric tags, without the default ones + verify(fixture.lastSpan!!, never()).setTag("release", "1.0") + verify(fixture.lastSpan!!).setTag("a", "b") + } + @Test fun `if timing throws an exception, span still finishes`() { val api = fixture.getSut()