diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactory.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactory.java index 53b8998a8609..9ee5567cf755 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactory.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactory.java @@ -29,8 +29,10 @@ */ package com.google.api.gax.tracing; +import com.google.api.client.util.Strings; import com.google.api.core.BetaApi; import com.google.api.core.InternalApi; +import com.google.api.gax.rpc.LibraryMetadata; import io.opentelemetry.api.OpenTelemetry; /** @@ -74,6 +76,13 @@ public ApiTracer newTracer(ApiTracer parent, ApiTracerContext methodLevelTracerC @Override public ApiTracerFactory withContext(ApiTracerContext context) { + if (context == null) { + return new BaseApiTracerFactory(); + } + LibraryMetadata metadata = context.libraryMetadata(); + if (metadata == null || metadata.isEmpty() || Strings.isNullOrEmpty(metadata.artifactName())) { + return new BaseApiTracerFactory(); + } this.clientLevelTracerContext = context; this.metricsRecorder = new GoldenSignalsMetricsRecorder( diff --git a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactoryTest.java b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactoryTest.java index 9726101c0704..04d164619176 100644 --- a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactoryTest.java +++ b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactoryTest.java @@ -33,6 +33,7 @@ import static org.mockito.Answers.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.*; +import com.google.api.gax.rpc.LibraryMetadata; import io.opentelemetry.api.OpenTelemetry; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -48,7 +49,10 @@ void setUp() { @Test void newTracerWithSpanName_shouldCreateTracer_ifMetricsRecorderIsNotNull() { - tracerFactory.withContext(ApiTracerContext.empty()); + LibraryMetadata metadata = + LibraryMetadata.newBuilder().setArtifactName("gax-java").setVersion("1.0").build(); + ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build(); + tracerFactory.withContext(context); ApiTracer actual = tracerFactory.newTracer( mock(ApiTracer.class), mock(SpanName.class), ApiTracerFactory.OperationType.Unary); @@ -67,7 +71,8 @@ void newTracerWithSpanName_shouldCreateBaseTracer_ifMetricsRecorderIsNull() { void newTracerWithApiTracerContext_shouldMergeApiTracerContext() { ApiTracerContext clientLevelTracerContext = mock(ApiTracerContext.class, RETURNS_DEEP_STUBS); ApiTracerContext methodLevelTracerContext = mock(ApiTracerContext.class); - when(clientLevelTracerContext.libraryMetadata().artifactName()).thenReturn("does not matter"); + when(clientLevelTracerContext.libraryMetadata().artifactName()).thenReturn("gax-java"); + when(clientLevelTracerContext.libraryMetadata().isEmpty()).thenReturn(false); when(clientLevelTracerContext.merge(methodLevelTracerContext)) .thenReturn(clientLevelTracerContext); @@ -78,9 +83,50 @@ void newTracerWithApiTracerContext_shouldMergeApiTracerContext() { assertThat(actual).isInstanceOf(GoldenSignalsMetricsTracer.class); } + @Test + void testWithContext_nullContext_returnsBaseApiTracerFactory() { + GoldenSignalsMetricsTracerFactory factory = + new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop()); + ApiTracerFactory factoryWithContext = factory.withContext(null); + assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class); + } + + @Test + void testWithContext_nullMetadata_returnsBaseApiTracerFactory() { + GoldenSignalsMetricsTracerFactory factory = + new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop()); + ApiTracerFactory factoryWithContext = factory.withContext(ApiTracerContext.empty()); + assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class); + } + + @Test + void testWithContext_emptyArtifactName_returnsBaseApiTracerFactory() { + GoldenSignalsMetricsTracerFactory factory = + new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop()); + LibraryMetadata metadata = + LibraryMetadata.newBuilder().setArtifactName("").setVersion("1.0").build(); + ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build(); + + ApiTracerFactory factoryWithContext = factory.withContext(context); + assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class); + } + + @Test + void testWithContext_nullArtifactName_returnsBaseApiTracerFactory() { + GoldenSignalsMetricsTracerFactory factory = + new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop()); + LibraryMetadata metadata = LibraryMetadata.newBuilder().setVersion("1.0").build(); + ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build(); + + ApiTracerFactory factoryWithContext = factory.withContext(context); + assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class); + } + @Test void newTracerWithApiTracerContext_shouldCreateBaseTracer_ifMetricsRecorderIsNull() { - ApiTracer actual = tracerFactory.newTracer(mock(ApiTracer.class), mock(ApiTracerContext.class)); + GoldenSignalsMetricsTracerFactory factory = + new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop()); + ApiTracer actual = factory.newTracer(mock(ApiTracer.class), mock(ApiTracerContext.class)); assertThat(actual).isInstanceOf(BaseApiTracer.class); } diff --git a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/SpanTracerFactoryTest.java b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/SpanTracerFactoryTest.java index 64bba80e33e5..f534d41edfbb 100644 --- a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/SpanTracerFactoryTest.java +++ b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/SpanTracerFactoryTest.java @@ -347,6 +347,29 @@ void testWithContext_nullMetadata_returnsBaseApiTracerFactory() { assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class); } + @Test + void testWithContext_emptyArtifactName_returnsBaseApiTracerFactory() { + SpanTracerFactory factory = + new SpanTracerFactory(openTelemetry, tracer, ApiTracerContext.empty()); + LibraryMetadata metadata = + LibraryMetadata.newBuilder().setArtifactName("").setVersion("1.0").build(); + ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build(); + + ApiTracerFactory factoryWithContext = factory.withContext(context); + assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class); + } + + @Test + void testWithContext_nullArtifactName_returnsBaseApiTracerFactory() { + SpanTracerFactory factory = + new SpanTracerFactory(openTelemetry, tracer, ApiTracerContext.empty()); + LibraryMetadata metadata = LibraryMetadata.newBuilder().setVersion("1.0").build(); + ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build(); + + ApiTracerFactory factoryWithContext = factory.withContext(context); + assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class); + } + @Test void testWithContext_nullTracer_returnsBaseApiTracerFactory() { OpenTelemetry mockOpenTelemetry = mock(OpenTelemetry.class);