From e329bde5115d067d9f70e07c9617b775ce5a0a65 Mon Sep 17 00:00:00 2001 From: Jin Seop Kim Date: Mon, 21 Sep 2026 12:37:29 -0400 Subject: [PATCH 1/3] feat: log actionable errors on operation failure in LoggingTracer --- .../com/google/api/gax/tracing/LoggingTracer.java | 5 +++++ .../google/api/gax/tracing/LoggingTracerTest.java | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/LoggingTracer.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/LoggingTracer.java index 51483728d5bb..82b6d851a2d8 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/LoggingTracer.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/LoggingTracer.java @@ -64,6 +64,11 @@ public void attemptFailedRetriesExhausted(Throwable error) { recordActionableError(error); } + @Override + public void operationFailed(Throwable error) { + recordActionableError(error); + } + @Override public void attemptPermanentFailure(Throwable error) { recordActionableError(error); diff --git a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/LoggingTracerTest.java b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/LoggingTracerTest.java index d1ba025d3867..183c7a2a53b1 100644 --- a/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/LoggingTracerTest.java +++ b/sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/LoggingTracerTest.java @@ -93,6 +93,18 @@ void testAttemptPermanentFailure_LogsError() { assertEquals("generic permanent failure", testLogger.getMessageList().get(0)); } + @Test + void testOperationFailed_LogsError() { + ApiTracerContext context = ApiTracerContext.empty(); + LoggingTracer tracer = new LoggingTracer(context); + + Exception error = new RuntimeException("generic operation failure"); + tracer.operationFailed(error); + + assertEquals(1, testLogger.getMessageList().size()); + assertEquals("generic operation failure", testLogger.getMessageList().get(0)); + } + @Test void testRecordActionableError_logsErrorMessage() { ApiTracerContext context = ApiTracerContext.empty(); From 3ad74519e583457b32e90c66bab6e51310af9e94 Mon Sep 17 00:00:00 2001 From: Jin Seop Kim Date: Mon, 21 Sep 2026 13:57:00 -0400 Subject: [PATCH 2/3] test: detach appender and clear events in ITActionableErrorsLogging --- .../showcase/v1beta1/it/logging/ITActionableErrorsLogging.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/logging/ITActionableErrorsLogging.java b/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/logging/ITActionableErrorsLogging.java index ed71435fb4ad..912483a5cb45 100644 --- a/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/logging/ITActionableErrorsLogging.java +++ b/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/logging/ITActionableErrorsLogging.java @@ -92,6 +92,8 @@ void setupTestLogger() { void teardownTestLogger() { if (testAppender != null) { testAppender.stop(); + org.slf4j.Logger logger = LoggerFactory.getLogger("com.google.api.gax.tracing.LoggingTracer"); + ((ch.qos.logback.classic.Logger) logger).detachAppender(testAppender); } } @@ -264,6 +266,7 @@ void testGrpc_logEmittedForLowLevelRequestFailure() { @Test void testGrpc_noLogEmittedForSuccess() { + testAppender.clearEvents(); EchoRequest request = EchoRequest.newBuilder().setContent("Success").build(); grpcClient.echo(request); assertThat(testAppender.events.size()).isEqualTo(0); From 054f23c34034d904ab6cef4708dd07319e07b32b Mon Sep 17 00:00:00 2001 From: Jin Seop Kim Date: Mon, 21 Sep 2026 13:59:55 -0400 Subject: [PATCH 3/3] fix: check instanceof ch.qos.logback.classic.Logger before detaching appender --- .../v1beta1/it/logging/ITActionableErrorsLogging.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/logging/ITActionableErrorsLogging.java b/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/logging/ITActionableErrorsLogging.java index 912483a5cb45..d3cf1145d4a4 100644 --- a/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/logging/ITActionableErrorsLogging.java +++ b/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/logging/ITActionableErrorsLogging.java @@ -93,7 +93,9 @@ void teardownTestLogger() { if (testAppender != null) { testAppender.stop(); org.slf4j.Logger logger = LoggerFactory.getLogger("com.google.api.gax.tracing.LoggingTracer"); - ((ch.qos.logback.classic.Logger) logger).detachAppender(testAppender); + if (logger instanceof ch.qos.logback.classic.Logger) { + ((ch.qos.logback.classic.Logger) logger).detachAppender(testAppender); + } } }