Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions core/include/prometheus/summary.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,21 @@ class PROMETHEUS_CPP_CORE_EXPORT Summary {
/// and how smooth the time window is moved. With only one age bucket it
/// effectively results in a complete reset of the summary each time max_age
/// has passed. The default value is 5.
///
/// \param sample_ratio Set the sample ratio for the observed values which are
/// used to calculate quantiles. When used in high throughput situations, if
/// not sampled the SDK will cause serious performance problem. The value
/// valid in [0, 1], and sample_ratio = 0 or 1 will not cause sample. The
/// default value is 0.
explicit Summary(const Quantiles& quantiles,
std::chrono::milliseconds max_age = std::chrono::seconds{60},
int age_buckets = 5);
int age_buckets = 5, double sample_ratio = 0);

/// \copydoc Summary::Summary(const Quantiles&,std::chrono::milliseconds,int)
/// \copydoc Summary::Summary(const
/// Quantiles&,std::chrono::milliseconds,int,double)
explicit Summary(Quantiles&& quantiles,
std::chrono::milliseconds max_age = std::chrono::seconds{60},
int age_buckets = 5);
int age_buckets = 5, double sample_ratio = 0);

/// \brief Observe the given amount.
void Observe(double value);
Expand All @@ -94,6 +101,7 @@ class PROMETHEUS_CPP_CORE_EXPORT Summary {
std::uint64_t count_{};
double sum_{};
detail::TimeWindowQuantiles quantile_values_;
int sample_ratio_threshold_{};
};

/// \brief Return a builder to configure and register a Summary metric.
Expand Down
23 changes: 18 additions & 5 deletions core/src/summary.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,34 @@
namespace prometheus {

Summary::Summary(const Quantiles& quantiles,
const std::chrono::milliseconds max_age, const int age_buckets)
const std::chrono::milliseconds max_age, const int age_buckets,
const double sample_ratio)
: quantiles_{quantiles},
quantile_values_{quantiles_, max_age, age_buckets} {}
quantile_values_{quantiles_, max_age, age_buckets} {
if (sample_ratio > 0 && sample_ratio < 1) {
sample_ratio_threshold_ = sample_ratio * RAND_MAX;
}
}

Summary::Summary(Quantiles&& quantiles, const std::chrono::milliseconds max_age,
const int age_buckets)
const int age_buckets, const double sample_ratio)
: quantiles_{std::move(quantiles)},
quantile_values_{quantiles_, max_age, age_buckets} {}
quantile_values_{quantiles_, max_age, age_buckets} {
if (sample_ratio > 0 && sample_ratio < 1) {
sample_ratio_threshold_ = sample_ratio * RAND_MAX;
}
}

void Summary::Observe(const double value) {
bool should_observe =
(sample_ratio_threshold_ == 0 || sample_ratio_threshold_ < std::rand());
std::lock_guard<std::mutex> lock(mutex_);

count_ += 1;
sum_ += value;
quantile_values_.insert(value);
if (should_observe) {
quantile_values_.insert(value);
}
}

ClientMetric Summary::Collect() const {
Expand Down