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  }