blob: b8b3f1fe78340b070d95217d27d8f0e0db5f3d91 [file] [log] [blame]
/*
* Copyright 2018 The gRPC Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.grpc.services;
import com.google.common.annotations.VisibleForTesting;
import io.grpc.ExperimentalApi;
import io.grpc.InternalChannelz;
import io.grpc.InternalChannelz.ChannelStats;
import io.grpc.InternalChannelz.ServerList;
import io.grpc.InternalChannelz.ServerSocketsList;
import io.grpc.InternalChannelz.SocketStats;
import io.grpc.InternalInstrumented;
import io.grpc.Status;
import io.grpc.channelz.v1.ChannelzGrpc;
import io.grpc.channelz.v1.GetChannelRequest;
import io.grpc.channelz.v1.GetChannelResponse;
import io.grpc.channelz.v1.GetServerSocketsRequest;
import io.grpc.channelz.v1.GetServerSocketsResponse;
import io.grpc.channelz.v1.GetServersRequest;
import io.grpc.channelz.v1.GetServersResponse;
import io.grpc.channelz.v1.GetSocketRequest;
import io.grpc.channelz.v1.GetSocketResponse;
import io.grpc.channelz.v1.GetSubchannelRequest;
import io.grpc.channelz.v1.GetSubchannelResponse;
import io.grpc.channelz.v1.GetTopChannelsRequest;
import io.grpc.channelz.v1.GetTopChannelsResponse;
import io.grpc.stub.StreamObserver;
/**
* The channelz service provides stats about a running gRPC process.
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/4206")
public final class ChannelzService extends ChannelzGrpc.ChannelzImplBase {
private final InternalChannelz channelz;
private final int maxPageSize;
/**
* Creates an instance.
*/
public static ChannelzService newInstance(int maxPageSize) {
return new ChannelzService(InternalChannelz.instance(), maxPageSize);
}
@VisibleForTesting
ChannelzService(InternalChannelz channelz, int maxPageSize) {
this.channelz = channelz;
this.maxPageSize = maxPageSize;
}
/** Returns top level channel aka {@link io.grpc.internal.ManagedChannelImpl}. */
@Override
public void getTopChannels(
GetTopChannelsRequest request, StreamObserver<GetTopChannelsResponse> responseObserver) {
InternalChannelz.RootChannelList rootChannels
= channelz.getRootChannels(request.getStartChannelId(), maxPageSize);
responseObserver.onNext(ChannelzProtoUtil.toGetTopChannelResponse(rootChannels));
responseObserver.onCompleted();
}
/** Returns a top level channel aka {@link io.grpc.internal.ManagedChannelImpl}. */
@Override
public void getChannel(
GetChannelRequest request, StreamObserver<GetChannelResponse> responseObserver) {
InternalInstrumented<ChannelStats> s = channelz.getRootChannel(request.getChannelId());
if (s == null) {
responseObserver.onError(Status.NOT_FOUND.asRuntimeException());
return;
}
responseObserver.onNext(
GetChannelResponse
.newBuilder()
.setChannel(ChannelzProtoUtil.toChannel(s))
.build());
responseObserver.onCompleted();
}
/** Returns servers. */
@Override
public void getServers(
GetServersRequest request, StreamObserver<GetServersResponse> responseObserver) {
ServerList servers = channelz.getServers(request.getStartServerId(), maxPageSize);
responseObserver.onNext(ChannelzProtoUtil.toGetServersResponse(servers));
responseObserver.onCompleted();
}
/** Returns a subchannel. */
@Override
public void getSubchannel(
GetSubchannelRequest request, StreamObserver<GetSubchannelResponse> responseObserver) {
InternalInstrumented<ChannelStats> s = channelz.getSubchannel(request.getSubchannelId());
if (s == null) {
responseObserver.onError(Status.NOT_FOUND.asRuntimeException());
return;
}
responseObserver.onNext(
GetSubchannelResponse
.newBuilder()
.setSubchannel(ChannelzProtoUtil.toSubchannel(s))
.build());
responseObserver.onCompleted();
}
/** Returns a socket. */
@Override
public void getSocket(
GetSocketRequest request, StreamObserver<GetSocketResponse> responseObserver) {
InternalInstrumented<SocketStats> s = channelz.getSocket(request.getSocketId());
if (s == null) {
responseObserver.onError(Status.NOT_FOUND.asRuntimeException());
return;
}
responseObserver.onNext(
GetSocketResponse
.newBuilder()
.setSocket(ChannelzProtoUtil.toSocket(s))
.build());
responseObserver.onCompleted();
}
@Override
public void getServerSockets(
GetServerSocketsRequest request, StreamObserver<GetServerSocketsResponse> responseObserver) {
ServerSocketsList serverSockets
= channelz.getServerSockets(request.getServerId(), request.getStartSocketId(), maxPageSize);
if (serverSockets == null) {
responseObserver.onError(Status.NOT_FOUND.asRuntimeException());
return;
}
responseObserver.onNext(ChannelzProtoUtil.toGetServerSocketsResponse(serverSockets));
responseObserver.onCompleted();
}
}