in VMBackup/debughelper/run.go [199:294]
func (r Run) monitorMem(ctx context.Context, memStream chan *Mem) {
ticker := time.NewTicker(time.Second)
ctx1, cancel := context.WithCancel(context.TODO())
outer:
for {
select {
case <-ctx.Done():
cancel()
ticker.Stop()
memStream <- nil
break outer
case <-ticker.C:
command := exec.CommandContext(ctx1, "cat", "/proc/meminfo")
bs, err := command.CombinedOutput()
if err != nil {
log.Println(wrapErr(err, "CombinedOutput failed"))
} else {
m := Mem{
TS: time.Now().UnixMilli(),
}
flag := false
for _, line := range strings.Split(string(bs), "\n") {
if len(line) == 0 {
continue
}
fields := strings.Fields(line)
if len(fields) != 3 {
continue
}
switch fields[0] {
case "MemTotal:":
v, err := strconv.Atoi(fields[1])
if err != nil {
log.Println("MemTotal conversion to int failed: ", err)
} else {
m.TotalKb = int64(v)
flag = true
}
case "MemAvailable:":
v, err := strconv.Atoi(fields[1])
if err != nil {
log.Println("MemAvailable conversion to int failed: ", err)
} else {
m.AvailKb = int64(v)
flag = true
}
case "MemFree:":
v, err := strconv.Atoi(fields[1])
if err != nil {
log.Println("MemFree conversion to int failed: ", err)
} else {
m.FreeKb = int64(v)
flag = true
}
case "Cached:":
v, err := strconv.Atoi(fields[1])
if err != nil {
log.Println("Cached Mem conversion to int failed: ", err)
} else {
m.CachedKb = int64(v)
flag = true
}
case "SwapCached:":
v, err := strconv.Atoi(fields[1])
if err != nil {
log.Println("SwapCached conversion to int failed: ", err)
} else {
m.SwapCachedKb = int64(v)
flag = true
}
case "SwapTotal:":
v, err := strconv.Atoi(fields[1])
if err != nil {
log.Println("SwapTotal conversion to int failed: ", err)
} else {
m.SwapTotalKb = int64(v)
flag = true
}
case "SwapFree:":
v, err := strconv.Atoi(fields[1])
if err != nil {
log.Println("SwapFree conversion to int failed: ", err)
} else {
m.SwapFreeKb = int64(v)
flag = true
}
}
}
if flag {
// log.Println("[monitorMem] -> sending new metric")
memStream <- &m
}
}
}
}
}