#pragma once #include "common/admin_socket_client.h" #include #include #include #include #include #include #include #include #include struct pstat { unsigned long utime; unsigned long stime; unsigned long minflt; unsigned long majflt; unsigned long start_time; int num_threads; unsigned long vm_size; int resident_size; }; class MetricsBuilder; class OrderedMetricsBuilder; class UnorderedMetricsBuilder; class Metric; typedef std::map labels_t; class DaemonMetricCollector { public: void main(); std::string get_metrics(); labels_t get_extra_labels(std::string daemon_name); private: std::map clients; std::string metrics; std::mutex metrics_mutex; std::unique_ptr builder; void update_sockets(); void request_loop(boost::asio::steady_timer &timer); void dump_asok_metrics(); void dump_asok_metric(boost::json::object perf_info, boost::json::value perf_values, std::string name, labels_t labels); std::pair add_fixed_name_metrics(std::string metric_name); void get_process_metrics(std::vector> daemon_pids); std::string asok_request(AdminSocketClient &asok, std::string command, std::string daemon_name); }; class Metric { private: struct metric_entry { labels_t labels; std::string value; }; std::string name; std::string mtype; std::string description; std::vector entries; public: Metric(std::string name, std::string mtype, std::string description) : name(name), mtype(mtype), description(description) {} Metric(const Metric &) = default; Metric() = default; void add(labels_t labels, std::string value); std::string dump(); }; class MetricsBuilder { public: virtual ~MetricsBuilder() = default; virtual std::string dump() = 0; virtual void add(std::string value, std::string name, std::string description, std::string mtype, labels_t labels) = 0; protected: std::string out; }; class OrderedMetricsBuilder : public MetricsBuilder { private: std::map metrics; public: std::string dump(); void add(std::string value, std::string name, std::string description, std::string mtype, labels_t labels); }; class UnorderedMetricsBuilder : public MetricsBuilder { public: std::string dump(); void add(std::string value, std::string name, std::string description, std::string mtype, labels_t labels); }; DaemonMetricCollector &collector_instance();