1 /* 2 * Copyright 2018 The gRPC Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package io.grpc.services; 18 19 import com.google.common.annotations.VisibleForTesting; 20 import io.grpc.ExperimentalApi; 21 import io.grpc.InternalChannelz; 22 import io.grpc.InternalChannelz.ChannelStats; 23 import io.grpc.InternalChannelz.ServerList; 24 import io.grpc.InternalChannelz.ServerSocketsList; 25 import io.grpc.InternalChannelz.SocketStats; 26 import io.grpc.InternalInstrumented; 27 import io.grpc.Status; 28 import io.grpc.channelz.v1.ChannelzGrpc; 29 import io.grpc.channelz.v1.GetChannelRequest; 30 import io.grpc.channelz.v1.GetChannelResponse; 31 import io.grpc.channelz.v1.GetServerSocketsRequest; 32 import io.grpc.channelz.v1.GetServerSocketsResponse; 33 import io.grpc.channelz.v1.GetServersRequest; 34 import io.grpc.channelz.v1.GetServersResponse; 35 import io.grpc.channelz.v1.GetSocketRequest; 36 import io.grpc.channelz.v1.GetSocketResponse; 37 import io.grpc.channelz.v1.GetSubchannelRequest; 38 import io.grpc.channelz.v1.GetSubchannelResponse; 39 import io.grpc.channelz.v1.GetTopChannelsRequest; 40 import io.grpc.channelz.v1.GetTopChannelsResponse; 41 import io.grpc.stub.StreamObserver; 42 43 /** 44 * The channelz service provides stats about a running gRPC process. 45 */ 46 @ExperimentalApi("https://github.com/grpc/grpc-java/issues/4206") 47 public final class ChannelzService extends ChannelzGrpc.ChannelzImplBase { 48 private final InternalChannelz channelz; 49 private final int maxPageSize; 50 51 /** 52 * Creates an instance. 53 */ 54 public static ChannelzService newInstance(int maxPageSize) { 55 return new ChannelzService(InternalChannelz.instance(), maxPageSize); 56 } 57 58 @VisibleForTesting 59 ChannelzService(InternalChannelz channelz, int maxPageSize) { 60 this.channelz = channelz; 61 this.maxPageSize = maxPageSize; 62 } 63 64 /** Returns top level channel aka {@link io.grpc.internal.ManagedChannelImpl}. */ 65 @Override 66 public void getTopChannels( 67 GetTopChannelsRequest request, StreamObserver<GetTopChannelsResponse> responseObserver) { 68 InternalChannelz.RootChannelList rootChannels 69 = channelz.getRootChannels(request.getStartChannelId(), maxPageSize); 70 71 responseObserver.onNext(ChannelzProtoUtil.toGetTopChannelResponse(rootChannels)); 72 responseObserver.onCompleted(); 73 } 74 75 /** Returns a top level channel aka {@link io.grpc.internal.ManagedChannelImpl}. */ 76 @Override 77 public void getChannel( 78 GetChannelRequest request, StreamObserver<GetChannelResponse> responseObserver) { 79 InternalInstrumented<ChannelStats> s = channelz.getRootChannel(request.getChannelId()); 80 if (s == null) { 81 responseObserver.onError(Status.NOT_FOUND.asRuntimeException()); 82 return; 83 } 84 85 responseObserver.onNext( 86 GetChannelResponse 87 .newBuilder() 88 .setChannel(ChannelzProtoUtil.toChannel(s)) 89 .build()); 90 responseObserver.onCompleted(); 91 } 92 93 /** Returns servers. */ 94 @Override 95 public void getServers( 96 GetServersRequest request, StreamObserver<GetServersResponse> responseObserver) { 97 ServerList servers = channelz.getServers(request.getStartServerId(), maxPageSize); 98 99 responseObserver.onNext(ChannelzProtoUtil.toGetServersResponse(servers)); 100 responseObserver.onCompleted(); 101 } 102 103 /** Returns a subchannel. */ 104 @Override 105 public void getSubchannel( 106 GetSubchannelRequest request, StreamObserver<GetSubchannelResponse> responseObserver) { 107 InternalInstrumented<ChannelStats> s = channelz.getSubchannel(request.getSubchannelId()); 108 if (s == null) { 109 responseObserver.onError(Status.NOT_FOUND.asRuntimeException()); 110 return; 111 } 112 113 responseObserver.onNext( 114 GetSubchannelResponse 115 .newBuilder() 116 .setSubchannel(ChannelzProtoUtil.toSubchannel(s)) 117 .build()); 118 responseObserver.onCompleted(); 119 } 120 121 /** Returns a socket. */ 122 @Override 123 public void getSocket( 124 GetSocketRequest request, StreamObserver<GetSocketResponse> responseObserver) { 125 InternalInstrumented<SocketStats> s = channelz.getSocket(request.getSocketId()); 126 if (s == null) { 127 responseObserver.onError(Status.NOT_FOUND.asRuntimeException()); 128 return; 129 } 130 131 responseObserver.onNext( 132 GetSocketResponse 133 .newBuilder() 134 .setSocket(ChannelzProtoUtil.toSocket(s)) 135 .build()); 136 responseObserver.onCompleted(); 137 } 138 139 @Override 140 public void getServerSockets( 141 GetServerSocketsRequest request, StreamObserver<GetServerSocketsResponse> responseObserver) { 142 ServerSocketsList serverSockets 143 = channelz.getServerSockets(request.getServerId(), request.getStartSocketId(), maxPageSize); 144 if (serverSockets == null) { 145 responseObserver.onError(Status.NOT_FOUND.asRuntimeException()); 146 return; 147 } 148 149 responseObserver.onNext(ChannelzProtoUtil.toGetServerSocketsResponse(serverSockets)); 150 responseObserver.onCompleted(); 151 } 152 } 153