Files
go2rtc/internal/api/system_linux.go
T
Sergey Krashevich 0b80fa53cf feat(api): add system resource monitoring functionality
- implement getSystemInfo to gather CPU and memory usage
- add platform-specific implementations for memory and CPU usage
- enhance OpenAPI documentation to include system resource metrics
2026-02-13 14:49:20 +03:00

85 lines
1.6 KiB
Go

//go:build linux
package api
import (
"bytes"
"os"
"strconv"
"strings"
)
func getMemoryInfo() (total, used uint64) {
data, err := os.ReadFile("/proc/meminfo")
if err != nil {
return 0, 0
}
var memTotal, memAvailable uint64
for _, line := range strings.Split(string(data), "\n") {
fields := strings.Fields(line)
if len(fields) < 2 {
continue
}
val, err := strconv.ParseUint(fields[1], 10, 64)
if err != nil {
continue
}
switch fields[0] {
case "MemTotal:":
memTotal = val * 1024 // kB to bytes
case "MemAvailable:":
memAvailable = val * 1024
}
}
if memTotal > 0 && memAvailable <= memTotal {
return memTotal, memTotal - memAvailable
}
return memTotal, 0
}
// previous CPU times for delta calculation
var prevIdle, prevTotal uint64
func getCPUUsage() float64 {
data, err := os.ReadFile("/proc/stat")
if err != nil {
return 0
}
// first line: cpu user nice system idle iowait irq softirq steal
idx := bytes.IndexByte(data, '\n')
if idx < 0 {
return 0
}
line := string(data[:idx])
fields := strings.Fields(line)
if len(fields) < 5 || fields[0] != "cpu" {
return 0
}
var total, idle uint64
for i := 1; i < len(fields); i++ {
val, err := strconv.ParseUint(fields[i], 10, 64)
if err != nil {
continue
}
total += val
if i == 4 { // idle is the 4th value (index 4 in fields, 1-based field 4)
idle = val
}
}
deltaTotal := total - prevTotal
deltaIdle := idle - prevIdle
prevIdle = idle
prevTotal = total
if deltaTotal == 0 {
return 0
}
return float64(deltaTotal-deltaIdle) / float64(deltaTotal) * 100
}