diff --git a/go.mod b/go.mod index 95cd65f4..1e4e4ed2 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/prometheus/procfs go 1.19 require ( + github.com/dustin/go-humanize v1.0.1 github.com/google/go-cmp v0.5.9 golang.org/x/sync v0.3.0 golang.org/x/sys v0.11.0 diff --git a/go.sum b/go.sum index 4d2f8b9d..1d6f31ba 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= diff --git a/meminfo.go b/meminfo.go index eaf00e22..03088d1c 100644 --- a/meminfo.go +++ b/meminfo.go @@ -21,6 +21,8 @@ import ( "strconv" "strings" + "github.com/dustin/go-humanize" + "github.com/prometheus/procfs/internal/util" ) @@ -162,15 +164,26 @@ func parseMemInfo(r io.Reader) (*Meminfo, error) { var m Meminfo s := bufio.NewScanner(r) for s.Scan() { - // Each line has at least a name and value; we ignore the unit. fields := strings.Fields(s.Text()) - if len(fields) < 2 { - return nil, fmt.Errorf("%w: Malformed line %q", ErrFileParse, s.Text()) - } + var v uint64 - v, err := strconv.ParseUint(fields[1], 0, 64) - if err != nil { - return nil, err + switch len(fields) { + case 2: + // No unit present, parse the value as bytes directly. + val, err := strconv.ParseUint(fields[1], 0, 64) + if err != nil { + return nil, err + } + v = val + case 3: + // Unit present, convert and normalize to bytes. + val, err := humanize.ParseBytes(fmt.Sprintf("%s %s", fields[1], fields[2])) + if err != nil { + return nil, err + } + v = val + default: + return nil, fmt.Errorf("%w: Malformed line %q", ErrFileParse, s.Text()) } switch fields[0] {