From ef187235c537913ffbaa4bd7ce4c0103acc54977 Mon Sep 17 00:00:00 2001 From: "Penn (Dapeng) Zhang" Date: Mon, 23 Jul 2018 11:15:54 -0700 Subject: [PATCH 1/2] core: channel tracing log only when number of backends changed between zeor and nonzero --- .../io/grpc/internal/ManagedChannelImpl.java | 7 ++-- .../grpc/internal/ManagedChannelImplTest.java | 34 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index 7b6fc9e015e..7eb15a7d19d 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java @@ -211,6 +211,7 @@ void handleUncaughtThrowable(Throwable t) { @CheckForNull private final ChannelTracer channelTracer; private final Channelz channelz; + private Boolean nonzeroBackends; // a flag for doing channel tracing when flipped // One instance per channel. private final ChannelBufferMeter channelBufferUsed = new ChannelBufferMeter(); @@ -1246,12 +1247,13 @@ public void onAddresses(final List servers, final Attrib new Object[]{getLogId(), servers, config}); } - if (channelTracer != null) { + if (channelTracer != null && (nonzeroBackends == null || !nonzeroBackends)) { channelTracer.reportEvent(new ChannelTrace.Event.Builder() .setDescription("Address resolved: " + servers) .setSeverity(ChannelTrace.Event.Severity.CT_INFO) .setTimestampNanos(timeProvider.currentTimeNanos()) .build()); + nonzeroBackends = true; } final class NamesResolved implements Runnable { @@ -1292,12 +1294,13 @@ public void onError(final Status error) { checkArgument(!error.isOk(), "the error status must not be OK"); logger.log(Level.WARNING, "[{0}] Failed to resolve name. status={1}", new Object[] {getLogId(), error}); - if (channelTracer != null) { + if (channelTracer != null && (nonzeroBackends == null || nonzeroBackends)) { channelTracer.reportEvent(new ChannelTrace.Event.Builder() .setDescription("Failed to resolve name") .setSeverity(ChannelTrace.Event.Severity.CT_WARNING) .setTimestampNanos(timeProvider.currentTimeNanos()) .build()); + nonzeroBackends = false; } channelExecutor .executeLater( diff --git a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java index 9203ecea462..d4cb141cb5b 100644 --- a/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java +++ b/core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java @@ -2138,6 +2138,40 @@ public void channelTracing_nameResolvedEvent() throws Exception { .build()); } + @Test + public void channelTracing_nameResolvedEvent_zeorAndNonzeroBackends() throws Exception { + timer.forwardNanos(1234); + channelBuilder.maxTraceEvents(10); + List servers = new ArrayList(); + servers.add(new EquivalentAddressGroup(socketAddress)); + FakeNameResolverFactory nameResolverFactory = + new FakeNameResolverFactory.Builder(expectedUri).setServers(servers).build(); + channelBuilder.nameResolverFactory(nameResolverFactory); + createChannel(); + + int prevSize = getStats(channel).channelTrace.events.size(); + nameResolverFactory.resolvers.get(0).listener.onAddresses( + Collections.singletonList(new EquivalentAddressGroup( + Arrays.asList(new SocketAddress() {}, new SocketAddress() {}))), + Attributes.EMPTY); + assertThat(getStats(channel).channelTrace.events).hasSize(prevSize); + + prevSize = getStats(channel).channelTrace.events.size(); + nameResolverFactory.resolvers.get(0).listener.onError(Status.INTERNAL); + assertThat(getStats(channel).channelTrace.events).hasSize(prevSize + 1); + + prevSize = getStats(channel).channelTrace.events.size(); + nameResolverFactory.resolvers.get(0).listener.onError(Status.INTERNAL); + assertThat(getStats(channel).channelTrace.events).hasSize(prevSize); + + prevSize = getStats(channel).channelTrace.events.size(); + nameResolverFactory.resolvers.get(0).listener.onAddresses( + Collections.singletonList(new EquivalentAddressGroup( + Arrays.asList(new SocketAddress() {}, new SocketAddress() {}))), + Attributes.EMPTY); + assertThat(getStats(channel).channelTrace.events).hasSize(prevSize + 1); + } + @Test public void channelTracing_stateChangeEvent() throws Exception { channelBuilder.maxTraceEvents(10); From ef186583c3c5b0d565f3a1b734b05ce123f53c57 Mon Sep 17 00:00:00 2001 From: "Penn (Dapeng) Zhang" Date: Mon, 23 Jul 2018 13:48:37 -0700 Subject: [PATCH 2/2] flip the negation --- .../main/java/io/grpc/internal/ManagedChannelImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index 7eb15a7d19d..f38a4ddd37a 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java @@ -211,7 +211,7 @@ void handleUncaughtThrowable(Throwable t) { @CheckForNull private final ChannelTracer channelTracer; private final Channelz channelz; - private Boolean nonzeroBackends; // a flag for doing channel tracing when flipped + private Boolean zeroBackends; // a flag for doing channel tracing when flipped // One instance per channel. private final ChannelBufferMeter channelBufferUsed = new ChannelBufferMeter(); @@ -1247,13 +1247,13 @@ public void onAddresses(final List servers, final Attrib new Object[]{getLogId(), servers, config}); } - if (channelTracer != null && (nonzeroBackends == null || !nonzeroBackends)) { + if (channelTracer != null && (zeroBackends == null || zeroBackends)) { channelTracer.reportEvent(new ChannelTrace.Event.Builder() .setDescription("Address resolved: " + servers) .setSeverity(ChannelTrace.Event.Severity.CT_INFO) .setTimestampNanos(timeProvider.currentTimeNanos()) .build()); - nonzeroBackends = true; + zeroBackends = false; } final class NamesResolved implements Runnable { @@ -1294,13 +1294,13 @@ public void onError(final Status error) { checkArgument(!error.isOk(), "the error status must not be OK"); logger.log(Level.WARNING, "[{0}] Failed to resolve name. status={1}", new Object[] {getLogId(), error}); - if (channelTracer != null && (nonzeroBackends == null || nonzeroBackends)) { + if (channelTracer != null && (zeroBackends == null || !zeroBackends)) { channelTracer.reportEvent(new ChannelTrace.Event.Builder() .setDescription("Failed to resolve name") .setSeverity(ChannelTrace.Event.Severity.CT_WARNING) .setTimestampNanos(timeProvider.currentTimeNanos()) .build()); - nonzeroBackends = false; + zeroBackends = true; } channelExecutor .executeLater(