github.com/rudderlabs/rudder-go-kit@v0.30.0/mem/internal/cgroup/util.go (about) 1 package cgroup 2 3 import ( 4 "fmt" 5 "os" 6 "path" 7 "strconv" 8 "strings" 9 ) 10 11 func getStatGeneric(statName, sysfsPrefix, cgroupPath, cgroupGrepLine string) (int64, error) { 12 data, err := getFileContents(statName, sysfsPrefix, cgroupPath, cgroupGrepLine) 13 if err != nil { 14 return 0, err 15 } 16 data = strings.TrimSpace(data) 17 n, err := strconv.ParseInt(data, 10, 64) 18 if err != nil { 19 return 0, fmt.Errorf("cannot parse %q: %w", cgroupPath, err) 20 } 21 return n, nil 22 } 23 24 func getFileContents(statName, sysfsPrefix, cgroupPath, cgroupGrepLine string) (string, error) { 25 filepath := path.Join(sysfsPrefix, statName) 26 data, err := os.ReadFile(filepath) 27 if err == nil { 28 return string(data), nil 29 } 30 cgroupData, err := os.ReadFile(cgroupPath) 31 if err != nil { 32 return "", err 33 } 34 subPath, err := grepFirstMatch(string(cgroupData), cgroupGrepLine, 2, ":") 35 if err != nil { 36 return "", fmt.Errorf("cannot find cgroup path for %q in %q: %w", cgroupGrepLine, cgroupPath, err) 37 } 38 filepath = path.Join(sysfsPrefix, subPath, statName) 39 data, err = os.ReadFile(filepath) 40 if err != nil { 41 return "", err 42 } 43 return string(data), nil 44 } 45 46 // grepFirstMatch searches match line at data and returns item from it by index with given delimiter. 47 func grepFirstMatch(data, match string, index int, delimiter string) (string, error) { 48 lines := strings.Split(data, "\n") 49 for _, s := range lines { 50 if !strings.Contains(s, match) { 51 continue 52 } 53 parts := strings.Split(s, delimiter) 54 if index < len(parts) { 55 return strings.TrimSpace(parts[index]), nil 56 } 57 } 58 return "", fmt.Errorf("cannot find %q in %q", match, data) 59 }