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 <queue>
00019 #include <condition_variable>
00020 #include <atomic>
00021 #include <boost/thread.hpp>
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
00071 void initialize(fhicl::ParameterSet const& pset, std::string prefix = "");
00072
00076 void do_start();
00077
00081 void do_stop();
00082
00086 void do_pause();
00087
00091 void do_resume();
00092
00100 void reinitialize(fhicl::ParameterSet const& pset, std::string prefix = "");
00101
00105 void shutdown();
00106
00120 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);
00121
00135 void sendMetric(std::string const& name, int const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00136
00150 void sendMetric(std::string const& name, double const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00151
00165 void sendMetric(std::string const& name, float const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00166
00180 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);
00181
00186 void setPrefix(std::string prefix) { prefix_ = prefix; }
00187
00192 bool Initialized() { return initialized_; }
00193
00198 bool Running() { return running_; }
00199
00204 bool Active() { return active_; }
00205
00210 bool metricQueueEmpty();
00211
00217 size_t metricQueueSize(std::string name = "");
00218
00219 private:
00220 void sendMetricLoop_();
00221
00222 void startMetricLoop_();
00223
00224 std::vector<std::unique_ptr<artdaq::MetricPlugin>> metric_plugins_;
00225 boost::thread metric_sending_thread_;
00226 std::mutex metric_mutex_;
00227 std::condition_variable metric_cv_;
00228 int metric_send_interval_ms_;
00229
00230 bool initialized_;
00231 bool running_;
00232 bool active_;
00233 std::string prefix_;
00234
00235
00236
00237 typedef std::unique_ptr<MetricData> metric_data_ptr;
00238 typedef std::pair<size_t, std::list<metric_data_ptr>> queue_entry;
00239
00240 std::unordered_map<std::string, queue_entry> metric_queue_;
00241 std::mutex metric_queue_mutex_;
00242 std::atomic<size_t> missed_metric_calls_;
00243 size_t metric_queue_max_size_;
00244 size_t metric_queue_notify_size_;
00245 };
00246
00247 #endif