// 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. // This file defines an interface for exporting monitoring information // out of gRPC servers. See the full design at // https://github.com/grpc/proposal/blob/master/A14-channelz.md // // The canonical version of this proto can be found at // https://github.com/grpc/grpc-proto/blob/master/grpc/channelz/v1/channelz.proto syntax = "proto3"; package grpc.channelz.v1; import "google/protobuf/any.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; option go_package = "google.golang.org/grpc/channelz/grpc_channelz_v1"; option java_multiple_files = true; option java_package = "io.grpc.channelz.v1"; option java_outer_classname = "ChannelzProto"; // Channel is a logical grouping of channels, subchannels, and sockets. message Channel { // The identifier for this channel. This should bet set. ChannelRef ref = 1; // Data specific to this channel. ChannelData data = 2; // At most one of 'channel_ref+subchannel_ref' and 'socket' is set. // There are no ordering guarantees on the order of channel refs. // There may not be cycles in the ref graph. // A channel ref may be present in more than one channel or subchannel. repeated ChannelRef channel_ref = 3; // At most one of 'channel_ref+subchannel_ref' and 'socket' is set. // There are no ordering guarantees on the order of subchannel refs. // There may not be cycles in the ref graph. // A sub channel ref may be present in more than one channel or subchannel. repeated SubchannelRef subchannel_ref = 4; // There are no ordering guarantees on the order of sockets. repeated SocketRef socket_ref = 5; } // Subchannel is a logical grouping of channels, subchannels, and sockets. // A subchannel is load balanced over by it's ancestor message Subchannel { // The identifier for this channel. SubchannelRef ref = 1; // Data specific to this channel. ChannelData data = 2; // At most one of 'channel_ref+subchannel_ref' and 'socket' is set. // There are no ordering guarantees on the order of channel refs. // There may not be cycles in the ref graph. // A channel ref may be present in more than one channel or subchannel. repeated ChannelRef channel_ref = 3; // At most one of 'channel_ref+subchannel_ref' and 'socket' is set. // There are no ordering guarantees on the order of subchannel refs. // There may not be cycles in the ref graph. // A sub channel ref may be present in more than one channel or subchannel. repeated SubchannelRef subchannel_ref = 4; // There are no ordering guarantees on the order of sockets. repeated SocketRef socket_ref = 5; } // These come from the specified states in this document: // https://github.com/grpc/grpc/blob/master/doc/connectivity-semantics-and-api.md message ChannelConnectivityState { enum State { UNKNOWN = 0; IDLE = 1; CONNECTING = 2; READY = 3; TRANSIENT_FAILURE = 4; SHUTDOWN = 5; } State state = 1; } // Channel data is data related to a specific Channel or Subchannel. message ChannelData { // The connectivity state of the channel or subchannel. Implementations // should always set this. ChannelConnectivityState state = 1; // The target this channel originally tried to connect to. May be absent string target = 2; // A trace of recent events on the channel. May be absent. ChannelTrace trace = 3; // The number of calls started on the channel int64 calls_started = 4; // The number of calls that have completed with an OK status int64 calls_succeeded = 5; // The number of calls that have completed with a non-OK status int64 calls_failed = 6; // The last time a call was started on the channel. google.protobuf.Timestamp last_call_started_timestamp = 7; } // A trace event is an interesting thing that happened to a channel or // subchannel, such as creation, address resolution, subchannel creation, etc. message ChannelTraceEvent { // High level description of the event. string description = 1; // The supported severity levels of trace events. enum Severity { CT_UNKNOWN = 0; CT_INFO = 1; CT_WARNING = 2; CT_ERROR = 3; } // the severity of the trace event Severity severity = 2; // When this event occurred. google.protobuf.Timestamp timestamp = 3; // ref of referenced channel or subchannel. // Optional, only present if this event refers to a child object. For example, // this field would be filled if this trace event was for a subchannel being // created. oneof child_ref { ChannelRef channel_ref = 4; SubchannelRef subchannel_ref = 5; } } // ChannelTrace represents the recent events that have occurred on the channel. message ChannelTrace { // Number of events ever logged in this tracing object. This can differ from // events.size() because events can be overwritten or garbage collected by // implementations. int64 num_events_logged = 1; // Time that this channel was created. google.protobuf.Timestamp creation_timestamp = 2; // List of events that have occurred on this channel. repeated ChannelTraceEvent events = 3; } // ChannelRef is a reference to a Channel. message ChannelRef { // The globally unique id for this channel. Must be a positive number. int64 channel_id = 1; // An optional name associated with the channel. string name = 2; // Intentionally don't use field numbers from other refs. reserved 3, 4, 5, 6, 7, 8; } // SubchannelRef is a reference to a Subchannel. message SubchannelRef { // The globally unique id for this subchannel. Must be a positive number. int64 subchannel_id = 7; // An optional name associated with the subchannel. string name = 8; // Intentionally don't use field numbers from other refs. reserved 1, 2, 3, 4, 5, 6; } // SocketRef is a reference to a Socket. message SocketRef { // The globally unique id for this socket. Must be a positive number. int64 socket_id = 3; // An optional name associated with the socket. string name = 4; // Intentionally don't use field numbers from other refs. reserved 1, 2, 5, 6, 7, 8; } // ServerRef is a reference to a Server. message ServerRef { // A globally unique identifier for this server. Must be a positive number. int64 server_id = 5; // An optional name associated with the server. string name = 6; // Intentionally don't use field numbers from other refs. reserved 1, 2, 3, 4, 7, 8; } // Server represents a single server. There may be multiple servers in a single // program. message Server { // The identifier for a Server. This should be set. ServerRef ref = 1; // The associated data of the Server. ServerData data = 2; // The sockets that the server is listening on. There are no ordering // guarantees. This may be absent. repeated SocketRef listen_socket = 3; } // ServerData is data for a specific Server. message ServerData { // A trace of recent events on the server. May be absent. ChannelTrace trace = 1; // The number of incoming calls started on the server int64 calls_started = 2; // The number of incoming calls that have completed with an OK status int64 calls_succeeded = 3; // The number of incoming calls that have a completed with a non-OK status int64 calls_failed = 4; // The last time a call was started on the server. google.protobuf.Timestamp last_call_started_timestamp = 5; } // Information about an actual connection. Pronounced "sock-ay". message Socket { // The identifier for the Socket. SocketRef ref = 1; // Data specific to this Socket. SocketData data = 2; // The locally bound address. Address local = 3; // The remote bound address. May be absent. Address remote = 4; // Security details for this socket. May be absent if not available, or // there is no security on the socket. Security security = 5; // Optional, represents the name of the remote endpoint, if different than // the original target name. string remote_name = 6; } // SocketData is data associated for a specific Socket. The fields present // are specific to the implementation, so there may be minor differences in // the semantics. (e.g. flow control windows) message SocketData { // The number of streams that have been started. int64 streams_started = 1; // The number of streams that have ended successfully: // On client side, received frame with eos bit set; // On server side, sent frame with eos bit set. int64 streams_succeeded = 2; // The number of streams that have ended unsuccessfully: // On client side, ended without receiving frame with eos bit set; // On server side, ended without sending frame with eos bit set. int64 streams_failed = 3; // The number of grpc messages successfully sent on this socket. int64 messages_sent = 4; // The number of grpc messages received on this socket. int64 messages_received = 5; // The number of keep alives sent. This is typically implemented with HTTP/2 // ping messages. int64 keep_alives_sent = 6; // The last time a stream was created by this endpoint. Usually unset for // servers. google.protobuf.Timestamp last_local_stream_created_timestamp = 7; // The last time a stream was created by the remote endpoint. Usually unset // for clients. google.protobuf.Timestamp last_remote_stream_created_timestamp = 8; // The last time a message was sent by this endpoint. google.protobuf.Timestamp last_message_sent_timestamp = 9; // The last time a message was received by this endpoint. google.protobuf.Timestamp last_message_received_timestamp = 10; // The amount of window, granted to the local endpoint by the remote endpoint. // This may be slightly out of date due to network latency. This does NOT // include stream level or TCP level flow control info. google.protobuf.Int64Value local_flow_control_window = 11; // The amount of window, granted to the remote endpoint by the local endpoint. // This may be slightly out of date due to network latency. This does NOT // include stream level or TCP level flow control info. google.protobuf.Int64Value remote_flow_control_window = 12; // Socket options set on this socket. May be absent if 'summary' is set // on GetSocketRequest. repeated SocketOption option = 13; } // Address represents the address used to create the socket. message Address { message TcpIpAddress { // Either the IPv4 or IPv6 address in bytes. Will be either 4 bytes or 16 // bytes in length. bytes ip_address = 1; // 0-64k, or -1 if not appropriate. int32 port = 2; } // A Unix Domain Socket address. message UdsAddress { string filename = 1; } // An address type not included above. message OtherAddress { // The human readable version of the value. This value should be set. string name = 1; // The actual address message. google.protobuf.Any value = 2; } oneof address { TcpIpAddress tcpip_address = 1; UdsAddress uds_address = 2; OtherAddress other_address = 3; } } // Security represents details about how secure the socket is. message Security { message Tls { oneof cipher_suite { // The cipher suite name in the RFC 4346 format: // https://tools.ietf.org/html/rfc4346#appendix-C string standard_name = 1; // Some other way to describe the cipher suite if // the RFC 4346 name is not available. string other_name = 2; } // the certificate used by this endpoint. bytes local_certificate = 3; // the certificate used by the remote endpoint. bytes remote_certificate = 4; } message OtherSecurity { // The human readable version of the value. string name = 1; // The actual security details message. google.protobuf.Any value = 2; } oneof model { Tls tls = 1; OtherSecurity other = 2; } } // SocketOption represents socket options for a socket. Specifically, these // are the options returned by getsockopt(). message SocketOption { // The full name of the socket option. Typically this will be the upper case // name, such as "SO_REUSEPORT". string name = 1; // The human readable value of this socket option. At least one of value or // additional will be set. string value = 2; // Additional data associated with the socket option. At least one of value // or additional will be set. google.protobuf.Any additional = 3; } // For use with SocketOption's additional field. This is primarily used for // SO_RCVTIMEO and SO_SNDTIMEO message SocketOptionTimeout { google.protobuf.Duration duration = 1; } // For use with SocketOption's additional field. This is primarily used for // SO_LINGER. message SocketOptionLinger { // active maps to `struct linger.l_onoff` bool active = 1; // duration maps to `struct linger.l_linger` google.protobuf.Duration duration = 2; } // For use with SocketOption's additional field. Tcp info for // SOL_TCP and TCP_INFO. message SocketOptionTcpInfo { uint32 tcpi_state = 1; uint32 tcpi_ca_state = 2; uint32 tcpi_retransmits = 3; uint32 tcpi_probes = 4; uint32 tcpi_backoff = 5; uint32 tcpi_options = 6; uint32 tcpi_snd_wscale = 7; uint32 tcpi_rcv_wscale = 8; uint32 tcpi_rto = 9; uint32 tcpi_ato = 10; uint32 tcpi_snd_mss = 11; uint32 tcpi_rcv_mss = 12; uint32 tcpi_unacked = 13; uint32 tcpi_sacked = 14; uint32 tcpi_lost = 15; uint32 tcpi_retrans = 16; uint32 tcpi_fackets = 17; uint32 tcpi_last_data_sent = 18; uint32 tcpi_last_ack_sent = 19; uint32 tcpi_last_data_recv = 20; uint32 tcpi_last_ack_recv = 21; uint32 tcpi_pmtu = 22; uint32 tcpi_rcv_ssthresh = 23; uint32 tcpi_rtt = 24; uint32 tcpi_rttvar = 25; uint32 tcpi_snd_ssthresh = 26; uint32 tcpi_snd_cwnd = 27; uint32 tcpi_advmss = 28; uint32 tcpi_reordering = 29; } // Channelz is a service exposed by gRPC servers that provides detailed debug // information. service Channelz { // Gets all root channels (i.e. channels the application has directly // created). This does not include subchannels nor non-top level channels. rpc GetTopChannels(GetTopChannelsRequest) returns (GetTopChannelsResponse); // Gets all servers that exist in the process. rpc GetServers(GetServersRequest) returns (GetServersResponse); // Returns a single Server, or else a NOT_FOUND code. rpc GetServer(GetServerRequest) returns (GetServerResponse); // Gets all server sockets that exist in the process. rpc GetServerSockets(GetServerSocketsRequest) returns (GetServerSocketsResponse); // Returns a single Channel, or else a NOT_FOUND code. rpc GetChannel(GetChannelRequest) returns (GetChannelResponse); // Returns a single Subchannel, or else a NOT_FOUND code. rpc GetSubchannel(GetSubchannelRequest) returns (GetSubchannelResponse); // Returns a single Socket or else a NOT_FOUND code. rpc GetSocket(GetSocketRequest) returns (GetSocketResponse); } message GetTopChannelsRequest { // start_channel_id indicates that only channels at or above this id should be // included in the results. // To request the first page, this should be set to 0. To request // subsequent pages, the client generates this value by adding 1 to // the highest seen result ID. int64 start_channel_id = 1; // If non-zero, the server will return a page of results containing // at most this many items. If zero, the server will choose a // reasonable page size. Must never be negative. int64 max_results = 2; } message GetTopChannelsResponse { // list of channels that the connection detail service knows about. Sorted in // ascending channel_id order. // Must contain at least 1 result, otherwise 'end' must be true. repeated Channel channel = 1; // If set, indicates that the list of channels is the final list. Requesting // more channels can only return more if they are created after this RPC // completes. bool end = 2; } message GetServersRequest { // start_server_id indicates that only servers at or above this id should be // included in the results. // To request the first page, this must be set to 0. To request // subsequent pages, the client generates this value by adding 1 to // the highest seen result ID. int64 start_server_id = 1; // If non-zero, the server will return a page of results containing // at most this many items. If zero, the server will choose a // reasonable page size. Must never be negative. int64 max_results = 2; } message GetServersResponse { // list of servers that the connection detail service knows about. Sorted in // ascending server_id order. // Must contain at least 1 result, otherwise 'end' must be true. repeated Server server = 1; // If set, indicates that the list of servers is the final list. Requesting // more servers will only return more if they are created after this RPC // completes. bool end = 2; } message GetServerRequest { // server_id is the identifier of the specific server to get. int64 server_id = 1; } message GetServerResponse { // The Server that corresponds to the requested server_id. This field // should be set. Server server = 1; } message GetServerSocketsRequest { int64 server_id = 1; // start_socket_id indicates that only sockets at or above this id should be // included in the results. // To request the first page, this must be set to 0. To request // subsequent pages, the client generates this value by adding 1 to // the highest seen result ID. int64 start_socket_id = 2; // If non-zero, the server will return a page of results containing // at most this many items. If zero, the server will choose a // reasonable page size. Must never be negative. int64 max_results = 3; } message GetServerSocketsResponse { // list of socket refs that the connection detail service knows about. Sorted in // ascending socket_id order. // Must contain at least 1 result, otherwise 'end' must be true. repeated SocketRef socket_ref = 1; // If set, indicates that the list of sockets is the final list. Requesting // more sockets will only return more if they are created after this RPC // completes. bool end = 2; } message GetChannelRequest { // channel_id is the identifier of the specific channel to get. int64 channel_id = 1; } message GetChannelResponse { // The Channel that corresponds to the requested channel_id. This field // should be set. Channel channel = 1; } message GetSubchannelRequest { // subchannel_id is the identifier of the specific subchannel to get. int64 subchannel_id = 1; } message GetSubchannelResponse { // The Subchannel that corresponds to the requested subchannel_id. This // field should be set. Subchannel subchannel = 1; } message GetSocketRequest { // socket_id is the identifier of the specific socket to get. int64 socket_id = 1; // If true, the response will contain only high level information // that is inexpensive to obtain. Fields thay may be omitted are // documented. bool summary = 2; } message GetSocketResponse { // The Socket that corresponds to the requested socket_id. This field // should be set. Socket socket = 1; }