From 897b99e99757b9538bc3e49aa1f17c2c18008d60 Mon Sep 17 00:00:00 2001 From: Diego Date: Thu, 2 Apr 2026 14:23:18 -0400 Subject: [PATCH 1/3] test(o11y): expand coverage and cleanup of ITOtelTracing --- .../showcase/v1beta1/it/ITOtelTracing.java | 207 ++++++++++++++---- 1 file changed, 159 insertions(+), 48 deletions(-) diff --git a/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java b/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java index 1b35580fdafa..c2a6fd8ca69f 100644 --- a/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java +++ b/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java @@ -52,6 +52,8 @@ import com.google.showcase.v1beta1.EchoRequest; import com.google.showcase.v1beta1.EchoResponse; import com.google.showcase.v1beta1.EchoSettings; +import com.google.showcase.v1beta1.GetUserRequest; +import com.google.showcase.v1beta1.IdentityClient; import com.google.showcase.v1beta1.it.util.TestClientInitializer; import com.google.showcase.v1beta1.stub.EchoStub; import com.google.showcase.v1beta1.stub.EchoStubSettings; @@ -152,6 +154,16 @@ void testTracing_successfulEcho_grpc() throws Exception { assertThat( attemptSpan .getAttributes() + .get(AttributeKey.stringKey(ObservabilityAttributes.RPC_SYSTEM_NAME_ATTRIBUTE))) + .isEqualTo("grpc"); + assertThat( + attemptSpan + .getAttributes() + .get(AttributeKey.stringKey(ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) + .isEqualTo("OK"); + assertThat( + attemptSpan + .getAttributes() .get(AttributeKey.stringKey(ObservabilityAttributes.REPO_ATTRIBUTE))) .isEqualTo(SHOWCASE_REPO); assertThat( @@ -223,6 +235,16 @@ void testTracing_successfulEcho_httpjson() throws Exception { assertThat( attemptSpan .getAttributes() + .get(AttributeKey.stringKey(ObservabilityAttributes.RPC_SYSTEM_NAME_ATTRIBUTE))) + .isEqualTo("http"); + assertThat( + attemptSpan + .getAttributes() + .get(AttributeKey.longKey(ObservabilityAttributes.HTTP_RESPONSE_STATUS_ATTRIBUTE))) + .isEqualTo(200L); + assertThat( + attemptSpan + .getAttributes() .get(AttributeKey.stringKey(ObservabilityAttributes.REPO_ATTRIBUTE))) .isEqualTo(SHOWCASE_REPO); assertThat( @@ -274,6 +296,66 @@ private long computeExpectedHttpJsonResponseSize(Message message) return jsonPayload.getBytes(StandardCharsets.UTF_8).length; } + @Test + void testTracing_successfulIdentityGetUser_grpc() throws Exception { + SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); + + try (IdentityClient client = TestClientInitializer.createGrpcIdentityClientOpentelemetry(tracingFactory)) { + + try { + client.getUser(GetUserRequest.newBuilder().setName("users/test-user").build()); + } catch (Exception e) { + // Ignored, the showcase server may not have this user, but trace is still + // generated. + } + + List spans = spanExporter.getFinishedSpanItems(); + assertThat(spans).isNotEmpty(); + + SpanData attemptSpan = spans.stream() + .filter(span -> span.getName().equals("google.showcase.v1beta1.Identity/GetUser")) + .findFirst() + .orElseThrow(() -> new AssertionError("Incorrect span name")); + assertThat( + attemptSpan + .getAttributes() + .get( + AttributeKey.stringKey( + ObservabilityAttributes.DESTINATION_RESOURCE_ID_ATTRIBUTE))) + .isEqualTo("users/test-user"); + } + } + + @Test + void testTracing_successfulIdentityGetUser_httpjson() throws Exception { + SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); + + try (IdentityClient client = TestClientInitializer.createHttpJsonIdentityClientOpentelemetry(tracingFactory)) { + + try { + client.getUser(GetUserRequest.newBuilder().setName("users/test-user").build()); + } catch (Exception e) { + // Ignored, the showcase server may not have this user, but trace is still + // generated. + } + + List spans = spanExporter.getFinishedSpanItems(); + assertThat(spans).isNotEmpty(); + + SpanData attemptSpan = spans.stream() + .filter(span -> span.getName().equals("GET v1beta1/{name=users/*}")) + .findFirst() + .orElseThrow(() -> new AssertionError("Incorrect span name")); + assertThat( + attemptSpan + .getAttributes() + .get( + AttributeKey.stringKey( + ObservabilityAttributes.DESTINATION_RESOURCE_ID_ATTRIBUTE))) + .isEqualTo("users/test-user"); + } + } + @Test void testTracing_retry_grpc() throws Exception { final int attempts = 5; @@ -424,7 +506,7 @@ void testTracing_retry_httpjson() throws Exception { assertThat(resendCounts).containsExactlyElementsIn(expectedCounts).inOrder(); } - private void verifyErrorTypeAttribute(String expectedErrorType) { + private SpanData getErrorAttribute() { List spans = spanExporter.getFinishedSpanItems(); assertThat(spans).isNotEmpty(); @@ -439,16 +521,11 @@ private void verifyErrorTypeAttribute(String expectedErrorType) { != null) .findFirst() .orElseThrow(() -> new AssertionError("Span with error.type not found")); - - assertThat( - errorSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE))) - .isEqualTo(expectedErrorType); + return errorSpan; } @Test - void testTracing_failedEcho_grpc_recordsErrorType() throws Exception { + void testTracing_failedEcho_grpc_recordsErrorAttributes() throws Exception { SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); ClientInterceptor interceptor = @@ -490,52 +567,28 @@ public void sendMessage(ReqT message) {} EchoRequest echoRequest = EchoRequest.newBuilder().build(); assertThrows(UnavailableException.class, () -> client.echo(echoRequest)); - verifyErrorTypeAttribute("UNAVAILABLE"); - } - } - @Test - void testTracing_statusCodes_grpc() throws Exception { - SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); - EchoRequest errorRequest = - EchoRequest.newBuilder() - .setError( - Status.newBuilder().setCode(StatusCode.Code.INVALID_ARGUMENT.ordinal()).build()) - .build(); - EchoRequest successRequest = EchoRequest.newBuilder().setContent("tracing-test").build(); - - try (EchoClient grpcClient = - TestClientInitializer.createGrpcEchoClientOpentelemetry(tracingFactory)) { - - grpcClient.echo(successRequest); - assertThrows( - com.google.api.gax.rpc.InvalidArgumentException.class, - () -> grpcClient.echo(errorRequest)); - - List spans = spanExporter.getFinishedSpanItems(); - assertThat(spans).hasSize(2); - - SpanData grpcSuccessSpan = spans.get(0); + SpanData errorSpan = getErrorAttribute(); + assertThat( + errorSpan + .getAttributes() + .get(AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE))) + .isEqualTo("UNAVAILABLE"); assertThat( - grpcSuccessSpan + errorSpan .getAttributes() .get( - AttributeKey.stringKey( - ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) - .isEqualTo("OK"); - - SpanData grpcErrorSpan = spans.get(1); + AttributeKey.stringKey(ObservabilityAttributes.EXCEPTION_TYPE_ATTRIBUTE))) + .isEqualTo("com.google.api.gax.rpc.UnavailableException"); assertThat( - grpcErrorSpan + errorSpan .getAttributes() .get( - AttributeKey.stringKey( - ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) - .isEqualTo("INVALID_ARGUMENT"); - } - } - + AttributeKey.stringKey(ObservabilityAttributes.STATUS_MESSAGE_ATTRIBUTE))) + .isEqualTo("io.grpc.StatusRuntimeException: UNAVAILABLE"); + } + } @Test - void testTracing_failedEcho_httpjson_recordsErrorType() throws Exception { + void testTracing_failedEcho_httpjson_recordsErrorAttributes() throws Exception { SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); HttpTransport mockTransport = @@ -625,9 +678,67 @@ public String getHeaderValue(int index) { EchoRequest echoRequest = EchoRequest.newBuilder().build(); assertThrows(UnavailableException.class, () -> client.echo(echoRequest)); - verifyErrorTypeAttribute("503"); + SpanData errorSpan = getErrorAttribute(); + assertThat( + errorSpan + .getAttributes() + .get(AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE))) + .isEqualTo("503"); + assertThat( + errorSpan + .getAttributes() + .get( + AttributeKey.stringKey(ObservabilityAttributes.EXCEPTION_TYPE_ATTRIBUTE))) + .isEqualTo("com.google.api.gax.rpc.UnavailableException"); + assertThat( + errorSpan + .getAttributes() + .get( + AttributeKey.stringKey(ObservabilityAttributes.STATUS_MESSAGE_ATTRIBUTE))) + .isEqualTo("Service Unavailable"); } } + + @Test + void testTracing_statusCodes_grpc() throws Exception { + SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); + EchoRequest errorRequest = EchoRequest.newBuilder() + .setError( + Status.newBuilder().setCode(StatusCode.Code.INVALID_ARGUMENT.ordinal()).build()) + .build(); + EchoRequest successRequest = EchoRequest.newBuilder().setContent("tracing-test").build(); + + try (EchoClient grpcClient = TestClientInitializer.createGrpcEchoClientOpentelemetry(tracingFactory)) { + + grpcClient.echo(successRequest); + assertThrows( + com.google.api.gax.rpc.InvalidArgumentException.class, + () -> grpcClient.echo(errorRequest)); + + List spans = spanExporter.getFinishedSpanItems(); + assertThat(spans).hasSize(2); + + SpanData grpcSuccessSpan = spans.get(0); + assertThat( + grpcSuccessSpan + .getAttributes() + .get( + AttributeKey.stringKey( + ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) + .isEqualTo("OK"); + + SpanData grpcErrorSpan = spans.get(1); + assertThat( + grpcErrorSpan + .getAttributes() + .get( + AttributeKey.stringKey( + ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) + .isEqualTo("INVALID_ARGUMENT"); + } + } + + @Test void testTracing_statusCodes_httpjson() throws Exception { SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); EchoRequest errorRequest = From cd93bbce887adeb12f75eb1c4c5939d8a1207c4e Mon Sep 17 00:00:00 2001 From: Diego Date: Thu, 2 Apr 2026 14:43:58 -0400 Subject: [PATCH 2/3] test: cleanup of ITOtelTracing --- .../showcase/v1beta1/it/ITOtelTracing.java | 352 ++++++++---------- 1 file changed, 161 insertions(+), 191 deletions(-) diff --git a/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java b/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java index c2a6fd8ca69f..c5065edcfdd8 100644 --- a/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java +++ b/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java @@ -92,6 +92,39 @@ class ITOtelTracing { private static final String SHOWCASE_ARTIFACT = "com.google.cloud:gapic-showcase"; private static final String SHOWCASE_USER_URL = "http://localhost:7469/v1beta1/echo:echo"; + // Attribute Keys + private static final AttributeKey RPC_SYSTEM_KEY = + AttributeKey.stringKey(ObservabilityAttributes.RPC_SYSTEM_NAME_ATTRIBUTE); + private static final AttributeKey RPC_RESPONSE_STATUS_KEY = + AttributeKey.stringKey(ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE); + private static final AttributeKey HTTP_RESPONSE_STATUS_KEY = + AttributeKey.longKey(ObservabilityAttributes.HTTP_RESPONSE_STATUS_ATTRIBUTE); + private static final AttributeKey REPO_KEY = + AttributeKey.stringKey(ObservabilityAttributes.REPO_ATTRIBUTE); + private static final AttributeKey ARTIFACT_KEY = + AttributeKey.stringKey(ObservabilityAttributes.ARTIFACT_ATTRIBUTE); + private static final AttributeKey ERROR_TYPE_KEY = + AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE); + private static final AttributeKey EXCEPTION_TYPE_KEY = + AttributeKey.stringKey(ObservabilityAttributes.EXCEPTION_TYPE_ATTRIBUTE); + private static final AttributeKey STATUS_MESSAGE_KEY = + AttributeKey.stringKey(ObservabilityAttributes.STATUS_MESSAGE_ATTRIBUTE); + private static final AttributeKey DESTINATION_RESOURCE_ID_KEY = + AttributeKey.stringKey(ObservabilityAttributes.DESTINATION_RESOURCE_ID_ATTRIBUTE); + + // Expected Values + private static final String VALUE_GRPC = "grpc"; + private static final String VALUE_HTTP = "http"; + private static final String VALUE_OK = "OK"; + private static final String VALUE_TEST_USER = "users/test-user"; + private static final String VALUE_UNAVAILABLE = "UNAVAILABLE"; + private static final String VALUE_UNAVAILABLE_EXCEPTION = "UnavailableException"; + private static final String VALUE_SERVICE_UNAVAILABLE = "Service Unavailable"; + private static final String SPAN_NAME_ECHO_GRPC = "google.showcase.v1beta1.Echo/Echo"; + private static final String SPAN_NAME_ECHO_HTTP = "POST v1beta1/echo:echo"; + private static final String SPAN_NAME_GET_USER_GRPC = "google.showcase.v1beta1.Identity/GetUser"; + private static final String SPAN_NAME_GET_USER_HTTP = "GET v1beta1/{name=users/*}"; + private InMemorySpanExporter spanExporter; private OpenTelemetrySdk openTelemetrySdk; @@ -132,7 +165,7 @@ void testTracing_successfulEcho_grpc() throws Exception { SpanData attemptSpan = spans.stream() - .filter(span -> span.getName().equals("google.showcase.v1beta1.Echo/Echo")) + .filter(span -> span.getName().equals(SPAN_NAME_ECHO_GRPC)) .findFirst() .orElseThrow(() -> new AssertionError("Incorrect span name")); assertThat(attemptSpan.getKind()).isEqualTo(SpanKind.CLIENT); @@ -151,31 +184,11 @@ void testTracing_successfulEcho_grpc() throws Exception { .getAttributes() .get(AttributeKey.longKey(ObservabilityAttributes.SERVER_PORT_ATTRIBUTE))) .isEqualTo(SHOWCASE_SERVER_PORT); - assertThat( - attemptSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.RPC_SYSTEM_NAME_ATTRIBUTE))) - .isEqualTo("grpc"); - assertThat( - attemptSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) - .isEqualTo("OK"); - assertThat( - attemptSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.REPO_ATTRIBUTE))) - .isEqualTo(SHOWCASE_REPO); - assertThat( - attemptSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.ARTIFACT_ATTRIBUTE))) - .isEqualTo(SHOWCASE_ARTIFACT); - assertThat( - attemptSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.RPC_SYSTEM_NAME_ATTRIBUTE))) - .isEqualTo("grpc"); + assertThat(attemptSpan.getAttributes().get(RPC_SYSTEM_KEY)).isEqualTo(VALUE_GRPC); + assertThat(attemptSpan.getAttributes().get(RPC_RESPONSE_STATUS_KEY)).isEqualTo(VALUE_OK); + assertThat(attemptSpan.getAttributes().get(REPO_KEY)).isEqualTo(SHOWCASE_REPO); + assertThat(attemptSpan.getAttributes().get(ARTIFACT_KEY)).isEqualTo(SHOWCASE_ARTIFACT); + assertThat( attemptSpan .getAttributes() @@ -212,7 +225,7 @@ void testTracing_successfulEcho_httpjson() throws Exception { SpanData attemptSpan = spans.stream() - .filter(span -> span.getName().equals("POST v1beta1/echo:echo")) + .filter(span -> span.getName().equals(SPAN_NAME_ECHO_HTTP)) .findFirst() .orElseThrow( () -> new AssertionError("Attempt span 'POST v1beta1/echo:echo' not found")); @@ -232,26 +245,10 @@ void testTracing_successfulEcho_httpjson() throws Exception { .getAttributes() .get(AttributeKey.longKey(ObservabilityAttributes.SERVER_PORT_ATTRIBUTE))) .isEqualTo(SHOWCASE_SERVER_PORT); - assertThat( - attemptSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.RPC_SYSTEM_NAME_ATTRIBUTE))) - .isEqualTo("http"); - assertThat( - attemptSpan - .getAttributes() - .get(AttributeKey.longKey(ObservabilityAttributes.HTTP_RESPONSE_STATUS_ATTRIBUTE))) - .isEqualTo(200L); - assertThat( - attemptSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.REPO_ATTRIBUTE))) - .isEqualTo(SHOWCASE_REPO); - assertThat( - attemptSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.ARTIFACT_ATTRIBUTE))) - .isEqualTo(SHOWCASE_ARTIFACT); + assertThat(attemptSpan.getAttributes().get(RPC_SYSTEM_KEY)).isEqualTo(VALUE_HTTP); + assertThat(attemptSpan.getAttributes().get(HTTP_RESPONSE_STATUS_KEY)).isEqualTo(200L); + assertThat(attemptSpan.getAttributes().get(REPO_KEY)).isEqualTo(SHOWCASE_REPO); + assertThat(attemptSpan.getAttributes().get(ARTIFACT_KEY)).isEqualTo(SHOWCASE_ARTIFACT); assertThat( attemptSpan .getAttributes() @@ -296,65 +293,59 @@ private long computeExpectedHttpJsonResponseSize(Message message) return jsonPayload.getBytes(StandardCharsets.UTF_8).length; } - @Test - void testTracing_successfulIdentityGetUser_grpc() throws Exception { - SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); - - try (IdentityClient client = TestClientInitializer.createGrpcIdentityClientOpentelemetry(tracingFactory)) { - - try { - client.getUser(GetUserRequest.newBuilder().setName("users/test-user").build()); - } catch (Exception e) { - // Ignored, the showcase server may not have this user, but trace is still - // generated. - } - - List spans = spanExporter.getFinishedSpanItems(); - assertThat(spans).isNotEmpty(); - - SpanData attemptSpan = spans.stream() - .filter(span -> span.getName().equals("google.showcase.v1beta1.Identity/GetUser")) - .findFirst() - .orElseThrow(() -> new AssertionError("Incorrect span name")); - assertThat( - attemptSpan - .getAttributes() - .get( - AttributeKey.stringKey( - ObservabilityAttributes.DESTINATION_RESOURCE_ID_ATTRIBUTE))) - .isEqualTo("users/test-user"); - } - } - - @Test - void testTracing_successfulIdentityGetUser_httpjson() throws Exception { - SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); - - try (IdentityClient client = TestClientInitializer.createHttpJsonIdentityClientOpentelemetry(tracingFactory)) { - - try { - client.getUser(GetUserRequest.newBuilder().setName("users/test-user").build()); - } catch (Exception e) { - // Ignored, the showcase server may not have this user, but trace is still - // generated. - } - - List spans = spanExporter.getFinishedSpanItems(); - assertThat(spans).isNotEmpty(); - - SpanData attemptSpan = spans.stream() - .filter(span -> span.getName().equals("GET v1beta1/{name=users/*}")) - .findFirst() - .orElseThrow(() -> new AssertionError("Incorrect span name")); - assertThat( - attemptSpan - .getAttributes() - .get( - AttributeKey.stringKey( - ObservabilityAttributes.DESTINATION_RESOURCE_ID_ATTRIBUTE))) - .isEqualTo("users/test-user"); - } - } + @Test + void testTracing_successfulIdentityGetUser_grpc() throws Exception { + SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); + + try (IdentityClient client = + TestClientInitializer.createGrpcIdentityClientOpentelemetry(tracingFactory)) { + + try { + client.getUser(GetUserRequest.newBuilder().setName("users/test-user").build()); + } catch (Exception e) { + // Ignored, the showcase server may not have this user, but trace is still + // generated. + } + + List spans = spanExporter.getFinishedSpanItems(); + assertThat(spans).isNotEmpty(); + + SpanData attemptSpan = + spans.stream() + .filter(span -> span.getName().equals(SPAN_NAME_GET_USER_GRPC)) + .findFirst() + .orElseThrow(() -> new AssertionError("Incorrect span name")); + assertThat(attemptSpan.getAttributes().get(DESTINATION_RESOURCE_ID_KEY)) + .isEqualTo(VALUE_TEST_USER); + } + } + + @Test + void testTracing_successfulIdentityGetUser_httpjson() throws Exception { + SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); + + try (IdentityClient client = + TestClientInitializer.createHttpJsonIdentityClientOpentelemetry(tracingFactory)) { + + try { + client.getUser(GetUserRequest.newBuilder().setName("users/test-user").build()); + } catch (Exception e) { + // Ignored, the showcase server may not have this user, but trace is still + // generated. + } + + List spans = spanExporter.getFinishedSpanItems(); + assertThat(spans).isNotEmpty(); + + SpanData attemptSpan = + spans.stream() + .filter(span -> span.getName().equals(SPAN_NAME_GET_USER_HTTP)) + .findFirst() + .orElseThrow(() -> new AssertionError("Incorrect span name")); + assertThat(attemptSpan.getAttributes().get(DESTINATION_RESOURCE_ID_KEY)) + .isEqualTo(VALUE_TEST_USER); + } + } @Test void testTracing_retry_grpc() throws Exception { @@ -506,7 +497,7 @@ void testTracing_retry_httpjson() throws Exception { assertThat(resendCounts).containsExactlyElementsIn(expectedCounts).inOrder(); } - private SpanData getErrorAttribute() { + private SpanData getErrorAttribute() { List spans = spanExporter.getFinishedSpanItems(); assertThat(spans).isNotEmpty(); @@ -521,11 +512,11 @@ private SpanData getErrorAttribute() { != null) .findFirst() .orElseThrow(() -> new AssertionError("Span with error.type not found")); - return errorSpan; + return errorSpan; } @Test - void testTracing_failedEcho_grpc_recordsErrorAttributes() throws Exception { + void testTracing_failedEcho_grpc_recordsErrorAttributes() throws Exception { SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); ClientInterceptor interceptor = @@ -567,28 +558,17 @@ public void sendMessage(ReqT message) {} EchoRequest echoRequest = EchoRequest.newBuilder().build(); assertThrows(UnavailableException.class, () -> client.echo(echoRequest)); - SpanData errorSpan = getErrorAttribute(); - assertThat( - errorSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE))) - .isEqualTo("UNAVAILABLE"); - assertThat( - errorSpan - .getAttributes() - .get( - AttributeKey.stringKey(ObservabilityAttributes.EXCEPTION_TYPE_ATTRIBUTE))) - .isEqualTo("com.google.api.gax.rpc.UnavailableException"); - assertThat( - errorSpan - .getAttributes() - .get( - AttributeKey.stringKey(ObservabilityAttributes.STATUS_MESSAGE_ATTRIBUTE))) - .isEqualTo("io.grpc.StatusRuntimeException: UNAVAILABLE"); - } - } + SpanData errorSpan = getErrorAttribute(); + assertThat(errorSpan.getAttributes().get(ERROR_TYPE_KEY)).isEqualTo(VALUE_UNAVAILABLE); + assertThat(errorSpan.getAttributes().get(EXCEPTION_TYPE_KEY)) + .isEqualTo("com.google.api.gax.rpc.UnavailableException"); + assertThat(errorSpan.getAttributes().get(STATUS_MESSAGE_KEY)) + .isEqualTo("io.grpc.StatusRuntimeException: UNAVAILABLE"); + } + } + @Test - void testTracing_failedEcho_httpjson_recordsErrorAttributes() throws Exception { + void testTracing_failedEcho_httpjson_recordsErrorAttributes() throws Exception { SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); HttpTransport mockTransport = @@ -678,67 +658,57 @@ public String getHeaderValue(int index) { EchoRequest echoRequest = EchoRequest.newBuilder().build(); assertThrows(UnavailableException.class, () -> client.echo(echoRequest)); - SpanData errorSpan = getErrorAttribute(); - assertThat( - errorSpan - .getAttributes() - .get(AttributeKey.stringKey(ObservabilityAttributes.ERROR_TYPE_ATTRIBUTE))) - .isEqualTo("503"); - assertThat( - errorSpan - .getAttributes() - .get( - AttributeKey.stringKey(ObservabilityAttributes.EXCEPTION_TYPE_ATTRIBUTE))) - .isEqualTo("com.google.api.gax.rpc.UnavailableException"); - assertThat( - errorSpan - .getAttributes() - .get( - AttributeKey.stringKey(ObservabilityAttributes.STATUS_MESSAGE_ATTRIBUTE))) - .isEqualTo("Service Unavailable"); - } - } - - @Test - void testTracing_statusCodes_grpc() throws Exception { - SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); - EchoRequest errorRequest = EchoRequest.newBuilder() - .setError( - Status.newBuilder().setCode(StatusCode.Code.INVALID_ARGUMENT.ordinal()).build()) - .build(); - EchoRequest successRequest = EchoRequest.newBuilder().setContent("tracing-test").build(); - - try (EchoClient grpcClient = TestClientInitializer.createGrpcEchoClientOpentelemetry(tracingFactory)) { - - grpcClient.echo(successRequest); - assertThrows( - com.google.api.gax.rpc.InvalidArgumentException.class, - () -> grpcClient.echo(errorRequest)); - - List spans = spanExporter.getFinishedSpanItems(); - assertThat(spans).hasSize(2); - - SpanData grpcSuccessSpan = spans.get(0); - assertThat( - grpcSuccessSpan - .getAttributes() - .get( - AttributeKey.stringKey( - ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) - .isEqualTo("OK"); - - SpanData grpcErrorSpan = spans.get(1); - assertThat( - grpcErrorSpan - .getAttributes() - .get( - AttributeKey.stringKey( - ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) - .isEqualTo("INVALID_ARGUMENT"); - } - } - - @Test + SpanData errorSpan = getErrorAttribute(); + assertThat(errorSpan.getAttributes().get(ERROR_TYPE_KEY)).isEqualTo("503"); + assertThat(errorSpan.getAttributes().get(EXCEPTION_TYPE_KEY)) + .isEqualTo("com.google.api.gax.rpc.UnavailableException"); + assertThat(errorSpan.getAttributes().get(STATUS_MESSAGE_KEY)) + .isEqualTo(VALUE_SERVICE_UNAVAILABLE); + } + } + + @Test + void testTracing_statusCodes_grpc() throws Exception { + SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); + EchoRequest errorRequest = + EchoRequest.newBuilder() + .setError( + Status.newBuilder().setCode(StatusCode.Code.INVALID_ARGUMENT.ordinal()).build()) + .build(); + EchoRequest successRequest = EchoRequest.newBuilder().setContent("tracing-test").build(); + + try (EchoClient grpcClient = + TestClientInitializer.createGrpcEchoClientOpentelemetry(tracingFactory)) { + + grpcClient.echo(successRequest); + assertThrows( + com.google.api.gax.rpc.InvalidArgumentException.class, + () -> grpcClient.echo(errorRequest)); + + List spans = spanExporter.getFinishedSpanItems(); + assertThat(spans).hasSize(2); + + SpanData grpcSuccessSpan = spans.get(0); + assertThat( + grpcSuccessSpan + .getAttributes() + .get( + AttributeKey.stringKey( + ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) + .isEqualTo("OK"); + + SpanData grpcErrorSpan = spans.get(1); + assertThat( + grpcErrorSpan + .getAttributes() + .get( + AttributeKey.stringKey( + ObservabilityAttributes.RPC_RESPONSE_STATUS_ATTRIBUTE))) + .isEqualTo("INVALID_ARGUMENT"); + } + } + + @Test void testTracing_statusCodes_httpjson() throws Exception { SpanTracerFactory tracingFactory = new SpanTracerFactory(openTelemetrySdk); EchoRequest errorRequest = From 5d5fcc5c68047d4e58b31782b4d406642b00eb4b Mon Sep 17 00:00:00 2001 From: Diego Date: Thu, 2 Apr 2026 15:54:03 -0400 Subject: [PATCH 3/3] fix: use proper function name --- .../java/com/google/showcase/v1beta1/it/ITOtelTracing.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java b/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java index cdf4a48636fa..36223ba35797 100644 --- a/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java +++ b/sdk-platform-java/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITOtelTracing.java @@ -516,7 +516,7 @@ void testTracing_retry_httpjson() throws Exception { assertThat(resendCounts).containsExactlyElementsIn(expectedCounts).inOrder(); } - private SpanData getErrorAttribute() { + private SpanData getErrorSpan() { List spans = spanExporter.getFinishedSpanItems(); assertThat(spans).isNotEmpty(); @@ -577,7 +577,7 @@ public void sendMessage(ReqT message) {} EchoRequest echoRequest = EchoRequest.newBuilder().build(); assertThrows(UnavailableException.class, () -> client.echo(echoRequest)); - SpanData errorSpan = getErrorAttribute(); + SpanData errorSpan = getErrorSpan(); assertThat(errorSpan.getAttributes().get(ERROR_TYPE_KEY)).isEqualTo(VALUE_UNAVAILABLE); assertThat(errorSpan.getAttributes().get(EXCEPTION_TYPE_KEY)) .isEqualTo("com.google.api.gax.rpc.UnavailableException"); @@ -677,7 +677,7 @@ public String getHeaderValue(int index) { EchoRequest echoRequest = EchoRequest.newBuilder().build(); assertThrows(UnavailableException.class, () -> client.echo(echoRequest)); - SpanData errorSpan = getErrorAttribute(); + SpanData errorSpan = getErrorSpan(); assertThat(errorSpan.getAttributes().get(ERROR_TYPE_KEY)).isEqualTo("503"); assertThat(errorSpan.getAttributes().get(EXCEPTION_TYPE_KEY)) .isEqualTo("com.google.api.gax.rpc.UnavailableException");