in metric/system/process/process.go [375:413]
func (procStats *Stats) includeTopProcesses(processes []ProcState) []ProcState {
if !procStats.IncludeTop.Enabled ||
(procStats.IncludeTop.ByCPU == 0 && procStats.IncludeTop.ByMemory == 0) {
return processes
}
var result []ProcState
if procStats.IncludeTop.ByCPU > 0 {
numProcs := procStats.IncludeTop.ByCPU
if len(processes) < procStats.IncludeTop.ByCPU {
numProcs = len(processes)
}
sort.Slice(processes, func(i, j int) bool {
return processes[i].CPU.Total.Pct.ValueOr(0) > processes[j].CPU.Total.Pct.ValueOr(0)
})
result = append(result, processes[:numProcs]...)
}
if procStats.IncludeTop.ByMemory > 0 {
numProcs := procStats.IncludeTop.ByMemory
if len(processes) < procStats.IncludeTop.ByMemory {
numProcs = len(processes)
}
sort.Slice(processes, func(i, j int) bool {
return processes[i].Memory.Rss.Bytes.ValueOr(0) > processes[j].Memory.Rss.Bytes.ValueOr(0)
})
for _, proc := range processes[:numProcs] {
proc := proc
if !isProcessInSlice(result, &proc) {
result = append(result, proc)
}
}
}
return result
}