pulsatrix
Loading...
Searching...
No Matches
system_monitor_detail.hpp
Go to the documentation of this file.
1
9#pragma once
10
11#include <chrono>
12#include <cstddef>
13#include <memory>
14#include <optional>
15#include <string>
16#include <vector>
17
19
20namespace pulsatrix::detail {
21
23struct CpuTimes {
24 double busy = 0.0;
25 double total = 0.0;
26};
27
29struct RawReading {
30 std::optional<CpuTimes> system_cpu;
31 std::optional<double> process_cpu_seconds;
32 std::optional<double> memory_used_bytes;
33 std::optional<double> memory_total_bytes;
34 std::optional<double> process_rss_bytes;
35 std::optional<double> cpu_temperature_c;
36 std::vector<GpuSample> gpus;
37};
38
41public:
42 virtual ~PlatformSources() = default;
43 virtual RawReading read() = 0;
44 virtual std::vector<MetricCapability> capabilities() = 0;
45};
46
48std::unique_ptr<PlatformSources> make_host_sources();
49
51std::optional<double> cpu_percent_from_deltas(const CpuTimes& previous, const CpuTimes& current);
52
55 std::string card;
56 std::string device_dir;
57 std::string pci_device;
58};
59
65public:
72 explicit LinuxSources(std::string proc_root = "/proc", std::string sys_root = "/sys",
73 long clock_ticks_per_second = 0);
74
75 RawReading read() override;
76 std::vector<MetricCapability> capabilities() override;
77
79 [[nodiscard]] std::optional<CpuTimes> read_system_cpu_times() const;
81 [[nodiscard]] std::optional<double> read_process_cpu_seconds() const;
83 [[nodiscard]] std::optional<double> read_memory_total_bytes() const;
85 [[nodiscard]] std::optional<double> read_memory_used_bytes() const;
87 [[nodiscard]] std::optional<double> read_process_rss_bytes() const;
94 [[nodiscard]] std::optional<std::string> find_cpu_temperature_input() const;
95 [[nodiscard]] std::optional<double> read_cpu_temperature_c() const;
97 [[nodiscard]] std::vector<AmdGpuDevice> find_amd_gpus() const;
99 [[nodiscard]] GpuSample read_amd_gpu(const AmdGpuDevice& device, int index) const;
100
101private:
102 std::string proc_root_;
103 std::string sys_root_;
104 double clock_ticks_per_second_;
105};
106
108std::string json_escape(const std::string& text);
109
111std::string format_number(double value);
112
114std::string mark_to_json(std::chrono::system_clock::time_point timestamp, double elapsed_seconds,
115 const std::string& label);
116
118std::string csv_header(std::size_t gpu_count);
119
121std::string sample_to_csv(const SystemSample& sample, std::size_t gpu_count);
122
124std::string mark_to_csv(std::chrono::system_clock::time_point timestamp, double elapsed_seconds,
125 const std::string& label, std::size_t gpu_count);
126
127} // namespace pulsatrix::detail
Linux /proc + /sys parsers rooted at configurable directories so tests can point them at a fake tree....
Definition system_monitor_detail.hpp:64
std::optional< double > read_process_rss_bytes() const
VmRSS from <proc>/self/status, bytes.
std::vector< MetricCapability > capabilities() override
std::optional< std::string > find_cpu_temperature_input() const
The temp*_input file chosen for the CPU temperature, or nullopt.
std::optional< double > read_cpu_temperature_c() const
std::optional< double > read_memory_used_bytes() const
MemTotal - MemAvailable from <proc>/meminfo, bytes (nullopt if MemAvailable is absent).
std::optional< double > read_process_cpu_seconds() const
utime + stime of <proc>/self/stat, in seconds.
std::optional< CpuTimes > read_system_cpu_times() const
Aggregate "cpu" line of <proc>/stat.
std::optional< double > read_memory_total_bytes() const
MemTotal from <proc>/meminfo, bytes.
RawReading read() override
GpuSample read_amd_gpu(const AmdGpuDevice &device, int index) const
Readings of one AMD GPU (index/name/vendor filled, missing files nullopt).
std::vector< AmdGpuDevice > find_amd_gpus() const
AMD (PCI vendor 0x1002) DRM cards, skipping connector entries such as card1-DP-1.
LinuxSources(std::string proc_root="/proc", std::string sys_root="/sys", long clock_ticks_per_second=0)
Where SystemMonitor reads from. Implementations must make read() thread-safe.
Definition system_monitor_detail.hpp:40
virtual RawReading read()=0
virtual std::vector< MetricCapability > capabilities()=0
Definition asha.hpp:40
std::string csv_header(std::size_t gpu_count)
CSV header for gpu_count GPUs (columns gpu_util, gpu_mem_used, ...).
std::string json_escape(const std::string &text)
JSON string-literal body escaping (quotes, backslash, control characters).
std::string mark_to_json(std::chrono::system_clock::time_point timestamp, double elapsed_seconds, const std::string &label)
The "event":"mark" JSON Lines record.
std::optional< double > cpu_percent_from_deltas(const CpuTimes &previous, const CpuTimes &current)
Utilization in percent from two counter readings; nullopt if no time elapsed.
std::string mark_to_csv(std::chrono::system_clock::time_point timestamp, double elapsed_seconds, const std::string &label, std::size_t gpu_count)
One CSV mark row (only event, timestamp, elapsed_seconds and label filled).
std::unique_ptr< PlatformSources > make_host_sources()
The sources for the host this binary runs on (Linux/Windows + NVML, or a stub).
std::string sample_to_csv(const SystemSample &sample, std::size_t gpu_count)
One CSV data row for sample; GPU columns beyond those present are empty.
std::string format_number(double value)
Number as a JSON/CSV token: integral values without decimals, else 3 decimals; non-finite -> "".
One GPU's readings within a SystemSample.
Definition system_monitor.hpp:27
One point-in-time measurement of the host.
Definition system_monitor.hpp:48
One AMD GPU found under <sys_root>/class/drm.
Definition system_monitor_detail.hpp:54
std::string card
e.g. "card1".
Definition system_monitor_detail.hpp:55
std::string device_dir
<sys_root>/class/drm/card1/device
Definition system_monitor_detail.hpp:56
std::string pci_device
contents of device/device, e.g. "0x1586" (may be empty).
Definition system_monitor_detail.hpp:57
Aggregate CPU time counters (any consistent unit). busy = total - idle - iowait.
Definition system_monitor_detail.hpp:23
double total
Definition system_monitor_detail.hpp:25
double busy
Definition system_monitor_detail.hpp:24
Raw counters/levels from one platform read; rates are derived by SystemMonitor.
Definition system_monitor_detail.hpp:29
std::optional< double > cpu_temperature_c
Definition system_monitor_detail.hpp:35
std::optional< CpuTimes > system_cpu
Definition system_monitor_detail.hpp:30
std::optional< double > memory_total_bytes
Definition system_monitor_detail.hpp:33
std::vector< GpuSample > gpus
Definition system_monitor_detail.hpp:36
std::optional< double > process_rss_bytes
Definition system_monitor_detail.hpp:34
std::optional< double > process_cpu_seconds
user + system CPU time consumed by this process.
Definition system_monitor_detail.hpp:31
std::optional< double > memory_used_bytes
Definition system_monitor_detail.hpp:32
Live CPU/GPU utilization, memory and temperature monitoring with a streaming log.