11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
25PROMEKI_NAMESPACE_BEGIN
74class CpuMonitor :
public Thread {
89 double userPercent = 0.0;
90 double systemPercent = 0.0;
91 double totalPercent = 0.0;
92 Duration cpuTimeDelta;
106 Duration wallElapsed;
107 double processPercent = 0.0;
108 List<ThreadSample> threads;
125 using ReportFunction = Function<void(
const Report &)>;
128 static constexpr int64_t DefaultIntervalSec = 5;
133 static constexpr size_t DefaultTopN = 8;
144 ~CpuMonitor()
override;
146 CpuMonitor(
const CpuMonitor &) =
delete;
147 CpuMonitor &operator=(
const CpuMonitor &) =
delete;
166 Error start(
const Duration &interval);
180 bool isRunning()
const {
return Thread::isRunning(); }
192 void setInterval(
const Duration &d);
195 Duration interval()
const;
207 void setReportFunction(ReportFunction fn);
225 static String formatReport(
const Report &r,
size_t topN = DefaultTopN);
246 void setPoolReportEnabled(
bool enabled);
249 bool isPoolReportEnabled()
const;
264 static String formatPoolReport(
const String &poolName,
const Duration &wallElapsed,
265 const List<ThreadPool::WorkStats> &stats,
266 size_t topN = DefaultTopN);
272 struct ThreadCpuTimes {
275 int64_t utimeTicks = 0;
276 int64_t stimeTicks = 0;
285 List<ThreadCpuTimes> readThreadCpuTimes()
const;
287 Atomic<int64_t> _intervalNs;
288 Atomic<bool> _stopRequested;
289 Atomic<bool> _poolReportEnabled;
290 mutable Mutex _fnMutex;
291 ReportFunction _reportFn;