feat(system-metrics): update metrics to gather more information

This commit is contained in:
Patryk Hegenberg 2025-09-08 08:13:44 +02:00
parent a8eb0ad726
commit 6c098ed61c
3 changed files with 96 additions and 11 deletions

View file

@ -5,6 +5,7 @@ import (
"fmt"
"log/slog"
"slices"
"sort"
"time"
"github.com/elastic/go-elasticsearch/v7"
@ -13,6 +14,7 @@ import (
"github.com/shirou/gopsutil/host"
"github.com/shirou/gopsutil/mem"
"github.com/shirou/gopsutil/net"
"github.com/shirou/gopsutil/process"
)
type SystemMetricsCollector struct {
@ -81,9 +83,79 @@ func (smc *SystemMetricsCollector) collectMetrics() (SystemResources, error) {
}
}
if smc.config.CollectProcesses {
if err := smc.collectProcessMetrics(&result); err != nil {
slog.Warn("failed to collect process metrics", "error", err)
}
}
return result, nil
}
func (smc *SystemMetricsCollector) collectProcessMetrics(result *SystemResources) error {
processes, err := process.Processes()
if err != nil {
return err
}
var processInfos []ProcessInfo
var totalOpenFiles int32
for _, p := range processes {
name, err := p.Name()
if err != nil {
continue
}
cpuPercent, err := p.CPUPercent()
if err != nil {
continue
}
memInfo, err := p.MemoryInfo()
if err != nil {
continue
}
status, err := p.Status()
if err != nil {
status = ""
}
createTime, err := p.CreateTime()
if err != nil {
createTime = 0
}
if openFiles, err := p.NumFDs(); err == nil {
totalOpenFiles += openFiles
}
processInfos = append(processInfos, ProcessInfo{
PID: p.Pid,
Name: name,
CPUPercent: cpuPercent,
MemoryMB: float32(memInfo.RSS) / 1024 / 1024,
Status: status,
CreateTime: createTime,
})
}
sort.Slice(processInfos, func(i, j int) bool {
return processInfos[i].CPUPercent > processInfos[j].CPUPercent
})
limit := smc.config.TopProcessesLimit
if len(processInfos) > limit {
processInfos = processInfos[:limit]
}
result.TopProcesses = processInfos
result.OpenFileDescriptors = totalOpenFiles
return nil
}
func (smc *SystemMetricsCollector) collectCPUMetrics(result *SystemResources) error {
cpuPercents, err := cpu.Percent(time.Second, false)
if err != nil {