From df2284056394481ce5d5216f774d4a146b4983eb Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Fri, 9 Jun 2017 19:35:13 +0200 Subject: [PATCH] Mark the appropriate metrics as gauges. --- audio_mixer.cpp | 14 +++++++------- httpd.cpp | 2 +- metrics.cpp | 18 ++++++++++++------ metrics.h | 19 +++++++++++++++---- 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/audio_mixer.cpp b/audio_mixer.cpp index 0cd8b71..6a694cb 100644 --- a/audio_mixer.cpp +++ b/audio_mixer.cpp @@ -214,13 +214,13 @@ AudioMixer::AudioMixer(unsigned num_cards) } } - global_metrics.register_double_metric("audio_loudness_short_lufs", &metric_audio_loudness_short_lufs); - global_metrics.register_double_metric("audio_loudness_integrated_lufs", &metric_audio_loudness_integrated_lufs); - global_metrics.register_double_metric("audio_loudness_range_low_lufs", &metric_audio_loudness_range_low_lufs); - global_metrics.register_double_metric("audio_loudness_range_high_lufs", &metric_audio_loudness_range_high_lufs); - global_metrics.register_double_metric("audio_peak_dbfs", &metric_audio_peak_dbfs); - global_metrics.register_double_metric("audio_final_makeup_gain_db", &metric_audio_final_makeup_gain_db); - global_metrics.register_double_metric("audio_correlation", &metric_audio_correlation); + global_metrics.register_double_metric("audio_loudness_short_lufs", &metric_audio_loudness_short_lufs, Metrics::TYPE_GAUGE); + global_metrics.register_double_metric("audio_loudness_integrated_lufs", &metric_audio_loudness_integrated_lufs, Metrics::TYPE_GAUGE); + global_metrics.register_double_metric("audio_loudness_range_low_lufs", &metric_audio_loudness_range_low_lufs, Metrics::TYPE_GAUGE); + global_metrics.register_double_metric("audio_loudness_range_high_lufs", &metric_audio_loudness_range_high_lufs, Metrics::TYPE_GAUGE); + global_metrics.register_double_metric("audio_peak_dbfs", &metric_audio_peak_dbfs, Metrics::TYPE_GAUGE); + global_metrics.register_double_metric("audio_final_makeup_gain_db", &metric_audio_final_makeup_gain_db, Metrics::TYPE_GAUGE); + global_metrics.register_double_metric("audio_correlation", &metric_audio_correlation, Metrics::TYPE_GAUGE); } void AudioMixer::reset_resampler(DeviceSpec device_spec) diff --git a/httpd.cpp b/httpd.cpp index 2b19779..638c985 100644 --- a/httpd.cpp +++ b/httpd.cpp @@ -22,7 +22,7 @@ using namespace std; HTTPD::HTTPD() { - global_metrics.register_int_metric("num_connected_clients", &metric_num_connected_clients); + global_metrics.register_int_metric("num_connected_clients", &metric_num_connected_clients, Metrics::TYPE_GAUGE); } HTTPD::~HTTPD() diff --git a/metrics.cpp b/metrics.cpp index 78f1e98..dd2ff69 100644 --- a/metrics.cpp +++ b/metrics.cpp @@ -7,16 +7,16 @@ using namespace std; Metrics global_metrics; -void Metrics::register_int_metric(const string &name, atomic *location) +void Metrics::register_int_metric(const string &name, atomic *location, Metrics::Type type) { lock_guard lock(mu); - int_metrics.emplace(name, location); + int_metrics.emplace(name, Metric{ type, location }); } -void Metrics::register_double_metric(const string &name, atomic *location) +void Metrics::register_double_metric(const string &name, atomic *location, Metrics::Type type) { lock_guard lock(mu); - double_metrics.emplace(name, location); + double_metrics.emplace(name, Metric{ type, location }); } string Metrics::serialize() const @@ -28,10 +28,16 @@ string Metrics::serialize() const lock_guard lock(mu); for (const auto &key_and_value : int_metrics) { - ss << "nageru_" << key_and_value.first.c_str() << " " << key_and_value.second->load() << "\n"; + if (key_and_value.second.type == TYPE_GAUGE) { + ss << "# TYPE nageru_" << key_and_value.first << " gauge\n"; + } + ss << "nageru_" << key_and_value.first << " " << key_and_value.second.location->load() << "\n"; } for (const auto &key_and_value : double_metrics) { - ss << "nageru_" << key_and_value.first.c_str() << " " << key_and_value.second->load() << "\n"; + if (key_and_value.second.type == TYPE_GAUGE) { + ss << "# TYPE nageru_" << key_and_value.first << " gauge\n"; + } + ss << "nageru_" << key_and_value.first << " " << key_and_value.second.location->load() << "\n"; } return ss.str(); diff --git a/metrics.h b/metrics.h index 6c72ad5..e54bbcf 100644 --- a/metrics.h +++ b/metrics.h @@ -13,14 +13,25 @@ class Metrics { public: - void register_int_metric(const std::string &name, std::atomic *location); - void register_double_metric(const std::string &name, std::atomic *location); + enum Type { + TYPE_COUNTER, + TYPE_GAUGE, + }; + + void register_int_metric(const std::string &name, std::atomic *location, Type type = TYPE_COUNTER); + void register_double_metric(const std::string &name, std::atomic *location, Type type = TYPE_COUNTER); std::string serialize() const; private: + template + struct Metric { + Type type; + std::atomic *location; + }; + mutable std::mutex mu; - std::unordered_map *> int_metrics; - std::unordered_map *> double_metrics; + std::unordered_map> int_metrics; + std::unordered_map> double_metrics; }; extern Metrics global_metrics; -- 2.39.2