| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | #pragma once#include <vector>#include "prometheus/client_metric.h"#include "prometheus/counter.h"#include "prometheus/detail/builder.h"#include "prometheus/detail/core_export.h"#include "prometheus/metric_type.h"namespace prometheus {/// \brief A histogram metric to represent aggregatable distributions of events.////// This class represents the metric type histogram:/// https://prometheus.io/docs/concepts/metric_types/#histogram////// A histogram tracks the number of observations and the sum of the observed/// values, allowing to calculate the average of the observed values.////// At its core a histogram has a counter per bucket. The sum of observations/// also behaves like a counter.////// See https://prometheus.io/docs/practices/histograms/ for detailed/// explanations of histogram usage and differences to summaries.////// The class is thread-safe. No concurrent call to any API of this type causes/// a data race.class PROMETHEUS_CPP_CORE_EXPORT Histogram { public:  using BucketBoundaries = std::vector<double>;  static const MetricType metric_type{MetricType::Histogram};  /// \brief Create a histogram with manually chosen buckets.  ///  /// The BucketBoundaries are a list of monotonically increasing values  /// representing the bucket boundaries. Each consecutive pair of values is  /// interpreted as a half-open interval [b_n, b_n+1) which defines one bucket.  ///  /// There is no limitation on how the buckets are divided, i.e, equal size,  /// exponential etc..  ///  /// The bucket boundaries cannot be changed once the histogram is created.  Histogram(const BucketBoundaries& buckets);  /// \brief Observe the given amount.  ///  /// The given amount selects the 'observed' bucket. The observed bucket is  /// chosen for which the given amount falls into the half-open interval [b_n,  /// b_n+1). The counter of the observed bucket is incremented. Also the total  /// sum of all observations is incremented.  void Observe(double value);  /// \brief Observe multiple data points.  ///  /// Increments counters given a count for each bucket. (i.e. the caller of  /// this function must have already sorted the values into buckets).  /// Also increments the total sum of all observations by the given value.  void ObserveMultiple(const std::vector<double>& bucket_increments,                       const double sum_of_values);  /// \brief Get the current value of the counter.  ///  /// Collect is called by the Registry when collecting metrics.  ClientMetric Collect() const; private:  const BucketBoundaries bucket_boundaries_;  std::vector<Counter> bucket_counts_;  Counter sum_;};/// \brief Return a builder to configure and register a Histogram metric.////// @copydetails Family<>::Family()////// Example usage:////// \code/// auto registry = std::make_shared<Registry>();/// auto& histogram_family = prometheus::BuildHistogram()///                              .Name("some_name")///                              .Help("Additional description.")///                              .Labels({{"key", "value"}})///                              .Register(*registry);////// .../// \endcode////// \return An object of unspecified type T, i.e., an implementation detail/// except that it has the following members:////// - Name(const std::string&) to set the metric name,/// - Help(const std::string&) to set an additional description./// - Label(const std::map<std::string, std::string>&) to assign a set of///   key-value pairs (= labels) to the metric.////// To finish the configuration of the Histogram metric register it with/// Register(Registry&).PROMETHEUS_CPP_CORE_EXPORT detail::Builder<Histogram> BuildHistogram();}  // namespace prometheus
 |