Home | History | Annotate | Download | only in services
      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