pkg/exporter/nettop/cgroup.go (65 lines of code) (raw):
package nettop
import (
"fmt"
"io/fs"
"os"
"path/filepath"
"strconv"
"strings"
log "github.com/sirupsen/logrus"
)
var (
cgroupRoot = ""
)
func init() {
root, err := lookupCgroupRoot()
if err != nil {
log.Errorf("failed lookup cgroup root: %v", err)
return
}
cgroupRoot = root
}
func lookupCgroupRoot() (string, error) {
// TODO lookup from /proc/mount
return "/sys/fs/cgroup", nil
}
func tasksInsidePodCgroup(path string, absolutePath bool) []int {
//TODO watch file changes by inotify
if cgroupRoot == "" || path == "" {
return nil
}
base := path
if !absolutePath {
base = filepath.Join(cgroupRoot, "memory", path)
}
m := make(map[int]int)
err := filepath.Walk(base, func(path string, info fs.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() && strings.HasSuffix(path, "/tasks") {
tasks, err := os.ReadFile(path)
if err != nil {
return fmt.Errorf("failed read cgroup tasks %s: %w", path, err)
}
for _, s := range strings.Split(string(tasks), "\n") {
s = strings.TrimSpace(s)
if s == "" {
continue
}
i, err := strconv.Atoi(s)
if err != nil {
return fmt.Errorf("invalid tasks pid format in %s : %w", path, err)
}
m[i] = 1
}
}
return nil
})
if err != nil {
log.Errorf("failed list tasks: %v", err)
}
var ret []int
for k := range m {
ret = append(ret, k)
}
return ret
}