Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -44,13 +46,15 @@ public class GrpcCallSettings<RequestT, ResponseT> {
private final ResourceNameExtractor<RequestT> resourceNameExtractor;
private final RequestMutator<RequestT> requestMutator;
private final boolean alwaysAwaitTrailers;
private final @Nullable String javaMethodName;

private GrpcCallSettings(Builder<RequestT, ResponseT> builder) {
this.methodDescriptor = builder.methodDescriptor;
this.paramsExtractor = builder.paramsExtractor;
this.resourceNameExtractor = builder.resourceNameExtractor;
this.requestMutator = builder.requestMutator;
this.alwaysAwaitTrailers = builder.shouldAwaitTrailers;
this.javaMethodName = builder.javaMethodName;
}

public MethodDescriptor<RequestT, ResponseT> getMethodDescriptor() {
Expand Down Expand Up @@ -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;
}
Comment thread
jinseopkim0 marked this conversation as resolved.

public static <RequestT, ResponseT> Builder<RequestT, ResponseT> newBuilder() {
return new Builder<RequestT, ResponseT>().setShouldAwaitTrailers(true);
}
Expand All @@ -100,6 +109,7 @@ public static class Builder<RequestT, ResponseT> {

private RequestMutator<RequestT> requestMutator;
private boolean shouldAwaitTrailers;
private @Nullable String javaMethodName;

private Builder() {}

Expand All @@ -109,6 +119,7 @@ private Builder(GrpcCallSettings<RequestT, ResponseT> settings) {
this.resourceNameExtractor = settings.resourceNameExtractor;
this.requestMutator = settings.requestMutator;
this.shouldAwaitTrailers = settings.alwaysAwaitTrailers;
this.javaMethodName = settings.javaMethodName;
}

public Builder<RequestT, ResponseT> setMethodDescriptor(
Expand Down Expand Up @@ -144,6 +155,13 @@ public Builder<RequestT, ResponseT> setShouldAwaitTrailers(boolean b) {
return this;
}

/** Sets the Java method name of the RPC (e.g. "accessSecretVersion"). */
@InternalApi
public Builder<RequestT, ResponseT> setJavaMethodName(@Nullable String javaMethodName) {
this.javaMethodName = javaMethodName;
return this;
}

public GrpcCallSettings<RequestT, ResponseT> build() {
return new GrpcCallSettings<>(this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUna
new TracedUnaryCallable<>(
callable,
clientContext.getTracerFactory(),
getApiTracerContext(grpcCallSettings.getMethodDescriptor()),
getApiTracerContext(grpcCallSettings),
grpcCallSettings.getResourceNameExtractor());

return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
Expand Down Expand Up @@ -160,7 +160,7 @@ public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBat
new TracedBatchingCallable<>(
baseCallable,
clientContext.getTracerFactory(),
getApiTracerContext(grpcCallSettings.getMethodDescriptor()),
getApiTracerContext(grpcCallSettings),
batchingCallSettings.getBatchingDescriptor());

UnaryCallable<RequestT, ResponseT> batchingCallable =
Expand All @@ -186,7 +186,7 @@ OperationCallable<RequestT, ResponseT, MetadataT> 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");
Expand Down Expand Up @@ -235,9 +235,7 @@ BidiStreamingCallable<RequestT, ResponseT> createBidiStreamingCallable(

callable =
new TracedBidiCallable<>(
callable,
clientContext.getTracerFactory(),
getApiTracerContext(grpcCallSettings.getMethodDescriptor()));
callable, clientContext.getTracerFactory(), getApiTracerContext(grpcCallSettings));

return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
}
Expand Down Expand Up @@ -293,9 +291,7 @@ ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(

callable =
new TracedServerStreamingCallable<>(
callable,
clientContext.getTracerFactory(),
getApiTracerContext(grpcCallSettings.getMethodDescriptor()));
callable, clientContext.getTracerFactory(), getApiTracerContext(grpcCallSettings));

return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
}
Expand All @@ -321,19 +317,36 @@ ClientStreamingCallable<RequestT, ResponseT> 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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -163,6 +165,33 @@ void testGetSpanName() {
assertThat(actualSpanName).isEqualTo(SpanName.of("Bigtable", "ReadRows"));
}

@Test
void testGetApiTracerContextWithGrpcCallSettings() {
@SuppressWarnings("unchecked")
MethodDescriptor<Color, Money> descriptor =
MethodDescriptor.<Color, Money>newBuilder()
.setType(MethodType.UNARY)
.setFullMethodName("google.bigtable.v2.Bigtable/ReadRows")
.setRequestMarshaller(mock(Marshaller.class))
.setResponseMarshaller(mock(Marshaller.class))
.build();

GrpcCallSettings<Color, Money> grpcCallSettings =
GrpcCallSettings.<Color, Money>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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -45,13 +47,15 @@ public class HttpJsonCallSettings<RequestT, ResponseT> {

private final RequestMutator<RequestT> requestMutator;
private final TypeRegistry typeRegistry;
private final @Nullable String javaMethodName;

private HttpJsonCallSettings(Builder<RequestT, ResponseT> builder) {
this.methodDescriptor = builder.methodDescriptor;
this.paramsExtractor = builder.paramsExtractor;
this.resourceNameExtractor = builder.resourceNameExtractor;
this.requestMutator = builder.requestMutator;
this.typeRegistry = builder.typeRegistry;
this.javaMethodName = builder.javaMethodName;
}

public ApiMethodDescriptor<RequestT, ResponseT> getMethodDescriptor() {
Expand All @@ -70,6 +74,11 @@ ResourceNameExtractor<RequestT> getResourceNameExtractor() {
return resourceNameExtractor;
}

/** Gets the Java method name of the RPC (e.g. "accessSecretVersion"). */
@Nullable String getJavaMethodName() {
return javaMethodName;
}
Comment thread
jinseopkim0 marked this conversation as resolved.

public RequestMutator<RequestT> getRequestMutator() {
return requestMutator;
}
Expand Down Expand Up @@ -100,6 +109,7 @@ public static class Builder<RequestT, ResponseT> {
private RequestParamsExtractor<RequestT> paramsExtractor;
private ResourceNameExtractor<RequestT> resourceNameExtractor;
private TypeRegistry typeRegistry;
private @Nullable String javaMethodName;

private Builder() {}

Expand All @@ -109,6 +119,7 @@ private Builder(HttpJsonCallSettings<RequestT, ResponseT> settings) {
this.resourceNameExtractor = settings.resourceNameExtractor;
this.requestMutator = settings.requestMutator;
this.typeRegistry = settings.typeRegistry;
this.javaMethodName = settings.javaMethodName;
}

public Builder<RequestT, ResponseT> setMethodDescriptor(
Expand All @@ -132,6 +143,13 @@ public Builder<RequestT, ResponseT> setResourceNameExtractor(
return this;
}

/** Sets the Java method name of the RPC (e.g. "accessSecretVersion"). */
@InternalApi
public Builder<RequestT, ResponseT> setJavaMethodName(@Nullable String javaMethodName) {
this.javaMethodName = javaMethodName;
return this;
}

public Builder<RequestT, ResponseT> setRequestMutator(RequestMutator<RequestT> requestMutator) {
this.requestMutator = requestMutator;
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down Expand Up @@ -85,7 +86,7 @@ static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUnaryCalla
new TracedUnaryCallable<>(
callable,
clientContext.getTracerFactory(),
getApiTracerContext(httpJsonCallSettings.getMethodDescriptor()),
getApiTracerContext(httpJsonCallSettings),
httpJsonCallSettings.getResourceNameExtractor());
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
}
Comment thread
jinseopkim0 marked this conversation as resolved.
Expand Down Expand Up @@ -245,13 +246,34 @@ ResumableUploadCallable<RequestT, ResponseT> 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();
}
Comment thread
jinseopkim0 marked this conversation as resolved.

/**
* 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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -82,6 +83,36 @@ void testGetApiTracerContext() {
}
}

@Test
void testGetApiTracerContextWithHttpJsonCallSettings() {
@SuppressWarnings("unchecked")
ApiMethodDescriptor<String, String> descriptor =
ApiMethodDescriptor.<String, String>newBuilder()
.setFullMethodName("google.cloud.service.v1.CoolService/CoolRPC")
.setHttpMethod(HttpMethods.POST)
.setRequestFormatter(createMockRequestFormatter())
.setResponseParser(
mock(HttpResponseParser.class, Mockito.withSettings().withoutAnnotations()))
.build();

HttpJsonCallSettings<String, String> httpJsonCallSettings =
HttpJsonCallSettings.<String, String>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<String> invalidNames = ImmutableList.of("no_split", ".no_client");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ static ApiTracerFactory getApiTracerFactory(
.setServiceName(endpointContext.serviceName())
.setLibraryMetadata(settings.getLibraryMetadata())
.setUrlDomain(endpointContext.getUrlDomain())
.setJavaClientName(settings.getJavaClientName())
.build();
apiTracerFactory = apiTracerFactory.withContext(apiTracerContext);
}
Expand Down
Loading
Loading