]> git.sesse.net Git - nageru/commitdiff
Pre-serialize only the labels for metrics; the ordering constraints did not really...
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 13 Jun 2017 21:30:37 +0000 (23:30 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 13 Jun 2017 21:30:37 +0000 (23:30 +0200)
metrics.cpp
metrics.h

index db3c4b8c4da97c571f264c0b7f1eb60810d3208b..3fadb72907d9afdc5e2574269c57badd539eba6f 100644 (file)
@@ -19,9 +19,14 @@ double get_timestamp_for_metrics()
 }
 
 string Metrics::serialize_name(const string &name, const vector<pair<string, string>> &labels)
+{
+       return "nageru_" + name + serialize_labels(labels);
+}
+
+string Metrics::serialize_labels(const vector<pair<string, string>> &labels)
 {
        if (labels.empty()) {
-               return "nageru_" + name;
+               return "";
        }
 
        string label_str;
@@ -31,7 +36,7 @@ string Metrics::serialize_name(const string &name, const vector<pair<string, str
                }
                label_str += label.first + "=\"" + label.second + "\"";
        }
-       return "nageru_" + name + "{" + label_str + "}";
+       return "{" + label_str + "}";
 }
 
 void Metrics::add(const string &name, const vector<pair<string, string>> &labels, atomic<int64_t> *location, Metrics::Type type)
@@ -79,7 +84,7 @@ string Metrics::serialize() const
        lock_guard<mutex> lock(mu);
        auto type_it = types.cbegin();
        for (const auto &key_and_metric : metrics) {
-               const string &name = key_and_metric.first.serialized;
+               string name = "nageru_" + key_and_metric.first.name + key_and_metric.first.serialized_labels;
                const Metric &metric = key_and_metric.second;
 
                if (type_it != types.cend() &&
index 40aa8f7bf387159c6b31a40688e9e7b06b1fa37f..0371668bd2a1e25c1adaed613071ac8e3c6c0551 100644 (file)
--- a/metrics.h
+++ b/metrics.h
@@ -52,6 +52,7 @@ public:
 
 private:
        static std::string serialize_name(const std::string &name, const std::vector<std::pair<std::string, std::string>> &labels);
+       static std::string serialize_labels(const std::vector<std::pair<std::string, std::string>> &labels);
 
        enum DataType {
                DATA_TYPE_INT64,
@@ -60,18 +61,20 @@ private:
        };
        struct MetricKey {
                MetricKey(const std::string &name, const std::vector<std::pair<std::string, std::string>> labels)
-                       : name(name), labels(labels), serialized(serialize_name(name, labels))
+                       : name(name), labels(labels), serialized_labels(serialize_labels(labels))
                {
                }
 
                bool operator< (const MetricKey &other) const
                {
-                       return serialized < other.serialized;
+                       if (name != other.name)
+                               return name < other.name;
+                       return serialized_labels < other.serialized_labels;
                }
 
                const std::string name;
                const std::vector<std::pair<std::string, std::string>> labels;
-               const std::string serialized;
+               const std::string serialized_labels;
        };
        struct Metric {
                DataType data_type;
@@ -83,7 +86,7 @@ private:
        };
 
        mutable std::mutex mu;
-       std::map<std::string, Type> types;  // Ordered the same as metrics, assuming no { signs in names (which are illegal).
+       std::map<std::string, Type> types;  // Ordered the same as metrics.
        std::map<MetricKey, Metric> metrics;
        std::vector<Histogram> histograms;