Skip to content

Commit

Permalink
Add timestamp to telemetry responses (#2573)
Browse files Browse the repository at this point in the history
  • Loading branch information
wezrule committed Feb 24, 2020
1 parent f1944bd commit 3c8ae09
Show file tree
Hide file tree
Showing 8 changed files with 177 additions and 143 deletions.
139 changes: 80 additions & 59 deletions nano/core_test/node_telemetry.cpp

Large diffs are not rendered by default.

19 changes: 18 additions & 1 deletion nano/node/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,7 @@ void nano::telemetry_ack::serialize (nano::stream & stream_a) const
write (stream_a, *data.patch_version);
write (stream_a, *data.pre_release_version);
write (stream_a, *data.maker);
write (stream_a, std::chrono::duration_cast<std::chrono::milliseconds> (data.timestamp->time_since_epoch ()).count ());
}
}

Expand Down Expand Up @@ -1151,6 +1152,13 @@ bool nano::telemetry_ack::deserialize (nano::stream & stream_a)
read (stream_a, out);
data.maker = out;
}

if (header.extensions.to_ulong () > telemetry_data::size_v1)
{
uint64_t timestamp;
read (stream_a, timestamp);
data.timestamp = std::chrono::system_clock::time_point (std::chrono::milliseconds (timestamp));
}
}
}
catch (std::runtime_error const &)
Expand Down Expand Up @@ -1209,6 +1217,10 @@ nano::error nano::telemetry_data::serialize_json (nano::jsonconfig & json) const
{
json.put ("maker", *maker);
}
if (timestamp.is_initialized ())
{
json.put ("timestamp", std::chrono::duration_cast<std::chrono::milliseconds> (timestamp->time_since_epoch ()).count ());
}
return json.get_error ();
}

Expand Down Expand Up @@ -1236,13 +1248,18 @@ nano::error nano::telemetry_data::deserialize_json (nano::jsonconfig & json)
patch_version = json.get_optional<uint8_t> ("patch_version");
pre_release_version = json.get_optional<uint8_t> ("pre_release_version");
maker = json.get_optional<uint8_t> ("maker");
auto timestamp_l = json.get_optional<uint64_t> ("timestamp");
if (timestamp_l.is_initialized ())
{
timestamp = std::chrono::system_clock::time_point (std::chrono::milliseconds (*timestamp_l));
}

return json.get_error ();
}

bool nano::telemetry_data::operator== (nano::telemetry_data const & data_a) const
{
return (block_count == data_a.block_count && cemented_count == data_a.cemented_count && unchecked_count == data_a.unchecked_count && account_count == data_a.account_count && bandwidth_cap == data_a.bandwidth_cap && uptime == data_a.uptime && peer_count == data_a.peer_count && protocol_version == data_a.protocol_version && genesis_block == data_a.genesis_block && major_version == data_a.major_version && minor_version == data_a.minor_version && patch_version == data_a.patch_version && pre_release_version == data_a.pre_release_version && maker == data_a.maker);
return (block_count == data_a.block_count && cemented_count == data_a.cemented_count && unchecked_count == data_a.unchecked_count && account_count == data_a.account_count && bandwidth_cap == data_a.bandwidth_cap && uptime == data_a.uptime && peer_count == data_a.peer_count && protocol_version == data_a.protocol_version && genesis_block == data_a.genesis_block && major_version == data_a.major_version && minor_version == data_a.minor_version && patch_version == data_a.patch_version && pre_release_version == data_a.pre_release_version && maker == data_a.maker && timestamp == data_a.timestamp);
}

bool nano::telemetry_data::operator!= (nano::telemetry_data const & data_a) const
Expand Down
4 changes: 3 additions & 1 deletion nano/node/common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -349,14 +349,16 @@ class telemetry_data
boost::optional<uint8_t> patch_version;
boost::optional<uint8_t> pre_release_version;
boost::optional<uint8_t> maker; // 0 for NF node
boost::optional<std::chrono::system_clock::time_point> timestamp;

nano::error serialize_json (nano::jsonconfig & json) const;
nano::error deserialize_json (nano::jsonconfig & json);
bool operator== (nano::telemetry_data const &) const;
bool operator!= (nano::telemetry_data const &) const;

static auto constexpr size_v0 = sizeof (block_count) + sizeof (cemented_count) + sizeof (unchecked_count) + sizeof (account_count) + sizeof (bandwidth_cap) + sizeof (peer_count) + sizeof (protocol_version) + sizeof (uptime) + sizeof (genesis_block) + sizeof (major_version);
static auto constexpr size = size_v0 + sizeof (decltype (minor_version)::value_type) + sizeof (decltype (patch_version)::value_type) + sizeof (decltype (pre_release_version)::value_type) + sizeof (decltype (maker)::value_type);
static auto constexpr size_v1 = size_v0 + sizeof (decltype (minor_version)::value_type) + sizeof (decltype (patch_version)::value_type) + sizeof (decltype (pre_release_version)::value_type) + sizeof (decltype (maker)::value_type);
static auto constexpr size = size_v1 + sizeof (uint64_t);
};
class telemetry_req final : public message
{
Expand Down
28 changes: 12 additions & 16 deletions nano/node/json_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3941,7 +3941,6 @@ void nano::json_handler::telemetry ()

nano::jsonconfig config_l;
auto err = telemetry_data.serialize_json (config_l);
config_l.put ("timestamp", std::chrono::duration_cast<std::chrono::seconds> (std::chrono::system_clock::now ().time_since_epoch ()).count ());
auto const & ptree = config_l.get_tree ();

if (!err)
Expand Down Expand Up @@ -3979,12 +3978,11 @@ void nano::json_handler::telemetry ()
if (!ec)
{
debug_assert (channel);
node.telemetry.get_metrics_single_peer_async (channel, [rpc_l](auto const & single_telemetry_metric_a) {
if (!single_telemetry_metric_a.error)
node.telemetry.get_metrics_single_peer_async (channel, [rpc_l](auto const & telemetry_response_a) {
if (!telemetry_response_a.error)
{
nano::jsonconfig config_l;
auto err = single_telemetry_metric_a.telemetry_data_time_pair.data.serialize_json (config_l);
config_l.put ("timestamp", std::chrono::duration_cast<std::chrono::seconds> (single_telemetry_metric_a.telemetry_data_time_pair.system_last_updated.time_since_epoch ()).count ());
auto err = telemetry_response_a.telemetry_data.serialize_json (config_l);
auto const & ptree = config_l.get_tree ();

if (!err)
Expand Down Expand Up @@ -4015,15 +4013,14 @@ void nano::json_handler::telemetry ()
// setting "raw" to true returns metrics from all nodes requested.
auto raw = request.get_optional<bool> ("raw");
auto output_raw = raw.value_or (false);
node.telemetry.get_metrics_peers_async ([rpc_l, output_raw](auto const & batched_telemetry_metrics_a) {
node.telemetry.get_metrics_peers_async ([rpc_l, output_raw](telemetry_data_responses const & telemetry_responses_a) {
if (output_raw)
{
boost::property_tree::ptree metrics;
for (auto & telemetry_metrics : batched_telemetry_metrics_a.telemetry_data_time_pairs)
for (auto & telemetry_metrics : telemetry_responses_a.telemetry_datas)
{
nano::jsonconfig config_l;
auto err = telemetry_metrics.second.data.serialize_json (config_l);
config_l.put ("timestamp", std::chrono::duration_cast<std::chrono::seconds> (telemetry_metrics.second.system_last_updated.time_since_epoch ()).count ());
auto err = telemetry_metrics.second.serialize_json (config_l);
config_l.put ("address", telemetry_metrics.first.address ());
config_l.put ("port", telemetry_metrics.first.port ());
if (!err)
Expand All @@ -4041,15 +4038,14 @@ void nano::json_handler::telemetry ()
else
{
nano::jsonconfig config_l;
std::vector<nano::telemetry_data_time_pair> telemetry_data_time_pairs;
telemetry_data_time_pairs.reserve (batched_telemetry_metrics_a.telemetry_data_time_pairs.size ());
std::transform (batched_telemetry_metrics_a.telemetry_data_time_pairs.begin (), batched_telemetry_metrics_a.telemetry_data_time_pairs.end (), std::back_inserter (telemetry_data_time_pairs), [](auto const & telemetry_data_time_pair_a) {
return telemetry_data_time_pair_a.second;
std::vector<nano::telemetry_data> telemetry_datas;
telemetry_datas.reserve (telemetry_responses_a.telemetry_datas.size ());
std::transform (telemetry_responses_a.telemetry_datas.begin (), telemetry_responses_a.telemetry_datas.end (), std::back_inserter (telemetry_datas), [](auto const & endpoint_telemetry_data) {
return endpoint_telemetry_data.second;
});

auto average_telemetry_metrics = nano::consolidate_telemetry_data_time_pairs (telemetry_data_time_pairs);
auto err = average_telemetry_metrics.data.serialize_json (config_l);
config_l.put ("timestamp", std::chrono::duration_cast<std::chrono::seconds> (average_telemetry_metrics.system_last_updated.time_since_epoch ()).count ());
auto average_telemetry_metrics = nano::consolidate_telemetry_data (telemetry_datas);
auto err = average_telemetry_metrics.serialize_json (config_l);
auto const & ptree = config_l.get_tree ();

if (!err)
Expand Down
Loading

0 comments on commit 3c8ae09

Please sign in to comment.