@@ -149,10 +149,10 @@ class basic_dynamic_summary
149
149
dynamic_metric_impl<ylt::metric::detail::summary_impl<uint32_t >, N>;
150
150
151
151
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 })
156
156
: Base(MetricType::Summary, std::move(name), std::move(help),
157
157
std::move (labels_name)),
158
158
quantiles_(std::move(quantiles)),
@@ -162,33 +162,35 @@ class basic_dynamic_summary
162
162
}
163
163
164
164
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);
166
168
}
167
169
168
170
std::vector<float > get_rates (const std::array<std::string, N>& labels_value) {
169
171
double sum;
170
172
uint64_t count;
171
- return Base::try_emplace (labels_value, quantiles_)
173
+ return Base::try_emplace (labels_value, quantiles_, max_age_ )
172
174
.first ->value .get_rates (sum, count);
173
175
}
174
176
175
177
std::vector<float > get_rates (const std::array<std::string, N>& labels_value,
176
178
uint64_t & count) {
177
179
double sum;
178
- return Base::try_emplace (labels_value, quantiles_)
180
+ return Base::try_emplace (labels_value, quantiles_, max_age_ )
179
181
.first ->value .get_rates (sum, count);
180
182
}
181
183
182
184
std::vector<float > get_rates (const std::array<std::string, N>& labels_value,
183
185
double & sum) {
184
186
uint64_t count;
185
- return Base::try_emplace (labels_value, quantiles_)
187
+ return Base::try_emplace (labels_value, quantiles_, max_age_ )
186
188
.first ->value .get_rates (sum, count);
187
189
}
188
190
189
191
std::vector<float > get_rates (const std::array<std::string, N>& labels_value,
190
192
double & sum, uint64_t & count) {
191
- return Base::try_emplace (labels_value, quantiles_)
193
+ return Base::try_emplace (labels_value, quantiles_, max_age_ )
192
194
.first ->value .stat (sum, count);
193
195
}
194
196
@@ -238,8 +240,9 @@ class basic_dynamic_summary
238
240
double sum = 0 ;
239
241
uint64_t count = 0 ;
240
242
auto rates = summary_value.stat (sum, count);
241
- if (count == 0 )
243
+ if (count == 0 && !has_refreshed_. load (std::memory_order_relaxed)) {
242
244
continue ;
245
+ }
243
246
summary.metrics .emplace_back ();
244
247
json_summary_metric_t & metric = summary.metrics .back ();
245
248
metric.count = count;
@@ -254,7 +257,8 @@ class basic_dynamic_summary
254
257
255
258
private:
256
259
std::vector<double > quantiles_;
257
- std::chrono::milliseconds max_age_;
260
+ std::chrono::seconds max_age_;
261
+ std::atomic<bool > has_refreshed_;
258
262
};
259
263
260
264
using dynamic_summary_1 = basic_dynamic_summary<1 >;
0 commit comments