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
00069 void initialize(fhicl::ParameterSet const& pset, std::string prefix = "");
00070
00074 void do_start();
00075
00079 void do_stop();
00080
00084 void do_pause();
00085
00089 void do_resume();
00090
00098 void reinitialize(fhicl::ParameterSet const& pset, std::string prefix = "");
00099
00103 void shutdown();
00104
00118 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);
00119
00133 void sendMetric(std::string const& name, int const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00134
00148 void sendMetric(std::string const& name, double const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00149
00163 void sendMetric(std::string const& name, float const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00164
00178 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);
00179
00184 void setPrefix(std::string prefix) { prefix_ = prefix; }
00185
00190 bool Initialized() { return initialized_; }
00191
00196 bool Running() { return running_; }
00197
00202 bool Active() { return active_; }
00203
00208 bool metricQueueEmpty();
00209
00215 size_t metricQueueSize(std::string name = "");
00216
00217 private:
00218 void sendMetricLoop_();
00219
00220 void startMetricLoop_();
00221
00222 std::vector<std::unique_ptr<artdaq::MetricPlugin>> metric_plugins_;
00223 boost::thread metric_sending_thread_;
00224 std::mutex metric_mutex_;
00225 std::condition_variable metric_cv_;
00226 int metric_send_interval_ms_;
00227
00228 bool initialized_;
00229 bool running_;
00230 bool active_;
00231 std::string prefix_;
00232
00233
00234
00235 typedef std::unique_ptr<MetricData> metric_data_ptr;
00236 typedef std::pair<size_t, std::list<metric_data_ptr>> queue_entry;
00237
00238 std::unordered_map<std::string, queue_entry> metric_queue_;
00239 std::mutex metric_queue_mutex_;
00240 std::atomic<size_t> missed_metric_calls_;
00241 size_t metric_queue_max_size_;
00242 size_t metric_queue_notify_size_;
00243 };
00244
00245 #endif