aboutsummaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorZHANG Dapeng <zdapeng@google.com>2018-05-15 11:33:44 -0700
committerGitHub <noreply@github.com>2018-05-15 11:33:44 -0700
commit561583be1476e54f37812246329be43470262a55 (patch)
treeaf71d75ef5cd65ea4f0a31b5ccf5667519ad7609 /services
parent04a90bcad2044b78390da2d29c9166361bf84b59 (diff)
downloadgrpc-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')
-rw-r--r--services/src/main/java/io/grpc/services/ChannelzProtoUtil.java43
-rw-r--r--services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java73
-rw-r--r--services/src/test/java/io/grpc/services/ChannelzTestHelper.java19
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() {