Skip to content

Commit f36ebc5

Browse files
authored
Fix summary (#625)
1 parent 6323967 commit f36ebc5

File tree

1 file changed

+36
-34
lines changed

1 file changed

+36
-34
lines changed

include/cinatra/ylt/metric/summary.hpp

+36-34
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ REFLECTION(json_summary_t, name, help, type, metrics);
2929
#endif
3030

3131
struct block_t {
32+
std::atomic<bool> is_coro_started_ = false;
3233
std::atomic<bool> stop_ = false;
3334
ylt::detail::moodycamel::ConcurrentQueue<double> sample_queue_;
3435
std::shared_ptr<TimeWindowQuantiles> quantile_values_;
@@ -75,7 +76,7 @@ class summary_t : public static_metric {
7576
block_->sample_queue_.enqueue(value);
7677

7778
bool expected = false;
78-
if (is_coro_started_.compare_exchange_strong(expected, true)) {
79+
if (block_->is_coro_started_.compare_exchange_strong(expected, true)) {
7980
start(block_).via(excutor_->get_executor()).start([](auto &&) {
8081
});
8182
}
@@ -220,13 +221,13 @@ class summary_t : public static_metric {
220221
}
221222

222223
if (block->sample_queue_.size_approx() == 0) {
223-
is_coro_started_ = false;
224+
block_->is_coro_started_ = false;
224225
if (block->sample_queue_.size_approx() == 0) {
225226
break;
226227
}
227228

228229
bool expected = false;
229-
if (!is_coro_started_.compare_exchange_strong(expected, true)) {
230+
if (!block_->is_coro_started_.compare_exchange_strong(expected, true)) {
230231
break;
231232
}
232233

@@ -243,7 +244,6 @@ class summary_t : public static_metric {
243244
std::shared_ptr<block_t> block_;
244245
static inline std::shared_ptr<coro_io::io_context_pool> excutor_ =
245246
coro_io::create_io_context_pool(1);
246-
std::atomic<bool> is_coro_started_ = false;
247247
bool has_observe_ = false;
248248
};
249249

@@ -260,6 +260,10 @@ struct sum_and_count_t {
260260

261261
template <uint8_t N>
262262
struct labels_block_t {
263+
summary_t::Quantiles quantiles_; // readonly
264+
std::chrono::milliseconds max_age_;
265+
uint16_t age_buckets_;
266+
std::atomic<bool> is_coro_started_ = false;
263267
std::atomic<bool> stop_ = false;
264268
ylt::detail::moodycamel::ConcurrentQueue<summary_label_sample<N>>
265269
sample_queue_;
@@ -280,12 +284,16 @@ class basic_dynamic_summary : public dynamic_metric {
280284
std::array<std::string, N> labels_name,
281285
std::chrono::milliseconds max_age = std::chrono::seconds{60},
282286
uint16_t age_buckets = 5)
283-
: quantiles_{std::move(quantiles)},
284-
dynamic_metric(MetricType::Summary, std::move(name), std::move(help),
285-
std::move(labels_name)),
286-
max_age_(max_age),
287-
age_buckets_(age_buckets) {
288-
init_block(labels_block_);
287+
: dynamic_metric(MetricType::Summary, std::move(name), std::move(help),
288+
std::move(labels_name)) {
289+
labels_block_ = std::make_shared<labels_block_t<N>>();
290+
labels_block_->quantiles_ = std::move(quantiles);
291+
labels_block_->max_age_ = max_age;
292+
labels_block_->age_buckets_ = age_buckets;
293+
294+
start(labels_block_).via(excutor_->get_executor()).start([](auto &&) {
295+
});
296+
289297
g_user_metric_count++;
290298
}
291299

@@ -307,7 +315,8 @@ class basic_dynamic_summary : public dynamic_metric {
307315
labels_block_->sample_queue_.enqueue({std::move(labels_value), value});
308316

309317
bool expected = false;
310-
if (is_coro_started_.compare_exchange_strong(expected, true)) {
318+
if (labels_block_->is_coro_started_.compare_exchange_strong(expected,
319+
true)) {
311320
start(labels_block_).via(excutor_->get_executor()).start([](auto &&) {
312321
});
313322
}
@@ -327,7 +336,7 @@ class basic_dynamic_summary : public dynamic_metric {
327336
const std::array<std::string, N> &labels_value, double &sum,
328337
uint64_t &count) {
329338
std::vector<double> vec;
330-
if (quantiles_.empty()) {
339+
if (labels_block_->quantiles_.empty()) {
331340
co_return std::vector<double>{};
332341
}
333342

@@ -339,7 +348,7 @@ class basic_dynamic_summary : public dynamic_metric {
339348
}
340349
sum = labels_block_->sum_and_count_[labels_value].sum;
341350
count = labels_block_->sum_and_count_[labels_value].count;
342-
for (const auto &quantile : quantiles_) {
351+
for (const auto &quantile : labels_block_->quantiles_) {
343352
vec.push_back(it->second->get(quantile.quantile));
344353
}
345354
},
@@ -359,13 +368,6 @@ class basic_dynamic_summary : public dynamic_metric {
359368
}
360369
#endif
361370
private:
362-
template <typename T>
363-
void init_block(std::shared_ptr<T> &block) {
364-
block = std::make_shared<T>();
365-
start(block).via(excutor_->get_executor()).start([](auto &&) {
366-
});
367-
}
368-
369371
async_simple::coro::Lazy<void> start(
370372
std::shared_ptr<labels_block_t<N>> label_block) {
371373
summary_label_sample<N> sample;
@@ -376,8 +378,9 @@ class basic_dynamic_summary : public dynamic_metric {
376378
auto &ptr = label_block->label_quantile_values_[sample.labels_value];
377379

378380
if (ptr == nullptr) {
379-
ptr = std::make_shared<TimeWindowQuantiles>(quantiles_, max_age_,
380-
age_buckets_);
381+
ptr = std::make_shared<TimeWindowQuantiles>(
382+
label_block->quantiles_, label_block->max_age_,
383+
label_block->age_buckets_);
381384
}
382385

383386
ptr->insert(sample.value);
@@ -393,13 +396,14 @@ class basic_dynamic_summary : public dynamic_metric {
393396
co_await async_simple::coro::Yield{};
394397

395398
if (label_block->sample_queue_.size_approx() == 0) {
396-
is_coro_started_ = false;
399+
label_block->is_coro_started_ = false;
397400
if (label_block->sample_queue_.size_approx() == 0) {
398401
break;
399402
}
400403

401404
bool expected = false;
402-
if (!is_coro_started_.compare_exchange_strong(expected, true)) {
405+
if (!label_block->is_coro_started_.compare_exchange_strong(expected,
406+
true)) {
403407
break;
404408
}
405409

@@ -412,7 +416,7 @@ class basic_dynamic_summary : public dynamic_metric {
412416
}
413417

414418
async_simple::coro::Lazy<void> serialize_async_with_label(std::string &str) {
415-
if (quantiles_.empty()) {
419+
if (labels_block_->quantiles_.empty()) {
416420
co_return;
417421
}
418422

@@ -432,13 +436,14 @@ class basic_dynamic_summary : public dynamic_metric {
432436
double sum = 0;
433437
uint64_t count = 0;
434438
auto rates = co_await get_rates(labels_value, sum, count);
435-
for (size_t i = 0; i < quantiles_.size(); i++) {
439+
for (size_t i = 0; i < labels_block_->quantiles_.size(); i++) {
436440
str.append(name_);
437441
str.append("{");
438442
build_label_string(str, labels_name_, labels_value);
439443
str.append(",");
440444
str.append("quantile=\"");
441-
str.append(std::to_string(quantiles_[i].quantile)).append("\"} ");
445+
str.append(std::to_string(labels_block_->quantiles_[i].quantile))
446+
.append("\"} ");
442447
str.append(std::to_string(rates[i])).append("\n");
443448
}
444449

@@ -459,7 +464,7 @@ class basic_dynamic_summary : public dynamic_metric {
459464
#ifdef CINATRA_ENABLE_METRIC_JSON
460465
async_simple::coro::Lazy<void> serialize_to_json_with_label_async(
461466
std::string &str) {
462-
if (quantiles_.empty()) {
467+
if (labels_block_->quantiles_.empty()) {
463468
co_return;
464469
}
465470

@@ -482,11 +487,12 @@ class basic_dynamic_summary : public dynamic_metric {
482487
auto rates = co_await get_rates(labels_value, sum, count);
483488
metric.count = count;
484489
metric.sum = sum;
485-
for (size_t i = 0; i < quantiles_.size(); i++) {
490+
for (size_t i = 0; i < labels_block_->quantiles_.size(); i++) {
486491
for (size_t i = 0; i < labels_value.size(); i++) {
487492
metric.labels[labels_name_[i]] = labels_value[i];
488493
}
489-
metric.quantiles.emplace(quantiles_[i].quantile, rates[i]);
494+
metric.quantiles.emplace(labels_block_->quantiles_[i].quantile,
495+
rates[i]);
490496
}
491497

492498
summary.metrics.push_back(std::move(metric));
@@ -495,13 +501,9 @@ class basic_dynamic_summary : public dynamic_metric {
495501
}
496502
#endif
497503

498-
Quantiles quantiles_; // readonly
499504
std::shared_ptr<labels_block_t<N>> labels_block_;
500505
static inline std::shared_ptr<coro_io::io_context_pool> excutor_ =
501506
coro_io::create_io_context_pool(1);
502-
std::chrono::milliseconds max_age_;
503-
uint16_t age_buckets_;
504-
std::atomic<bool> is_coro_started_ = false;
505507
bool has_observe_ = false;
506508
};
507509

0 commit comments

Comments
 (0)