30 #include "absl/flags/flag.h"
31 #include "absl/strings/str_format.h"
32 #include "absl/strings/str_join.h"
33 #include "google/protobuf/text_format.h"
49 #include "src/proto/grpc/channelz/channelz.pb.h"
59 "sampling interval in seconds");
66 using grpc::channelz::v1::GetChannelRequest;
67 using grpc::channelz::v1::GetChannelResponse;
68 using grpc::channelz::v1::GetServersRequest;
69 using grpc::channelz::v1::GetServersResponse;
70 using grpc::channelz::v1::GetSocketRequest;
71 using grpc::channelz::v1::GetSocketResponse;
72 using grpc::channelz::v1::GetSubchannelRequest;
73 using grpc::channelz::v1::GetSubchannelResponse;
74 using grpc::channelz::v1::GetTopChannelsRequest;
75 using grpc::channelz::v1::GetTopChannelsResponse;
82 return server.ref().server_id();
87 return channel.ref().channel_id();
98 return socket.ref().socket_id();
103 return server.ref().name();
120 return socket.ref().name();
125 GetChannelRequest get_channel_request;
126 get_channel_request.set_channel_id(channel_id);
127 GetChannelResponse get_channel_response;
128 ClientContext get_channel_context;
129 get_channel_context.set_deadline(
132 &get_channel_context, get_channel_request, &get_channel_response);
135 get_channel_context.debug_error_string().c_str());
138 return get_channel_response.channel();
143 GetSubchannelRequest get_subchannel_request;
144 get_subchannel_request.set_subchannel_id(subchannel_id);
145 GetSubchannelResponse get_subchannel_response;
146 ClientContext get_subchannel_context;
147 get_subchannel_context.set_deadline(
150 get_subchannel_request,
151 &get_subchannel_response);
154 get_subchannel_context.debug_error_string().c_str());
157 return get_subchannel_response.subchannel();
162 GetSocketRequest get_socket_request;
163 get_socket_request.set_socket_id(socket_id);
164 GetSocketResponse get_socket_response;
165 ClientContext get_socket_context;
166 get_socket_context.set_deadline(
169 &get_socket_context, get_socket_request, &get_socket_response);
172 get_socket_context.debug_error_string().c_str());
175 return get_socket_response.socket();
183 std::queue<grpc::channelz::v1::Channel>& channel_queue,
184 std::queue<grpc::channelz::v1::Subchannel>& subchannel_queue) {
187 if (
channel.channel_ref_size() > 0 ||
channel.subchannel_ref_size() > 0) {
188 if (
channel.channel_ref_size() > 0) {
189 std::cout <<
"channel: ";
190 for (
const auto& _channelref :
channel.channel_ref()) {
191 int64_t ch_id = _channelref.channel_id();
192 std::cout <<
"ID" << ch_id <<
"_" << _channelref.name() <<
" ";
194 channel_queue.push(
ch);
200 if (
channel.subchannel_ref_size() > 0) {
204 if (
channel.subchannel_ref_size() > 0) {
205 std::cout <<
"subchannel: ";
206 for (
const auto& _subchannelref :
channel.subchannel_ref()) {
207 int64_t subch_id = _subchannelref.subchannel_id();
208 std::cout <<
"ID" << subch_id <<
"_" << _subchannelref.name() <<
" ";
210 subchannel_queue.push(subch);
217 }
else if (
channel.socket_ref_size() > 0) {
218 std::cout <<
"socket: ";
219 for (
const auto& _socketref :
channel.socket_ref()) {
220 int64_t so_id = _socketref.socket_id();
221 std::cout <<
"ID" << so_id <<
"_" << _socketref.name() <<
" ";
229 std::cout << std::endl;
237 std::queue<grpc::channelz::v1::Channel>& channel_queue,
238 std::queue<grpc::channelz::v1::Subchannel>& subchannel_queue) {
244 std::cout <<
"channel: ";
245 for (
const auto& _channelref :
subchannel.channel_ref()) {
246 int64_t ch_id = _channelref.channel_id();
247 std::cout <<
"ID" << ch_id <<
"_" << _channelref.name() <<
" ";
249 channel_queue.push(
ch);
260 std::cout <<
"subchannel: ";
261 for (
const auto& _subchannelref :
subchannel.subchannel_ref()) {
262 int64_t subch_id = _subchannelref.subchannel_id();
263 std::cout <<
"ID" << subch_id <<
"_" << _subchannelref.name() <<
" ";
265 subchannel_queue.push(subch);
272 }
else if (
subchannel.socket_ref_size() > 0) {
273 std::cout <<
"socket: ";
274 for (
const auto& _socketref :
subchannel.socket_ref()) {
275 int64_t so_id = _socketref.socket_id();
276 std::cout <<
"ID" << so_id <<
"_" << _socketref.name() <<
" ";
284 std::cout << std::endl;
294 std::shared_ptr<grpc::ChannelCredentials> channel_creds =
297 if (!channel_creds) {
299 "Wrong user credential type: %s. Allowed credential types: "
300 "INSECURE_CREDENTIALS, ssl, alts, google_default_credentials.",
304 std::shared_ptr<grpc::Channel>
channel =
315 GetServersRequest get_servers_request;
316 GetServersResponse get_servers_response;
317 ClientContext get_servers_context;
318 get_servers_context.set_deadline(
320 get_servers_request.set_start_server_id(server_start_id);
322 &get_servers_context, get_servers_request, &get_servers_response);
326 "Error status UNIMPLEMENTED. Please check and make sure "
327 "channelz has been registered on the server being queried.");
330 "GetServers RPC with GetServersRequest.server_start_id=%d, "
332 int(server_start_id),
333 get_servers_context.debug_error_string().c_str());
337 for (
const auto&
_server : get_servers_response.server()) {
341 if (!get_servers_response.end()) {
347 std::cout <<
"Number of servers = " <<
all_servers_.size() << std::endl;
356 for (
const auto& _socket :
_server.listen_socket()) {
357 int64_t so_id = _socket.socket_id();
358 std::cout <<
"ID" << so_id <<
"_" << _socket.name() <<
" ";
365 std::cout << std::endl;
375 GetTopChannelsRequest get_top_channels_request;
376 GetTopChannelsResponse get_top_channels_response;
377 ClientContext get_top_channels_context;
378 get_top_channels_context.set_deadline(
380 get_top_channels_request.set_start_channel_id(channel_start_id);
382 &get_top_channels_context, get_top_channels_request,
383 &get_top_channels_response);
386 "GetTopChannels RPC with "
387 "GetTopChannelsRequest.channel_start_id=%d failed: %s",
388 int(channel_start_id),
389 get_top_channels_context.debug_error_string().c_str());
392 for (
const auto& _topchannel : get_top_channels_response.channel()) {
397 if (!get_top_channels_response.end()) {
403 std::cout << std::endl
412 std::queue<grpc::channelz::v1::Channel> channel_queue;
413 std::queue<grpc::channelz::v1::Subchannel> subchannel_queue;
414 std::cout <<
"Tree depth = " << tree_depth << std::endl;
416 while (!channel_queue.empty() || !subchannel_queue.empty()) {
418 std::cout <<
"Tree depth = " << tree_depth << std::endl;
419 int ch_q_size = channel_queue.size();
420 int subch_q_size = subchannel_queue.size();
421 for (
int i = 0;
i < ch_q_size; ++
i) {
426 for (
int i = 0;
i < subch_q_size; ++
i) {
428 subchannel_queue.pop();
432 std::cout << std::endl;
445 printf(
"%s\n", data_str.c_str());
452 printf(
"%s\n", data_str.c_str());
458 printf(
"%s\n", data_str.c_str());
461 std::cout <<
"socket ID" <<
GetSocketID(_socket) <<
"_"
464 printf(
"%s\n", data_str.c_str());
517 std::stringstream ss;
519 ss << std::put_time(std::localtime(&
time_now),
"%F %T");
522 const time_t time_ago = ago.
tv_sec;
523 ss << std::put_time(std::localtime(&time_ago),
"%F %T");
564 int main(
int argc,
char** argv) {
572 std::cout <<
"Wait for sampling interval "
580 std::cout <<
"##### " <<
i <<
"th sampling #####" << std::endl;
588 output_file << channelz_sampler.
DumpJson() <<
"\n" << std::flush;