Channelz: track listen sockets in the server node

pull/19698/head
Hope Casey-Allen 6 years ago
parent 1194927905
commit 6a2bec7fcd
  1. 24
      src/core/lib/channel/channelz.cc
  2. 19
      src/core/lib/channel/channelz.h
  3. 15
      src/core/lib/surface/server.cc
  4. 4
      src/core/lib/surface/server.h

@ -303,9 +303,7 @@ void ChannelNode::RemoveChildSubchannel(intptr_t child_uuid) {
// //
ServerNode::ServerNode(grpc_server* server, size_t channel_tracer_max_nodes) ServerNode::ServerNode(grpc_server* server, size_t channel_tracer_max_nodes)
: BaseNode(EntityType::kServer), : BaseNode(EntityType::kServer), trace_(channel_tracer_max_nodes) {}
server_(server),
trace_(channel_tracer_max_nodes) {}
ServerNode::~ServerNode() {} ServerNode::~ServerNode() {}
@ -319,6 +317,16 @@ void ServerNode::RemoveChildSocket(intptr_t child_uuid) {
child_sockets_.erase(child_uuid); child_sockets_.erase(child_uuid);
} }
void ServerNode::AddChildListenSocket(intptr_t child_uuid) {
MutexLock lock(&child_mu_);
child_listen_sockets_.insert(MakePair(child_uuid, true));
}
void ServerNode::RemoveChildListenSocket(intptr_t child_uuid) {
MutexLock lock(&child_mu_);
child_listen_sockets_.erase(child_uuid);
}
char* ServerNode::RenderServerSockets(intptr_t start_socket_id, char* ServerNode::RenderServerSockets(intptr_t start_socket_id,
intptr_t max_results) { intptr_t max_results) {
// If user does not set max_results, we choose 500. // If user does not set max_results, we choose 500.
@ -382,17 +390,17 @@ grpc_json* ServerNode::RenderJson() {
// ask CallCountingHelper to populate trace and call count data. // ask CallCountingHelper to populate trace and call count data.
call_counter_.PopulateCallCounts(json); call_counter_.PopulateCallCounts(json);
json = top_level_json; json = top_level_json;
ChildRefsList listen_sockets; // Render listen sockets
grpc_server_populate_listen_sockets(server_, &listen_sockets); MutexLock lock(&child_mu_);
if (!listen_sockets.empty()) { if (!child_listen_sockets_.empty()) {
grpc_json* array_parent = grpc_json_create_child( grpc_json* array_parent = grpc_json_create_child(
nullptr, json, "listenSocket", nullptr, GRPC_JSON_ARRAY, false); nullptr, json, "listenSocket", nullptr, GRPC_JSON_ARRAY, false);
for (size_t i = 0; i < listen_sockets.size(); ++i) { for (const auto& it : child_listen_sockets_) {
json_iterator = json_iterator =
grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr, grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
GRPC_JSON_OBJECT, false); GRPC_JSON_OBJECT, false);
grpc_json_add_number_string_child(json_iterator, nullptr, "socketId", grpc_json_add_number_string_child(json_iterator, nullptr, "socketId",
listen_sockets[i]); it.first);
} }
} }
return top_level_json; return top_level_json;

@ -58,11 +58,6 @@ namespace channelz {
grpc_arg MakeParentUuidArg(intptr_t parent_uuid); grpc_arg MakeParentUuidArg(intptr_t parent_uuid);
intptr_t GetParentUuidFromArgs(const grpc_channel_args& args); intptr_t GetParentUuidFromArgs(const grpc_channel_args& args);
// TODO(ncteisen), this only contains the uuids of the children for now,
// since that is all that is strictly needed. In a future enhancement we will
// add human readable names as in the channelz.proto
typedef InlinedVector<intptr_t, 10> ChildRefsList;
class SocketNode; class SocketNode;
namespace testing { namespace testing {
@ -217,6 +212,13 @@ class ServerNode : public BaseNode {
void RemoveChildSocket(intptr_t child_uuid); void RemoveChildSocket(intptr_t child_uuid);
// TODO(ncteisen): This only takes in the uuid of the child socket for now,
// since that is all that is strictly needed. In a future enhancement we will
// add human readable names as in the channelz.proto
void AddChildListenSocket(intptr_t child_uuid);
void RemoveChildListenSocket(intptr_t child_uuid);
// proxy methods to composed classes. // proxy methods to composed classes.
void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) { void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) {
trace_.AddTraceEvent(severity, data); trace_.AddTraceEvent(severity, data);
@ -232,11 +234,14 @@ class ServerNode : public BaseNode {
void RecordCallSucceeded() { call_counter_.RecordCallSucceeded(); } void RecordCallSucceeded() { call_counter_.RecordCallSucceeded(); }
private: private:
grpc_server* server_;
CallCountingHelper call_counter_; CallCountingHelper call_counter_;
ChannelTrace trace_; ChannelTrace trace_;
Mutex child_mu_; // Guards child map below. Mutex child_mu_; // Guards child maps below.
Map<intptr_t, RefCountedPtr<SocketNode>> child_sockets_; Map<intptr_t, RefCountedPtr<SocketNode>> child_sockets_;
// TODO(roth): We don't actually use the values here, only the keys, so
// these should be sets instead of maps, but we don't currently have a set
// implementation. Change this if/when we have one.
Map<intptr_t, bool> child_listen_sockets_;
}; };
// Handles channelz bookkeeping for sockets // Handles channelz bookkeeping for sockets

@ -1252,15 +1252,6 @@ void grpc_server_setup_transport(
grpc_transport_perform_op(transport, op); grpc_transport_perform_op(transport, op);
} }
void grpc_server_populate_listen_sockets(
grpc_server* server, grpc_core::channelz::ChildRefsList* listen_sockets) {
gpr_mu_lock(&server->mu_global);
for (listener* l = server->listeners; l != nullptr; l = l->next) {
listen_sockets->push_back(l->socket_uuid);
}
gpr_mu_unlock(&server->mu_global);
}
void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) { void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) {
(void)done_arg; (void)done_arg;
gpr_free(storage); gpr_free(storage);
@ -1348,6 +1339,9 @@ void grpc_server_shutdown_and_notify(grpc_server* server,
GRPC_CLOSURE_INIT(&l->destroy_done, listener_destroy_done, server, GRPC_CLOSURE_INIT(&l->destroy_done, listener_destroy_done, server,
grpc_schedule_on_exec_ctx); grpc_schedule_on_exec_ctx);
l->destroy(server, l->arg, &l->destroy_done); l->destroy(server, l->arg, &l->destroy_done);
if (server->channelz_server != nullptr && l->socket_uuid != 0) {
server->channelz_server->RemoveChildListenSocket(l->socket_uuid);
}
} }
channel_broadcaster_shutdown(&broadcaster, true /* send_goaway */, channel_broadcaster_shutdown(&broadcaster, true /* send_goaway */,
@ -1411,6 +1405,9 @@ void grpc_server_add_listener(grpc_server* server, void* arg,
l->start = start; l->start = start;
l->destroy = destroy; l->destroy = destroy;
l->socket_uuid = socket_uuid; l->socket_uuid = socket_uuid;
if (server->channelz_server != nullptr && socket_uuid != 0) {
server->channelz_server->AddChildListenSocket(socket_uuid);
}
l->next = server->listeners; l->next = server->listeners;
server->listeners = l; server->listeners = l;
} }

@ -51,10 +51,6 @@ void grpc_server_setup_transport(
socket_node, socket_node,
grpc_resource_user* resource_user = nullptr); grpc_resource_user* resource_user = nullptr);
/* fills in the uuids of all listen sockets on this server */
void grpc_server_populate_listen_sockets(
grpc_server* server, grpc_core::channelz::ChildRefsList* listen_sockets);
grpc_core::channelz::ServerNode* grpc_server_get_channelz_node( grpc_core::channelz::ServerNode* grpc_server_get_channelz_node(
grpc_server* server); grpc_server* server);

Loading…
Cancel
Save