func()

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
				}
			}
		}
	}
}