Skip to content

Commit 86bfefd

Browse files
authored
api, core: make channel logger accessible through NameResolver.Args (#6430)
1 parent d774195 commit 86bfefd

File tree

10 files changed

+60
-7
lines changed

10 files changed

+60
-7
lines changed

api/src/main/java/io/grpc/NameResolver.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,18 +412,21 @@ public static final class Args {
412412
private final ProxyDetector proxyDetector;
413413
private final SynchronizationContext syncContext;
414414
private final ServiceConfigParser serviceConfigParser;
415+
@Nullable private final ChannelLogger channelLogger;
415416
@Nullable private final Executor executor;
416417

417418
private Args(
418419
Integer defaultPort,
419420
ProxyDetector proxyDetector,
420421
SynchronizationContext syncContext,
421422
ServiceConfigParser serviceConfigParser,
423+
@Nullable ChannelLogger channelLogger,
422424
@Nullable Executor executor) {
423425
this.defaultPort = checkNotNull(defaultPort, "defaultPort not set");
424426
this.proxyDetector = checkNotNull(proxyDetector, "proxyDetector not set");
425427
this.syncContext = checkNotNull(syncContext, "syncContext not set");
426428
this.serviceConfigParser = checkNotNull(serviceConfigParser, "serviceConfigParser not set");
429+
this.channelLogger = channelLogger;
427430
this.executor = executor;
428431
}
429432

@@ -466,6 +469,19 @@ public ServiceConfigParser getServiceConfigParser() {
466469
return serviceConfigParser;
467470
}
468471

472+
/**
473+
* Returns the {@link ChannelLogger} for the Channel served by this NameResolver.
474+
*
475+
* @since 1.26.0
476+
*/
477+
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/6438")
478+
public ChannelLogger getChannelLogger() {
479+
if (channelLogger == null) {
480+
throw new IllegalStateException("ChannelLogger is not set in Builder");
481+
}
482+
return channelLogger;
483+
}
484+
469485
/**
470486
* Returns the Executor on which this resolver should execute long-running or I/O bound work.
471487
* Null if no Executor was set.
@@ -485,6 +501,7 @@ public String toString() {
485501
.add("proxyDetector", proxyDetector)
486502
.add("syncContext", syncContext)
487503
.add("serviceConfigParser", serviceConfigParser)
504+
.add("channelLogger", channelLogger)
488505
.add("executor", executor)
489506
.toString();
490507
}
@@ -500,6 +517,7 @@ public Builder toBuilder() {
500517
builder.setProxyDetector(proxyDetector);
501518
builder.setSynchronizationContext(syncContext);
502519
builder.setServiceConfigParser(serviceConfigParser);
520+
builder.setChannelLogger(channelLogger);
503521
builder.setOffloadExecutor(executor);
504522
return builder;
505523
}
@@ -523,6 +541,7 @@ public static final class Builder {
523541
private ProxyDetector proxyDetector;
524542
private SynchronizationContext syncContext;
525543
private ServiceConfigParser serviceConfigParser;
544+
private ChannelLogger channelLogger;
526545
private Executor executor;
527546

528547
Builder() {
@@ -568,6 +587,17 @@ public Builder setServiceConfigParser(ServiceConfigParser parser) {
568587
return this;
569588
}
570589

590+
/**
591+
* See {@link Args#getChannelLogger}.
592+
*
593+
* @since 1.26.0
594+
*/
595+
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/6438")
596+
public Builder setChannelLogger(ChannelLogger channelLogger) {
597+
this.channelLogger = checkNotNull(channelLogger);
598+
return this;
599+
}
600+
571601
/**
572602
* See {@link Args#getOffloadExecutor}. This is an optional field.
573603
*
@@ -585,7 +615,10 @@ public Builder setOffloadExecutor(Executor executor) {
585615
* @since 1.21.0
586616
*/
587617
public Args build() {
588-
return new Args(defaultPort, proxyDetector, syncContext, serviceConfigParser, executor);
618+
return
619+
new Args(
620+
defaultPort, proxyDetector, syncContext, serviceConfigParser,
621+
channelLogger, executor);
589622
}
590623
}
591624
}

api/src/test/java/io/grpc/NameResolverRegistryTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public class NameResolverRegistryTest {
3939
.setProxyDetector(mock(ProxyDetector.class))
4040
.setSynchronizationContext(new SynchronizationContext(mock(UncaughtExceptionHandler.class)))
4141
.setServiceConfigParser(mock(ServiceConfigParser.class))
42+
.setChannelLogger(mock(ChannelLogger.class))
4243
.build();
4344

4445
@Test

api/src/test/java/io/grpc/NameResolverTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public class NameResolverTest {
4545
private final SynchronizationContext syncContext =
4646
new SynchronizationContext(mock(UncaughtExceptionHandler.class));
4747
private final ServiceConfigParser parser = mock(ServiceConfigParser.class);
48+
private final ChannelLogger channelLogger = mock(ChannelLogger.class);
4849
private final Executor executor = Executors.newSingleThreadExecutor();
4950
private URI uri;
5051
private final NameResolver nameResolver = mock(NameResolver.class);
@@ -61,13 +62,15 @@ public void args() {
6162
assertThat(args.getProxyDetector()).isSameInstanceAs(proxyDetector);
6263
assertThat(args.getSynchronizationContext()).isSameInstanceAs(syncContext);
6364
assertThat(args.getServiceConfigParser()).isSameInstanceAs(parser);
65+
assertThat(args.getChannelLogger()).isSameInstanceAs(channelLogger);
6466
assertThat(args.getOffloadExecutor()).isSameInstanceAs(executor);
6567

6668
NameResolver.Args args2 = args.toBuilder().build();
6769
assertThat(args2.getDefaultPort()).isEqualTo(defaultPort);
6870
assertThat(args2.getProxyDetector()).isSameInstanceAs(proxyDetector);
6971
assertThat(args2.getSynchronizationContext()).isSameInstanceAs(syncContext);
7072
assertThat(args2.getServiceConfigParser()).isSameInstanceAs(parser);
73+
assertThat(args2.getChannelLogger()).isSameInstanceAs(channelLogger);
7174
assertThat(args2.getOffloadExecutor()).isSameInstanceAs(executor);
7275

7376
assertThat(args2).isNotSameInstanceAs(args);
@@ -251,6 +254,7 @@ private NameResolver.Args createArgs() {
251254
.setProxyDetector(proxyDetector)
252255
.setSynchronizationContext(syncContext)
253256
.setServiceConfigParser(parser)
257+
.setChannelLogger(channelLogger)
254258
.setOffloadExecutor(executor)
255259
.build();
256260
}

core/src/main/java/io/grpc/internal/ManagedChannelImpl.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,12 @@ ClientStream newSubstream(ClientStreamTracer.Factory tracerFactory, Metadata new
561561
final TimeProvider timeProvider) {
562562
this.target = checkNotNull(builder.target, "target");
563563
this.logId = InternalLogId.allocate("Channel", target);
564+
this.timeProvider = checkNotNull(timeProvider, "timeProvider");
565+
maxTraceEvents = builder.maxTraceEvents;
566+
channelTracer = new ChannelTracer(
567+
logId, builder.maxTraceEvents, timeProvider.currentTimeNanos(),
568+
"Channel for '" + target + "'");
569+
channelLogger = new ChannelLoggerImpl(channelTracer, timeProvider);
564570
this.nameResolverFactory = builder.getNameResolverFactory();
565571
ProxyDetector proxyDetector =
566572
builder.proxyDetector != null ? builder.proxyDetector : GrpcUtil.DEFAULT_PROXY_DETECTOR;
@@ -581,6 +587,7 @@ ClientStream newSubstream(ClientStreamTracer.Factory tracerFactory, Metadata new
581587
builder.maxRetryAttempts,
582588
builder.maxHedgedAttempts,
583589
loadBalancerFactory))
590+
.setChannelLogger(channelLogger)
584591
.setOffloadExecutor(
585592
// Avoid creating the offloadExecutor until it is first used
586593
new Executor() {
@@ -591,12 +598,6 @@ public void execute(Runnable command) {
591598
})
592599
.build();
593600
this.nameResolver = getNameResolver(target, nameResolverFactory, nameResolverArgs);
594-
this.timeProvider = checkNotNull(timeProvider, "timeProvider");
595-
maxTraceEvents = builder.maxTraceEvents;
596-
channelTracer = new ChannelTracer(
597-
logId, builder.maxTraceEvents, timeProvider.currentTimeNanos(),
598-
"Channel for '" + target + "'");
599-
channelLogger = new ChannelLoggerImpl(channelTracer, timeProvider);
600601
this.executorPool = checkNotNull(builder.executorPool, "executorPool");
601602
this.balancerRpcExecutorPool = checkNotNull(balancerRpcExecutorPool, "balancerRpcExecutorPool");
602603
this.balancerRpcExecutorHolder = new ExecutorHolder(balancerRpcExecutorPool);

core/src/test/java/io/grpc/internal/DnsNameResolverProviderTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static org.junit.Assume.assumeTrue;
2525
import static org.mockito.Mockito.mock;
2626

27+
import io.grpc.ChannelLogger;
2728
import io.grpc.NameResolver;
2829
import io.grpc.NameResolver.ServiceConfigParser;
2930
import io.grpc.SynchronizationContext;
@@ -47,6 +48,7 @@ public void uncaughtException(Thread t, Throwable e) {
4748
.setProxyDetector(GrpcUtil.DEFAULT_PROXY_DETECTOR)
4849
.setSynchronizationContext(syncContext)
4950
.setServiceConfigParser(mock(ServiceConfigParser.class))
51+
.setChannelLogger(mock(ChannelLogger.class))
5052
.build();
5153

5254
private DnsNameResolverProvider provider = new DnsNameResolverProvider();

core/src/test/java/io/grpc/internal/DnsNameResolverTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.google.common.collect.Iterables;
3737
import com.google.common.net.InetAddresses;
3838
import com.google.common.testing.FakeTicker;
39+
import io.grpc.ChannelLogger;
3940
import io.grpc.EquivalentAddressGroup;
4041
import io.grpc.HttpConnectProxiedSocketAddress;
4142
import io.grpc.NameResolver;
@@ -115,6 +116,7 @@ public void uncaughtException(Thread t, Throwable e) {
115116
.setProxyDetector(GrpcUtil.DEFAULT_PROXY_DETECTOR)
116117
.setSynchronizationContext(syncContext)
117118
.setServiceConfigParser(mock(ServiceConfigParser.class))
119+
.setChannelLogger(mock(ChannelLogger.class))
118120
.build();
119121

120122
private final DnsNameResolverProvider provider = new DnsNameResolverProvider();
@@ -175,6 +177,7 @@ private DnsNameResolver newResolver(
175177
.setProxyDetector(proxyDetector)
176178
.setSynchronizationContext(syncContext)
177179
.setServiceConfigParser(mock(ServiceConfigParser.class))
180+
.setChannelLogger(mock(ChannelLogger.class))
178181
.build();
179182
return newResolver(name, stopwatch, isAndroid, args);
180183
}
@@ -331,6 +334,7 @@ public void testExecutor_custom() throws Exception {
331334
.setProxyDetector(GrpcUtil.NOOP_PROXY_DETECTOR)
332335
.setSynchronizationContext(syncContext)
333336
.setServiceConfigParser(mock(ServiceConfigParser.class))
337+
.setChannelLogger(mock(ChannelLogger.class))
334338
.setOffloadExecutor(
335339
new Executor() {
336340
@Override

core/src/test/java/io/grpc/internal/ManagedChannelImplGetNameResolverTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static org.junit.Assert.fail;
2222
import static org.mockito.Mockito.mock;
2323

24+
import io.grpc.ChannelLogger;
2425
import io.grpc.NameResolver;
2526
import io.grpc.NameResolver.Factory;
2627
import io.grpc.NameResolver.ServiceConfigParser;
@@ -40,6 +41,7 @@ public class ManagedChannelImplGetNameResolverTest {
4041
.setProxyDetector(mock(ProxyDetector.class))
4142
.setSynchronizationContext(new SynchronizationContext(mock(UncaughtExceptionHandler.class)))
4243
.setServiceConfigParser(mock(ServiceConfigParser.class))
44+
.setChannelLogger(mock(ChannelLogger.class))
4345
.build();
4446

4547
@Test

core/src/test/java/io/grpc/internal/OverrideAuthorityNameResolverTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import static org.mockito.Mockito.verify;
2424
import static org.mockito.Mockito.when;
2525

26+
import io.grpc.ChannelLogger;
2627
import io.grpc.NameResolver;
2728
import io.grpc.NameResolver.ServiceConfigParser;
2829
import io.grpc.ProxyDetector;
@@ -41,6 +42,7 @@ public class OverrideAuthorityNameResolverTest {
4142
.setProxyDetector(mock(ProxyDetector.class))
4243
.setSynchronizationContext(new SynchronizationContext(mock(UncaughtExceptionHandler.class)))
4344
.setServiceConfigParser(mock(ServiceConfigParser.class))
45+
.setChannelLogger(mock(ChannelLogger.class))
4446
.build();
4547

4648
@Test

xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.junit.Assert.fail;
2121
import static org.mockito.Mockito.mock;
2222

23+
import io.grpc.ChannelLogger;
2324
import io.grpc.InternalServiceProviders;
2425
import io.grpc.NameResolver;
2526
import io.grpc.NameResolver.ServiceConfigParser;
@@ -46,6 +47,7 @@ public void uncaughtException(Thread t, Throwable e) {
4647
.setProxyDetector(GrpcUtil.NOOP_PROXY_DETECTOR)
4748
.setSynchronizationContext(syncContext)
4849
.setServiceConfigParser(mock(ServiceConfigParser.class))
50+
.setChannelLogger(mock(ChannelLogger.class))
4951
.build();
5052

5153
private XdsNameResolverProvider provider = new XdsNameResolverProvider();

xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.common.collect.ImmutableList;
2525
import com.google.common.collect.Iterables;
2626
import io.envoyproxy.envoy.api.v2.core.Node;
27+
import io.grpc.ChannelLogger;
2728
import io.grpc.NameResolver;
2829
import io.grpc.NameResolver.ResolutionResult;
2930
import io.grpc.NameResolver.ServiceConfigParser;
@@ -69,6 +70,7 @@ public void uncaughtException(Thread t, Throwable e) {
6970
.setProxyDetector(GrpcUtil.NOOP_PROXY_DETECTOR)
7071
.setSynchronizationContext(syncContext)
7172
.setServiceConfigParser(mock(ServiceConfigParser.class))
73+
.setChannelLogger(mock(ChannelLogger.class))
7274
.build();
7375

7476
private final XdsNameResolverProvider provider = new XdsNameResolverProvider();

0 commit comments

Comments
 (0)