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 "fhiclcpp/types/OptionalTable.h"
00016 #include "messagefacility/MessageLogger/MessageLogger.h"
00017
00018 #include <sstream>
00019 #include <queue>
00020 #include <condition_variable>
00021 #include <atomic>
00022 #include <boost/thread.hpp>
00023
00024 namespace artdaq
00025 {
00026 class MetricManager;
00027 }
00028
00034 class artdaq::MetricManager
00035 {
00036 public:
00040 struct Config
00041 {
00043 fhicl::Atom<size_t> metric_queue_size{ fhicl::Name{"metric_queue_size"}, fhicl::Comment{"The maximum number of metric entries which can be stored in the metric queue."}, 1000 };
00045 fhicl::Atom<size_t> metric_queue_notify_size{ fhicl::Name{"metric_queue_notify_size"}, fhicl::Comment{"The number of metric entries in the list which will cause reports of the queue size to be printed."}, 10 };
00047 fhicl::Atom<int> metric_send_maximum_delay_ms{ fhicl::Name{"metric_send_maximum_delay_ms"}, fhicl::Comment{"The maximum amount of time between metric send calls (will send 0s for metrics which have not reported in this interval)"}, 15000 };
00049 fhicl::OptionalTable<artdaq::MetricPlugin::Config> metricConfig{ fhicl::Name{"metricConfig"} };
00050 };
00051 using Parameters = fhicl::WrappedTable<Config>;
00052
00056 MetricManager();
00057
00061 MetricManager(MetricManager const&) = delete;
00062
00068 virtual ~MetricManager() noexcept;
00069
00074 MetricManager& operator=(MetricManager const&) = delete;
00075
00088 void initialize(fhicl::ParameterSet const& pset, std::string const& prefix = "");
00089
00093 void do_start();
00094
00098 void do_stop();
00099
00103 void do_pause();
00104
00108 void do_resume();
00109
00117 void reinitialize(fhicl::ParameterSet const& pset, std::string const& prefix = "");
00118
00122 void shutdown();
00123
00137 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);
00138
00152 void sendMetric(std::string const& name, int const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00153
00167 void sendMetric(std::string const& name, double const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00168
00182 void sendMetric(std::string const& name, float const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00183
00197 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);
00198
00203 void setPrefix(std::string const& prefix) { prefix_ = prefix; }
00204
00209 bool Initialized() { return initialized_; }
00210
00215 bool Running() { return running_; }
00216
00221 bool Active() { return active_; }
00222
00227 bool metricQueueEmpty();
00228
00234 size_t metricQueueSize(std::string const& name = "");
00235
00236 private:
00237 void sendMetricLoop_();
00238
00239 void startMetricLoop_();
00240
00241 std::vector<std::unique_ptr<artdaq::MetricPlugin>> metric_plugins_;
00242 boost::thread metric_sending_thread_;
00243 std::mutex metric_mutex_;
00244 std::condition_variable metric_cv_;
00245 int metric_send_interval_ms_;
00246
00247 std::atomic<bool> initialized_;
00248 std::atomic<bool> running_;
00249 std::atomic<bool> active_;
00250 std::string prefix_;
00251
00252
00253
00254 typedef std::unique_ptr<MetricData> metric_data_ptr;
00255 typedef std::pair<std::atomic<size_t>, std::list<metric_data_ptr>> queue_entry;
00256
00257 std::unordered_map<std::string, queue_entry> metric_queue_;
00258 std::mutex metric_queue_mutex_;
00259 std::atomic<size_t> missed_metric_calls_;
00260 size_t metric_queue_max_size_;
00261 size_t metric_queue_notify_size_;
00262 };
00263
00264 #endif