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 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..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 @@ -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; @@ -57,6 +60,17 @@ 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(originalLoggingEnabled); + } @Test void testInterceptor_basic() { @@ -101,4 +115,43 @@ 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); + } + + 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 {