From c4f79b23fcb018f7ce6f8b47c2b30d439097870b Mon Sep 17 00:00:00 2001 From: Adam Wegrzynek Date: Tue, 23 Feb 2021 09:04:41 +0100 Subject: [PATCH 1/2] Add an example how to send process metrics from user code --- CMakeLists.txt | 1 + examples/9-ProcessMonitoring.cxx | 23 +++++++++++++++++++++++ include/Monitoring/ProcessMonitor.h | 5 +---- 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 examples/9-ProcessMonitoring.cxx diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f34e33bc..721578992 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -182,6 +182,7 @@ set(EXAMPLES examples/6-Increment.cxx examples/7-InternalBenchamrk.cxx examples/8-DbFiller.cxx + examples/9-ProcessMonitoring.cxx examples/10-Buffering.cxx ) diff --git a/examples/9-ProcessMonitoring.cxx b/examples/9-ProcessMonitoring.cxx new file mode 100644 index 000000000..e1f56cdbc --- /dev/null +++ b/examples/9-ProcessMonitoring.cxx @@ -0,0 +1,23 @@ +/// +/// \file 9-ProcessMonitoring.cxx +/// \author Adam Wegrzynek +/// + +#include "Monitoring/MonitoringFactory.h" +#include "Monitoring/ProcessMonitor.h" + +using namespace o2::monitoring; + +int main() +{ + auto monitoring = MonitoringFactory::Get("influxdb-stdout://"); + auto processMonitor = std::make_unique(); + processMonitor->init(); + for (int i = 0; i < 5; i++) { + for (auto&& metric : processMonitor->getPerformanceMetrics()) + monitoring->send(std::move(metric)); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + } + for (auto&& metric : processMonitor->makeLastMeasurementAndGetMetrics()) + monitoring->send(std::move(metric)); +} diff --git a/include/Monitoring/ProcessMonitor.h b/include/Monitoring/ProcessMonitor.h index 2c70ee4ff..eb7329dec 100644 --- a/include/Monitoring/ProcessMonitor.h +++ b/include/Monitoring/ProcessMonitor.h @@ -57,8 +57,8 @@ class ProcessMonitor static std::vector getAvailableMetricsNames(); std::vector getPerformanceMetrics(); + std::vector makeLastMeasurementAndGetMetrics(); - public: /// Prepares externam software commands (ps) ProcessMonitor(); @@ -73,7 +73,6 @@ class ProcessMonitor /// Retrievs total memory size from /proc/meminfo void setTotalMemory(); - private: static constexpr const char* metricsNames[] = {"memoryUsagePercentage", "virtualMemorySize", "residentSetSize", "cpuUsedPercentage", "involuntaryContextSwitches", "voluntaryContextSwitches", "cpuUsedAbsolute", "averageResidentSetSize", "averageVirtualMemorySize", "averageCpuUsedPercentage", @@ -108,8 +107,6 @@ class ProcessMonitor /// Retrieves CPU usage (%) and number of context switches during the interval std::vector getCpuAndContexts(); - - std::vector makeLastMeasurementAndGetMetrics(); }; } // namespace monitoring From 2243ebc2cc11f17e0ddde0045bcdef874b882612 Mon Sep 17 00:00:00 2001 From: Adam Wegrzynek Date: Tue, 23 Feb 2021 09:25:48 +0100 Subject: [PATCH 2/2] Simplify --- README.md | 6 ++++++ examples/9-ProcessMonitoring.cxx | 8 +------- include/Monitoring/Monitoring.h | 6 ++---- src/Monitoring.cxx | 5 +++++ src/ProcessMonitor.cxx | 3 +-- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 0ee575768..914418b84 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,12 @@ This feature provides basic performance status of the process. Note that is runs ```cpp enableProcessMonitoring([interval in seconds]); ``` + +As an alternative, without a need of a new thread, user can manually trigger: +``` +pushProcessMonitoringMetrics() +``` + Following metrics are generated every time interval: CPU measurements: + **cpuUsedPercentage** - percentage of a core usage (kernel + user mode) over time interval diff --git a/examples/9-ProcessMonitoring.cxx b/examples/9-ProcessMonitoring.cxx index e1f56cdbc..7b99b2acd 100644 --- a/examples/9-ProcessMonitoring.cxx +++ b/examples/9-ProcessMonitoring.cxx @@ -4,20 +4,14 @@ /// #include "Monitoring/MonitoringFactory.h" -#include "Monitoring/ProcessMonitor.h" using namespace o2::monitoring; int main() { auto monitoring = MonitoringFactory::Get("influxdb-stdout://"); - auto processMonitor = std::make_unique(); - processMonitor->init(); for (int i = 0; i < 5; i++) { - for (auto&& metric : processMonitor->getPerformanceMetrics()) - monitoring->send(std::move(metric)); + monitoring->pushProcessMonitoringMetrics(); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); } - for (auto&& metric : processMonitor->makeLastMeasurementAndGetMetrics()) - monitoring->send(std::move(metric)); } diff --git a/include/Monitoring/Monitoring.h b/include/Monitoring/Monitoring.h index 4079d9266..808ce7357 100644 --- a/include/Monitoring/Monitoring.h +++ b/include/Monitoring/Monitoring.h @@ -88,10 +88,8 @@ class Monitoring /// \param value tag value void addGlobalTag(tags::Key key, tags::Value value); - /// Returns a metric which will be periodically sent to backends - /// \param name metric name - /// \return periodically send metric - //ComplexMetric& getAutoPushMetric(std::string name, unsigned int interval = 1); + /// Allows user to push process monitoring metrics without having separate thread + void pushProcessMonitoringMetrics(); private: /// Sends multiple (not related to each other) metrics diff --git a/src/Monitoring.cxx b/src/Monitoring.cxx index 3527838a0..223cb19ac 100644 --- a/src/Monitoring.cxx +++ b/src/Monitoring.cxx @@ -178,6 +178,11 @@ void Monitoring::send(Metric&& metric, DerivedMetricMode mode) transmit(std::move(metric)); } +void Monitoring::pushProcessMonitoringMetrics() +{ + transmit(mProcessMonitor->getPerformanceMetrics()); +} + inline bool Monitoring::matchVerbosity(Verbosity backend, Verbosity metric) { return (static_cast::type>(backend) >= static_cast::type>(metric)); diff --git a/src/ProcessMonitor.cxx b/src/ProcessMonitor.cxx index 153388733..e88490c68 100644 --- a/src/ProcessMonitor.cxx +++ b/src/ProcessMonitor.cxx @@ -22,11 +22,10 @@ namespace monitoring ProcessMonitor::ProcessMonitor() { mPid = static_cast(::getpid()); - mTimeLastRun = std::chrono::high_resolution_clock::now(); - getrusage(RUSAGE_SELF, &mPreviousGetrUsage); #ifdef O2_MONITORING_OS_LINUX setTotalMemory(); #endif + init(); } void ProcessMonitor::init()