Skip to content

Commit ef59e3e

Browse files
committed
Merge branch 'main' into add-metrics-attributes
2 parents 59f320c + 6a76397 commit ef59e3e

43 files changed

Lines changed: 1654 additions & 295 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

gax-java/dependencies.properties

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ maven.com_google_api_grpc_proto_google_common_protos=com.google.api.grpc:proto-g
3939
maven.com_google_api_grpc_grpc_google_common_protos=com.google.api.grpc:grpc-google-common-protos:2.63.2
4040
maven.com_google_auth_google_auth_library_oauth2_http=com.google.auth:google-auth-library-oauth2-http:1.42.1
4141
maven.com_google_auth_google_auth_library_credentials=com.google.auth:google-auth-library-credentials:1.42.1
42-
maven.io_opentelemetry_opentelemetry_api=io.opentelemetry:opentelemetry-api:1.47.0
43-
maven.io_opentelemetry_opentelemetry_context=io.opentelemetry:opentelemetry-context:1.47.0
44-
maven.io_opentelemetry_opentelemetry_sdk_testing=io.opentelemetry:opentelemetry_sdk_testing:1.47.0
42+
maven.io_opentelemetry_opentelemetry_api=io.opentelemetry:opentelemetry-api:1.51.0
43+
maven.io_opentelemetry_opentelemetry_context=io.opentelemetry:opentelemetry-context:1.51.0
4544
maven.io_opencensus_opencensus_api=io.opencensus:opencensus-api:0.31.1
4645
maven.io_opencensus_opencensus_contrib_grpc_metrics=io.opencensus:opencensus-contrib-grpc-metrics:0.31.1
4746
maven.io_opencensus_opencensus_contrib_http_util=io.opencensus:opencensus-contrib-http-util:0.31.1
@@ -92,3 +91,8 @@ maven.net_bytebuddy_byte_buddy=net.bytebuddy:byte-buddy:1.17.0
9291
maven.org_objenesis_objenesis=org.objenesis:objenesis:2.6
9392
maven.org_junit_jupiter_junit_jupiter_api=org.junit.jupiter:junit-jupiter-api:5.11.4
9493
maven.org_junit_jupiter_junit_jupiter_params=org.junit.jupiter:junit-jupiter-params:5.11.4
94+
maven.io_opentelemetry_opentelemetry_sdk_testing=io.opentelemetry:opentelemetry-sdk-testing:1.51.0
95+
maven.io_opentelemetry_opentelemetry_sdk=io.opentelemetry:opentelemetry-sdk:1.51.0
96+
maven.io_opentelemetry_opentelemetry_sdk_common=io.opentelemetry:opentelemetry-sdk-common:1.51.0
97+
maven.io_opentelemetry_opentelemetry_sdk_metrics=io.opentelemetry:opentelemetry-sdk-metrics:1.51.0
98+
maven.com_google_guava_guava_testlib=com.google.guava:guava-testlib:32.1.3-jre

gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallableFactory.java

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@
2929
*/
3030
package com.google.api.gax.grpc;
3131

32-
import com.google.api.core.InternalApi;
3332
import com.google.api.gax.longrunning.OperationSnapshot;
3433
import com.google.api.gax.rpc.BatchingCallSettings;
3534
import com.google.api.gax.rpc.BidiStreamingCallable;
3635
import com.google.api.gax.rpc.Callables;
3736
import com.google.api.gax.rpc.ClientContext;
3837
import com.google.api.gax.rpc.ClientStreamingCallable;
38+
import com.google.api.gax.rpc.LibraryMetadata;
3939
import com.google.api.gax.rpc.LongRunningClient;
4040
import com.google.api.gax.rpc.OperationCallSettings;
4141
import com.google.api.gax.rpc.OperationCallable;
@@ -46,6 +46,7 @@
4646
import com.google.api.gax.rpc.StreamingCallSettings;
4747
import com.google.api.gax.rpc.UnaryCallSettings;
4848
import com.google.api.gax.rpc.UnaryCallable;
49+
import com.google.api.gax.tracing.ApiTracerContext;
4950
import com.google.api.gax.tracing.SpanName;
5051
import com.google.api.gax.tracing.TracedBatchingCallable;
5152
import com.google.api.gax.tracing.TracedBidiCallable;
@@ -54,19 +55,15 @@
5455
import com.google.api.gax.tracing.TracedOperationInitialCallable;
5556
import com.google.api.gax.tracing.TracedServerStreamingCallable;
5657
import com.google.api.gax.tracing.TracedUnaryCallable;
57-
import com.google.common.base.Preconditions;
58+
import com.google.common.annotations.VisibleForTesting;
5859
import com.google.common.collect.ImmutableSet;
5960
import com.google.longrunning.Operation;
6061
import com.google.longrunning.stub.OperationsStub;
6162
import io.grpc.MethodDescriptor;
62-
import java.util.regex.Matcher;
63-
import java.util.regex.Pattern;
6463
import javax.annotation.Nonnull;
6564

6665
/** Class with utility methods to create grpc-based direct callables. */
6766
public class GrpcCallableFactory {
68-
// Used to extract service and method name from a grpc MethodDescriptor.
69-
private static final Pattern FULL_METHOD_NAME_REGEX = Pattern.compile("^.*?([^./]+)/([^./]+)$");
7067

7168
private GrpcCallableFactory() {}
7269

@@ -112,7 +109,7 @@ public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUna
112109
new TracedUnaryCallable<>(
113110
callable,
114111
clientContext.getTracerFactory(),
115-
getSpanName(grpcCallSettings.getMethodDescriptor()));
112+
getApiTracerContext(grpcCallSettings.getMethodDescriptor()));
116113

117114
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
118115
}
@@ -161,7 +158,7 @@ public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBat
161158
new TracedBatchingCallable<>(
162159
baseCallable,
163160
clientContext.getTracerFactory(),
164-
getSpanName(grpcCallSettings.getMethodDescriptor()),
161+
getApiTracerContext(grpcCallSettings.getMethodDescriptor()),
165162
batchingCallSettings.getBatchingDescriptor());
166163

167164
UnaryCallable<RequestT, ResponseT> batchingCallable =
@@ -187,7 +184,8 @@ OperationCallable<RequestT, ResponseT, MetadataT> createOperationCallable(
187184
ClientContext clientContext,
188185
OperationsStub operationsStub) {
189186

190-
SpanName initialSpanName = getSpanName(grpcCallSettings.getMethodDescriptor());
187+
ApiTracerContext tracerContext = getApiTracerContext(grpcCallSettings.getMethodDescriptor());
188+
SpanName initialSpanName = SpanName.of(tracerContext);
191189
SpanName operationSpanName =
192190
SpanName.of(initialSpanName.getClientName(), initialSpanName.getMethodName() + "Operation");
193191

@@ -237,7 +235,7 @@ BidiStreamingCallable<RequestT, ResponseT> createBidiStreamingCallable(
237235
new TracedBidiCallable<>(
238236
callable,
239237
clientContext.getTracerFactory(),
240-
getSpanName(grpcCallSettings.getMethodDescriptor()));
238+
getApiTracerContext(grpcCallSettings.getMethodDescriptor()));
241239

242240
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
243241
}
@@ -295,7 +293,7 @@ ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(
295293
new TracedServerStreamingCallable<>(
296294
callable,
297295
clientContext.getTracerFactory(),
298-
getSpanName(grpcCallSettings.getMethodDescriptor()));
296+
getApiTracerContext(grpcCallSettings.getMethodDescriptor()));
299297

300298
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
301299
}
@@ -323,16 +321,17 @@ ClientStreamingCallable<RequestT, ResponseT> createClientStreamingCallable(
323321
new TracedClientStreamingCallable<>(
324322
callable,
325323
clientContext.getTracerFactory(),
326-
getSpanName(grpcCallSettings.getMethodDescriptor()));
324+
getApiTracerContext(grpcCallSettings.getMethodDescriptor()));
327325

328326
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
329327
}
330328

331-
@InternalApi("Visible for testing")
332-
static SpanName getSpanName(@Nonnull MethodDescriptor<?, ?> methodDescriptor) {
333-
Matcher matcher = FULL_METHOD_NAME_REGEX.matcher(methodDescriptor.getFullMethodName());
334-
335-
Preconditions.checkArgument(matcher.matches(), "Invalid fullMethodName");
336-
return SpanName.of(matcher.group(1), matcher.group(2));
329+
@VisibleForTesting
330+
static ApiTracerContext getApiTracerContext(@Nonnull MethodDescriptor<?, ?> methodDescriptor) {
331+
return ApiTracerContext.newBuilder()
332+
.setFullMethodName(methodDescriptor.getFullMethodName())
333+
.setTransport(ApiTracerContext.Transport.GRPC)
334+
.setLibraryMetadata(LibraryMetadata.empty())
335+
.build();
337336
}
338337
}

gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcCallableFactoryTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ void testGetSpanName() {
157157
.setResponseMarshaller(Mockito.mock(Marshaller.class))
158158
.build();
159159

160-
SpanName actualSpanName = GrpcCallableFactory.getSpanName(descriptor);
160+
SpanName actualSpanName = SpanName.of(GrpcCallableFactory.getApiTracerContext(descriptor));
161161
assertThat(actualSpanName).isEqualTo(SpanName.of("Bigtable", "ReadRows"));
162162
}
163163

@@ -172,7 +172,7 @@ void testGetSpanNameUnqualified() {
172172
.setResponseMarshaller(Mockito.mock(Marshaller.class))
173173
.build();
174174

175-
SpanName actualSpanName = GrpcCallableFactory.getSpanName(descriptor);
175+
SpanName actualSpanName = SpanName.of(GrpcCallableFactory.getApiTracerContext(descriptor));
176176
assertThat(actualSpanName).isEqualTo(SpanName.of("UnqualifiedService", "ReadRows"));
177177
}
178178

@@ -192,7 +192,7 @@ void testGetSpanNameInvalid() {
192192

193193
IllegalArgumentException actualError = null;
194194
try {
195-
SpanName spanName = GrpcCallableFactory.getSpanName(descriptor);
195+
SpanName spanName = SpanName.of(GrpcCallableFactory.getApiTracerContext(descriptor));
196196
Truth.assertWithMessage(
197197
"Invalid method descriptor should not have a valid span name: %s should not generate the spanName: %s",
198198
invalidName, spanName)

gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallableFactory.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.google.api.gax.rpc.BatchingCallSettings;
3636
import com.google.api.gax.rpc.Callables;
3737
import com.google.api.gax.rpc.ClientContext;
38+
import com.google.api.gax.rpc.LibraryMetadata;
3839
import com.google.api.gax.rpc.LongRunningClient;
3940
import com.google.api.gax.rpc.OperationCallSettings;
4041
import com.google.api.gax.rpc.OperationCallable;
@@ -43,17 +44,13 @@
4344
import com.google.api.gax.rpc.ServerStreamingCallable;
4445
import com.google.api.gax.rpc.UnaryCallSettings;
4546
import com.google.api.gax.rpc.UnaryCallable;
47+
import com.google.api.gax.tracing.ApiTracerContext;
4648
import com.google.api.gax.tracing.SpanName;
4749
import com.google.api.gax.tracing.TracedUnaryCallable;
48-
import com.google.common.base.Preconditions;
49-
import java.util.regex.Matcher;
50-
import java.util.regex.Pattern;
5150
import javax.annotation.Nonnull;
5251

5352
/** Class with utility methods to create http/json-based direct callables. */
5453
public class HttpJsonCallableFactory {
55-
// Used to extract service and method name from a HttpJson MethodDescriptor.
56-
private static final Pattern FULL_METHOD_NAME_REGEX = Pattern.compile("^.*?([^./]+)/([^./]+)$");
5754

5855
private HttpJsonCallableFactory() {}
5956

@@ -226,9 +223,12 @@ ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(
226223

227224
@InternalApi("Visible for testing")
228225
static SpanName getSpanName(@Nonnull ApiMethodDescriptor<?, ?> methodDescriptor) {
229-
Matcher matcher = FULL_METHOD_NAME_REGEX.matcher(methodDescriptor.getFullMethodName());
230-
231-
Preconditions.checkArgument(matcher.matches(), "Invalid fullMethodName");
232-
return SpanName.of(matcher.group(1), matcher.group(2));
226+
ApiTracerContext apiTracerContext =
227+
ApiTracerContext.newBuilder()
228+
.setFullMethodName(methodDescriptor.getFullMethodName())
229+
.setTransport(ApiTracerContext.Transport.HTTP)
230+
.setLibraryMetadata(LibraryMetadata.empty())
231+
.build();
232+
return SpanName.of(apiTracerContext);
233233
}
234234
}

gax-java/gax/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ _TEST_COMPILE_DEPS = [
4444
"@net_bytebuddy_byte_buddy//jar",
4545
"@org_objenesis_objenesis//jar",
4646
"@com_googlecode_java_diff_utils_diffutils//jar",
47+
"@io_opentelemetry_opentelemetry_sdk_testing//jar",
48+
"@io_opentelemetry_opentelemetry_sdk//jar",
49+
"@io_opentelemetry_opentelemetry_sdk_metrics//jar",
50+
"@io_opentelemetry_opentelemetry_sdk_common//jar",
51+
"@com_google_guava_guava_testlib//jar",
4752
]
4853

4954
java_library(

gax-java/gax/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@
8383
<artifactId>opentelemetry-sdk-testing</artifactId>
8484
<scope>test</scope>
8585
</dependency>
86+
<dependency>
87+
<groupId>com.google.guava</groupId>
88+
<artifactId>guava-testlib</artifactId>
89+
<version>${guava.version}</version>
90+
<scope>test</scope>
91+
</dependency>
8692
<!-- Logging dependency -->
8793
<dependency>
8894
<groupId>org.slf4j</groupId>

gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientContext.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ public static ClientContext create(StubSettings settings) throws IOException {
274274
ApiTracerContext apiTracerContext =
275275
ApiTracerContext.newBuilder()
276276
.setServerAddress(endpointContext.resolvedServerAddress())
277+
.setServerPort(endpointContext.resolvedServerPort())
277278
.setLibraryMetadata(settings.getLibraryMetadata())
278279
.build();
279280
ApiTracerFactory apiTracerFactory = settings.getTracerFactory();

gax-java/gax/src/main/java/com/google/api/gax/rpc/EndpointContext.java

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ public static EndpointContext getDefaultInstance() {
136136

137137
public abstract String resolvedServerAddress();
138138

139+
@Nullable
140+
public abstract Integer resolvedServerPort();
141+
139142
public abstract Builder toBuilder();
140143

141144
public static Builder newBuilder() {
@@ -233,6 +236,8 @@ public abstract static class Builder {
233236

234237
public abstract Builder setResolvedServerAddress(String serverAddress);
235238

239+
public abstract Builder setResolvedServerPort(Integer serverPort);
240+
236241
public abstract Builder setResolvedUniverseDomain(String resolvedUniverseDomain);
237242

238243
abstract Builder setUseS2A(boolean useS2A);
@@ -264,6 +269,8 @@ public abstract static class Builder {
264269

265270
abstract String resolvedUniverseDomain();
266271

272+
abstract String resolvedEndpoint();
273+
267274
abstract EndpointContext autoBuild();
268275

269276
private String determineUniverseDomain() {
@@ -388,19 +395,38 @@ boolean shouldUseS2A() {
388395
}
389396

390397
private String parseServerAddress(String endpoint) {
391-
if (Strings.isNullOrEmpty(endpoint)) {
398+
if (endpoint.isEmpty()) {
392399
return endpoint;
393400
}
401+
HostAndPort hostAndPort = parseServerHostAndPort(endpoint);
402+
if (hostAndPort == null) {
403+
return null;
404+
}
405+
return hostAndPort.getHost();
406+
}
407+
408+
private Integer parseServerPort(String endpoint) {
409+
if (endpoint.isEmpty()) {
410+
return null;
411+
}
412+
HostAndPort hostAndPort = parseServerHostAndPort(endpoint);
413+
if (!hostAndPort.hasPort()) {
414+
return null;
415+
}
416+
return hostAndPort.getPort();
417+
}
418+
419+
private HostAndPort parseServerHostAndPort(String endpoint) {
394420
String hostPort = endpoint;
395421
if (hostPort.contains("://")) {
396422
// Strip the scheme if present. HostAndPort doesn't support schemes.
397423
hostPort = hostPort.substring(hostPort.indexOf("://") + 3);
398424
}
399425
try {
400-
return HostAndPort.fromString(hostPort).getHost();
426+
return HostAndPort.fromString(hostPort);
401427
} catch (IllegalArgumentException e) {
402428
// Fallback for cases HostAndPort can't handle.
403-
return hostPort;
429+
return null;
404430
}
405431
}
406432

@@ -440,7 +466,8 @@ public EndpointContext build() throws IOException {
440466
setResolvedUniverseDomain(determineUniverseDomain());
441467
String endpoint = determineEndpoint();
442468
setResolvedEndpoint(endpoint);
443-
setResolvedServerAddress(parseServerAddress(endpoint));
469+
setResolvedServerAddress(parseServerAddress(resolvedEndpoint()));
470+
setResolvedServerPort(parseServerPort(resolvedEndpoint()));
444471
setUseS2A(shouldUseS2A());
445472
return autoBuild();
446473
}

gax-java/gax/src/main/java/com/google/api/gax/rpc/LibraryMetadata.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,23 @@
4545
@AutoValue
4646
public abstract class LibraryMetadata {
4747

48+
/**
49+
* Returns the repository of the client library.
50+
*
51+
* <p>Example: "googleapis/google-cloud-java". This maps to the {@code gcp.client.repo} attribute.
52+
*
53+
* @return the repository, or {@code null} if not set
54+
*/
4855
@Nullable
4956
public abstract String repository();
5057

58+
/**
59+
* Returns the artifact name of the client library.
60+
*
61+
* <p>Example: "google-cloud-vision". This maps to the {@code gcp.client.artifact} attribute.
62+
*
63+
* @return the artifact name, or {@code null} if not set
64+
*/
5165
@Nullable
5266
public abstract String artifactName();
5367

@@ -58,6 +72,10 @@ public static LibraryMetadata empty() {
5872
return newBuilder().build();
5973
}
6074

75+
public boolean isEmpty() {
76+
return repository() == null && artifactName() == null;
77+
}
78+
6179
public static LibraryMetadata.Builder newBuilder() {
6280
return new AutoValue_LibraryMetadata.Builder();
6381
}

0 commit comments

Comments
 (0)