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/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 new file mode 100644 index 000000000..7b99b2acd --- /dev/null +++ b/examples/9-ProcessMonitoring.cxx @@ -0,0 +1,17 @@ +/// +/// \file 9-ProcessMonitoring.cxx +/// \author Adam Wegrzynek +/// + +#include "Monitoring/MonitoringFactory.h" + +using namespace o2::monitoring; + +int main() +{ + auto monitoring = MonitoringFactory::Get("influxdb-stdout://"); + for (int i = 0; i < 5; i++) { + monitoring->pushProcessMonitoringMetrics(); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + } +} 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/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 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()