Skip to content

Commit 008f13a

Browse files
authored
Use single metric multi-value metric for process performance (#199)
1 parent 0795fea commit 008f13a

File tree

4 files changed

+27
-43
lines changed

4 files changed

+27
-43
lines changed

include/Monitoring/ProcessMonitor.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,8 @@ class ProcessMonitor
4343
/// Default destructor
4444
~ProcessMonitor() = default;
4545

46-
/// Retrieves memory usage (%)
47-
Metric getMemoryUsage();
48-
49-
/// Retrieves CPU usage (%) and number of context switches during the interval
50-
std::vector<Metric> getCpuAndContexts();
46+
/// Return performance metrics
47+
Metric getPerformanceMetrics();
5148

5249
private:
5350
/// PIDs that are monitored
@@ -64,6 +61,12 @@ class ProcessMonitor
6461

6562
/// Timestamp when process monitoring was executed last time
6663
std::chrono::high_resolution_clock::time_point mTimeLastRun;
64+
65+
/// Retrieves memory usage (%)
66+
double getMemoryUsage();
67+
68+
/// Retrieves CPU usage (%) and number of context switches during the interval
69+
Metric getCpuAndContexts();
6770
};
6871

6972
} // namespace monitoring

src/Monitoring.cxx

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -134,36 +134,13 @@ void Monitoring::pushLoop()
134134
std::this_thread::sleep_for(std::chrono::milliseconds(100));
135135
while (mMonitorRunning) {
136136
if (mProcessMonitoringInterval != 0 && (loopCount % (mProcessMonitoringInterval * 10)) == 0) {
137-
transmit(mProcessMonitor->getCpuAndContexts());
138-
#ifdef O2_MONITORING_OS_LINUX
139-
transmit(mProcessMonitor->getMemoryUsage());
140-
#endif
137+
transmit(mProcessMonitor->getPerformanceMetrics());
141138
}
142-
143-
/*if (mAutoPushInterval != 0 && (loopCount % (mAutoPushInterval * 10)) == 0) {
144-
std::vector<Metric> metrics;
145-
for (auto metric : mPushStore) {
146-
metric.resetTimestamp();
147-
metrics.push_back(metric);
148-
}
149-
transmit(std::move(metrics));
150-
}*/
151139
std::this_thread::sleep_for(std::chrono::milliseconds(100));
152140
(loopCount >= 600) ? loopCount = 0 : loopCount++;
153141
}
154142
}
155143

156-
/*ComplexMetric& Monitoring::getAutoPushMetric(std::string name, unsigned int interval)
157-
{
158-
if (!mMonitorRunning) {
159-
mMonitorRunning = true;
160-
mMonitorThread = std::thread(&Monitoring::pushLoop, this);
161-
mAutoPushInterval = interval;
162-
}
163-
mPushStore.emplace_back(std::variant<int, std::string, double, uint64_t>{}, name);
164-
return mPushStore.back();
165-
}*/
166-
167144
void Monitoring::transmit(std::vector<Metric>&& metrics)
168145
{
169146
for (auto& backend : mBackends) {

src/ProcessMonitor.cxx

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@ ProcessMonitor::ProcessMonitor()
2828
#endif
2929
}
3030

31+
Metric ProcessMonitor::getPerformanceMetrics()
32+
{
33+
auto metric = getCpuAndContexts();
34+
#ifdef O2_MONITORING_OS_LINUX
35+
metric.addValue(getMemoryUsage(), "memory_pct");
36+
#endif
37+
return metric;
38+
}
39+
3140
void ProcessMonitor::setTotalMemory()
3241
{
3342
std::ifstream memInfo("/proc/meminfo");
@@ -39,7 +48,7 @@ void ProcessMonitor::setTotalMemory()
3948
mTotalMemory = std::stoi(tokens[1]);
4049
}
4150

42-
Metric ProcessMonitor::getMemoryUsage()
51+
double ProcessMonitor::getMemoryUsage()
4352
{
4453
std::ifstream statusStream("/proc/self/status");
4554
std::string rssString;
@@ -52,30 +61,28 @@ Metric ProcessMonitor::getMemoryUsage()
5261
std::istringstream iss(rssString);
5362
std::vector<std::string> tokens{std::istream_iterator<std::string>{iss},
5463
std::istream_iterator<std::string>{}};
55-
return Metric{(std::stod(tokens[1]) * 100) / mTotalMemory, "memoryUsagePercentage"};
64+
return (std::stod(tokens[1]) * 100) / mTotalMemory;
5665
}
5766

58-
std::vector<Metric> ProcessMonitor::getCpuAndContexts()
67+
Metric ProcessMonitor::getCpuAndContexts()
5968
{
60-
std::vector<Metric> metrics;
6169
struct rusage currentUsage;
6270
getrusage(RUSAGE_SELF, &currentUsage);
6371
auto timeNow = std::chrono::high_resolution_clock::now();
6472
double timePassed = std::chrono::duration_cast<std::chrono::microseconds>(timeNow - mTimeLastRun).count();
6573
if (timePassed < 950) {
6674
MonLogger::Get() << "[WARN] Do not invoke Process Monitor more frequent then every 1s" << MonLogger::End();
67-
return {};
75+
return {"processPerformance"};
6876
}
6977
double fractionCpuUsed = (currentUsage.ru_utime.tv_sec * 1000000.0 + currentUsage.ru_utime.tv_usec - (mPreviousGetrUsage.ru_utime.tv_sec * 1000000.0 + mPreviousGetrUsage.ru_utime.tv_usec) + currentUsage.ru_stime.tv_sec * 1000000.0 + currentUsage.ru_stime.tv_usec - (mPreviousGetrUsage.ru_stime.tv_sec * 1000000.0 + mPreviousGetrUsage.ru_stime.tv_usec)) / timePassed;
7078

71-
metrics.emplace_back(Metric{
72-
static_cast<double>(std::round(fractionCpuUsed * 100.0 * 100.0) / 100.0), "cpuUsedPercentage"});
73-
metrics.emplace_back(Metric{
74-
static_cast<uint64_t>(currentUsage.ru_nivcsw - mPreviousGetrUsage.ru_nivcsw), "involuntaryContextSwitches"});
79+
Metric metric{"processPerformance"};
80+
metric.addValue(static_cast<double>(std::round(fractionCpuUsed * 100.0 * 100.0) / 100.0), "cpu_user_pct");
81+
metric.addValue(static_cast<uint64_t>(currentUsage.ru_nivcsw - mPreviousGetrUsage.ru_nivcsw), "involuntary_context_switches");
7582

7683
mTimeLastRun = timeNow;
7784
mPreviousGetrUsage = currentUsage;
78-
return metrics;
85+
return metric;
7986
}
8087

8188
} // namespace monitoring

test/testProcessMonitor.cxx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@ namespace Test
2525
BOOST_AUTO_TEST_CASE(createProcessMonitor)
2626
{
2727
o2::monitoring::ProcessMonitor processMonitor;
28-
processMonitor.getCpuAndContexts();
29-
#ifdef O2_MONITORING_OS_LINUX
30-
processMonitor.getMemoryUsage();
31-
#endif
28+
processMonitor.getPerformanceMetrics();
3229
}
3330

3431
BOOST_AUTO_TEST_CASE(monitorProcess)

0 commit comments

Comments
 (0)