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
00186 private:
00187 void sendMetricLoop_();
00188
00189 void startMetricLoop_();
00190
00191 std::vector<std::unique_ptr<artdaq::MetricPlugin>> metric_plugins_;
00192 boost::thread metric_sending_thread_;
00193 std::mutex metric_mutex_;
00194 std::condition_variable metric_cv_;
00195 int metric_send_interval_ms_;
00196
00197 bool initialized_;
00198 bool running_;
00199 bool active_;
00200 std::string prefix_;
00201
00202 std::queue<std::unique_ptr<MetricData>> metric_queue_;
00203 std::mutex metric_queue_mutex_;
00204 std::atomic<size_t> missed_metric_calls_;
00205 size_t metric_queue_max_size_;
00206 };
00207
00208 #endif