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 #if MESSAGEFACILITY_HEX_VERSION >= 0x20103
00052 using Parameters = fhicl::WrappedTable<Config>;
00053 #endif
00054
00058 MetricManager();
00059
00063 MetricManager(MetricManager const&) = delete;
00064
00070 virtual ~MetricManager() noexcept;
00071
00076 MetricManager& operator=(MetricManager const&) = delete;
00077
00090 void initialize(fhicl::ParameterSet const& pset, std::string const& prefix = "");
00091
00095 void do_start();
00096
00100 void do_stop();
00101
00105 void do_pause();
00106
00110 void do_resume();
00111
00119 void reinitialize(fhicl::ParameterSet const& pset, std::string const& prefix = "");
00120
00124 void shutdown();
00125
00139 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);
00140
00154 void sendMetric(std::string const& name, int const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00155
00169 void sendMetric(std::string const& name, double const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00170
00184 void sendMetric(std::string const& name, float const& value, std::string const& unit, int level, MetricMode mode, std::string const& metricPrefix = "", bool useNameOverride = false);
00185
00199 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);
00200
00205 void setPrefix(std::string const& prefix) { prefix_ = prefix; }
00206
00211 bool Initialized() { return initialized_; }
00212
00217 bool Running() { return running_; }
00218
00223 bool Active() { return active_; }
00224
00229 bool metricQueueEmpty();
00230
00236 size_t metricQueueSize(std::string const& name = "");
00237
00238 private:
00239 void sendMetricLoop_();
00240
00241 void startMetricLoop_();
00242
00243 std::vector<std::unique_ptr<artdaq::MetricPlugin>> metric_plugins_;
00244 boost::thread metric_sending_thread_;
00245 std::mutex metric_mutex_;
00246 std::condition_variable metric_cv_;
00247 int metric_send_interval_ms_;
00248
00249 bool initialized_;
00250 bool running_;
00251 bool active_;
00252 std::string prefix_;
00253
00254
00255
00256 typedef std::unique_ptr<MetricData> metric_data_ptr;
00257 typedef std::pair<size_t, std::list<metric_data_ptr>> queue_entry;
00258
00259 std::unordered_map<std::string, queue_entry> metric_queue_;
00260 std::mutex metric_queue_mutex_;
00261 std::atomic<size_t> missed_metric_calls_;
00262 size_t metric_queue_max_size_;
00263 size_t metric_queue_notify_size_;
00264 };
00265
00266 #endif