|  | @@ -1,4 +1,4 @@
 | 
	
		
			
				|  |  | -// Copyright 2018 gRPC authors.
 | 
	
		
			
				|  |  | +// 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.
 | 
	
	
		
			
				|  | @@ -12,20 +12,30 @@
 | 
	
		
			
				|  |  |  // 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;
 | 
	
		
			
				|  |  | +package grpc.channelz.v1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import "google/protobuf/any.proto";
 | 
	
		
			
				|  |  |  import "google/protobuf/duration.proto";
 | 
	
		
			
				|  |  |  import "google/protobuf/timestamp.proto";
 | 
	
		
			
				|  |  |  import "google/protobuf/wrappers.proto";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// See go/grpc-channelz.
 | 
	
		
			
				|  |  | +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.
 | 
	
		
			
				|  |  | +  // The identifier for this channel. This should bet set.
 | 
	
		
			
				|  |  |    ChannelRef ref = 1;
 | 
	
		
			
				|  |  |    // Data specific to this channel.
 | 
	
		
			
				|  |  |    ChannelData data = 2;
 | 
	
	
		
			
				|  | @@ -43,7 +53,7 @@ message Channel {
 | 
	
		
			
				|  |  |    repeated SubchannelRef subchannel_ref = 4;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // There are no ordering guarantees on the order of sockets.
 | 
	
		
			
				|  |  | -  repeated SocketRef socket = 5;
 | 
	
		
			
				|  |  | +  repeated SocketRef socket_ref = 5;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Subchannel is a logical grouping of channels, subchannels, and sockets.
 | 
	
	
		
			
				|  | @@ -67,7 +77,7 @@ message Subchannel {
 | 
	
		
			
				|  |  |    repeated SubchannelRef subchannel_ref = 4;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // There are no ordering guarantees on the order of sockets.
 | 
	
		
			
				|  |  | -  repeated SocketRef socket = 5;
 | 
	
		
			
				|  |  | +  repeated SocketRef socket_ref = 5;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // These come from the specified states in this document:
 | 
	
	
		
			
				|  | @@ -84,20 +94,23 @@ message ChannelConnectivityState {
 | 
	
		
			
				|  |  |    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 a completed with a non-OK status
 | 
	
		
			
				|  |  | +  // 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.
 | 
	
	
		
			
				|  | @@ -130,26 +143,29 @@ message ChannelTraceEvent {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// 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_time = 2;
 | 
	
		
			
				|  |  | +  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;
 | 
	
		
			
				|  |  | +  reserved 3, 4, 5, 6, 7, 8;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// ChannelRef is a reference to a Subchannel.
 | 
	
		
			
				|  |  |  message SubchannelRef {
 | 
	
		
			
				|  |  |    // The globally unique id for this subchannel.  Must be a positive number.
 | 
	
		
			
				|  |  |    int64 subchannel_id = 7;
 | 
	
	
		
			
				|  | @@ -159,6 +175,7 @@ message SubchannelRef {
 | 
	
		
			
				|  |  |    reserved 1, 2, 3, 4, 5, 6;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// SocketRef is a reference to a Socket.
 | 
	
		
			
				|  |  |  message SocketRef {
 | 
	
		
			
				|  |  |    int64 socket_id = 3;
 | 
	
		
			
				|  |  |    // An optional name associated with the socket.
 | 
	
	
		
			
				|  | @@ -167,8 +184,9 @@ message SocketRef {
 | 
	
		
			
				|  |  |    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.
 | 
	
		
			
				|  |  | +  // 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;
 | 
	
	
		
			
				|  | @@ -176,16 +194,22 @@ message ServerRef {
 | 
	
		
			
				|  |  |    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.
 | 
	
		
			
				|  |  | +  // 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
 | 
	
	
		
			
				|  | @@ -201,13 +225,17 @@ message ServerData {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 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
 | 
	
	
		
			
				|  | @@ -215,17 +243,23 @@ message Socket {
 | 
	
		
			
				|  |  |    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 with the EoS bit set for
 | 
	
		
			
				|  |  | -  //  both end points
 | 
	
		
			
				|  |  | +  // 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 incoming streams that have a completed with a non-OK status
 | 
	
		
			
				|  |  | +  // 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 messages successfully sent on this socket.
 | 
	
		
			
				|  |  | +  // 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
 | 
	
	
		
			
				|  | @@ -254,12 +288,14 @@ message SocketData {
 | 
	
		
			
				|  |  |    // 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.
 | 
	
		
			
				|  |  |    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 either be 4 bytes or 16
 | 
	
		
			
				|  |  | +    // 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.
 | 
	
	
		
			
				|  | @@ -271,7 +307,7 @@ message Address {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    // An address type not included above.
 | 
	
		
			
				|  |  |    message OtherAddress {
 | 
	
		
			
				|  |  | -    // The human readable version of the value.
 | 
	
		
			
				|  |  | +    // The human readable version of the value.  This value should be set.
 | 
	
		
			
				|  |  |      string name = 1;
 | 
	
		
			
				|  |  |      // The actual address message.
 | 
	
		
			
				|  |  |      google.protobuf.Any value = 2;
 | 
	
	
		
			
				|  | @@ -284,12 +320,17 @@ message Address {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Security represents details about how secure the socket is.
 | 
	
		
			
				|  |  |  message Security {
 | 
	
		
			
				|  |  |    message Tls {
 | 
	
		
			
				|  |  | -    // The key exchange used.  e.g. X25519
 | 
	
		
			
				|  |  | -    string key_exchange = 1;
 | 
	
		
			
				|  |  | -    // The cipher used. e.g. AES_128_GCM.
 | 
	
		
			
				|  |  | -    string cipher = 2;
 | 
	
		
			
				|  |  | +    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.
 | 
	
	
		
			
				|  | @@ -307,7 +348,11 @@ message Security {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// 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.
 | 
	
	
		
			
				|  | @@ -323,12 +368,17 @@ 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;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// Tcp info for SOL_TCP, TCP_INFO
 | 
	
		
			
				|  |  | +// For use with SocketOption's additional field.  Tcp info for
 | 
	
		
			
				|  |  | +// SOL_TCP and TCP_INFO.
 | 
	
		
			
				|  |  |  message SocketOptionTcpInfo {
 | 
	
		
			
				|  |  |    uint32 tcpi_state = 1;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -366,8 +416,10 @@ message SocketOptionTcpInfo {
 | 
	
		
			
				|  |  |    uint32 tcpi_reordering = 29;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Channelz is a service exposed by gRPC servers that provides detailed debug
 | 
	
		
			
				|  |  | +// information.
 | 
	
		
			
				|  |  |  service Channelz {
 | 
	
		
			
				|  |  | -  // Gets all root channels (e.g. channels the application has directly
 | 
	
		
			
				|  |  | +  // 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.
 | 
	
	
		
			
				|  | @@ -382,6 +434,22 @@ service Channelz {
 | 
	
		
			
				|  |  |    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.
 | 
	
		
			
				|  |  | +  int64 start_channel_id = 1;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +message GetTopChannelsResponse {
 | 
	
		
			
				|  |  | +  // list of channels that the connection detail service knows about.  Sorted in
 | 
	
		
			
				|  |  | +  // ascending channel_id order.
 | 
	
		
			
				|  |  | +  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.
 | 
	
	
		
			
				|  | @@ -415,42 +483,35 @@ message GetServerSocketsResponse {
 | 
	
		
			
				|  |  |    bool end = 2;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -message GetTopChannelsRequest {
 | 
	
		
			
				|  |  | -  // start_channel_id indicates that only channels at or above this id should be
 | 
	
		
			
				|  |  | -  // included in the results.
 | 
	
		
			
				|  |  | -  int64 start_channel_id = 1;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -message GetTopChannelsResponse {
 | 
	
		
			
				|  |  | -  // list of channels that the connection detail service knows about.  Sorted in
 | 
	
		
			
				|  |  | -  // ascending channel_id order.
 | 
	
		
			
				|  |  | -  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 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;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  message GetSocketResponse {
 | 
	
		
			
				|  |  | +  // The Socket that corresponds to the requested socket_id.  This field
 | 
	
		
			
				|  |  | +  // should be set.
 | 
	
		
			
				|  |  |    Socket socket = 1;
 | 
	
		
			
				|  |  |  }
 |