From f44889e2c75b07f38abe07b3d92cb71274572671 Mon Sep 17 00:00:00 2001 From: Rahul Yadav Date: Wed, 15 Apr 2026 19:37:11 +0530 Subject: [PATCH 1/3] perf(gax-grpc): skip metadata materialization when logging is disabled --- .../api/gax/grpc/GrpcLoggingInterceptor.java | 23 ++++++----- .../gax/grpc/GrpcLoggingInterceptorTest.java | 40 +++++++++++++++++++ 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcLoggingInterceptor.java b/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcLoggingInterceptor.java index 9c305261cbc7..8f5a161941e9 100644 --- a/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcLoggingInterceptor.java +++ b/sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcLoggingInterceptor.java @@ -31,6 +31,7 @@ package com.google.api.gax.grpc; import static com.google.api.gax.logging.LoggingUtils.executeWithTryCatch; +import static com.google.api.gax.logging.LoggingUtils.isLoggingEnabled; import static com.google.api.gax.logging.LoggingUtils.logRequest; import static com.google.api.gax.logging.LoggingUtils.logResponse; import static com.google.api.gax.logging.LoggingUtils.recordResponseHeaders; @@ -70,19 +71,23 @@ public ClientCall interceptCall( @Override public void start(Listener responseListener, Metadata headers) { - recordServiceRpcAndRequestHeaders( - method.getServiceName(), - method.getFullMethodName(), - null, // endpoint is for http request only - metadataHeadersToMap(headers), - logDataBuilder, - LOGGER_PROVIDER); + if (isLoggingEnabled()) { + recordServiceRpcAndRequestHeaders( + method.getServiceName(), + method.getFullMethodName(), + null, // endpoint is for http request only + metadataHeadersToMap(headers), + logDataBuilder, + LOGGER_PROVIDER); + } SimpleForwardingClientCallListener responseLoggingListener = new SimpleForwardingClientCallListener(responseListener) { @Override public void onHeaders(Metadata headers) { - recordResponseHeaders( - metadataHeadersToMap(headers), logDataBuilder, LOGGER_PROVIDER); + if (isLoggingEnabled()) { + recordResponseHeaders( + metadataHeadersToMap(headers), logDataBuilder, LOGGER_PROVIDER); + } super.onHeaders(headers); } diff --git a/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcLoggingInterceptorTest.java b/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcLoggingInterceptorTest.java index fad4cd468b95..3aaf59d536d3 100644 --- a/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcLoggingInterceptorTest.java +++ b/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcLoggingInterceptorTest.java @@ -30,6 +30,7 @@ package com.google.api.gax.grpc; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; @@ -44,6 +45,8 @@ import io.grpc.Metadata; import io.grpc.MethodDescriptor; import io.grpc.Status; +import java.lang.reflect.Method; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -58,6 +61,11 @@ class GrpcLoggingInterceptorTest { private static final MethodDescriptor method = FakeMethodDescriptor.create(); + @AfterEach + void tearDown() throws Exception { + setLoggingEnabled(false); + } + @Test void testInterceptor_basic() { when(channel.newCall(Mockito.>any(), any(CallOptions.class))) @@ -101,4 +109,36 @@ void testInterceptor_responseListener() { Status status = Status.OK; interceptor.currentListener.onClose(status, new Metadata()); } + + @Test + void testInterceptor_skipsMetadataMaterializationWhenLoggingDisabled() throws Exception { + setLoggingEnabled(false); + when(channel.newCall(Mockito.>any(), any(CallOptions.class))) + .thenReturn(call); + + GrpcLoggingInterceptor interceptor = new GrpcLoggingInterceptor(); + Channel intercepted = ClientInterceptors.intercept(channel, interceptor); + + @SuppressWarnings("unchecked") + ClientCall.Listener listener = mock(ClientCall.Listener.class); + + Metadata requestHeaders = mock(Metadata.class); + when(requestHeaders.keys()).thenThrow(new AssertionError("request headers should not be read")); + ClientCall interceptedCall = intercepted.newCall(method, CallOptions.DEFAULT); + + assertDoesNotThrow(() -> interceptedCall.start(listener, requestHeaders)); + + Metadata responseHeaders = mock(Metadata.class); + when(responseHeaders.keys()) + .thenThrow(new AssertionError("response headers should not be read")); + + assertDoesNotThrow(() -> interceptor.currentListener.onHeaders(responseHeaders)); + } + + private static void setLoggingEnabled(boolean enabled) throws Exception { + Class loggingUtils = Class.forName("com.google.api.gax.logging.LoggingUtils"); + Method method = loggingUtils.getDeclaredMethod("setLoggingEnabled", boolean.class); + method.setAccessible(true); + method.invoke(null, enabled); + } } From a6ad9143324559d60256fd2dfc79be7c933cdf15 Mon Sep 17 00:00:00 2001 From: Rahul Yadav Date: Wed, 15 Apr 2026 20:47:20 +0530 Subject: [PATCH 2/3] fix tests --- .../api/gax/grpc/GrpcLoggingInterceptorTest.java | 15 ++++++++++++++- .../com/google/api/gax/logging/Slf4jUtils.java | 4 +--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcLoggingInterceptorTest.java b/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcLoggingInterceptorTest.java index 3aaf59d536d3..9b1decd1d3dc 100644 --- a/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcLoggingInterceptorTest.java +++ b/sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcLoggingInterceptorTest.java @@ -60,10 +60,16 @@ class GrpcLoggingInterceptorTest { @Mock private ClientCall call; private static final MethodDescriptor method = FakeMethodDescriptor.create(); + private boolean originalLoggingEnabled; + + @org.junit.jupiter.api.BeforeEach + void setUpLoggingState() throws Exception { + originalLoggingEnabled = isLoggingEnabled(); + } @AfterEach void tearDown() throws Exception { - setLoggingEnabled(false); + setLoggingEnabled(originalLoggingEnabled); } @Test @@ -141,4 +147,11 @@ private static void setLoggingEnabled(boolean enabled) throws Exception { method.setAccessible(true); method.invoke(null, enabled); } + + private static boolean isLoggingEnabled() throws Exception { + Class loggingUtils = Class.forName("com.google.api.gax.logging.LoggingUtils"); + Method method = loggingUtils.getDeclaredMethod("isLoggingEnabled"); + method.setAccessible(true); + return (boolean) method.invoke(null); + } } diff --git a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/logging/Slf4jUtils.java b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/logging/Slf4jUtils.java index e9bce1101db8..ab382a93bb64 100644 --- a/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/logging/Slf4jUtils.java +++ b/sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/logging/Slf4jUtils.java @@ -47,8 +47,6 @@ class Slf4jUtils { private static final Logger NO_OP_LOGGER = org.slf4j.helpers.NOPLogger.NOP_LOGGER; - private static final boolean loggingEnabled = LoggingUtils.isLoggingEnabled(); - private static final boolean isSLF4J2x; static { @@ -70,7 +68,7 @@ static Logger getLogger(Class clazz) { // constructor with LoggerFactoryProvider to make testing easier static Logger getLogger(Class clazz, LoggerFactoryProvider factoryProvider) { - if (loggingEnabled) { + if (LoggingUtils.isLoggingEnabled()) { ILoggerFactory loggerFactory = factoryProvider.getLoggerFactory(); return loggerFactory.getLogger(clazz.getName()); } else { From 71a3a7286b3a08185c93c13f366382b1d1c9f4db Mon Sep 17 00:00:00 2001 From: cloud-java-bot Date: Wed, 15 Apr 2026 15:30:51 +0000 Subject: [PATCH 3/3] chore: generate libraries at Wed Apr 15 15:29:18 UTC 2026 --- gapic-libraries-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gapic-libraries-bom/pom.xml b/gapic-libraries-bom/pom.xml index 9f1174f95b72..9cbef9e2cdee 100644 --- a/gapic-libraries-bom/pom.xml +++ b/gapic-libraries-bom/pom.xml @@ -4,7 +4,7 @@ com.google.cloud gapic-libraries-bom pom - 1.85.1 + 1.85.0 Google Cloud Java BOM BOM for the libraries in google-cloud-java repository. Users should not