func parseMemInfo()

in providers/linux/memory_linux.go [26:72]


func parseMemInfo(content []byte) (*types.HostMemoryInfo, error) {
	memInfo := &types.HostMemoryInfo{
		Metrics: map[string]uint64{},
	}

	hasAvailable := false
	err := parseKeyValue(content, ':', func(key, value []byte) error {
		num, err := parseBytesOrNumber(value)
		if err != nil {
			return fmt.Errorf("failed to parse %v value of %v: %w", string(key), string(value), err)
		}

		k := string(key)
		switch k {
		case "MemTotal":
			memInfo.Total = num
		case "MemAvailable":
			hasAvailable = true
			memInfo.Available = num
		case "MemFree":
			memInfo.Free = num
		case "SwapTotal":
			memInfo.VirtualTotal = num
		case "SwapFree":
			memInfo.VirtualFree = num
		default:
			memInfo.Metrics[k] = num
		}

		return nil
	})
	if err != nil {
		return nil, err
	}

	memInfo.Used = memInfo.Total - memInfo.Free
	memInfo.VirtualUsed = memInfo.VirtualTotal - memInfo.VirtualFree

	// MemAvailable was added in kernel 3.14.
	if !hasAvailable {
		// Linux uses this for the calculation (but we are using a simpler calculation).
		// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
		memInfo.Available = memInfo.Free + memInfo.Metrics["Buffers"] + memInfo.Metrics["Cached"]
	}

	return memInfo, nil
}