diff --git a/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallSettings.java b/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallSettings.java index 9e2206df6d0b..bd4eb55d36a2 100644 --- a/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallSettings.java +++ b/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallSettings.java @@ -30,11 +30,13 @@ package com.google.api.gax.grpc; import com.google.api.core.BetaApi; +import com.google.api.core.InternalApi; import com.google.api.gax.rpc.RequestMutator; import com.google.api.gax.rpc.RequestParamsExtractor; import com.google.api.gax.rpc.ResourceNameExtractor; import io.grpc.MethodDescriptor; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; /** Grpc-specific settings for creating callables. */ @NullMarked @@ -44,6 +46,7 @@ public class GrpcCallSettings { private final ResourceNameExtractor resourceNameExtractor; private final RequestMutator requestMutator; private final boolean alwaysAwaitTrailers; + private final @Nullable String javaMethodName; private GrpcCallSettings(Builder builder) { this.methodDescriptor = builder.methodDescriptor; @@ -51,6 +54,7 @@ private GrpcCallSettings(Builder builder) { this.resourceNameExtractor = builder.resourceNameExtractor; this.requestMutator = builder.requestMutator; this.alwaysAwaitTrailers = builder.shouldAwaitTrailers; + this.javaMethodName = builder.javaMethodName; } public MethodDescriptor getMethodDescriptor() { @@ -78,6 +82,11 @@ public boolean shouldAwaitTrailers() { return alwaysAwaitTrailers; } + /** Gets the Java method name of the RPC (e.g. "accessSecretVersion"). */ + @Nullable String getJavaMethodName() { + return javaMethodName; + } + public static Builder newBuilder() { return new Builder().setShouldAwaitTrailers(true); } @@ -100,6 +109,7 @@ public static class Builder { private RequestMutator requestMutator; private boolean shouldAwaitTrailers; + private @Nullable String javaMethodName; private Builder() {} @@ -109,6 +119,7 @@ private Builder(GrpcCallSettings settings) { this.resourceNameExtractor = settings.resourceNameExtractor; this.requestMutator = settings.requestMutator; this.shouldAwaitTrailers = settings.alwaysAwaitTrailers; + this.javaMethodName = settings.javaMethodName; } public Builder setMethodDescriptor( @@ -144,6 +155,13 @@ public Builder setShouldAwaitTrailers(boolean b) { return this; } + /** Sets the Java method name of the RPC (e.g. "accessSecretVersion"). */ + @InternalApi + public Builder setJavaMethodName(@Nullable String javaMethodName) { + this.javaMethodName = javaMethodName; + return this; + } + public GrpcCallSettings build() { return new GrpcCallSettings<>(this); } diff --git a/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallableFactory.java b/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallableFactory.java index 8983fb5ded95..59c0929a665a 100644 --- a/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallableFactory.java +++ b/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallableFactory.java @@ -110,7 +110,7 @@ public static UnaryCallable createUna new TracedUnaryCallable<>( callable, clientContext.getTracerFactory(), - getApiTracerContext(grpcCallSettings.getMethodDescriptor()), + getApiTracerContext(grpcCallSettings), grpcCallSettings.getResourceNameExtractor()); return callable.withDefaultCallContext(clientContext.getDefaultCallContext()); @@ -160,7 +160,7 @@ public static UnaryCallable createBat new TracedBatchingCallable<>( baseCallable, clientContext.getTracerFactory(), - getApiTracerContext(grpcCallSettings.getMethodDescriptor()), + getApiTracerContext(grpcCallSettings), batchingCallSettings.getBatchingDescriptor()); UnaryCallable batchingCallable = @@ -186,7 +186,7 @@ OperationCallable createOperationCallable( ClientContext clientContext, OperationsStub operationsStub) { - ApiTracerContext tracerContext = getApiTracerContext(grpcCallSettings.getMethodDescriptor()); + ApiTracerContext tracerContext = getApiTracerContext(grpcCallSettings); SpanName initialSpanName = SpanName.of(tracerContext); SpanName operationSpanName = SpanName.of(initialSpanName.getClientName(), initialSpanName.getMethodName() + "Operation"); @@ -235,9 +235,7 @@ BidiStreamingCallable createBidiStreamingCallable( callable = new TracedBidiCallable<>( - callable, - clientContext.getTracerFactory(), - getApiTracerContext(grpcCallSettings.getMethodDescriptor())); + callable, clientContext.getTracerFactory(), getApiTracerContext(grpcCallSettings)); return callable.withDefaultCallContext(clientContext.getDefaultCallContext()); } @@ -293,9 +291,7 @@ ServerStreamingCallable createServerStreamingCallable( callable = new TracedServerStreamingCallable<>( - callable, - clientContext.getTracerFactory(), - getApiTracerContext(grpcCallSettings.getMethodDescriptor())); + callable, clientContext.getTracerFactory(), getApiTracerContext(grpcCallSettings)); return callable.withDefaultCallContext(clientContext.getDefaultCallContext()); } @@ -321,19 +317,36 @@ ClientStreamingCallable createClientStreamingCallable( callable = new TracedClientStreamingCallable<>( - callable, - clientContext.getTracerFactory(), - getApiTracerContext(grpcCallSettings.getMethodDescriptor())); + callable, clientContext.getTracerFactory(), getApiTracerContext(grpcCallSettings)); return callable.withDefaultCallContext(clientContext.getDefaultCallContext()); } + /** + * Builds an {@link ApiTracerContext} from the given {@link GrpcCallSettings}, including the + * method descriptor and Java method name. + */ + static ApiTracerContext getApiTracerContext(GrpcCallSettings grpcCallSettings) { + return getApiTracerContextBuilder(grpcCallSettings.getMethodDescriptor()) + .setJavaMethodName(grpcCallSettings.getJavaMethodName()) + .build(); + } + + /** Builds an {@link ApiTracerContext} from the given gRPC {@link MethodDescriptor}. */ @VisibleForTesting static ApiTracerContext getApiTracerContext(MethodDescriptor methodDescriptor) { + return getApiTracerContextBuilder(methodDescriptor).build(); + } + + /** + * Creates an {@link ApiTracerContext.Builder} populated with common gRPC transport and method + * descriptor fields. + */ + private static ApiTracerContext.Builder getApiTracerContextBuilder( + MethodDescriptor methodDescriptor) { return ApiTracerContext.newBuilder() .setFullMethodName(methodDescriptor.getFullMethodName()) .setTransport(ApiTracerContext.Transport.GRPC) - .setLibraryMetadata(LibraryMetadata.empty()) - .build(); + .setLibraryMetadata(LibraryMetadata.empty()); } } diff --git a/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcCallableFactoryTest.java b/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcCallableFactoryTest.java index 18fdf220defd..99c95efd202c 100644 --- a/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcCallableFactoryTest.java +++ b/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcCallableFactoryTest.java @@ -40,9 +40,11 @@ import com.google.api.gax.rpc.ClientContext; import com.google.api.gax.rpc.EndpointContext; import com.google.api.gax.rpc.InvalidArgumentException; +import com.google.api.gax.rpc.LibraryMetadata; import com.google.api.gax.rpc.ServerStreamingCallSettings; import com.google.api.gax.rpc.ServerStreamingCallable; import com.google.api.gax.rpc.StatusCode.Code; +import com.google.api.gax.tracing.ApiTracerContext; import com.google.api.gax.tracing.SpanName; import com.google.auth.Credentials; import com.google.common.collect.ImmutableList; @@ -163,6 +165,33 @@ void testGetSpanName() { assertThat(actualSpanName).isEqualTo(SpanName.of("Bigtable", "ReadRows")); } + @Test + void testGetApiTracerContextWithGrpcCallSettings() { + @SuppressWarnings("unchecked") + MethodDescriptor descriptor = + MethodDescriptor.newBuilder() + .setType(MethodType.UNARY) + .setFullMethodName("google.bigtable.v2.Bigtable/ReadRows") + .setRequestMarshaller(mock(Marshaller.class)) + .setResponseMarshaller(mock(Marshaller.class)) + .build(); + + GrpcCallSettings grpcCallSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(descriptor) + .setJavaMethodName("readRows") + .build(); + + assertThat(GrpcCallableFactory.getApiTracerContext(grpcCallSettings)) + .isEqualTo( + ApiTracerContext.newBuilder() + .setFullMethodName("google.bigtable.v2.Bigtable/ReadRows") + .setTransport(ApiTracerContext.Transport.GRPC) + .setLibraryMetadata(LibraryMetadata.empty()) + .setJavaMethodName("readRows") + .build()); + } + @Test void testGetSpanNameUnqualified() { @SuppressWarnings("unchecked") diff --git a/sdk-platform-java/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallSettings.java b/sdk-platform-java/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallSettings.java index 36ba46069e37..893d42e1bc44 100644 --- a/sdk-platform-java/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallSettings.java +++ b/sdk-platform-java/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallSettings.java @@ -30,11 +30,13 @@ package com.google.api.gax.httpjson; import com.google.api.core.BetaApi; +import com.google.api.core.InternalApi; import com.google.api.gax.rpc.RequestMutator; import com.google.api.gax.rpc.RequestParamsExtractor; import com.google.api.gax.rpc.ResourceNameExtractor; import com.google.protobuf.TypeRegistry; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; /** HTTP-specific settings for creating callables. */ @NullMarked @@ -45,6 +47,7 @@ public class HttpJsonCallSettings { private final RequestMutator requestMutator; private final TypeRegistry typeRegistry; + private final @Nullable String javaMethodName; private HttpJsonCallSettings(Builder builder) { this.methodDescriptor = builder.methodDescriptor; @@ -52,6 +55,7 @@ private HttpJsonCallSettings(Builder builder) { this.resourceNameExtractor = builder.resourceNameExtractor; this.requestMutator = builder.requestMutator; this.typeRegistry = builder.typeRegistry; + this.javaMethodName = builder.javaMethodName; } public ApiMethodDescriptor getMethodDescriptor() { @@ -70,6 +74,11 @@ ResourceNameExtractor getResourceNameExtractor() { return resourceNameExtractor; } + /** Gets the Java method name of the RPC (e.g. "accessSecretVersion"). */ + @Nullable String getJavaMethodName() { + return javaMethodName; + } + public RequestMutator getRequestMutator() { return requestMutator; } @@ -100,6 +109,7 @@ public static class Builder { private RequestParamsExtractor paramsExtractor; private ResourceNameExtractor resourceNameExtractor; private TypeRegistry typeRegistry; + private @Nullable String javaMethodName; private Builder() {} @@ -109,6 +119,7 @@ private Builder(HttpJsonCallSettings settings) { this.resourceNameExtractor = settings.resourceNameExtractor; this.requestMutator = settings.requestMutator; this.typeRegistry = settings.typeRegistry; + this.javaMethodName = settings.javaMethodName; } public Builder setMethodDescriptor( @@ -132,6 +143,13 @@ public Builder setResourceNameExtractor( return this; } + /** Sets the Java method name of the RPC (e.g. "accessSecretVersion"). */ + @InternalApi + public Builder setJavaMethodName(@Nullable String javaMethodName) { + this.javaMethodName = javaMethodName; + return this; + } + public Builder setRequestMutator(RequestMutator requestMutator) { this.requestMutator = requestMutator; return this; diff --git a/sdk-platform-java/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallableFactory.java b/sdk-platform-java/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallableFactory.java index 3af6442a5ead..f091eaabf47b 100644 --- a/sdk-platform-java/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallableFactory.java +++ b/sdk-platform-java/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallableFactory.java @@ -48,6 +48,7 @@ import com.google.api.gax.rpc.UnaryCallable; import com.google.api.gax.tracing.ApiTracerContext; import com.google.api.gax.tracing.TracedUnaryCallable; +import com.google.common.annotations.VisibleForTesting; import org.jspecify.annotations.NullMarked; /** Class with utility methods to create http/json-based direct callables. */ @@ -85,7 +86,7 @@ static UnaryCallable createUnaryCalla new TracedUnaryCallable<>( callable, clientContext.getTracerFactory(), - getApiTracerContext(httpJsonCallSettings.getMethodDescriptor()), + getApiTracerContext(httpJsonCallSettings), httpJsonCallSettings.getResourceNameExtractor()); return callable.withDefaultCallContext(clientContext.getDefaultCallContext()); } @@ -245,13 +246,34 @@ ResumableUploadCallable createResumableUploadCallable( return Callables.resumableUpload(uploadClient, callSettings, clientContext); } + /** + * Builds an {@link ApiTracerContext} from the given {@link HttpJsonCallSettings}, including the + * method descriptor and Java method name. + */ + @VisibleForTesting + static ApiTracerContext getApiTracerContext(HttpJsonCallSettings httpJsonCallSettings) { + return getApiTracerContextBuilder(httpJsonCallSettings.getMethodDescriptor()) + .setJavaMethodName(httpJsonCallSettings.getJavaMethodName()) + .build(); + } + + /** Builds an {@link ApiTracerContext} from the given HTTP/JSON {@link ApiMethodDescriptor}. */ + @VisibleForTesting static ApiTracerContext getApiTracerContext(ApiMethodDescriptor methodDescriptor) { + return getApiTracerContextBuilder(methodDescriptor).build(); + } + + /** + * Creates an {@link ApiTracerContext.Builder} populated with common HTTP/JSON transport and + * method descriptor fields. + */ + private static ApiTracerContext.Builder getApiTracerContextBuilder( + ApiMethodDescriptor methodDescriptor) { return ApiTracerContext.newBuilder() .setFullMethodName(methodDescriptor.getFullMethodName()) .setHttpMethod(methodDescriptor.getHttpMethod()) .setHttpPathTemplate(methodDescriptor.getRequestFormatter().getPathTemplate().toRawString()) .setTransport(ApiTracerContext.Transport.HTTP) - .setLibraryMetadata(LibraryMetadata.empty()) - .build(); + .setLibraryMetadata(LibraryMetadata.empty()); } } diff --git a/sdk-platform-java/gax-java/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpJsonCallableFactoryTest.java b/sdk-platform-java/gax-java/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpJsonCallableFactoryTest.java index af5450b3c5f6..d8d2cfc74058 100644 --- a/sdk-platform-java/gax-java/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpJsonCallableFactoryTest.java +++ b/sdk-platform-java/gax-java/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpJsonCallableFactoryTest.java @@ -35,6 +35,7 @@ import com.google.api.client.http.HttpMethods; import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.LibraryMetadata; import com.google.api.gax.rpc.ResumableUploadCallable; import com.google.api.gax.rpc.UnaryCallSettings; import com.google.api.gax.tracing.ApiTracerContext; @@ -82,6 +83,36 @@ void testGetApiTracerContext() { } } + @Test + void testGetApiTracerContextWithHttpJsonCallSettings() { + @SuppressWarnings("unchecked") + ApiMethodDescriptor descriptor = + ApiMethodDescriptor.newBuilder() + .setFullMethodName("google.cloud.service.v1.CoolService/CoolRPC") + .setHttpMethod(HttpMethods.POST) + .setRequestFormatter(createMockRequestFormatter()) + .setResponseParser( + mock(HttpResponseParser.class, Mockito.withSettings().withoutAnnotations())) + .build(); + + HttpJsonCallSettings httpJsonCallSettings = + HttpJsonCallSettings.newBuilder() + .setMethodDescriptor(descriptor) + .setJavaMethodName("coolRpc") + .build(); + + assertThat(HttpJsonCallableFactory.getApiTracerContext(httpJsonCallSettings)) + .isEqualTo( + ApiTracerContext.newBuilder() + .setFullMethodName("google.cloud.service.v1.CoolService/CoolRPC") + .setHttpMethod(HttpMethods.POST) + .setHttpPathTemplate("test/path/template") + .setTransport(ApiTracerContext.Transport.HTTP) + .setLibraryMetadata(LibraryMetadata.empty()) + .setJavaMethodName("coolRpc") + .build()); + } + @Test void testGetApiTracerContextInvalid() { List invalidNames = ImmutableList.of("no_split", ".no_client"); diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientContext.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientContext.java index 79cea1dba7d9..eb6e230a1b66 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientContext.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientContext.java @@ -311,6 +311,7 @@ static ApiTracerFactory getApiTracerFactory( .setServiceName(endpointContext.serviceName()) .setLibraryMetadata(settings.getLibraryMetadata()) .setUrlDomain(endpointContext.getUrlDomain()) + .setJavaClientName(settings.getJavaClientName()) .build(); apiTracerFactory = apiTracerFactory.withContext(apiTracerContext); } diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java index 0c57740b86fd..0b6f79bcde2d 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java @@ -255,6 +255,17 @@ protected LibraryMetadata getLibraryMetadata() { return LibraryMetadata.empty(); } + /** + * Returns the fully qualified Java client class name (e.g. + * "com.google.cloud.secretmanager.v1.SecretManagerServiceClient"). + * + *

This should be effectively treated as an abstract method. + */ + @InternalApi + protected @Nullable String getJavaClientName() { + return null; + } + @Override public String toString() { return MoreObjects.toStringHelper(this) 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 79841eb718d6..3f1389412167 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 @@ -158,6 +158,15 @@ public enum Transport { /** The url domain of the request (e.g. "pubsub.googleapis.com"). */ abstract @Nullable String urlDomain(); + /** + * The fully qualified Java client class name (e.g. + * "com.google.cloud.secretmanager.v1.SecretManagerServiceClient"). + */ + abstract @Nullable String javaClientName(); + + /** The Java method name of the RPC (e.g. "accessSecretVersion"). */ + abstract @Nullable String javaMethodName(); + protected abstract @Nullable Supplier destinationResourceIdSupplier(); /** @@ -306,6 +315,12 @@ ApiTracerContext merge(ApiTracerContext other) { if (!Strings.isNullOrEmpty(other.urlDomain())) { builder.setUrlDomain(other.urlDomain()); } + if (!Strings.isNullOrEmpty(other.javaClientName())) { + builder.setJavaClientName(other.javaClientName()); + } + if (!Strings.isNullOrEmpty(other.javaMethodName())) { + builder.setJavaMethodName(other.javaMethodName()); + } if (other.destinationResourceIdSupplier() != null) { builder.setDestinationResourceIdSupplier(other.destinationResourceIdSupplier()); } @@ -344,6 +359,15 @@ public abstract static class Builder { public abstract Builder setUrlDomain(@Nullable String urlDomain); + /** + * Sets the fully qualified Java client class name (e.g. + * "com.google.cloud.secretmanager.v1.SecretManagerServiceClient"). + */ + public abstract Builder setJavaClientName(@Nullable String javaClientName); + + /** Sets the Java method name of the RPC (e.g. "accessSecretVersion"). */ + public abstract Builder setJavaMethodName(@Nullable String javaMethodName); + abstract Builder setDestinationResourceIdSupplier( @Nullable Supplier destinationResourceIdSupplier); diff --git a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientContextTest.java b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientContextTest.java index ffc380e39284..be4ccfcbccac 100644 --- a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientContextTest.java +++ b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/rpc/ClientContextTest.java @@ -55,6 +55,7 @@ import com.google.api.gax.rpc.testing.FakeClientSettings; import com.google.api.gax.rpc.testing.FakeStubSettings; import com.google.api.gax.rpc.testing.FakeTransportChannel; +import com.google.api.gax.tracing.ApiTracerContext; import com.google.api.gax.tracing.ApiTracerFactory; import com.google.auth.ApiKeyCredentials; import com.google.auth.CredentialTypeForMetrics; @@ -1405,6 +1406,36 @@ void testGetApiTracerFactory_contextNeeded() throws java.io.IOException { .withContext(Mockito.any(com.google.api.gax.tracing.ApiTracerContext.class)); } + @Test + void testGetApiTracerFactory_passesJavaClientName() throws IOException { + ApiTracerFactory mockTracerFactory = + Mockito.mock(ApiTracerFactory.class, Mockito.withSettings().withoutAnnotations()); + when(mockTracerFactory.needsContext()).thenReturn(true); + when(mockTracerFactory.withContext(Mockito.any(ApiTracerContext.class))) + .thenReturn(mockTracerFactory); + + FakeStubSettings.Builder builder = FakeStubSettings.newBuilder(); + builder.setTracerFactory(mockTracerFactory); + FakeStubSettings settings = Mockito.spy(builder.build()); + Mockito.doReturn("com.google.cloud.v1.FakeServiceClient").when(settings).getJavaClientName(); + + EndpointContext endpointContext = + Mockito.mock(EndpointContext.class, Mockito.withSettings().withoutAnnotations()); + when(endpointContext.resolvedServerAddress()).thenReturn("test-address"); + when(endpointContext.resolvedServerPort()).thenReturn(443); + + ClientContext.getApiTracerFactory(settings, endpointContext); + + verify(mockTracerFactory, times(1)) + .withContext( + ApiTracerContext.newBuilder() + .setServerAddress("test-address") + .setServerPort(443) + .setLibraryMetadata(LibraryMetadata.empty()) + .setJavaClientName("com.google.cloud.v1.FakeServiceClient") + .build()); + } + // This test should only run when the maven profile `EnvVarTest` is enabled. @Test void testGetApiTracerFactory_loggingEnabled() throws java.io.IOException { diff --git a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/ApiTracerContextTest.java b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/ApiTracerContextTest.java index 9c0c01e54408..61aef1531e02 100644 --- a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/ApiTracerContextTest.java +++ b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/ApiTracerContextTest.java @@ -334,6 +334,8 @@ void testMerge() { .setLibraryMetadata(metadata) .setFullMethodName("method1") .setTransport(ApiTracerContext.Transport.HTTP) + .setJavaClientName("com.google.cloud.v1.Service1Client") + .setJavaMethodName("javaMethod1") .build(); LibraryMetadata metadata2 = LibraryMetadata.newBuilder().setArtifactName("artifact").build(); @@ -343,6 +345,8 @@ void testMerge() { .setLibraryMetadata(metadata2) .setFullMethodName("method2") .setTransport(ApiTracerContext.Transport.GRPC) + .setJavaClientName("com.google.cloud.v1.Service2Client") + .setJavaMethodName("javaMethod2") .build(); ApiTracerContext merged = context1.merge(context2); @@ -354,6 +358,27 @@ void testMerge() { assertThat(merged.libraryMetadata().repository()).isNull(); assertThat(merged.fullMethodName()).isEqualTo("method2"); assertThat(merged.transport()).isEqualTo(ApiTracerContext.Transport.GRPC); + assertThat(merged.javaClientName()).isEqualTo("com.google.cloud.v1.Service2Client"); + assertThat(merged.javaMethodName()).isEqualTo("javaMethod2"); + } + + @Test + void testMerge_javaClientAndMethodName() { + ApiTracerContext clientLevelContext = + ApiTracerContext.newBuilder() + .setLibraryMetadata(LibraryMetadata.empty()) + .setJavaClientName("com.google.cloud.secretmanager.v1.SecretManagerServiceClient") + .build(); + ApiTracerContext methodLevelContext = + ApiTracerContext.newBuilder() + .setLibraryMetadata(LibraryMetadata.empty()) + .setJavaMethodName("accessSecretVersion") + .build(); + + ApiTracerContext merged = clientLevelContext.merge(methodLevelContext); + assertThat(merged.javaClientName()) + .isEqualTo("com.google.cloud.secretmanager.v1.SecretManagerServiceClient"); + assertThat(merged.javaMethodName()).isEqualTo("accessSecretVersion"); } @Test @@ -388,6 +413,8 @@ void testMerge_emptyOther() { .setLibraryMetadata(LibraryMetadata.newBuilder().setRepository("repo").build()) .setFullMethodName("method1") .setTransport(ApiTracerContext.Transport.HTTP) + .setJavaClientName("com.google.cloud.v1.Service1Client") + .setJavaMethodName("javaMethod1") .build(); ApiTracerContext merged = context1.merge(ApiTracerContext.empty());