core: channel tracing log only when number of backends changed between zeor and nonzero

This is to implement one of changes made in the spec
https://github.com/grpc/proposal/pull/89/files
This commit is contained in:
ZHANG Dapeng 2018-07-23 14:30:38 -07:00 committed by GitHub
parent 877b1a198f
commit e1865b565d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 2 deletions

View File

@ -211,6 +211,7 @@ final class ManagedChannelImpl extends ManagedChannel implements Instrumented<Ch
@CheckForNull
private final ChannelTracer channelTracer;
private final Channelz channelz;
private Boolean zeroBackends; // a flag for doing channel tracing when flipped
// One instance per channel.
private final ChannelBufferMeter channelBufferUsed = new ChannelBufferMeter();
@ -1249,12 +1250,13 @@ final class ManagedChannelImpl extends ManagedChannel implements Instrumented<Ch
new Object[]{getLogId(), servers, config});
}
if (channelTracer != null) {
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());
zeroBackends = false;
}
final class NamesResolved implements Runnable {
@ -1295,12 +1297,13 @@ final class ManagedChannelImpl extends ManagedChannel implements Instrumented<Ch
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 && (zeroBackends == null || !zeroBackends)) {
channelTracer.reportEvent(new ChannelTrace.Event.Builder()
.setDescription("Failed to resolve name")
.setSeverity(ChannelTrace.Event.Severity.CT_WARNING)
.setTimestampNanos(timeProvider.currentTimeNanos())
.build());
zeroBackends = true;
}
channelExecutor
.executeLater(

View File

@ -2182,6 +2182,40 @@ public class ManagedChannelImplTest {
.build());
}
@Test
public void channelTracing_nameResolvedEvent_zeorAndNonzeroBackends() throws Exception {
timer.forwardNanos(1234);
channelBuilder.maxTraceEvents(10);
List<EquivalentAddressGroup> servers = new ArrayList<EquivalentAddressGroup>();
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);