Skip to content

Commit

Permalink
Create health_check rpc
Browse files Browse the repository at this point in the history
* Gives a summary of the health of the node:
  Healthy, Warning, or Critical

* Last validated ledger age:
  <7s is Healthy,
  7s to 20s is Warning
  > 20s is Critcal

* If amendment blocked, Critical

* Number of peers:
  > 7 is Healthy
  1 to 7 is Warning
  0 is Critical

* server state:
  One of full, validating or proposing is Healthy
  One of syncing, tracking or connected is Warning
  All other states are Critical

* load factor:
  <= 100 is Healthy
  101 to 999 is Warning
  >= 1000 is Critical

* If not Healthy, info field contains data that is considered not
  Healthy.

Fixes: #2809
  • Loading branch information
HowardHinnant authored and manojsdoshi committed May 29, 2020
1 parent 3d86b49 commit 0290d0b
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 1 deletion.
89 changes: 88 additions & 1 deletion src/ripple/overlay/impl/OverlayImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1075,11 +1075,98 @@ OverlayImpl::processValidatorList(
return true;
}

bool
OverlayImpl::processHealth(http_request_type const& req, Handoff& handoff)
{
if (req.target() != "/health")
return false;
boost::beast::http::response<json_body> msg;
msg.version(req.version());
msg.insert("Server", BuildInfo::getFullVersionString());
msg.insert("Content-Type", "application/json");
msg.insert("Connection", "close");

auto info = getServerInfo();

int last_validated_ledger_age = std::numeric_limits<int>::max();
if (info.isMember("validated_ledger"))
last_validated_ledger_age = info["validated_ledger"]["age"].asInt();
bool amendment_blocked = false;
if (info.isMember("amendment_blocked"))
amendment_blocked = true;
int number_peers = info["peers"].asInt();
std::string server_state = info["server_state"].asString();
auto load_factor = info["load_factor"].asDouble();

enum { healthy, warning, critical };
int health = healthy;
auto set_health = [&health](int state) {
if (health < state)
health = state;
};

if (last_validated_ledger_age >= 7)
{
msg.body()[jss::info]["validated_ledger"] = last_validated_ledger_age;
if (last_validated_ledger_age < 20)
set_health(warning);
else
set_health(critical);
}

if (amendment_blocked)
{
msg.body()[jss::info]["amendment_blocked"] = true;
set_health(critical);
}

if (number_peers <= 7)
{
msg.body()[jss::info]["peers"] = number_peers;
if (number_peers != 0)
set_health(warning);
else
set_health(critical);
}

if (!(server_state == "full" || server_state == "validating" ||
server_state == "proposing"))
{
msg.body()[jss::info]["server_state"] = server_state;
if (server_state == "syncing" || server_state == "tracking" ||
server_state == "connected")
{
set_health(warning);
}
else
set_health(critical);
}

if (load_factor > 100)
{
msg.body()[jss::info]["load_factor"] = load_factor;
if (load_factor < 1000)
set_health(warning);
else
set_health(critical);
}

if (health != critical)
msg.result(boost::beast::http::status::ok);
else
msg.result(boost::beast::http::status::service_unavailable);

msg.prepare_payload();
handoff.response = std::make_shared<SimpleWriter>(msg);
return true;
}

bool
OverlayImpl::processRequest(http_request_type const& req, Handoff& handoff)
{
// Take advantage of || short-circuiting
return processCrawl(req, handoff) || processValidatorList(req, handoff);
return processCrawl(req, handoff) || processValidatorList(req, handoff) ||
processHealth(req, handoff);
}

Overlay::PeerSequence
Expand Down
8 changes: 8 additions & 0 deletions src/ripple/overlay/impl/OverlayImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,14 @@ class OverlayImpl : public Overlay
bool
processValidatorList(http_request_type const& req, Handoff& handoff);

/** Handles health requests. Health returns information about the
health of the node.
@return true if the request was handled.
*/
bool
processHealth(http_request_type const& req, Handoff& handoff);

/** Handles non-peer protocol requests.
@return true if the request was handled.
Expand Down

0 comments on commit 0290d0b

Please sign in to comment.