diff --git a/include/ylt/metric/summary_impl.hpp b/include/ylt/metric/summary_impl.hpp index 72a99a942..4747b6910 100644 --- a/include/ylt/metric/summary_impl.hpp +++ b/include/ylt/metric/summary_impl.hpp @@ -9,9 +9,6 @@ #include #include -#include "ylt/easylog.hpp" -#include "ylt/metric/counter.hpp" - namespace ylt::metric::detail { template @@ -316,15 +313,15 @@ class summary_impl { std::vector result; result.reserve(rate_.size()); float v = -float16_max; - for (auto e : rate_) { - if (e < 0) [[unlikely]] { + for (double e : rate_) { + if (std::isnan(e) || e < 0) { result.push_back(v); continue; } - else if (e > 1) { + else if (e > 1) [[unlikely]] { e = 1; } - auto target_count = std::min(e * count, count); + auto target_count = std::min(e * count, count); while (true) { if (target_count <= count_now) [[unlikely]] { result.push_back(v); diff --git a/src/metric/tests/test_metric.cpp b/src/metric/tests/test_metric.cpp index 6b81c7a12..99f505ccb 100644 --- a/src/metric/tests/test_metric.cpp +++ b/src/metric/tests/test_metric.cpp @@ -449,12 +449,16 @@ using my_manager = static_metric_manager; auto g_pair = my_manager::instance().create_metric_static( "test_g_counter", ""); -TEST_CASE("test no lable") { +TEST_CASE("test no label") { { std::map customMap = {}; auto summary = std::make_shared( "test", "help", std::vector{0.5, 0.9, 0.95, 0.99}, customMap); summary->observe(100); + auto result = summary->get_rates(); + for (auto&e: result) { + CHECK(e==100); + } } auto g_counter = g_pair.second; g_counter->inc();