diff options
author | zpencer <spencerfang@google.com> | 2018-04-03 10:05:47 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-03 10:05:47 -0700 |
commit | 724e32fe57db8ba21a180632cb144d5af0a814c4 (patch) | |
tree | 6e6d4fe3d04681e12d845a24388d489c6c9a522e /services | |
parent | d99d8d99d8c878ab53e29d920aa589eadd7fb213 (diff) | |
download | grpc-grpc-java-724e32fe57db8ba21a180632cb144d5af0a814c4.tar.gz |
core,netty,services: add server listen sockets to channelz proto service (#4220)
Server listen sockets differ from normal sockets in that they do not
have a remote address, do not have stats on calls started/failed/etc,
and do not have security info.
Diffstat (limited to 'services')
3 files changed, 128 insertions, 12 deletions
diff --git a/services/src/main/java/io/grpc/services/ChannelzProtoUtil.java b/services/src/main/java/io/grpc/services/ChannelzProtoUtil.java index ca8f58228..dea047d04 100644 --- a/services/src/main/java/io/grpc/services/ChannelzProtoUtil.java +++ b/services/src/main/java/io/grpc/services/ChannelzProtoUtil.java @@ -40,6 +40,7 @@ import io.grpc.channelz.v1.Server; import io.grpc.channelz.v1.ServerData; import io.grpc.channelz.v1.ServerRef; import io.grpc.channelz.v1.Socket; +import io.grpc.channelz.v1.Socket.Builder; import io.grpc.channelz.v1.SocketData; import io.grpc.channelz.v1.SocketOption; import io.grpc.channelz.v1.SocketOptionLinger; @@ -106,11 +107,14 @@ final class ChannelzProtoUtil { static Server toServer(Instrumented<ServerStats> obj) { ServerStats stats = getFuture(obj.getStats()); - return Server + Server.Builder builder = Server .newBuilder() .setRef(toServerRef(obj)) - .setData(toServerData(stats)) - .build(); + .setData(toServerData(stats)); + for (Instrumented<SocketStats> listenSocket : stats.listenSockets) { + builder.addListenSocket(toSocketRef(listenSocket)); + } + return builder.build(); } static ServerData toServerData(ServerStats stats) { @@ -125,15 +129,21 @@ final class ChannelzProtoUtil { static Socket toSocket(Instrumented<SocketStats> obj) { SocketStats socketStats = getFuture(obj.getStats()); - return Socket.newBuilder() + Builder builder = Socket.newBuilder() .setRef(toSocketRef(obj)) - .setRemote(toAddress(socketStats.remote)) - .setLocal(toAddress(socketStats.local)) - .setData(extractSocketData(socketStats)) - .build(); + .setLocal(toAddress(socketStats.local)); + // listen sockets do not have remote nor data + if (socketStats.remote != null) { + builder.setRemote(toAddress(socketStats.remote)); + } + if (socketStats.data != null) { + builder.setData(extractSocketData(socketStats)); + } + return builder.build(); } static Address toAddress(SocketAddress address) { + Preconditions.checkNotNull(address); Address.Builder builder = Address.newBuilder(); if (address instanceof InetSocketAddress) { InetSocketAddress inetAddress = (InetSocketAddress) address; @@ -142,6 +152,7 @@ final class ChannelzProtoUtil { .newBuilder() .setIpAddress( ByteString.copyFrom(inetAddress.getAddress().getAddress())) + .setPort(inetAddress.getPort()) .build()); } else if (address.getClass().getName().endsWith("io.netty.channel.unix.DomainSocketAddress")) { builder.setUdsAddress( diff --git a/services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java b/services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java index 83e3c6dad..e3697f4b9 100644 --- a/services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java +++ b/services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java @@ -17,6 +17,7 @@ package io.grpc.services; import static com.google.common.truth.Truth.assertThat; +import static io.grpc.internal.Channelz.id; import static org.junit.Assert.assertEquals; import com.google.common.collect.ImmutableList; @@ -55,9 +56,11 @@ import io.grpc.internal.Channelz.ServerList; import io.grpc.internal.Channelz.ServerSocketsList; import io.grpc.internal.Channelz.ServerStats; import io.grpc.internal.Channelz.SocketOptions; +import io.grpc.internal.Channelz.SocketStats; import io.grpc.internal.Instrumented; import io.grpc.internal.WithLogId; import io.grpc.services.ChannelzTestHelper.TestChannel; +import io.grpc.services.ChannelzTestHelper.TestListenSocket; import io.grpc.services.ChannelzTestHelper.TestServer; import io.grpc.services.ChannelzTestHelper.TestSocket; import io.netty.channel.unix.DomainSocketAddress; @@ -168,6 +171,23 @@ public final class ChannelzProtoUtilTest { .setValue("some-made-up-value") .build(); + private final TestListenSocket listenSocket = new TestListenSocket(); + private final SocketRef listenSocketRef = SocketRef + .newBuilder() + .setName(listenSocket.toString()) + .setSocketId(id(listenSocket)) + .build(); + private final Address listenAddress = Address + .newBuilder() + .setTcpipAddress( + TcpIpAddress + .newBuilder() + .setIpAddress(ByteString.copyFrom( + ((InetSocketAddress) listenSocket.listenAddress).getAddress().getAddress())) + .setPort(1234) + .build()) + .build(); + private final TestSocket socket = new TestSocket(); private final SocketRef socketRef = SocketRef .newBuilder() @@ -196,6 +216,7 @@ public final class ChannelzProtoUtilTest { .newBuilder() .setIpAddress(ByteString.copyFrom( ((InetSocketAddress) socket.local).getAddress().getAddress())) + .setPort(1000) .build()) .build(); private final Address remoteAddress = Address @@ -205,6 +226,7 @@ public final class ChannelzProtoUtilTest { .newBuilder() .setIpAddress(ByteString.copyFrom( ((InetSocketAddress) socket.remote).getAddress().getAddress())) + .setPort(1000) .build()) .build(); @@ -271,6 +293,26 @@ public final class ChannelzProtoUtilTest { } @Test + public void toSocket_listenSocket() { + assertEquals( + Socket + .newBuilder() + .setRef(listenSocketRef) + .setLocal(listenAddress) + .build(), + ChannelzProtoUtil.toSocket(listenSocket)); + } + + @Test + public void toSocketData() throws Exception { + assertEquals( + socketDataNoSockOpts + .toBuilder() + .build(), + ChannelzProtoUtil.extractSocketData(socket.getStats().get())); + } + + @Test public void toAddress_inet() throws Exception { InetSocketAddress inet4 = new InetSocketAddress(Inet4Address.getByName("10.0.0.1"), 1000); assertEquals( @@ -278,6 +320,7 @@ public final class ChannelzProtoUtilTest { TcpIpAddress .newBuilder() .setIpAddress(ByteString.copyFrom(inet4.getAddress().getAddress())) + .setPort(1000) .build()) .build(), ChannelzProtoUtil.toAddress(inet4)); @@ -318,7 +361,34 @@ public final class ChannelzProtoUtilTest { @Test public void toServer() throws Exception { + // no listen sockets assertEquals(serverProto, ChannelzProtoUtil.toServer(server)); + + // 1 listen socket + server.serverStats = toBuilder(server.serverStats) + .setListenSockets(ImmutableList.<Instrumented<SocketStats>>of(listenSocket)) + .build(); + assertEquals( + serverProto + .toBuilder() + .addListenSocket(listenSocketRef) + .build(), + ChannelzProtoUtil.toServer(server)); + + // multiple listen sockets + TestListenSocket otherListenSocket = new TestListenSocket(); + SocketRef otherListenSocketRef = ChannelzProtoUtil.toSocketRef(otherListenSocket); + server.serverStats = toBuilder(server.serverStats) + .setListenSockets( + ImmutableList.<Instrumented<SocketStats>>of(listenSocket, otherListenSocket)) + .build(); + assertEquals( + serverProto + .toBuilder() + .addListenSocket(listenSocketRef) + .addListenSocket(otherListenSocketRef) + .build(), + ChannelzProtoUtil.toServer(server)); } @Test @@ -612,6 +682,7 @@ public final class ChannelzProtoUtilTest { return builder; } + private static SocketOptions.Builder toBuilder(SocketOptions options) { SocketOptions.Builder builder = new SocketOptions.Builder() .setSocketOptionTimeoutMillis(options.soTimeoutMillis) @@ -621,4 +692,13 @@ public final class ChannelzProtoUtilTest { } return builder; } + + private static ServerStats.Builder toBuilder(ServerStats stats) { + return new ServerStats.Builder() + .setCallsStarted(stats.callsStarted) + .setCallsSucceeded(stats.callsSucceeded) + .setCallsFailed(stats.callsFailed) + .setLastCallStartedMillis(stats.lastCallStartedMillis) + .setListenSockets(stats.listenSockets); + } } diff --git a/services/src/test/java/io/grpc/services/ChannelzTestHelper.java b/services/src/test/java/io/grpc/services/ChannelzTestHelper.java index baadc10f3..4530a7cc7 100644 --- a/services/src/test/java/io/grpc/services/ChannelzTestHelper.java +++ b/services/src/test/java/io/grpc/services/ChannelzTestHelper.java @@ -23,6 +23,7 @@ import io.grpc.internal.Channelz; import io.grpc.internal.Channelz.ChannelStats; import io.grpc.internal.Channelz.Security; import io.grpc.internal.Channelz.ServerStats; +import io.grpc.internal.Channelz.SocketOptions; import io.grpc.internal.Channelz.SocketStats; import io.grpc.internal.Channelz.TransportStats; import io.grpc.internal.Instrumented; @@ -76,13 +77,37 @@ final class ChannelzTestHelper { } } + static final class TestListenSocket implements Instrumented<SocketStats> { + private final LogId id = LogId.allocate("listensocket"); + SocketAddress listenAddress = new InetSocketAddress("10.0.0.1", 1234); + + @Override + public ListenableFuture<SocketStats> getStats() { + SettableFuture<SocketStats> ret = SettableFuture.create(); + ret.set( + new SocketStats( + /*data=*/ null, + listenAddress, + /*remoteAddress=*/ null, + new SocketOptions.Builder().build(), + /*security=*/ null)); + return ret; + } + + @Override + public LogId getLogId() { + return id; + } + } + static final class TestServer implements Instrumented<ServerStats> { private final LogId id = LogId.allocate("server"); ServerStats serverStats = new ServerStats( - /*callsStarted=*/ 1, - /*callsSucceeded=*/ 2, - /*callsFailed=*/ 3, - /*lastCallStartedMillis=*/ 4); + /*callsStarted=*/ 1, + /*callsSucceeded=*/ 2, + /*callsFailed=*/ 3, + /*lastCallStartedMillis=*/ 4, + Collections.<Instrumented<SocketStats>>emptyList()); @Override public ListenableFuture<ServerStats> getStats() { |