Skip to content

Commit f44889e

Browse files
committed
perf(gax-grpc): skip metadata materialization when logging is disabled
1 parent 5208fc9 commit f44889e

File tree

2 files changed

+54
-9
lines changed

2 files changed

+54
-9
lines changed

sdk-platform-java/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcLoggingInterceptor.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
package com.google.api.gax.grpc;
3232

3333
import static com.google.api.gax.logging.LoggingUtils.executeWithTryCatch;
34+
import static com.google.api.gax.logging.LoggingUtils.isLoggingEnabled;
3435
import static com.google.api.gax.logging.LoggingUtils.logRequest;
3536
import static com.google.api.gax.logging.LoggingUtils.logResponse;
3637
import static com.google.api.gax.logging.LoggingUtils.recordResponseHeaders;
@@ -70,19 +71,23 @@ public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
7071

7172
@Override
7273
public void start(Listener<RespT> responseListener, Metadata headers) {
73-
recordServiceRpcAndRequestHeaders(
74-
method.getServiceName(),
75-
method.getFullMethodName(),
76-
null, // endpoint is for http request only
77-
metadataHeadersToMap(headers),
78-
logDataBuilder,
79-
LOGGER_PROVIDER);
74+
if (isLoggingEnabled()) {
75+
recordServiceRpcAndRequestHeaders(
76+
method.getServiceName(),
77+
method.getFullMethodName(),
78+
null, // endpoint is for http request only
79+
metadataHeadersToMap(headers),
80+
logDataBuilder,
81+
LOGGER_PROVIDER);
82+
}
8083
SimpleForwardingClientCallListener<RespT> responseLoggingListener =
8184
new SimpleForwardingClientCallListener<RespT>(responseListener) {
8285
@Override
8386
public void onHeaders(Metadata headers) {
84-
recordResponseHeaders(
85-
metadataHeadersToMap(headers), logDataBuilder, LOGGER_PROVIDER);
87+
if (isLoggingEnabled()) {
88+
recordResponseHeaders(
89+
metadataHeadersToMap(headers), logDataBuilder, LOGGER_PROVIDER);
90+
}
8691
super.onHeaders(headers);
8792
}
8893

sdk-platform-java/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/GrpcLoggingInterceptorTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
package com.google.api.gax.grpc;
3232

33+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
3334
import static org.mockito.ArgumentMatchers.any;
3435
import static org.mockito.Mockito.mock;
3536
import static org.mockito.Mockito.spy;
@@ -44,6 +45,8 @@
4445
import io.grpc.Metadata;
4546
import io.grpc.MethodDescriptor;
4647
import io.grpc.Status;
48+
import java.lang.reflect.Method;
49+
import org.junit.jupiter.api.AfterEach;
4750
import org.junit.jupiter.api.Test;
4851
import org.junit.jupiter.api.extension.ExtendWith;
4952
import org.mockito.Mock;
@@ -58,6 +61,11 @@ class GrpcLoggingInterceptorTest {
5861

5962
private static final MethodDescriptor<String, Integer> method = FakeMethodDescriptor.create();
6063

64+
@AfterEach
65+
void tearDown() throws Exception {
66+
setLoggingEnabled(false);
67+
}
68+
6169
@Test
6270
void testInterceptor_basic() {
6371
when(channel.newCall(Mockito.<MethodDescriptor<String, Integer>>any(), any(CallOptions.class)))
@@ -101,4 +109,36 @@ void testInterceptor_responseListener() {
101109
Status status = Status.OK;
102110
interceptor.currentListener.onClose(status, new Metadata());
103111
}
112+
113+
@Test
114+
void testInterceptor_skipsMetadataMaterializationWhenLoggingDisabled() throws Exception {
115+
setLoggingEnabled(false);
116+
when(channel.newCall(Mockito.<MethodDescriptor<String, Integer>>any(), any(CallOptions.class)))
117+
.thenReturn(call);
118+
119+
GrpcLoggingInterceptor interceptor = new GrpcLoggingInterceptor();
120+
Channel intercepted = ClientInterceptors.intercept(channel, interceptor);
121+
122+
@SuppressWarnings("unchecked")
123+
ClientCall.Listener<Integer> listener = mock(ClientCall.Listener.class);
124+
125+
Metadata requestHeaders = mock(Metadata.class);
126+
when(requestHeaders.keys()).thenThrow(new AssertionError("request headers should not be read"));
127+
ClientCall<String, Integer> interceptedCall = intercepted.newCall(method, CallOptions.DEFAULT);
128+
129+
assertDoesNotThrow(() -> interceptedCall.start(listener, requestHeaders));
130+
131+
Metadata responseHeaders = mock(Metadata.class);
132+
when(responseHeaders.keys())
133+
.thenThrow(new AssertionError("response headers should not be read"));
134+
135+
assertDoesNotThrow(() -> interceptor.currentListener.onHeaders(responseHeaders));
136+
}
137+
138+
private static void setLoggingEnabled(boolean enabled) throws Exception {
139+
Class<?> loggingUtils = Class.forName("com.google.api.gax.logging.LoggingUtils");
140+
Method method = loggingUtils.getDeclaredMethod("setLoggingEnabled", boolean.class);
141+
method.setAccessible(true);
142+
method.invoke(null, enabled);
143+
}
104144
}

0 commit comments

Comments
 (0)