mirror of
https://github.com/zeek/zeek.git
synced 2025-10-15 04:58:21 +00:00
Fix race condition by pre-building the cluster json data for services.json
This commit is contained in:
parent
00b24b043a
commit
f55c0a5292
2 changed files with 11 additions and 8 deletions
|
@ -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<AddrVal>("ip");
|
||||
auto port = node->GetField<PortVal>("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,
|
||||
|
|
|
@ -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<std::string, std::shared_ptr<MetricFamily>> families;
|
||||
std::map<std::string, RecordValPtr> opts_records;
|
||||
|
@ -242,11 +243,10 @@ private:
|
|||
GaugePtr cpu_gauge;
|
||||
GaugePtr fds_gauge;
|
||||
|
||||
std::string endpoint_name;
|
||||
std::vector<std::string> export_prefixes;
|
||||
|
||||
std::shared_ptr<prometheus::Registry> prometheus_registry;
|
||||
std::unique_ptr<prometheus::Exposer> prometheus_exposer;
|
||||
|
||||
std::string cluster_json;
|
||||
};
|
||||
|
||||
} // namespace zeek::telemetry
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue