X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=metrics.h;h=0371668bd2a1e25c1adaed613071ac8e3c6c0551;hb=1836dccf699779d9092a75755cec96cea1734a2a;hp=a570723dae713f218c9b46c8f0d865ff71e526ad;hpb=c574aef4437253dcf0e6c1fed4c9cab1033b33f9;p=nageru diff --git a/metrics.h b/metrics.h index a570723..0371668 100644 --- a/metrics.h +++ b/metrics.h @@ -15,6 +15,12 @@ class Histogram; +// Prometheus recommends the use of timestamps instead of “time since event”, +// so you can use this to get the number of seconds since the epoch. +// Note that this will be wrong if your clock changes, so for non-metric use, +// you should use std::chrono::steady_clock instead. +double get_timestamp_for_metrics(); + class Metrics { public: enum Type { @@ -45,16 +51,33 @@ public: std::string serialize() const; private: + static std::string serialize_name(const std::string &name, const std::vector> &labels); + static std::string serialize_labels(const std::vector> &labels); + enum DataType { DATA_TYPE_INT64, DATA_TYPE_DOUBLE, DATA_TYPE_HISTOGRAM, }; - + struct MetricKey { + MetricKey(const std::string &name, const std::vector> labels) + : name(name), labels(labels), serialized_labels(serialize_labels(labels)) + { + } + + bool operator< (const MetricKey &other) const + { + if (name != other.name) + return name < other.name; + return serialized_labels < other.serialized_labels; + } + + const std::string name; + const std::vector> labels; + const std::string serialized_labels; + }; struct Metric { DataType data_type; - std::string name; - std::vector> labels; union { std::atomic *location_int64; std::atomic *location_double; @@ -63,15 +86,18 @@ private: }; mutable std::mutex mu; - std::map types; - std::vector metrics; + std::map types; // Ordered the same as metrics. + std::map metrics; std::vector histograms; + + friend class Histogram; }; class Histogram { public: void init(const std::vector &bucket_vals); void init_uniform(size_t num_buckets); // Sets up buckets 0..(N-1). + void init_geometric(double min, double max, size_t num_buckets); void count_event(double val); std::string serialize(const std::string &name, const std::vector> &labels) const;