| 38 | } |
| 39 | |
| 40 | func parseMemInfo(r io.Reader) (map[string]float64, error) { |
| 41 | var ( |
| 42 | memInfo = map[string]float64{} |
| 43 | scanner = bufio.NewScanner(r) |
| 44 | re = regexp.MustCompile(`\((.*)\)`) |
| 45 | ) |
| 46 | |
| 47 | for scanner.Scan() { |
| 48 | line := scanner.Text() |
| 49 | parts := strings.Fields(line) |
| 50 | fv, err := strconv.ParseFloat(parts[1], 64) |
| 51 | if err != nil { |
| 52 | return nil, fmt.Errorf("invalid value in meminfo: %s", err) |
| 53 | } |
| 54 | key := parts[0][:len(parts[0])-1] // remove trailing : from key |
| 55 | // Active(anon) -> Active_anon |
| 56 | key = re.ReplaceAllString(key, "_${1}") |
| 57 | switch len(parts) { |
| 58 | case 2: // no unit |
| 59 | case 3: // has unit, we presume kB |
| 60 | fv *= 1024 |
| 61 | key = key + "_bytes" |
| 62 | default: |
| 63 | return nil, fmt.Errorf("invalid line in meminfo: %s", line) |
| 64 | } |
| 65 | memInfo[key] = fv |
| 66 | } |
| 67 | |
| 68 | return memInfo, scanner.Err() |
| 69 | } |