X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=shared%2Fmetrics.cpp;h=91b03e83483e1335d85d747dca730d607ff10438;hb=f9219370ce1f5ba37e716d50d41115bb672c4244;hp=24b61fe56de7cb0574dab74670101393ae645dab;hpb=eeda8995329601f9f4e35047358400833eeae68e;p=nageru diff --git a/shared/metrics.cpp b/shared/metrics.cpp index 24b61fe..91b03e8 100644 --- a/shared/metrics.cpp +++ b/shared/metrics.cpp @@ -12,6 +12,7 @@ using namespace std; using namespace std::chrono; Metrics global_metrics; +string Metrics::prefix = "nageru"; double get_timestamp_for_metrics() { @@ -20,7 +21,7 @@ double get_timestamp_for_metrics() string Metrics::serialize_name(const string &name, const vector> &labels) { - return "nageru_" + name + serialize_labels(labels); + return prefix + "_" + name + serialize_labels(labels); } string Metrics::serialize_labels(const vector> &labels) @@ -98,7 +99,24 @@ void Metrics::remove(const string &name, const vector> &lab // If this is the last metric with this name, remove the type as well. if (!((it != metrics.begin() && prev(it)->first.name == name) || - (it != metrics.end() && next(it)->first.name == name))) { + (it != metrics.end() && next(it) != metrics.end() && next(it)->first.name == name))) { + types.erase(name); + } + + metrics.erase(it); +} + +void Metrics::remove_if_exists(const string &name, const vector> &labels) +{ + lock_guard lock(mu); + auto it = metrics.find(MetricKey(name, labels)); + if (it == metrics.end()) { + return; + } + + // If this is the last metric with this name, remove the type as well. + if (!((it != metrics.begin() && prev(it)->first.name == name) || + (it != metrics.end() && next(it) != metrics.end() && next(it)->first.name == name))) { types.erase(name); } @@ -114,7 +132,7 @@ string Metrics::serialize() const lock_guard lock(mu); auto type_it = types.cbegin(); for (const auto &key_and_metric : metrics) { - string name = "nageru_" + key_and_metric.first.name + key_and_metric.first.serialized_labels; + string name = prefix + "_" + key_and_metric.first.name + key_and_metric.first.serialized_labels; const Metric &metric = key_and_metric.second; if (type_it != types.cend() && @@ -122,11 +140,11 @@ string Metrics::serialize() const // It's the first time we print out any metric with this name, // so add the type header. if (type_it->second == TYPE_GAUGE) { - ss << "# TYPE nageru_" << type_it->first << " gauge\n"; + ss << "# TYPE " + prefix + "_" << type_it->first << " gauge\n"; } else if (type_it->second == TYPE_HISTOGRAM) { - ss << "# TYPE nageru_" << type_it->first << " histogram\n"; + ss << "# TYPE " + prefix + "_" << type_it->first << " histogram\n"; } else if (type_it->second == TYPE_SUMMARY) { - ss << "# TYPE nageru_" << type_it->first << " summary\n"; + ss << "# TYPE " + prefix + "_" << type_it->first << " summary\n"; } ++type_it; }