diff --git a/src/metrics/Collector.cpp b/src/metrics/Collector.cpp index 3239708..cea28b6 100644 --- a/src/metrics/Collector.cpp +++ b/src/metrics/Collector.cpp @@ -10,6 +10,8 @@ #include #include +#include + namespace metrics { @@ -203,14 +205,27 @@ namespace metrics Memory Collector::readMemory() { std::ifstream f("/proc/meminfo"); - std::string key; - uint64_t value; - std::string unit; + if (!f) + return {}; - uint64_t mem_total = 0, mem_available = 0, swap_total = 0, swap_available = 0, hugepages_total = 0, hugepages_available = 0, hugepages_size = 0; + uint64_t mem_total = 0; + uint64_t mem_available = 0; + uint64_t swap_total = 0; + uint64_t swap_available = 0; + uint64_t hugepages_total = 0; + uint64_t hugepages_available = 0; + uint64_t hugepages_size = 0; - while (f >> key >> value >> unit) + std::string line; + while (std::getline(f, line)) { + std::istringstream iss(line); + std::string key; + uint64_t value = 0; + std::string unit; + + iss >> key >> value >> unit; // unit может отсутствовать + if (key == "MemTotal:") mem_total = value * 1024; else if (key == "MemAvailable:") @@ -224,19 +239,24 @@ namespace metrics else if (key == "HugePages_Free:") hugepages_available = value; else if (key == "Hugepagesize:") - hugepages_size = value; + hugepages_size = value * 1024; // kB → bytes } Memory memory; + memory.memory.total = mem_total; memory.memory.available = mem_available; memory.memory.used = mem_total - mem_available; + memory.swap.total = swap_total; memory.swap.available = swap_available; memory.swap.used = swap_total - swap_available; + memory.hugepages.total = hugepages_total * hugepages_size; memory.hugepages.available = hugepages_available * hugepages_size; - memory.hugepages.used = hugepages_total - hugepages_available; + memory.hugepages.used = + memory.hugepages.total - memory.hugepages.available; + return memory; }