diff options
author | ZHANG Dapeng <zdapeng@google.com> | 2018-05-15 11:33:44 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-15 11:33:44 -0700 |
commit | 561583be1476e54f37812246329be43470262a55 (patch) | |
tree | af71d75ef5cd65ea4f0a31b5ccf5667519ad7609 /services | |
parent | 04a90bcad2044b78390da2d29c9166361bf84b59 (diff) | |
download | grpc-grpc-java-561583be1476e54f37812246329be43470262a55.tar.gz |
core,services: Add ChannelTracing data object
Added `ChannelTrace` as an inner class of `Channelz`.
This is in preparation for the implementation of [Channel Tracing](https://github.com/grpc/proposal/blob/master/A3-channel-tracing.md)
Diffstat (limited to 'services')
3 files changed, 121 insertions, 14 deletions
diff --git a/services/src/main/java/io/grpc/services/ChannelzProtoUtil.java b/services/src/main/java/io/grpc/services/ChannelzProtoUtil.java index 0403bf0b7..431a0ce9d 100644 --- a/services/src/main/java/io/grpc/services/ChannelzProtoUtil.java +++ b/services/src/main/java/io/grpc/services/ChannelzProtoUtil.java @@ -34,6 +34,9 @@ import io.grpc.channelz.v1.ChannelConnectivityState; import io.grpc.channelz.v1.ChannelConnectivityState.State; import io.grpc.channelz.v1.ChannelData; import io.grpc.channelz.v1.ChannelRef; +import io.grpc.channelz.v1.ChannelTrace; +import io.grpc.channelz.v1.ChannelTraceEvent; +import io.grpc.channelz.v1.ChannelTraceEvent.Severity; import io.grpc.channelz.v1.GetServerSocketsResponse; import io.grpc.channelz.v1.GetServersResponse; import io.grpc.channelz.v1.GetTopChannelsResponse; @@ -55,6 +58,7 @@ import io.grpc.channelz.v1.Subchannel; import io.grpc.channelz.v1.SubchannelRef; import io.grpc.internal.Channelz; import io.grpc.internal.Channelz.ChannelStats; +import io.grpc.internal.Channelz.ChannelTrace.Event; import io.grpc.internal.Channelz.RootChannelList; import io.grpc.internal.Channelz.ServerList; import io.grpc.internal.Channelz.ServerSocketsList; @@ -67,6 +71,7 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.security.cert.CertificateEncodingException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map.Entry; import java.util.concurrent.ExecutionException; @@ -348,21 +353,49 @@ final class ChannelzProtoUtil { } static ChannelData extractChannelData(Channelz.ChannelStats stats) { - return ChannelData - .newBuilder() - .setTarget(stats.target) + ChannelData.Builder builder = ChannelData.newBuilder(); + builder.setTarget(stats.target) .setState(toChannelConnectivityState(stats.state)) .setCallsStarted(stats.callsStarted) .setCallsSucceeded(stats.callsSucceeded) .setCallsFailed(stats.callsFailed) - .setLastCallStartedTimestamp(Timestamps.fromMillis(stats.lastCallStartedMillis)) - .build(); + .setLastCallStartedTimestamp(Timestamps.fromMillis(stats.lastCallStartedMillis)); + if (stats.channelTrace != null) { + builder.setTrace(toChannelTrace(stats.channelTrace)); + } + return builder.build(); } static ChannelConnectivityState toChannelConnectivityState(ConnectivityState s) { return ChannelConnectivityState.newBuilder().setState(toState(s)).build(); } + private static ChannelTrace toChannelTrace(Channelz.ChannelTrace channelTrace) { + return ChannelTrace.newBuilder() + .setNumEventsLogged(channelTrace.numEventsLogged) + .setCreationTimestamp(Timestamps.fromNanos(channelTrace.creationTimeNanos)) + .addAllEvents(toChannelTraceEvents(channelTrace.events)) + .build(); + } + + private static List<ChannelTraceEvent> toChannelTraceEvents(List<Event> events) { + List<ChannelTraceEvent> channelTraceEvents = new ArrayList<ChannelTraceEvent>(); + for (Event event : events) { + ChannelTraceEvent.Builder builder = ChannelTraceEvent.newBuilder() + .setDescription(event.description) + .setSeverity(Severity.valueOf(event.severity.name())) + .setTimestamp(Timestamps.fromNanos(event.timestampNanos)); + if (event.channelRef != null) { + builder.setChannelRef(toChannelRef(event.channelRef)); + } + if (event.subchannelRef != null) { + builder.setSubchannelRef(toSubchannelRef(event.subchannelRef)); + } + channelTraceEvents.add(builder.build()); + } + return Collections.unmodifiableList(channelTraceEvents); + } + static State toState(ConnectivityState state) { if (state == null) { return State.UNKNOWN; diff --git a/services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java b/services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java index 407d8734b..8bdbb15f2 100644 --- a/services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java +++ b/services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java @@ -41,6 +41,8 @@ import io.grpc.channelz.v1.ChannelConnectivityState; import io.grpc.channelz.v1.ChannelConnectivityState.State; import io.grpc.channelz.v1.ChannelData; import io.grpc.channelz.v1.ChannelRef; +import io.grpc.channelz.v1.ChannelTrace; +import io.grpc.channelz.v1.ChannelTraceEvent; import io.grpc.channelz.v1.GetChannelRequest; import io.grpc.channelz.v1.GetServerSocketsResponse; import io.grpc.channelz.v1.GetServersResponse; @@ -62,6 +64,8 @@ import io.grpc.channelz.v1.Subchannel; import io.grpc.channelz.v1.SubchannelRef; import io.grpc.internal.Channelz; import io.grpc.internal.Channelz.ChannelStats; +import io.grpc.internal.Channelz.ChannelTrace.Event; +import io.grpc.internal.Channelz.ChannelTrace.Event.Severity; import io.grpc.internal.Channelz.RootChannelList; import io.grpc.internal.Channelz.ServerList; import io.grpc.internal.Channelz.ServerSocketsList; @@ -79,6 +83,7 @@ import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.security.cert.Certificate; +import java.util.Arrays; import java.util.Collections; import java.util.Map.Entry; import org.junit.Test; @@ -310,6 +315,12 @@ public final class ChannelzProtoUtilTest { .setPort(1000)) .build(); + private final ChannelTrace channelTrace = ChannelTrace + .newBuilder() + .setNumEventsLogged(1234) + .setCreationTimestamp(Timestamps.fromNanos(1000)) + .build(); + @Test public void toChannelRef() { assertEquals(channelRef, ChannelzProtoUtil.toChannelRef(channel)); @@ -832,6 +843,68 @@ public final class ChannelzProtoUtilTest { .containsExactly(sockOptAdditional, otherOption); } + @Test + public void channelTrace_withoutEvents() { + ChannelStats stats = toBuilder(channel.stats) + .setChannelTrace(new Channelz.ChannelTrace.Builder() + .setNumEventsLogged(1234) + .setCreationTimeNanos(1000) + .build()) + .build(); + + ChannelData protoStats = channelData.toBuilder().setTrace(channelTrace).build(); + assertEquals(ChannelzProtoUtil.extractChannelData(stats), protoStats); + } + + @Test + public void channelTrace_withEvents() { + Event event1 = new Event.Builder() + .setDescription("event1") + .setSeverity(Severity.CT_ERROR) + .setTimestampNaonos(12) + .setSubchannelRef(subchannel) + .build(); + Event event2 = new Event.Builder() + .setDescription("event2") + .setTimestampNaonos(34) + .setSeverity(Severity.CT_INFO) + .setChannelRef(channel) + .build(); + + ChannelStats stats = + toBuilder(channel.stats) + .setChannelTrace( + new Channelz.ChannelTrace.Builder() + .setNumEventsLogged(1234) + .setCreationTimeNanos(1000) + .setEvents(Arrays.asList(event1, event2)) + .build()) + .build(); + + ChannelTraceEvent protoEvent1 = ChannelTraceEvent + .newBuilder() + .setDescription("event1") + .setTimestamp(Timestamps.fromNanos(12)) + .setSeverity(ChannelTraceEvent.Severity.CT_ERROR) + .setSubchannelRef(subchannelRef) + .build(); + ChannelTraceEvent protoEvent2 = ChannelTraceEvent + .newBuilder() + .setDescription("event2") + .setTimestamp(Timestamps.fromNanos(34)) + .setSeverity(ChannelTraceEvent.Severity.CT_INFO) + .setChannelRef(channelRef) + .build(); + ChannelData protoStats = channelData + .toBuilder() + .setTrace(channelTrace + .toBuilder() + .addAllEvents(Arrays.asList(protoEvent1, protoEvent2)) + .build()) + .build(); + assertEquals(ChannelzProtoUtil.extractChannelData(stats), protoStats); + } + private static ChannelStats.Builder toBuilder(ChannelStats stats) { ChannelStats.Builder builder = new ChannelStats.Builder() .setTarget(stats.target) diff --git a/services/src/test/java/io/grpc/services/ChannelzTestHelper.java b/services/src/test/java/io/grpc/services/ChannelzTestHelper.java index b326fa0bc..0acdd0287 100644 --- a/services/src/test/java/io/grpc/services/ChannelzTestHelper.java +++ b/services/src/test/java/io/grpc/services/ChannelzTestHelper.java @@ -148,15 +148,16 @@ final class ChannelzTestHelper { static final class TestChannel implements Instrumented<ChannelStats> { private final LogId id = LogId.allocate("channel-or-subchannel"); - ChannelStats stats = new ChannelStats( - /*target=*/ "sometarget", - /*state=*/ ConnectivityState.READY, - /*callsStarted=*/ 1, - /*callsSucceeded=*/ 2, - /*callsFailed=*/ 3, - /*lastCallStartedMillis=*/ 4, - /*subchannels=*/ Collections.<WithLogId>emptyList(), - /*sockets=*/ Collections.<WithLogId>emptyList()); + ChannelStats stats = new ChannelStats.Builder() + .setTarget("sometarget") + .setState(ConnectivityState.READY) + .setCallsStarted(1) + .setCallsSucceeded(2) + .setCallsFailed(3) + .setLastCallStartedMillis(4) + .setSubchannels(Collections.<WithLogId>emptyList()) + .setSockets(Collections.<WithLogId>emptyList()) + .build(); @Override public ListenableFuture<ChannelStats> getStats() { |