}
}
- 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)
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()
Metrics global_metrics;
-void Metrics::register_int_metric(const string &name, atomic<int64_t> *location)
+void Metrics::register_int_metric(const string &name, atomic<int64_t> *location, Metrics::Type type)
{
lock_guard<mutex> lock(mu);
- int_metrics.emplace(name, location);
+ int_metrics.emplace(name, Metric<int64_t>{ type, location });
}
-void Metrics::register_double_metric(const string &name, atomic<double> *location)
+void Metrics::register_double_metric(const string &name, atomic<double> *location, Metrics::Type type)
{
lock_guard<mutex> lock(mu);
- double_metrics.emplace(name, location);
+ double_metrics.emplace(name, Metric<double>{ type, location });
}
string Metrics::serialize() const
lock_guard<mutex> 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();
class Metrics {
public:
- void register_int_metric(const std::string &name, std::atomic<int64_t> *location);
- void register_double_metric(const std::string &name, std::atomic<double> *location);
+ enum Type {
+ TYPE_COUNTER,
+ TYPE_GAUGE,
+ };
+
+ void register_int_metric(const std::string &name, std::atomic<int64_t> *location, Type type = TYPE_COUNTER);
+ void register_double_metric(const std::string &name, std::atomic<double> *location, Type type = TYPE_COUNTER);
std::string serialize() const;
private:
+ template<class T>
+ struct Metric {
+ Type type;
+ std::atomic<T> *location;
+ };
+
mutable std::mutex mu;
- std::unordered_map<std::string, std::atomic<int64_t> *> int_metrics;
- std::unordered_map<std::string, std::atomic<double> *> double_metrics;
+ std::unordered_map<std::string, Metric<int64_t>> int_metrics;
+ std::unordered_map<std::string, Metric<double>> double_metrics;
};
extern Metrics global_metrics;