Skip to content

Commit 3c9b415

Browse files
authored
fix dynamic summary.
fix missed argument
1 parent ccdb2f6 commit 3c9b415

File tree

3 files changed

+65
-13
lines changed

3 files changed

+65
-13
lines changed

include/ylt/metric/summary.hpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,10 @@ class basic_dynamic_summary
149149
dynamic_metric_impl<ylt::metric::detail::summary_impl<uint32_t>, N>;
150150

151151
public:
152-
basic_dynamic_summary(
153-
std::string name, std::string help, std::vector<double> quantiles,
154-
std::array<std::string, N> labels_name,
155-
std::chrono::milliseconds max_age = std::chrono::seconds{60})
152+
basic_dynamic_summary(std::string name, std::string help,
153+
std::vector<double> quantiles,
154+
std::array<std::string, N> labels_name,
155+
std::chrono::seconds max_age = std::chrono::seconds{60})
156156
: Base(MetricType::Summary, std::move(name), std::move(help),
157157
std::move(labels_name)),
158158
quantiles_(std::move(quantiles)),
@@ -162,33 +162,35 @@ class basic_dynamic_summary
162162
}
163163

164164
void observe(const std::array<std::string, N>& labels_value, float value) {
165-
Base::try_emplace(labels_value, quantiles_).first->value.insert(value);
165+
has_refreshed_.store(true, std::memory_order_relaxed);
166+
Base::try_emplace(labels_value, quantiles_, max_age_)
167+
.first->value.insert(value);
166168
}
167169

168170
std::vector<float> get_rates(const std::array<std::string, N>& labels_value) {
169171
double sum;
170172
uint64_t count;
171-
return Base::try_emplace(labels_value, quantiles_)
173+
return Base::try_emplace(labels_value, quantiles_, max_age_)
172174
.first->value.get_rates(sum, count);
173175
}
174176

175177
std::vector<float> get_rates(const std::array<std::string, N>& labels_value,
176178
uint64_t& count) {
177179
double sum;
178-
return Base::try_emplace(labels_value, quantiles_)
180+
return Base::try_emplace(labels_value, quantiles_, max_age_)
179181
.first->value.get_rates(sum, count);
180182
}
181183

182184
std::vector<float> get_rates(const std::array<std::string, N>& labels_value,
183185
double& sum) {
184186
uint64_t count;
185-
return Base::try_emplace(labels_value, quantiles_)
187+
return Base::try_emplace(labels_value, quantiles_, max_age_)
186188
.first->value.get_rates(sum, count);
187189
}
188190

189191
std::vector<float> get_rates(const std::array<std::string, N>& labels_value,
190192
double& sum, uint64_t& count) {
191-
return Base::try_emplace(labels_value, quantiles_)
193+
return Base::try_emplace(labels_value, quantiles_, max_age_)
192194
.first->value.stat(sum, count);
193195
}
194196

@@ -238,8 +240,9 @@ class basic_dynamic_summary
238240
double sum = 0;
239241
uint64_t count = 0;
240242
auto rates = summary_value.stat(sum, count);
241-
if (count == 0)
243+
if (count == 0 && !has_refreshed_.load(std::memory_order_relaxed)) {
242244
continue;
245+
}
243246
summary.metrics.emplace_back();
244247
json_summary_metric_t& metric = summary.metrics.back();
245248
metric.count = count;
@@ -254,7 +257,8 @@ class basic_dynamic_summary
254257

255258
private:
256259
std::vector<double> quantiles_;
257-
std::chrono::milliseconds max_age_;
260+
std::chrono::seconds max_age_;
261+
std::atomic<bool> has_refreshed_;
258262
};
259263

260264
using dynamic_summary_1 = basic_dynamic_summary<1>;

include/ylt/metric/summary_impl.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,8 +333,7 @@ class summary_impl {
333333
return result;
334334
}
335335

336-
summary_impl(std::vector<double>& rate,
337-
std::chrono::seconds refresh_time = std::chrono::seconds{0})
336+
summary_impl(std::vector<double>& rate, std::chrono::seconds refresh_time)
338337
: rate_(rate),
339338
refresh_time_(refresh_time.count() * 1000 / 2),
340339
tp_(std::chrono::steady_clock::now().time_since_epoch().count()){};

src/metric/tests/test_metric.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,55 @@ struct metrc_tag {};
1414

1515
struct test_tag {};
1616

17+
TEST_CASE("summary test zero") {
18+
std::map<std::string, std::string> customMap = {};
19+
summary_t summary{"test_summary",
20+
"summary help",
21+
{0.5, 0.9, 0.95, 0.99},
22+
customMap,
23+
std::chrono::seconds(2)};
24+
summary.observe(1);
25+
std::string str;
26+
summary.serialize_to_json(str);
27+
28+
basic_dynamic_summary<2> dy_summary(
29+
std::string("test_summary"), std::string("summary help"),
30+
std::vector<double>{0.5, 0.9, 0.95, 0.99},
31+
std::array<std::string, 2>{"method", "url"}, std::chrono::seconds(1));
32+
dy_summary.observe({"GET", "test"}, 10);
33+
std::string str2;
34+
dy_summary.serialize_to_json(str2);
35+
36+
std::cout << str << "\n";
37+
std::cout << str2 << "\n";
38+
double sum{};
39+
uint64_t count{};
40+
summary.get_rates(sum, count);
41+
CHECK(sum > 0);
42+
CHECK(count > 0);
43+
sum = 0;
44+
count = 0;
45+
dy_summary.get_rates({"GET", "test"}, sum, count);
46+
CHECK(sum > 0);
47+
CHECK(count > 0);
48+
49+
std::this_thread::sleep_for(3s);
50+
51+
str.clear();
52+
str2.clear();
53+
54+
summary.serialize_to_json(str);
55+
dy_summary.serialize_to_json(str2);
56+
57+
std::cout << str << "\n";
58+
std::cout << str2 << "\n";
59+
sum = 0;
60+
count = 0;
61+
summary.get_rates(sum, count);
62+
CHECK(sum == 0);
63+
CHECK(count == 0);
64+
}
65+
1766
TEST_CASE("serialize zero") {
1867
{
1968
std::string str;

0 commit comments

Comments
 (0)