Home | History | Annotate | Download | only in channelz
      1 // Copyright 2018 The gRPC Authors
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 // This file defines an interface for exporting monitoring information
     16 // out of gRPC servers.  See the full design at
     17 // https://github.com/grpc/proposal/blob/master/A14-channelz.md
     18 //
     19 // The canonical version of this proto can be found at
     20 // https://github.com/grpc/grpc-proto/blob/master/grpc/channelz/v1/channelz.proto
     21 
     22 syntax = "proto3";
     23 
     24 package grpc.channelz.v1;
     25 
     26 import "google/protobuf/any.proto";
     27 import "google/protobuf/duration.proto";
     28 import "google/protobuf/timestamp.proto";
     29 import "google/protobuf/wrappers.proto";
     30 
     31 option go_package = "google.golang.org/grpc/channelz/grpc_channelz_v1";
     32 option java_multiple_files = true;
     33 option java_package = "io.grpc.channelz.v1";
     34 option java_outer_classname = "ChannelzProto";
     35 
     36 // Channel is a logical grouping of channels, subchannels, and sockets.
     37 message Channel {
     38   // The identifier for this channel. This should bet set.
     39   ChannelRef ref = 1;
     40   // Data specific to this channel.
     41   ChannelData data = 2;
     42   // At most one of 'channel_ref+subchannel_ref' and 'socket' is set.
     43 
     44   // There are no ordering guarantees on the order of channel refs.
     45   // There may not be cycles in the ref graph.
     46   // A channel ref may be present in more than one channel or subchannel.
     47   repeated ChannelRef channel_ref = 3;
     48 
     49   // At most one of 'channel_ref+subchannel_ref' and 'socket' is set.
     50   // There are no ordering guarantees on the order of subchannel refs.
     51   // There may not be cycles in the ref graph.
     52   // A sub channel ref may be present in more than one channel or subchannel.
     53   repeated SubchannelRef subchannel_ref = 4;
     54 
     55   // There are no ordering guarantees on the order of sockets.
     56   repeated SocketRef socket_ref = 5;
     57 }
     58 
     59 // Subchannel is a logical grouping of channels, subchannels, and sockets.
     60 // A subchannel is load balanced over by it's ancestor
     61 message Subchannel {
     62   // The identifier for this channel.
     63   SubchannelRef ref = 1;
     64   // Data specific to this channel.
     65   ChannelData data = 2;
     66   // At most one of 'channel_ref+subchannel_ref' and 'socket' is set.
     67 
     68   // There are no ordering guarantees on the order of channel refs.
     69   // There may not be cycles in the ref graph.
     70   // A channel ref may be present in more than one channel or subchannel.
     71   repeated ChannelRef channel_ref = 3;
     72 
     73   // At most one of 'channel_ref+subchannel_ref' and 'socket' is set.
     74   // There are no ordering guarantees on the order of subchannel refs.
     75   // There may not be cycles in the ref graph.
     76   // A sub channel ref may be present in more than one channel or subchannel.
     77   repeated SubchannelRef subchannel_ref = 4;
     78 
     79   // There are no ordering guarantees on the order of sockets.
     80   repeated SocketRef socket_ref = 5;
     81 }
     82 
     83 // These come from the specified states in this document:
     84 // https://github.com/grpc/grpc/blob/master/doc/connectivity-semantics-and-api.md
     85 message ChannelConnectivityState {
     86   enum State {
     87     UNKNOWN = 0;
     88     IDLE = 1;
     89     CONNECTING = 2;
     90     READY = 3;
     91     TRANSIENT_FAILURE = 4;
     92     SHUTDOWN = 5;
     93   }
     94   State state = 1;
     95 }
     96 
     97 // Channel data is data related to a specific Channel or Subchannel.
     98 message ChannelData {
     99   // The connectivity state of the channel or subchannel.  Implementations
    100   // should always set this.
    101   ChannelConnectivityState state = 1;
    102 
    103   // The target this channel originally tried to connect to.  May be absent
    104   string target = 2;
    105 
    106   // A trace of recent events on the channel.  May be absent.
    107   ChannelTrace trace = 3;
    108 
    109   // The number of calls started on the channel
    110   int64 calls_started = 4;
    111   // The number of calls that have completed with an OK status
    112   int64 calls_succeeded = 5;
    113   // The number of calls that have completed with a non-OK status
    114   int64 calls_failed = 6;
    115 
    116   // The last time a call was started on the channel.
    117   google.protobuf.Timestamp last_call_started_timestamp = 7;
    118 }
    119 
    120 // A trace event is an interesting thing that happened to a channel or
    121 // subchannel, such as creation, address resolution, subchannel creation, etc.
    122 message ChannelTraceEvent {
    123   // High level description of the event.
    124   string description = 1;
    125   // The supported severity levels of trace events.
    126   enum Severity {
    127     CT_UNKNOWN = 0;
    128     CT_INFO = 1;
    129     CT_WARNING = 2;
    130     CT_ERROR = 3;
    131   }
    132   // the severity of the trace event
    133   Severity severity = 2;
    134   // When this event occurred.
    135   google.protobuf.Timestamp timestamp = 3;
    136   // ref of referenced channel or subchannel.
    137   // Optional, only present if this event refers to a child object. For example,
    138   // this field would be filled if this trace event was for a subchannel being
    139   // created.
    140   oneof child_ref {
    141     ChannelRef channel_ref = 4;
    142     SubchannelRef subchannel_ref = 5;
    143   }
    144 }
    145 
    146 // ChannelTrace represents the recent events that have occurred on the channel.
    147 message ChannelTrace {
    148   // Number of events ever logged in this tracing object. This can differ from
    149   // events.size() because events can be overwritten or garbage collected by
    150   // implementations.
    151   int64 num_events_logged = 1;
    152   // Time that this channel was created.
    153   google.protobuf.Timestamp creation_timestamp = 2;
    154   // List of events that have occurred on this channel.
    155   repeated ChannelTraceEvent events = 3;
    156 }
    157 
    158 // ChannelRef is a reference to a Channel.
    159 message ChannelRef {
    160   // The globally unique id for this channel.  Must be a positive number.
    161   int64 channel_id = 1;
    162   // An optional name associated with the channel.
    163   string name = 2;
    164   // Intentionally don't use field numbers from other refs.
    165   reserved 3, 4, 5, 6, 7, 8;
    166 }
    167 
    168 // ChannelRef is a reference to a Subchannel.
    169 message SubchannelRef {
    170   // The globally unique id for this subchannel.  Must be a positive number.
    171   int64 subchannel_id = 7;
    172   // An optional name associated with the subchannel.
    173   string name = 8;
    174   // Intentionally don't use field numbers from other refs.
    175   reserved 1, 2, 3, 4, 5, 6;
    176 }
    177 
    178 // SocketRef is a reference to a Socket.
    179 message SocketRef {
    180   int64 socket_id = 3;
    181   // An optional name associated with the socket.
    182   string name = 4;
    183   // Intentionally don't use field numbers from other refs.
    184   reserved 1, 2, 5, 6, 7, 8;
    185 }
    186 
    187 // ServerRef is a reference to a Server.
    188 message ServerRef {
    189   // A globally unique identifier for this server.  Must be a positive number.
    190   int64 server_id = 5;
    191   // An optional name associated with the server.
    192   string name = 6;
    193   // Intentionally don't use field numbers from other refs.
    194   reserved 1, 2, 3, 4, 7, 8;
    195 }
    196 
    197 // Server represents a single server.  There may be multiple servers in a single
    198 // program.
    199 message Server {
    200   // The identifier for a Server.  This should be set.
    201   ServerRef ref = 1;
    202   // The associated data of the Server.
    203   ServerData data = 2;
    204 
    205   // The sockets that the server is listening on.  There are no ordering
    206   // guarantees.  This may be absent.
    207   repeated SocketRef listen_socket = 3;
    208 }
    209 
    210 // ServerData is data for a specific Server.
    211 message ServerData {
    212   // A trace of recent events on the server.  May be absent.
    213   ChannelTrace trace = 1;
    214 
    215   // The number of incoming calls started on the server
    216   int64 calls_started = 2;
    217   // The number of incoming calls that have completed with an OK status
    218   int64 calls_succeeded = 3;
    219   // The number of incoming calls that have a completed with a non-OK status
    220   int64 calls_failed = 4;
    221 
    222   // The last time a call was started on the server.
    223   google.protobuf.Timestamp last_call_started_timestamp = 5;
    224 }
    225 
    226 // Information about an actual connection.  Pronounced "sock-ay".
    227 message Socket {
    228   // The identifier for the Socket.
    229   SocketRef ref = 1;
    230 
    231   // Data specific to this Socket.
    232   SocketData data = 2;
    233   // The locally bound address.
    234   Address local = 3;
    235   // The remote bound address.  May be absent.
    236   Address remote = 4;
    237   // Security details for this socket.  May be absent if not available, or
    238   // there is no security on the socket.
    239   Security security = 5;
    240 
    241   // Optional, represents the name of the remote endpoint, if different than
    242   // the original target name.
    243   string remote_name = 6;
    244 }
    245 
    246 // SocketData is data associated for a specific Socket.  The fields present
    247 // are specific to the implementation, so there may be minor differences in
    248 // the semantics.  (e.g. flow control windows)
    249 message SocketData {
    250   // The number of streams that have been started.
    251   int64 streams_started = 1;
    252   // The number of streams that have ended successfully:
    253   // On client side, received frame with eos bit set;
    254   // On server side, sent frame with eos bit set.
    255   int64 streams_succeeded = 2;
    256   // The number of streams that have ended unsuccessfully:
    257   // On client side, ended without receiving frame with eos bit set;
    258   // On server side, ended without sending frame with eos bit set.
    259   int64 streams_failed = 3;
    260   // The number of grpc messages successfully sent on this socket.
    261   int64 messages_sent = 4;
    262   // The number of grpc messages received on this socket.
    263   int64 messages_received = 5;
    264 
    265   // The number of keep alives sent.  This is typically implemented with HTTP/2
    266   // ping messages.
    267   int64 keep_alives_sent = 6;
    268 
    269   // The last time a stream was created by this endpoint.  Usually unset for
    270   // servers.
    271   google.protobuf.Timestamp last_local_stream_created_timestamp = 7;
    272   // The last time a stream was created by the remote endpoint.  Usually unset
    273   // for clients.
    274   google.protobuf.Timestamp last_remote_stream_created_timestamp = 8;
    275 
    276   // The last time a message was sent by this endpoint.
    277   google.protobuf.Timestamp last_message_sent_timestamp = 9;
    278   // The last time a message was received by this endpoint.
    279   google.protobuf.Timestamp last_message_received_timestamp = 10;
    280 
    281   // The amount of window, granted to the local endpoint by the remote endpoint.
    282   // This may be slightly out of date due to network latency.  This does NOT
    283   // include stream level or TCP level flow control info.
    284   google.protobuf.Int64Value local_flow_control_window = 11;
    285 
    286   // The amount of window, granted to the remote endpoint by the local endpoint.
    287   // This may be slightly out of date due to network latency.  This does NOT
    288   // include stream level or TCP level flow control info.
    289   google.protobuf.Int64Value  remote_flow_control_window = 12;
    290 
    291   // Socket options set on this socket.  May be absent.
    292   repeated SocketOption option = 13;
    293 }
    294 
    295 // Address represents the address used to create the socket.
    296 message Address {
    297   message TcpIpAddress {
    298     // Either the IPv4 or IPv6 address in bytes.  Will be either 4 bytes or 16
    299     // bytes in length.
    300     bytes ip_address = 1;
    301     // 0-64k, or -1 if not appropriate.
    302     int32 port = 2;
    303   }
    304   // A Unix Domain Socket address.
    305   message UdsAddress {
    306     string filename = 1;
    307   }
    308   // An address type not included above.
    309   message OtherAddress {
    310     // The human readable version of the value.  This value should be set.
    311     string name = 1;
    312     // The actual address message.
    313     google.protobuf.Any value = 2;
    314   }
    315 
    316   oneof address {
    317     TcpIpAddress tcpip_address = 1;
    318     UdsAddress uds_address = 2;
    319     OtherAddress other_address = 3;
    320   }
    321 }
    322 
    323 // Security represents details about how secure the socket is.
    324 message Security {
    325   message Tls {
    326     oneof cipher_suite {
    327       // The cipher suite name in the RFC 4346 format:
    328       // https://tools.ietf.org/html/rfc4346#appendix-C
    329       string standard_name = 1;
    330       // Some other way to describe the cipher suite if
    331       // the RFC 4346 name is not available.
    332       string other_name = 2;
    333     }
    334     // the certificate used by this endpoint.
    335     bytes local_certificate = 3;
    336     // the certificate used by the remote endpoint.
    337     bytes remote_certificate = 4;
    338   }
    339   message OtherSecurity {
    340     // The human readable version of the value.
    341     string name = 1;
    342     // The actual security details message.
    343     google.protobuf.Any value = 2;
    344   }
    345   oneof model {
    346     Tls tls = 1;
    347     OtherSecurity other = 2;
    348   }
    349 }
    350 
    351 // SocketOption represents socket options for a socket.  Specifically, these
    352 // are the options returned by getsockopt().
    353 message SocketOption {
    354   // The full name of the socket option.  Typically this will be the upper case
    355   // name, such as "SO_REUSEPORT".
    356   string name = 1;
    357   // The human readable value of this socket option.  At least one of value or
    358   // additional will be set.
    359   string value = 2;
    360   // Additional data associated with the socket option.  At least one of value
    361   // or additional will be set.
    362   google.protobuf.Any additional = 3;
    363 }
    364 
    365 // For use with SocketOption's additional field.  This is primarily used for
    366 // SO_RCVTIMEO and SO_SNDTIMEO
    367 message SocketOptionTimeout {
    368   google.protobuf.Duration duration = 1;
    369 }
    370 
    371 // For use with SocketOption's additional field.  This is primarily used for
    372 // SO_LINGER.
    373 message SocketOptionLinger {
    374   // active maps to `struct linger.l_onoff`
    375   bool active = 1;
    376   // duration maps to `struct linger.l_linger`
    377   google.protobuf.Duration duration = 2;
    378 }
    379 
    380 // For use with SocketOption's additional field.  Tcp info for
    381 // SOL_TCP and TCP_INFO.
    382 message SocketOptionTcpInfo {
    383   uint32 tcpi_state = 1;
    384 
    385   uint32 tcpi_ca_state = 2;
    386   uint32 tcpi_retransmits = 3;
    387   uint32 tcpi_probes = 4;
    388   uint32 tcpi_backoff = 5;
    389   uint32 tcpi_options = 6;
    390   uint32 tcpi_snd_wscale = 7;
    391   uint32 tcpi_rcv_wscale = 8;
    392 
    393   uint32 tcpi_rto = 9;
    394   uint32 tcpi_ato = 10;
    395   uint32 tcpi_snd_mss = 11;
    396   uint32 tcpi_rcv_mss = 12;
    397 
    398   uint32 tcpi_unacked = 13;
    399   uint32 tcpi_sacked = 14;
    400   uint32 tcpi_lost = 15;
    401   uint32 tcpi_retrans = 16;
    402   uint32 tcpi_fackets = 17;
    403 
    404   uint32 tcpi_last_data_sent = 18;
    405   uint32 tcpi_last_ack_sent = 19;
    406   uint32 tcpi_last_data_recv = 20;
    407   uint32 tcpi_last_ack_recv = 21;
    408 
    409   uint32 tcpi_pmtu = 22;
    410   uint32 tcpi_rcv_ssthresh = 23;
    411   uint32 tcpi_rtt = 24;
    412   uint32 tcpi_rttvar = 25;
    413   uint32 tcpi_snd_ssthresh = 26;
    414   uint32 tcpi_snd_cwnd = 27;
    415   uint32 tcpi_advmss = 28;
    416   uint32 tcpi_reordering = 29;
    417 }
    418 
    419 // Channelz is a service exposed by gRPC servers that provides detailed debug
    420 // information.
    421 service Channelz {
    422   // Gets all root channels (i.e. channels the application has directly
    423   // created). This does not include subchannels nor non-top level channels.
    424   rpc GetTopChannels(GetTopChannelsRequest) returns (GetTopChannelsResponse);
    425   // Gets all servers that exist in the process.
    426   rpc GetServers(GetServersRequest) returns (GetServersResponse);
    427   // Gets all server sockets that exist in the process.
    428   rpc GetServerSockets(GetServerSocketsRequest) returns (GetServerSocketsResponse);
    429   // Returns a single Channel, or else a NOT_FOUND code.
    430   rpc GetChannel(GetChannelRequest) returns (GetChannelResponse);
    431   // Returns a single Subchannel, or else a NOT_FOUND code.
    432   rpc GetSubchannel(GetSubchannelRequest) returns (GetSubchannelResponse);
    433   // Returns a single Socket or else a NOT_FOUND code.
    434   rpc GetSocket(GetSocketRequest) returns (GetSocketResponse);
    435 }
    436 
    437 message GetTopChannelsRequest {
    438   // start_channel_id indicates that only channels at or above this id should be
    439   // included in the results.
    440   int64 start_channel_id = 1;
    441 }
    442 
    443 message GetTopChannelsResponse {
    444   // list of channels that the connection detail service knows about.  Sorted in
    445   // ascending channel_id order.
    446   repeated Channel channel = 1;
    447   // If set, indicates that the list of channels is the final list.  Requesting
    448   // more channels can only return more if they are created after this RPC
    449   // completes.
    450   bool end = 2;
    451 }
    452 
    453 message GetServersRequest {
    454   // start_server_id indicates that only servers at or above this id should be
    455   // included in the results.
    456   int64 start_server_id = 1;
    457 }
    458 
    459 message GetServersResponse {
    460   // list of servers that the connection detail service knows about.  Sorted in
    461   // ascending server_id order.
    462   repeated Server server = 1;
    463   // If set, indicates that the list of servers is the final list.  Requesting
    464   // more servers will only return more if they are created after this RPC
    465   // completes.
    466   bool end = 2;
    467 }
    468 
    469 message GetServerSocketsRequest {
    470   int64 server_id = 1;
    471   // start_socket_id indicates that only sockets at or above this id should be
    472   // included in the results.
    473   int64 start_socket_id = 2;
    474 }
    475 
    476 message GetServerSocketsResponse {
    477   // list of socket refs that the connection detail service knows about.  Sorted in
    478   // ascending socket_id order.
    479   repeated SocketRef socket_ref = 1;
    480   // If set, indicates that the list of sockets is the final list.  Requesting
    481   // more sockets will only return more if they are created after this RPC
    482   // completes.
    483   bool end = 2;
    484 }
    485 
    486 message GetChannelRequest {
    487   // channel_id is the identifier of the specific channel to get.
    488   int64 channel_id = 1;
    489 }
    490 
    491 message GetChannelResponse {
    492   // The Channel that corresponds to the requested channel_id.  This field
    493   // should be set.
    494   Channel channel = 1;
    495 }
    496 
    497 message GetSubchannelRequest {
    498   // subchannel_id is the identifier of the specific subchannel to get.
    499   int64 subchannel_id = 1;
    500 }
    501 
    502 message GetSubchannelResponse {
    503   // The Subchannel that corresponds to the requested subchannel_id.  This
    504   // field should be set.
    505   Subchannel subchannel = 1;
    506 }
    507 
    508 message GetSocketRequest {
    509   // socket_id is the identifier of the specific socket to get.
    510   int64 socket_id = 1;
    511 }
    512 
    513 message GetSocketResponse {
    514   // The Socket that corresponds to the requested socket_id.  This field
    515   // should be set.
    516   Socket socket = 1;
    517 }
    518