Console: print node overall health in status

This commit is contained in:
SChernykh
2025-07-13 16:37:07 +02:00
parent 81431b12fb
commit 01ae862507
2 changed files with 77 additions and 3 deletions

View File

@@ -203,9 +203,14 @@ static void do_help(p2pool * /* m_pool */, const char * /* args */)
static void do_status(p2pool *m_pool, const char * /* args */)
{
m_pool->side_chain().print_status();
if (m_pool->stratum_server()) {
m_pool->stratum_server()->print_status();
const SideChain& c = m_pool->side_chain();
c.print_status();
StratumServer* stratum = m_pool->stratum_server();
if (stratum) {
stratum->print_status();
}
P2PServer* p2p = m_pool->p2p_server();
@@ -224,6 +229,72 @@ static void do_status(p2pool *m_pool, const char * /* args */)
if (p2p) {
p2p->check_for_updates(true);
}
int node_health = 10;
std::vector<const char*> comments;
if (!stratum) {
node_health = 0;
comments.push_back("Stratum server not loaded");
}
if (!p2p) {
node_health = 0;
comments.push_back("P2P server not loaded");
}
else if (p2p->num_connections() == 0) {
node_health = 0;
comments.push_back("No p2p connections");
}
else if (p2p->num_incoming_connections() == 0) {
node_health -= 1;
comments.push_back("No incoming p2p connections");
}
const PoolBlock* tip = c.chainTip();
if (!tip) {
node_health = 0;
comments.push_back("Sidechain not loaded");
}
else if (!c.precalcFinished()) {
node_health -= 1;
comments.push_back("Sidechain just synced, it needs a few minutes to confirm that everything is ok");
}
const MinerData data = m_pool->miner_data();
if (tip && (data.height < tip->m_txinGenHeight)) {
node_health -= 5;
comments.push_back("Your Monero node is lagging");
}
if (stratum && (stratum->num_connections() == 0)) {
node_health -= 1;
comments.push_back("No stratum connections");
}
char buf[64] = {};
log::Stream s(buf);
if (node_health >= 8) {
s << log::LightGreen();
}
else if (node_health >= 5) {
s << log::LightYellow();
}
else {
s << log::LightRed();
}
s << "Node health: " << std::max(node_health, 0) << "/10";
LOGINFO(0, log::const_buf(buf, s.m_pos));
for (const char* comment : comments) {
LOGINFO(0, log::LightYellow() << comment);
}
}
static void do_loglevel(p2pool * /* m_pool */, const char *args)

View File

@@ -140,6 +140,9 @@ public:
template<typename T>
[[nodiscard]] FORCEINLINE bool send(Client* client, T&& callback, bool raw = false) { return send_internal(client, Callback<size_t, uint8_t*, size_t>::Derived<T>(std::move(callback)), raw); }
[[nodiscard]] FORCEINLINE uint32_t num_connections() const { return m_numConnections.load(); }
[[nodiscard]] FORCEINLINE uint32_t num_incoming_connections() const { return m_numIncomingConnections.load(); }
private:
static void on_new_connection(uv_stream_t* server, int status);
static void on_connection_close(uv_handle_t* handle);