1717namespace ylt ::metric {
1818#ifdef CINATRA_ENABLE_METRIC_JSON
1919struct json_summary_metric_t {
20- std::vector<std::string_view> labels;
21- std::vector<float > quantiles_value ;
20+ std::vector<std::pair<std:: string_view, std::string_view> > labels;
21+ std::vector<std::pair< float , float >> quantiles ;
2222 uint64_t count;
2323 double sum;
2424};
25- YLT_REFL (json_summary_metric_t , labels, quantiles_value , count, sum);
25+ YLT_REFL (json_summary_metric_t , labels, quantiles , count, sum);
2626struct json_summary_t {
2727 std::string_view name;
2828 std::string_view help;
2929 std::string_view type;
30- const std::vector<std::string>& labels_name;
31- const std::vector<double >& quantiles_key;
3230 std::vector<json_summary_metric_t > metrics;
3331};
34- YLT_REFL (json_summary_t , name, help, type, labels_name, quantiles_key, metrics);
32+ YLT_REFL (json_summary_t , name, help, type, metrics);
3533#endif
3634
35+ namespace detail {
36+ template <typename O, typename K, typename V>
37+ inline void vector_combine (O& result, const K& vec1, const V& vec2) {
38+ assert (vec1.size () == vec2.size ());
39+ result.reserve (vec1.size ());
40+ for (std::size_t i = 0 ; i < vec1.size (); ++i) {
41+ result.emplace_back (vec1[i], vec2[i]);
42+ }
43+ }
44+ } // namespace detail
45+
3746class summary_t : public static_metric {
3847 public:
3948 summary_t (std::string name, std::string help, std::vector<double > quantiles,
@@ -42,8 +51,11 @@ class summary_t : public static_metric {
4251 quantiles_ (std::move(quantiles)),
4352 impl_(quantiles_,
4453 std::chrono::duration_cast<std::chrono::seconds>(max_age)) {
45- if (!std::is_sorted (quantiles_.begin (), quantiles_.end ()))
54+ if (!std::is_sorted (quantiles_.begin (), quantiles_.end ())) {
4655 std::sort (quantiles_.begin (), quantiles_.end ());
56+ }
57+ auto iter = std::unique (quantiles_.begin (), quantiles_.end ());
58+ quantiles_.erase (iter, quantiles_.end ());
4759 }
4860
4961 summary_t (std::string name, std::string help, std::vector<double > quantiles,
@@ -54,8 +66,11 @@ class summary_t : public static_metric {
5466 quantiles_(std::move(quantiles)),
5567 impl_(quantiles_,
5668 std::chrono::duration_cast<std::chrono::seconds>(max_age)) {
57- if (!std::is_sorted (quantiles_.begin (), quantiles_.end ()))
69+ if (!std::is_sorted (quantiles_.begin (), quantiles_.end ())) {
5870 std::sort (quantiles_.begin (), quantiles_.end ());
71+ }
72+ auto iter = std::unique (quantiles_.begin (), quantiles_.end ());
73+ quantiles_.erase (iter, quantiles_.end ());
5974 }
6075
6176 void observe (float value) {
@@ -119,16 +134,14 @@ class summary_t : public static_metric {
119134 return ;
120135 }
121136
122- json_summary_t summary{name_, help_, metric_name (), labels_name (),
123- quantiles_};
137+ json_summary_t summary{name_, help_, metric_name ()};
124138 json_summary_metric_t metric;
125-
126- metric. quantiles_value = get_rates (metric.sum , metric. count );
139+ auto rates = get_rates (metric. sum , metric. count );
140+ detail::vector_combine (metric.quantiles , quantiles_, rates );
127141 if (metric.count == 0 && !has_refreshed_.load (std::memory_order_relaxed)) {
128142 return ;
129143 }
130- metric.labels .reserve (labels_value_.size ());
131- for (auto & e : labels_value_) metric.labels .emplace_back (e);
144+ detail::vector_combine (metric.labels , labels_name (), labels_value_);
132145 summary.metrics .push_back (std::move (metric));
133146 iguana::to_json (summary, str);
134147 }
@@ -229,8 +242,7 @@ class basic_dynamic_summary
229242 if (map.empty ()) {
230243 return ;
231244 }
232- json_summary_t summary{Base::name_, Base::help_, Base::metric_name (),
233- Base::labels_name (), quantiles_};
245+ json_summary_t summary{Base::name_, Base::help_, Base::metric_name ()};
234246 summary.metrics .reserve (map.size ());
235247 for (size_t i = 0 ; i < map.size (); ++i) {
236248 auto & labels_value = map[i]->label ;
@@ -244,9 +256,8 @@ class basic_dynamic_summary
244256 json_summary_metric_t & metric = summary.metrics .back ();
245257 metric.count = count;
246258 metric.sum = sum;
247- metric.quantiles_value = std::move (rates);
248- metric.labels .reserve (labels_value.size ());
249- for (auto & e : labels_value) metric.labels .emplace_back (e);
259+ detail::vector_combine (metric.quantiles , quantiles_, rates);
260+ detail::vector_combine (metric.labels , Base::labels_name (), labels_value);
250261 }
251262 iguana::to_json (summary, str);
252263 }
0 commit comments