diff --git a/CMakeLists.txt b/CMakeLists.txt index 402ea6ff2..8846a5b61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -181,6 +181,7 @@ set(EXAMPLES examples/5-Benchmark.cxx examples/6-Increment.cxx examples/7-InternalBenchamrk.cxx + examples/8-DbFiller.cxx examples/10-Buffering.cxx ) @@ -195,6 +196,7 @@ foreach (example ${EXAMPLES}) endforeach() set_target_properties(5-Benchmark PROPERTIES OUTPUT_NAME "o2-monitoring-benchmark") +set_target_properties(8-DbFiller PROPERTIES OUTPUT_NAME "o2-monitoring-dbfiller") #################################### # Tests @@ -238,7 +240,7 @@ endforeach() #################################### # Install library -install(TARGETS Monitoring 5-Benchmark +install(TARGETS Monitoring 5-Benchmark 8-DbFiller EXPORT MonitoringTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/examples/8-DbFiller.cxx b/examples/8-DbFiller.cxx new file mode 100644 index 000000000..4370333ae --- /dev/null +++ b/examples/8-DbFiller.cxx @@ -0,0 +1,57 @@ +/// +/// \file 8-DbFiller.cxx +/// \author Adam Wegrzynek +/// + +#include "Monitoring/MonitoringFactory.h" +#include +#include + +using o2::monitoring::Metric; +using namespace o2::monitoring; + +int main(int argc, char* argv[]) +{ + std::srand(std::time(nullptr)); + + std::random_device rd; + std::mt19937 mt(rd()); + + std::uniform_real_distribution doubleDist(1.0, 100.0); + std::uniform_int_distribution<> intDist(1, 100); + + boost::program_options::options_description desc("Allowed options"); + desc.add_options() + ("url", boost::program_options::value()->required(), "URL to monitoring backend (or list of comma seperated URLs)") + ("measurements", boost::program_options::value()->default_value(1), "Number of different measurements") + ("flps", boost::program_options::value()->default_value(1), "Number of FLPs") + ("since", boost::program_options::value()->default_value(60), "Start filling since (s)") + ("interval", boost::program_options::value()->default_value(1), "Interval between metrics (s)"); + + boost::program_options::variables_map vm; + boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm); + boost::program_options::notify(vm); + + auto monitoring = MonitoringFactory::Get(vm["url"].as()); + monitoring->addGlobalTag(tags::Key::Subsystem, tags::Value::QC); + + auto now = Metric::getCurrentTimestamp(); + auto interval = std::chrono::seconds(vm["interval"].as()); + auto since = now - std::chrono::seconds(vm["since"].as()); + + for (;;) { + since = since + interval; + for (int i = 1; i <= vm["measurements"].as(); i++) { + for (int k = 1; k <= vm["flps"].as(); k++) { + auto metric = Metric{"metric" + std::to_string(i), Metric::DefaultVerbosity, since} + .addValue(doubleDist(mt), "double") + .addValue(intDist(mt), "int") + .addValue(std::rand() % 2, "onOff") + .addTag(tags::Key::FLP, k); + monitoring->send(std::move(metric)); + std::this_thread::sleep_for(std::chrono::microseconds(1)); + } + } + if (since > now) break; + } +} diff --git a/include/Monitoring/Metric.h b/include/Monitoring/Metric.h index ff0abd76f..ca36f510d 100644 --- a/include/Monitoring/Metric.h +++ b/include/Monitoring/Metric.h @@ -59,7 +59,7 @@ class Metric /// Constructor that does not require any value to be specified, .addValue needs to be used /// \param name metric name - Metric(const std::string& name, Verbosity verbosity = Metric::DefaultVerbosity); + Metric(const std::string& name, Verbosity verbosity = Metric::DefaultVerbosity, const std::chrono::time_point& timestamp = Metric::getCurrentTimestamp()); /// Adds additional int value to metric /// \param value diff --git a/src/Metric.cxx b/src/Metric.cxx index 0750de36c..264db921d 100644 --- a/src/Metric.cxx +++ b/src/Metric.cxx @@ -87,7 +87,7 @@ Metric&& Metric::addValue(const std::variant return std::move(*this); } -Metric::Metric(const std::string& name, Verbosity verbosity) : mName(name), mTimestamp(Metric::getCurrentTimestamp()), mVerbosity(verbosity) +Metric::Metric(const std::string& name, Verbosity verbosity, const std::chrono::time_point& timestamp) : mName(name), mTimestamp(timestamp), mVerbosity(verbosity) { overwriteVerbosity(); }