Skip to content

Commit f42fa8d

Browse files
committed
fix(o11y): create noop tracer when artifact ID is not set
1 parent dea24db commit f42fa8d

File tree

3 files changed

+81
-3
lines changed

3 files changed

+81
-3
lines changed

sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactory.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
*/
3030
package com.google.api.gax.tracing;
3131

32+
import com.google.api.client.util.Strings;
3233
import com.google.api.core.BetaApi;
3334
import com.google.api.core.InternalApi;
35+
import com.google.api.gax.rpc.LibraryMetadata;
3436
import io.opentelemetry.api.OpenTelemetry;
3537

3638
/**
@@ -74,7 +76,14 @@ public ApiTracer newTracer(ApiTracer parent, ApiTracerContext methodLevelTracerC
7476

7577
@Override
7678
public ApiTracerFactory withContext(ApiTracerContext context) {
79+
if (context == null) {
80+
return new BaseApiTracerFactory();
81+
}
7782
this.clientLevelTracerContext = context;
83+
LibraryMetadata metadata = context.libraryMetadata();
84+
if (metadata == null || metadata.isEmpty() || Strings.isNullOrEmpty(metadata.artifactName())) {
85+
return new BaseApiTracerFactory();
86+
}
7887
this.metricsRecorder =
7988
new GoldenSignalsMetricsRecorder(
8089
openTelemetry, clientLevelTracerContext.libraryMetadata().artifactName());

sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/GoldenSignalsMetricsTracerFactoryTest.java

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
3434
import static org.mockito.Mockito.*;
3535

36+
import com.google.api.gax.rpc.LibraryMetadata;
3637
import io.opentelemetry.api.OpenTelemetry;
3738
import org.junit.jupiter.api.BeforeEach;
3839
import org.junit.jupiter.api.Test;
@@ -48,7 +49,10 @@ void setUp() {
4849

4950
@Test
5051
void newTracerWithSpanName_shouldCreateTracer_ifMetricsRecorderIsNotNull() {
51-
tracerFactory.withContext(ApiTracerContext.empty());
52+
LibraryMetadata metadata =
53+
LibraryMetadata.newBuilder().setArtifactName("gax-java").setVersion("1.0").build();
54+
ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build();
55+
tracerFactory.withContext(context);
5256
ApiTracer actual =
5357
tracerFactory.newTracer(
5458
mock(ApiTracer.class), mock(SpanName.class), ApiTracerFactory.OperationType.Unary);
@@ -67,7 +71,8 @@ void newTracerWithSpanName_shouldCreateBaseTracer_ifMetricsRecorderIsNull() {
6771
void newTracerWithApiTracerContext_shouldMergeApiTracerContext() {
6872
ApiTracerContext clientLevelTracerContext = mock(ApiTracerContext.class, RETURNS_DEEP_STUBS);
6973
ApiTracerContext methodLevelTracerContext = mock(ApiTracerContext.class);
70-
when(clientLevelTracerContext.libraryMetadata().artifactName()).thenReturn("does not matter");
74+
when(clientLevelTracerContext.libraryMetadata().artifactName()).thenReturn("gax-java");
75+
when(clientLevelTracerContext.libraryMetadata().isEmpty()).thenReturn(false);
7176
when(clientLevelTracerContext.merge(methodLevelTracerContext))
7277
.thenReturn(clientLevelTracerContext);
7378

@@ -78,9 +83,50 @@ void newTracerWithApiTracerContext_shouldMergeApiTracerContext() {
7883
assertThat(actual).isInstanceOf(GoldenSignalsMetricsTracer.class);
7984
}
8085

86+
@Test
87+
void testWithContext_nullContext_returnsBaseApiTracerFactory() {
88+
GoldenSignalsMetricsTracerFactory factory =
89+
new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop());
90+
ApiTracerFactory factoryWithContext = factory.withContext(null);
91+
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
92+
}
93+
94+
@Test
95+
void testWithContext_nullMetadata_returnsBaseApiTracerFactory() {
96+
GoldenSignalsMetricsTracerFactory factory =
97+
new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop());
98+
ApiTracerFactory factoryWithContext = factory.withContext(ApiTracerContext.empty());
99+
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
100+
}
101+
102+
@Test
103+
void testWithContext_emptyArtifactName_returnsBaseApiTracerFactory() {
104+
GoldenSignalsMetricsTracerFactory factory =
105+
new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop());
106+
LibraryMetadata metadata =
107+
LibraryMetadata.newBuilder().setArtifactName("").setVersion("1.0").build();
108+
ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build();
109+
110+
ApiTracerFactory factoryWithContext = factory.withContext(context);
111+
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
112+
}
113+
114+
@Test
115+
void testWithContext_nullArtifactName_returnsBaseApiTracerFactory() {
116+
GoldenSignalsMetricsTracerFactory factory =
117+
new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop());
118+
LibraryMetadata metadata = LibraryMetadata.newBuilder().setVersion("1.0").build();
119+
ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build();
120+
121+
ApiTracerFactory factoryWithContext = factory.withContext(context);
122+
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
123+
}
124+
81125
@Test
82126
void newTracerWithApiTracerContext_shouldCreateBaseTracer_ifMetricsRecorderIsNull() {
83-
ApiTracer actual = tracerFactory.newTracer(mock(ApiTracer.class), mock(ApiTracerContext.class));
127+
GoldenSignalsMetricsTracerFactory factory =
128+
new GoldenSignalsMetricsTracerFactory(OpenTelemetry.noop());
129+
ApiTracer actual = factory.newTracer(mock(ApiTracer.class), mock(ApiTracerContext.class));
84130

85131
assertThat(actual).isInstanceOf(BaseApiTracer.class);
86132
}

sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/SpanTracerFactoryTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,29 @@ void testWithContext_nullMetadata_returnsBaseApiTracerFactory() {
347347
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
348348
}
349349

350+
@Test
351+
void testWithContext_emptyArtifactName_returnsBaseApiTracerFactory() {
352+
SpanTracerFactory factory =
353+
new SpanTracerFactory(openTelemetry, tracer, ApiTracerContext.empty());
354+
LibraryMetadata metadata =
355+
LibraryMetadata.newBuilder().setArtifactName("").setVersion("1.0").build();
356+
ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build();
357+
358+
ApiTracerFactory factoryWithContext = factory.withContext(context);
359+
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
360+
}
361+
362+
@Test
363+
void testWithContext_nullArtifactName_returnsBaseApiTracerFactory() {
364+
SpanTracerFactory factory =
365+
new SpanTracerFactory(openTelemetry, tracer, ApiTracerContext.empty());
366+
LibraryMetadata metadata = LibraryMetadata.newBuilder().setVersion("1.0").build();
367+
ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build();
368+
369+
ApiTracerFactory factoryWithContext = factory.withContext(context);
370+
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
371+
}
372+
350373
@Test
351374
void testWithContext_nullTracer_returnsBaseApiTracerFactory() {
352375
OpenTelemetry mockOpenTelemetry = mock(OpenTelemetry.class);

0 commit comments

Comments
 (0)