Skip to content

Commit ce57bf6

Browse files
committed
cli: create peer connections report sorted by dir, minping
1 parent f5edd66 commit ce57bf6

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

src/bitcoin-cli.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,11 @@ class NetinfoRequestHandler : public BaseRequestHandler
374374
if (!batch[ID_NETWORKINFO]["error"].isNull()) return batch[ID_NETWORKINFO];
375375

376376
// Count peer connection totals, and if m_verbose is true, store peer data in a vector of structs.
377+
const int64_t time_now{GetSystemTimeInSeconds()};
377378
int ipv4_i{0}, ipv6_i{0}, onion_i{0}, block_relay_i{0}, total_i{0}; // inbound conn counters
378379
int ipv4_o{0}, ipv6_o{0}, onion_o{0}, block_relay_o{0}, total_o{0}; // outbound conn counters
380+
size_t max_peer_id_length{2}, max_version_length{1};
381+
bool is_asmap_on{false};
379382
std::vector<Peer> peers;
380383
const UniValue& getpeerinfo{batch[ID_PEERINFO]["result"]};
381384

@@ -420,13 +423,45 @@ class NetinfoRequestHandler : public BaseRequestHandler
420423
const double min_ping{peer["minping"].isNull() ? -1 : peer["minping"].get_real()};
421424
const double ping{peer["pingtime"].isNull() ? -1 : peer["pingtime"].get_real()};
422425
peers.push_back({peer_id, mapped_as, version, conn_time, last_recv, last_send, min_ping, ping, addr, sub_version, net_type, is_block_relay, !is_inbound});
426+
max_peer_id_length = std::max(ToString(peer_id).length(), max_peer_id_length);
427+
max_version_length = std::max((ToString(version) + sub_version).length(), max_version_length);
428+
is_asmap_on |= (mapped_as != 0);
423429
}
424430
}
425431

426432
// Generate report header.
427433
const UniValue& networkinfo{batch[ID_NETWORKINFO]["result"]};
428434
std::string result{strprintf("%s %s%s - %i%s\n\n", PACKAGE_NAME, FormatFullVersion(), ChainToString(), networkinfo["protocolversion"].get_int(), networkinfo["subversion"].get_str())};
429435

436+
// Report detailed peer connections list sorted by direction and minimum ping time.
437+
if (m_verbose && !peers.empty()) {
438+
std::sort(peers.begin(), peers.end());
439+
result += "Peer connections sorted by direction and min ping\n<-> relay net minping ping lastsend lastrecv uptime ";
440+
if (is_asmap_on) result += " asmap ";
441+
result += strprintf("%*s %-*s address\n", max_peer_id_length, "id", max_version_length, "version");
442+
for (const Peer& peer : peers) {
443+
std::string version{ToString(peer.version) + peer.sub_version};
444+
result += strprintf(
445+
"%3s %5s %5s%8s%7s %8s %8s%7s%*i %*s %-*s %s\n",
446+
peer.is_outbound ? "out" : "in",
447+
peer.is_block_relay ? "block" : "full",
448+
NetTypeEnumToString(peer.net_type),
449+
peer.min_ping == -1 ? "" : ToString(round(1000 * peer.min_ping)),
450+
peer.ping == -1 ? "" : ToString(round(1000 * peer.ping)),
451+
peer.last_send == 0 ? "" : ToString(time_now - peer.last_send),
452+
peer.last_recv == 0 ? "" : ToString(time_now - peer.last_recv),
453+
peer.conn_time == 0 ? "" : ToString((time_now - peer.conn_time) / 60),
454+
is_asmap_on ? 7 : 0, // variable spacing
455+
is_asmap_on && peer.mapped_as != 0 ? ToString(peer.mapped_as) : "",
456+
max_peer_id_length, // variable spacing
457+
peer.id,
458+
max_version_length, // variable spacing
459+
version == "0" ? "" : version,
460+
peer.addr);
461+
}
462+
result += " ms ms sec sec min\n\n";
463+
}
464+
430465
// Report peer connection totals by type.
431466
total_i = ipv4_i + ipv6_i + onion_i;
432467
total_o = ipv4_o + ipv6_o + onion_o;

0 commit comments

Comments
 (0)