From 461b10a9071de60fe502ae665c16701b42906758 Mon Sep 17 00:00:00 2001 From: Sergii Tkachenko Date: Mon, 1 Feb 2021 18:09:32 -0500 Subject: [PATCH] services: add support for channelz.GetServer() --- .../main/java/io/grpc/InternalChannelz.java | 6 +++ .../io/grpc/services/ChannelzService.java | 30 ++++++++++++++ .../io/grpc/services/ChannelzServiceTest.java | 40 +++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/api/src/main/java/io/grpc/InternalChannelz.java b/api/src/main/java/io/grpc/InternalChannelz.java index 2ccbd4a491..35cbb4c282 100644 --- a/api/src/main/java/io/grpc/InternalChannelz.java +++ b/api/src/main/java/io/grpc/InternalChannelz.java @@ -179,6 +179,12 @@ public final class InternalChannelz { return new ServerList(serverList, !iterator.hasNext()); } + /** Returns a server. */ + @Nullable + public InternalInstrumented getServer(long id) { + return servers.get(id); + } + /** Returns socket refs for a server. */ @Nullable public ServerSocketsList getServerSockets(long serverId, long fromId, int maxPageSize) { diff --git a/services/src/main/java/io/grpc/services/ChannelzService.java b/services/src/main/java/io/grpc/services/ChannelzService.java index f2a2072a22..8032d0ad22 100644 --- a/services/src/main/java/io/grpc/services/ChannelzService.java +++ b/services/src/main/java/io/grpc/services/ChannelzService.java @@ -22,6 +22,7 @@ import io.grpc.InternalChannelz; import io.grpc.InternalChannelz.ChannelStats; import io.grpc.InternalChannelz.ServerList; import io.grpc.InternalChannelz.ServerSocketsList; +import io.grpc.InternalChannelz.ServerStats; import io.grpc.InternalChannelz.SocketStats; import io.grpc.InternalInstrumented; import io.grpc.Status; @@ -29,6 +30,8 @@ import io.grpc.StatusRuntimeException; import io.grpc.channelz.v1.ChannelzGrpc; import io.grpc.channelz.v1.GetChannelRequest; import io.grpc.channelz.v1.GetChannelResponse; +import io.grpc.channelz.v1.GetServerRequest; +import io.grpc.channelz.v1.GetServerResponse; import io.grpc.channelz.v1.GetServerSocketsRequest; import io.grpc.channelz.v1.GetServerSocketsResponse; import io.grpc.channelz.v1.GetServersRequest; @@ -126,6 +129,33 @@ public final class ChannelzService extends ChannelzGrpc.ChannelzImplBase { responseObserver.onCompleted(); } + /** Returns a server. */ + @Override + public void getServer( + GetServerRequest request, StreamObserver responseObserver) { + InternalInstrumented s = channelz.getServer(request.getServerId()); + if (s == null) { + responseObserver.onError( + Status.NOT_FOUND.withDescription("Can't find server " + request.getServerId()) + .asRuntimeException()); + return; + } + + GetServerResponse resp; + try { + resp = GetServerResponse + .newBuilder() + .setServer(ChannelzProtoUtil.toServer(s)) + .build(); + } catch (StatusRuntimeException e) { + responseObserver.onError(e); + return; + } + + responseObserver.onNext(resp); + responseObserver.onCompleted(); + } + /** Returns a subchannel. */ @Override public void getSubchannel( diff --git a/services/src/test/java/io/grpc/services/ChannelzServiceTest.java b/services/src/test/java/io/grpc/services/ChannelzServiceTest.java index db25e53af0..54d84358bd 100644 --- a/services/src/test/java/io/grpc/services/ChannelzServiceTest.java +++ b/services/src/test/java/io/grpc/services/ChannelzServiceTest.java @@ -25,6 +25,8 @@ import io.grpc.InternalChannelz; import io.grpc.Status; import io.grpc.channelz.v1.GetChannelRequest; import io.grpc.channelz.v1.GetChannelResponse; +import io.grpc.channelz.v1.GetServerRequest; +import io.grpc.channelz.v1.GetServerResponse; import io.grpc.channelz.v1.GetServersRequest; import io.grpc.channelz.v1.GetServersResponse; import io.grpc.channelz.v1.GetSocketRequest; @@ -127,6 +129,24 @@ public class ChannelzServiceTest { getServersHelper(0)); } + @Test + public void getServer() throws ExecutionException, InterruptedException { + TestServer server = new TestServer(); + assertServerNotFound(server.getLogId().getId()); + + channelz.addServer(server); + assertEquals( + GetServerResponse + .newBuilder() + .setServer(ChannelzProtoUtil.toServer(server)) + .build(), + getServerHelper(server.getLogId().getId())); + + channelz.removeServer(server); + assertServerNotFound(server.getLogId().getId()); + } + + @Test public void getSocket() throws Exception { TestSocket socket = new TestSocket(); @@ -212,6 +232,26 @@ public class ChannelzServiceTest { return responseCaptor.getValue(); } + private void assertServerNotFound(long id) { + @SuppressWarnings("unchecked") + StreamObserver observer = mock(StreamObserver.class); + ArgumentCaptor exceptionCaptor = ArgumentCaptor.forClass(Exception.class); + service.getServer(GetServerRequest.newBuilder().setServerId(id).build(), observer); + verify(observer).onError(exceptionCaptor.capture()); + Status s = Status.fromThrowable(exceptionCaptor.getValue()); + assertWithMessage(s.toString()).that(s.getCode()).isEqualTo(Status.Code.NOT_FOUND); + } + + private GetServerResponse getServerHelper(long id) { + @SuppressWarnings("unchecked") + StreamObserver observer = mock(StreamObserver.class); + ArgumentCaptor response = ArgumentCaptor.forClass(GetServerResponse.class); + service.getServer(GetServerRequest.newBuilder().setServerId(id).build(), observer); + verify(observer).onNext(response.capture()); + verify(observer).onCompleted(); + return response.getValue(); + } + private void assertSocketNotFound(long id) { @SuppressWarnings("unchecked") StreamObserver observer = mock(StreamObserver.class);