From d006fc32f166b84e0b12820e2f6d0316f91b107a Mon Sep 17 00:00:00 2001 From: blakeli Date: Thu, 9 Apr 2026 23:17:10 -0400 Subject: [PATCH 1/6] feat(o11y): reduce visibility of ApiTracerContext methods --- .../google/api/gax/tracing/ApiTracerContext.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/ApiTracerContext.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/ApiTracerContext.java index 068af971233e..b638d8e95e17 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/ApiTracerContext.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/ApiTracerContext.java @@ -79,7 +79,7 @@ public enum Transport { * @return the server port, or {@code null} if not set */ @Nullable - public abstract Integer serverPort(); + abstract Integer serverPort(); /** * Returns the library metadata associated with the RPC. @@ -135,7 +135,7 @@ String rpcSystemName() { * @return the operation type, or {@code null} if not set */ @Nullable - public abstract OperationType operationType(); + abstract OperationType operationType(); /** * Returns the HTTP method used for the RPC, in case the RPC is an HttpJson method. @@ -159,11 +159,11 @@ String rpcSystemName() { /** The service name of a client (e.g. "bigtable", "spanner"). */ @Nullable - public abstract String serviceName(); + abstract String serviceName(); /** The url domain of the request (e.g. "pubsub.googleapis.com"). */ @Nullable - public abstract String urlDomain(); + abstract String urlDomain(); @Nullable protected abstract Supplier destinationResourceIdSupplier(); @@ -173,7 +173,7 @@ String rpcSystemName() { * //pubsub.googleapis.com/projects/p/locations/l/topics/t). */ @Nullable - public String destinationResourceId() { + String destinationResourceId() { Supplier supplier = destinationResourceIdSupplier(); if (supplier == null) { return null; @@ -209,7 +209,7 @@ ApiTracerContext withResourceNameExtractor( /** * @return a map of attributes to be included in attempt-level spans */ - public Map getAttemptAttributes() { + Map getAttemptAttributes() { Map attributes = new HashMap<>(); if (!Strings.isNullOrEmpty(serverAddress())) { attributes.put(ObservabilityAttributes.SERVER_ADDRESS_ATTRIBUTE, serverAddress()); @@ -322,7 +322,7 @@ ApiTracerContext merge(ApiTracerContext other) { return builder.build(); } - public static ApiTracerContext empty() { + static ApiTracerContext empty() { return newBuilder().setLibraryMetadata(LibraryMetadata.empty()).build(); } @@ -330,7 +330,7 @@ public static Builder newBuilder() { return new AutoValue_ApiTracerContext.Builder(); } - public abstract Builder toBuilder(); + abstract Builder toBuilder(); @AutoValue.Builder public abstract static class Builder { From 1b7e99421b4c4a62ed016a1a22e90818f207177f Mon Sep 17 00:00:00 2001 From: blakeli Date: Thu, 9 Apr 2026 23:19:54 -0400 Subject: [PATCH 2/6] feat(o11y): reduce visibility of some builder methods in ApiTracerContext --- .../java/com/google/api/gax/tracing/ApiTracerContext.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/ApiTracerContext.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/ApiTracerContext.java index b638d8e95e17..197483d482e0 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/ApiTracerContext.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/ApiTracerContext.java @@ -342,7 +342,7 @@ public abstract static class Builder { public abstract Builder setTransport(@Nullable Transport transport); - public abstract Builder setOperationType(@Nullable OperationType operationType); + abstract Builder setOperationType(@Nullable OperationType operationType); public abstract Builder setServerPort(@Nullable Integer serverPort); @@ -354,7 +354,7 @@ public abstract static class Builder { public abstract Builder setUrlDomain(@Nullable String urlDomain); - public abstract Builder setDestinationResourceIdSupplier( + abstract Builder setDestinationResourceIdSupplier( @Nullable Supplier destinationResourceIdSupplier); public abstract ApiTracerContext build(); From ed34065c03cfec775bcf4b47538e88be8d706409 Mon Sep 17 00:00:00 2001 From: blakeli Date: Thu, 9 Apr 2026 23:35:15 -0400 Subject: [PATCH 3/6] test(o11y): fix OpenTelemetryMetricsFactoryTest and cover withContext --- .../OpenTelemetryMetricsFactoryTest.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java index e25b3d93f0af..73f467841175 100644 --- a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java +++ b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java @@ -52,9 +52,9 @@ void newTracerWithSpanName_shouldCreateTracer_ifMetricsRecorderIsNotNull() { LibraryMetadata metadata = LibraryMetadata.newBuilder().setArtifactName("gax-java").setVersion("1.0").build(); ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build(); - tracerFactory.withContext(context); + ApiTracerFactory factoryWithContext = tracerFactory.withContext(context); ApiTracer actual = - tracerFactory.newTracer( + factoryWithContext.newTracer( mock(ApiTracer.class), mock(SpanName.class), ApiTracerFactory.OperationType.Unary); assertThat(actual).isInstanceOf(OpenTelemetryMetricsTracer.class); } @@ -69,17 +69,16 @@ void newTracerWithSpanName_shouldCreateBaseTracer_ifMetricsRecorderIsNull() { @Test void newTracerWithApiTracerContext_shouldMergeApiTracerContext() { - ApiTracerContext clientLevelTracerContext = mock(ApiTracerContext.class, RETURNS_DEEP_STUBS); - ApiTracerContext methodLevelTracerContext = mock(ApiTracerContext.class); - when(clientLevelTracerContext.libraryMetadata().artifactName()).thenReturn("gax-java"); - when(clientLevelTracerContext.libraryMetadata().isEmpty()).thenReturn(false); - when(clientLevelTracerContext.merge(methodLevelTracerContext)) - .thenReturn(clientLevelTracerContext); - - tracerFactory.withContext(clientLevelTracerContext); - ApiTracer actual = tracerFactory.newTracer(mock(ApiTracer.class), methodLevelTracerContext); + LibraryMetadata metadata = + LibraryMetadata.newBuilder().setArtifactName("gax-java").setVersion("1.0").build(); + ApiTracerContext clientLevelTracerContext = + ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build(); + ApiTracerContext methodLevelTracerContext = + ApiTracerContext.newBuilder().setLibraryMetadata(LibraryMetadata.empty()).build(); + + ApiTracerFactory factoryWithContext = tracerFactory.withContext(clientLevelTracerContext); + ApiTracer actual = factoryWithContext.newTracer(mock(ApiTracer.class), methodLevelTracerContext); - verify(clientLevelTracerContext).merge(methodLevelTracerContext); assertThat(actual).isInstanceOf(OpenTelemetryMetricsTracer.class); } @@ -140,8 +139,8 @@ void testNeedsContext_returnsFalseWhenContextIsNotEmpty() { LibraryMetadata.newBuilder().setArtifactName("gax-java").setVersion("1.0").build(); ApiTracerContext context = ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build(); - tracerFactory.withContext(context); + ApiTracerFactory factoryWithContext = tracerFactory.withContext(context); - assertThat(tracerFactory.needsContext()).isFalse(); + assertThat(factoryWithContext.needsContext()).isFalse(); } } From 2091d6ecee2cab44bcd99b840d31a5fa503beca9 Mon Sep 17 00:00:00 2001 From: blakeli Date: Thu, 9 Apr 2026 23:36:10 -0400 Subject: [PATCH 4/6] feat(o11y): add needsContext and private constructor to OpenTelemetryMetricsFactory --- .../gax/tracing/OpenTelemetryMetricsFactory.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java index dceabeba2aaa..4510e19c2160 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java @@ -51,6 +51,12 @@ public OpenTelemetryMetricsFactory(OpenTelemetry openTelemetry) { this.clientLevelTracerContext = ApiTracerContext.empty(); } + private OpenTelemetryMetricsFactory(ApiTracerContext clientLevelTracerContext, OpenTelemetry openTelemetry, GoldenSignalsMetricsRecorder metricsRecorder) { + this.clientLevelTracerContext = clientLevelTracerContext; + this.openTelemetry = openTelemetry; + this.metricsRecorder = metricsRecorder; + } + @Override public ApiTracer newTracer(ApiTracer parent, SpanName spanName, OperationType operationType) { if (metricsRecorder == null) { @@ -83,12 +89,11 @@ public ApiTracerFactory withContext(ApiTracerContext context) { if (context == null) { return new BaseApiTracerFactory(); } - this.metricsRecorder = + metricsRecorder = GoldenSignalsMetricsRecorder.create(openTelemetry, context.libraryMetadata()); - if (this.metricsRecorder == null) { + if (metricsRecorder == null) { return new BaseApiTracerFactory(); } - this.clientLevelTracerContext = context; - return this; + return new OpenTelemetryMetricsFactory(clientLevelTracerContext.merge(context), openTelemetry, metricsRecorder); } } From 323e4b7282b163f664b2a0f34dae041a0046beeb Mon Sep 17 00:00:00 2001 From: blakeli Date: Thu, 9 Apr 2026 23:47:08 -0400 Subject: [PATCH 5/6] chore: format --- .../api/gax/tracing/OpenTelemetryMetricsFactory.java | 11 +++++++---- .../gax/tracing/OpenTelemetryMetricsFactoryTest.java | 6 +++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java index 4510e19c2160..bb6bb8fef746 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java @@ -51,7 +51,10 @@ public OpenTelemetryMetricsFactory(OpenTelemetry openTelemetry) { this.clientLevelTracerContext = ApiTracerContext.empty(); } - private OpenTelemetryMetricsFactory(ApiTracerContext clientLevelTracerContext, OpenTelemetry openTelemetry, GoldenSignalsMetricsRecorder metricsRecorder) { + private OpenTelemetryMetricsFactory( + ApiTracerContext clientLevelTracerContext, + OpenTelemetry openTelemetry, + GoldenSignalsMetricsRecorder metricsRecorder) { this.clientLevelTracerContext = clientLevelTracerContext; this.openTelemetry = openTelemetry; this.metricsRecorder = metricsRecorder; @@ -89,11 +92,11 @@ public ApiTracerFactory withContext(ApiTracerContext context) { if (context == null) { return new BaseApiTracerFactory(); } - metricsRecorder = - GoldenSignalsMetricsRecorder.create(openTelemetry, context.libraryMetadata()); + metricsRecorder = GoldenSignalsMetricsRecorder.create(openTelemetry, context.libraryMetadata()); if (metricsRecorder == null) { return new BaseApiTracerFactory(); } - return new OpenTelemetryMetricsFactory(clientLevelTracerContext.merge(context), openTelemetry, metricsRecorder); + return new OpenTelemetryMetricsFactory( + clientLevelTracerContext.merge(context), openTelemetry, metricsRecorder); } } diff --git a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java index 73f467841175..a97f15cc69e6 100644 --- a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java +++ b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java @@ -30,7 +30,6 @@ package com.google.api.gax.tracing; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Answers.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.*; import com.google.api.gax.rpc.LibraryMetadata; @@ -75,9 +74,10 @@ void newTracerWithApiTracerContext_shouldMergeApiTracerContext() { ApiTracerContext.newBuilder().setLibraryMetadata(metadata).build(); ApiTracerContext methodLevelTracerContext = ApiTracerContext.newBuilder().setLibraryMetadata(LibraryMetadata.empty()).build(); - + ApiTracerFactory factoryWithContext = tracerFactory.withContext(clientLevelTracerContext); - ApiTracer actual = factoryWithContext.newTracer(mock(ApiTracer.class), methodLevelTracerContext); + ApiTracer actual = + factoryWithContext.newTracer(mock(ApiTracer.class), methodLevelTracerContext); assertThat(actual).isInstanceOf(OpenTelemetryMetricsTracer.class); } From ef0946e0f7b974f6e2ab06606963de6da1b95855 Mon Sep 17 00:00:00 2001 From: blakeli Date: Fri, 10 Apr 2026 11:55:13 -0400 Subject: [PATCH 6/6] chore: address comments. --- .../com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java | 2 +- .../google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java index bb6bb8fef746..1f26cf38e49f 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactory.java @@ -42,7 +42,7 @@ @InternalApi public class OpenTelemetryMetricsFactory implements ApiTracerFactory { - private ApiTracerContext clientLevelTracerContext; + private final ApiTracerContext clientLevelTracerContext; private final OpenTelemetry openTelemetry; private GoldenSignalsMetricsRecorder metricsRecorder; diff --git a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java index a97f15cc69e6..4f1149945f4f 100644 --- a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java +++ b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/OpenTelemetryMetricsFactoryTest.java @@ -56,6 +56,7 @@ void newTracerWithSpanName_shouldCreateTracer_ifMetricsRecorderIsNotNull() { factoryWithContext.newTracer( mock(ApiTracer.class), mock(SpanName.class), ApiTracerFactory.OperationType.Unary); assertThat(actual).isInstanceOf(OpenTelemetryMetricsTracer.class); + assertThat(factoryWithContext).isNotEqualTo(tracerFactory); } @Test