| 31 | } |
| 32 | |
| 33 | func parseMemInfoNuma(r io.Reader) ([]meminfoMetric, error) { |
| 34 | var ( |
| 35 | memInfo []meminfoMetric |
| 36 | scanner = bufio.NewScanner(r) |
| 37 | re = regexp.MustCompile(`\((.*)\)`) |
| 38 | ) |
| 39 | |
| 40 | for scanner.Scan() { |
| 41 | line := strings.TrimSpace(scanner.Text()) |
| 42 | if line == "" { |
| 43 | continue |
| 44 | } |
| 45 | parts := strings.Fields(line) |
| 46 | |
| 47 | fv, err := strconv.ParseFloat(parts[3], 64) |
| 48 | if err != nil { |
| 49 | return nil, fmt.Errorf("invalid value in meminfo: %s", err) |
| 50 | } |
| 51 | switch l := len(parts); { |
| 52 | case l == 4: // no unit |
| 53 | case l == 5 && parts[4] == "kB": // has unit |
| 54 | fv *= 1024 |
| 55 | default: |
| 56 | return nil, fmt.Errorf("invalid line in meminfo: %s", line) |
| 57 | } |
| 58 | metric := strings.TrimRight(parts[2], ":") |
| 59 | |
| 60 | // Active(anon) -> Active_anon |
| 61 | metric = re.ReplaceAllString(metric, "_${1}") |
| 62 | memInfo = append(memInfo, meminfoMetric{metric, prometheus.GaugeValue, parts[1], fv}) |
| 63 | } |
| 64 | |
| 65 | return memInfo, scanner.Err() |
| 66 | } |
| 67 | |
| 68 | func parseMemInfoNumaStat(r io.Reader, nodeNumber string) ([]meminfoMetric, error) { |
| 69 | var ( |