diff --git a/attributed-metrics/attributed-metrics-api/src/main/java/com/duckduckgo/app/attributed/metrics/api/AttributedMetricsClient.kt b/attributed-metrics/attributed-metrics-api/src/main/java/com/duckduckgo/app/attributed/metrics/api/AttributedMetricsClient.kt index 002485edcd99..2e4132a39719 100644 --- a/attributed-metrics/attributed-metrics-api/src/main/java/com/duckduckgo/app/attributed/metrics/api/AttributedMetricsClient.kt +++ b/attributed-metrics/attributed-metrics-api/src/main/java/com/duckduckgo/app/attributed/metrics/api/AttributedMetricsClient.kt @@ -77,4 +77,10 @@ interface AttributedMetric { * @return Parameters to be included with this metric */ suspend fun getMetricParameters(): Map + + /** + * @return Identifier used to deduplicate metric emissions. The same combination of metric + * and tag will only be emitted once. + */ + suspend fun getTag(): String } diff --git a/attributed-metrics/attributed-metrics-impl/src/main/java/com/duckduckgo/app/attributed/metrics/impl/RealAttributedMetricClient.kt b/attributed-metrics/attributed-metrics-impl/src/main/java/com/duckduckgo/app/attributed/metrics/impl/RealAttributedMetricClient.kt index 9b9ce426244c..9cfff93cce2b 100644 --- a/attributed-metrics/attributed-metrics-impl/src/main/java/com/duckduckgo/app/attributed/metrics/impl/RealAttributedMetricClient.kt +++ b/attributed-metrics/attributed-metrics-impl/src/main/java/com/duckduckgo/app/attributed/metrics/impl/RealAttributedMetricClient.kt @@ -22,6 +22,7 @@ import com.duckduckgo.app.attributed.metrics.api.EventStats import com.duckduckgo.app.attributed.metrics.store.EventRepository import com.duckduckgo.app.di.AppCoroutineScope import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.Unique import com.duckduckgo.common.utils.DispatcherProvider import com.duckduckgo.di.scopes.AppScope import com.squareup.anvil.annotations.ContributesBinding @@ -71,10 +72,12 @@ class RealAttributedMetricClient @Inject constructor( appCoroutineScope.launch(dispatcherProvider.io()) { if (!metricsState.isActive()) return@launch val pixelName = metric.getPixelName() + val tag = metric.getTag() logcat(tag = "AttributedMetrics") { "Firing pixel for $pixelName" } - pixel.fire(pixelName = pixelName, parameters = metric.getMetricParameters()) + val pixelTag = "${pixelName}_$tag" + pixel.fire(pixelName = pixelName, parameters = metric.getMetricParameters(), type = Unique(pixelTag)) } } } diff --git a/attributed-metrics/attributed-metrics-impl/src/test/java/com/duckduckgo/app/attributed/metrics/impl/RealAttributedMetricClientTest.kt b/attributed-metrics/attributed-metrics-impl/src/test/java/com/duckduckgo/app/attributed/metrics/impl/RealAttributedMetricClientTest.kt index f46e7098f788..621b4ab7c8c2 100644 --- a/attributed-metrics/attributed-metrics-impl/src/test/java/com/duckduckgo/app/attributed/metrics/impl/RealAttributedMetricClientTest.kt +++ b/attributed-metrics/attributed-metrics-impl/src/test/java/com/duckduckgo/app/attributed/metrics/impl/RealAttributedMetricClientTest.kt @@ -21,6 +21,7 @@ import com.duckduckgo.app.attributed.metrics.api.AttributedMetric import com.duckduckgo.app.attributed.metrics.api.EventStats import com.duckduckgo.app.attributed.metrics.store.EventRepository import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.app.statistics.pixels.Pixel.PixelType.Unique import com.duckduckgo.common.test.CoroutineTestRule import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals @@ -105,7 +106,7 @@ class RealAttributedMetricClientTest { testee.emitMetric(testMetric) - verify(mockPixel).fire(pixelName = "test_pixel", parameters = mapOf("param" to "value")) + verify(mockPixel).fire(pixelName = "test_pixel", parameters = mapOf("param" to "value"), type = Unique("test_pixel_test_tag")) } @Test @@ -121,5 +122,6 @@ class RealAttributedMetricClientTest { private class TestAttributedMetric : AttributedMetric { override fun getPixelName(): String = "test_pixel" override suspend fun getMetricParameters(): Map = mapOf("param" to "value") + override suspend fun getTag(): String = "test_tag" } }