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