00001 #ifndef artdaq_DAQrate_MetricManager_hh
00002 #define artdaq_DAQrate_MetricManager_hh
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "artdaq-utilities/Plugins/MetricPlugin.hh"
00013 #include "artdaq-utilities/Plugins/MetricData.hh"
00014 #include "fhiclcpp/fwd.h"
00015 #include "messagefacility/MessageLogger/MessageLogger.h"
00016
00017 #include <sstream>
00018 #include <list>
00019 #include <thread>
00020 #include <condition_variable>
00021 #include <atomic>
00022
00023 namespace artdaq
00024 {
00025 class MetricManager;
00026 }
00027
00033 class artdaq::MetricManager
00034 {
00035 public:
00039 MetricManager();
00040
00044 MetricManager(MetricManager const&) = delete;
00045
00051 virtual ~MetricManager() noexcept;
00052
00057 MetricManager& operator=(MetricManager const&) = delete;
00058
00067 void initialize(fhicl::ParameterSet const& pset, std::string prefix = "");
00068
00072 void do_start();
00073
00077 void do_stop();
00078
00082 void do_pause();
00083
00087 void do_resume();
00088
00096 void reinitialize(fhicl::ParameterSet const& pset, std::string prefix = "");
00097
00101 void shutdown();
00102
00116 void sendMetric(std::string const& name, std::string const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00117
00131 void sendMetric(std::string const& name, int const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00132
00146 void sendMetric(std::string const& name, double const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00147
00161 void sendMetric(std::string const& name, float const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00162
00176 void sendMetric(std::string const& name, long unsigned int const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00177
00182 void setPrefix(std::string prefix) { prefix_ = prefix; }
00183
00184 private:
00185 void sendMetricLoop_();
00186
00187 void startMetricLoop_();
00188
00189 std::vector<std::unique_ptr<artdaq::MetricPlugin>> metric_plugins_;
00190 std::thread metric_sending_thread_;
00191 std::mutex metric_mutex_;
00192 std::condition_variable metric_cv_;
00193 int metric_send_interval_ms_;
00194
00195 bool initialized_;
00196 bool running_;
00197 bool active_;
00198 std::string prefix_;
00199
00200 std::list<std::unique_ptr<MetricData>> metric_queue_;
00201 std::mutex metric_queue_mutex_;
00202 };
00203
00204 #endif