aboutsummaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorzpencer <spencerfang@google.com>2018-04-03 10:05:47 -0700
committerGitHub <noreply@github.com>2018-04-03 10:05:47 -0700
commit724e32fe57db8ba21a180632cb144d5af0a814c4 (patch)
tree6e6d4fe3d04681e12d845a24388d489c6c9a522e /services
parentd99d8d99d8c878ab53e29d920aa589eadd7fb213 (diff)
downloadgrpc-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')
-rw-r--r--services/src/main/java/io/grpc/services/ChannelzProtoUtil.java27
-rw-r--r--services/src/test/java/io/grpc/services/ChannelzProtoUtilTest.java80
-rw-r--r--services/src/test/java/io/grpc/services/ChannelzTestHelper.java33
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() {