diff --git a/src/telemetry/Manager.cc b/src/telemetry/Manager.cc index 7159361cfb..fe0fb572d7 100644 --- a/src/telemetry/Manager.cc +++ b/src/telemetry/Manager.cc @@ -206,29 +206,6 @@ RecordValPtr Manager::GetMetricOptsRecord(const prometheus::MetricFamily& metric return record_val; } -static bool compare_string_vectors(const VectorValPtr& a, const VectorValPtr& b) { - if ( a->Size() < b->Size() ) - return true; - if ( a->Size() > b->Size() ) - return false; - - auto a_v = a->RawVec(); - auto b_v = b->RawVec(); - - auto b_it = b_v.begin(); - for ( auto a_it = a_v.begin(); a_it != a_v.end(); ++a_it, ++b_it ) { - if ( ! a_it->has_value() ) - return false; - if ( ! b_it->has_value() ) - return true; - - if ( (*a_it)->AsString()->ToStdStringView() < (*b_it)->AsString()->ToStdStringView() ) - return true; - } - - return false; -} - static bool comparer(const std::optional& a, const std::optional& b, const RecordTypePtr& type) { if ( ! a ) return false; @@ -239,9 +216,40 @@ static bool comparer(const std::optional& a, const std::optional& b, auto a_r = a->ToVal(type)->AsRecordVal(); auto b_r = b->ToVal(type)->AsRecordVal(); + auto a_opts = a_r->GetField("opts"); + auto b_opts = b_r->GetField("opts"); + + auto a_name = a_opts->GetField("name"); + auto b_name = b_opts->GetField("name"); + if ( a_name->Len() > b_name->Len() ) + return false; + if ( a_name->Len() < b_name->Len() ) + return true; + if ( memcmp(a_name->Bytes(), b_name->Bytes(), a_name->Len()) < 0 ) + return true; + + auto a_prefix = a_opts->GetField("prefix"); + auto b_prefix = b_opts->GetField("prefix"); + if ( a_prefix->Len() > b_prefix->Len() ) + return false; + if ( a_prefix->Len() < b_prefix->Len() ) + return true; + if ( memcmp(a_prefix->Bytes(), b_prefix->Bytes(), a_prefix->Len()) < 0 ) + return true; + auto a_labels = a_r->GetField("label_values"); + std::vector a_label_vec; + a_label_vec.reserve(a_labels->Size()); + for ( const auto& sv : a_labels->RawVec() ) + a_label_vec.push_back(sv->AsString()->ToStdString()); + auto b_labels = b_r->GetField("label_values"); - return compare_string_vectors(a_labels, b_labels); + std::vector b_label_vec; + b_label_vec.reserve(b_labels->Size()); + for ( const auto& sv : b_labels->RawVec() ) + b_label_vec.push_back(sv->AsString()->ToStdString()); + + return a_label_vec < b_label_vec; } static bool compare_metrics(const std::optional& a, const std::optional& b) { @@ -308,6 +316,8 @@ ValPtr Manager::CollectMetrics(std::string_view prefix_pattern, std::string_view full_pattern.append("*"); auto collected = prometheus_registry->Collect(); + ret_val->Reserve(collected.size()); + for ( const auto& fam : collected ) { if ( fam.type == prometheus::MetricType::Histogram ) continue; @@ -350,7 +360,7 @@ ValPtr Manager::CollectMetrics(std::string_view prefix_pattern, std::string_view static auto running_under_test = id::find_val("running_under_test")->AsBool(); if ( running_under_test ) { auto& vec = ret_val->RawVec(); - std::sort(vec.begin(), vec.end(), compare_histograms); + std::sort(vec.begin(), vec.end(), compare_metrics); } } @@ -388,6 +398,8 @@ ValPtr Manager::CollectHistogramMetrics(std::string_view prefix_pattern, std::st full_pattern.append("*"); auto collected = prometheus_registry->Collect(); + ret_val->Reserve(collected.size()); + for ( const auto& fam : collected ) { if ( fam.type != prometheus::MetricType::Histogram ) continue; diff --git a/testing/btest/Baseline/scripts.base.frameworks.telemetry.basic/out b/testing/btest/Baseline/scripts.base.frameworks.telemetry.basic/out index fdde7d52ff..7822985f43 100644 --- a/testing/btest/Baseline/scripts.base.frameworks.telemetry.basic/out +++ b/testing/btest/Baseline/scripts.base.frameworks.telemetry.basic/out @@ -1,8 +1,8 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. ### zeek_session_metrics |3| +Telemetry::GAUGE, zeek, zeek_active_sessions, [protocol], [tcp], 500.0 Telemetry::COUNTER, zeek, zeek_ended_sessions_total, [reason], [inactivity], 0.0 Telemetry::COUNTER, zeek, zeek_total_sessions_total, [protocol], [tcp], 500.0 -Telemetry::GAUGE, zeek, zeek_active_sessions, [protocol], [tcp], 500.0 ### bt* metrics |5| Telemetry::COUNTER, btest, btest_a_test_total, [x, y], [a, b], 1.0 Telemetry::COUNTER, btest, btest_b_test_total, [x, y], [a, b], 10.0 diff --git a/testing/btest/Baseline/scripts.base.frameworks.telemetry.internal-metrics/out b/testing/btest/Baseline/scripts.base.frameworks.telemetry.internal-metrics/out index 25a0bcf418..92fafa8041 100644 --- a/testing/btest/Baseline/scripts.base.frameworks.telemetry.internal-metrics/out +++ b/testing/btest/Baseline/scripts.base.frameworks.telemetry.internal-metrics/out @@ -1,17 +1,17 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. ### broker |7| +Telemetry::GAUGE, broker, broker_connections, [type], [native], 0.0 +value, 0.0 +Telemetry::GAUGE, broker, broker_connections, [type], [web-socket], 0.0 +value, 0.0 Telemetry::COUNTER, broker, broker_processed_messages_total, [type], [command], 0.0 value, 0.0 Telemetry::COUNTER, broker, broker_processed_messages_total, [type], [data], 0.0 value, 0.0 -Telemetry::GAUGE, broker, broker_connections, [type], [native], 0.0 -value, 0.0 Telemetry::COUNTER, broker, broker_processed_messages_total, [type], [ping], 0.0 value, 0.0 Telemetry::COUNTER, broker, broker_processed_messages_total, [type], [pong], 0.0 value, 0.0 Telemetry::COUNTER, broker, broker_processed_messages_total, [type], [routing-update], 0.0 value, 0.0 -Telemetry::GAUGE, broker, broker_connections, [type], [web-socket], 0.0 -value, 0.0 ### broker |0|