feat(system-metrics): update metrics to gather more information
This commit is contained in:
parent
a8eb0ad726
commit
6c098ed61c
3 changed files with 96 additions and 11 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue