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 {