From f55c0a5292757ff08e1fa38a91cfc43ee666db10 Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Fri, 31 May 2024 17:02:06 -0700 Subject: [PATCH] Fix race condition by pre-building the cluster json data for services.json --- src/telemetry/Manager.cc | 11 +++++++---- src/telemetry/Manager.h | 8 ++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/telemetry/Manager.cc b/src/telemetry/Manager.cc index 8b0a037e74..d414b20667 100644 --- a/src/telemetry/Manager.cc +++ b/src/telemetry/Manager.cc @@ -44,6 +44,8 @@ void Manager::InitPostScript() { static auto manager_type = node_type_type->Lookup("Cluster", "MANAGER"); if ( local_node_type == manager_type ) { + BuildClusterJson(); + callbacks = new CivetCallbacks(); callbacks->begin_request = [](struct mg_connection* conn) -> int { // Handle the services.json request ourselves by building up a response based on @@ -414,7 +416,7 @@ ValPtr Manager::CollectHistogramMetrics(std::string_view prefix_pattern, std::st return ret_val; } -std::string Manager::GetClusterJson() const { +void Manager::BuildClusterJson() { rapidjson::StringBuffer buffer; json::detail::NullDoubleWriter writer(buffer); @@ -423,8 +425,9 @@ std::string Manager::GetClusterJson() const { writer.Key("targets"); writer.StartArray(); - auto cluster_nodes = id::find_val("Cluster::nodes")->AsTableVal()->ToMap(); - for ( const auto& [idx, value] : cluster_nodes ) { + auto& node_val = id::find_val("Cluster::nodes"); + auto node_map = node_val->AsTableVal()->ToMap(); + for ( const auto& [idx, value] : node_map ) { auto node = value->AsRecordVal(); auto ip = node->GetField("ip"); auto port = node->GetField("metrics_port"); @@ -440,7 +443,7 @@ std::string Manager::GetClusterJson() const { writer.EndObject(); writer.EndArray(); - return buffer.GetString(); + cluster_json = buffer.GetString(); } CounterFamilyPtr Manager::CounterFamily(std::string_view prefix, std::string_view name, diff --git a/src/telemetry/Manager.h b/src/telemetry/Manager.h index 8a1deb5fc4..f81a39a6d5 100644 --- a/src/telemetry/Manager.h +++ b/src/telemetry/Manager.h @@ -200,7 +200,7 @@ public: * @return A JSON description of the cluster configuration for reporting * to Prometheus for service discovery requests. */ - std::string GetClusterJson() const; + std::string GetClusterJson() const { return cluster_json; } /** * @return The pointer to the prometheus-cpp registry used by the telemetry @@ -230,6 +230,7 @@ protected: private: RecordValPtr GetMetricOptsRecord(const prometheus::MetricFamily& metric_family); + void BuildClusterJson(); std::map> families; std::map opts_records; @@ -242,11 +243,10 @@ private: GaugePtr cpu_gauge; GaugePtr fds_gauge; - std::string endpoint_name; - std::vector export_prefixes; - std::shared_ptr prometheus_registry; std::unique_ptr prometheus_exposer; + + std::string cluster_json; }; } // namespace zeek::telemetry