From 55417d768820ec44c5f995182cc808640dfd1667 Mon Sep 17 00:00:00 2001 From: Thorhallur Sverrisson Date: Tue, 7 Feb 2017 08:30:49 -0600 Subject: [PATCH] Moving buddyinfo logic to procfs --- collector/buddyinfo.go | 56 +++++++----------------------------------- 1 file changed, 9 insertions(+), 47 deletions(-) diff --git a/collector/buddyinfo.go b/collector/buddyinfo.go index 07cc8753..2d4b5115 100644 --- a/collector/buddyinfo.go +++ b/collector/buddyinfo.go @@ -1,4 +1,4 @@ -// Copyright 2015 The Prometheus Authors +// Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -17,19 +17,14 @@ package collector import ( - "bufio" "fmt" - "io" - "os" "strconv" - "strings" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/log" + "github.com/prometheus/procfs" ) -type buddyInfo map[string]map[string][]float64 - const ( buddyInfoSubsystem = "buddyinfo" ) @@ -55,10 +50,16 @@ func NewBuddyinfoCollector() (Collector, error) { // Update calls (*buddyinfoCollector).getBuddyInfo to get the platform specific // buddyinfo metrics. func (c *buddyinfoCollector) Update(ch chan<- prometheus.Metric) (err error) { - buddyInfo, err := c.getBuddyInfo() + fs, err := procfs.NewFS(*procPath) + if err != nil { + return fmt.Errorf("failed to open procfs: %v", err) + } + + buddyInfo, err := fs.NewBuddyInfo() if err != nil { return fmt.Errorf("couldn't get buddyinfo: %s", err) } + log.Debugf("Set node_buddy: %#v", buddyInfo) for node, zones := range buddyInfo { for zone, values := range zones { @@ -73,42 +74,3 @@ func (c *buddyinfoCollector) Update(ch chan<- prometheus.Metric) (err error) { } return nil } -func (c *buddyinfoCollector) getBuddyInfo() (buddyInfo, error) { - file, err := os.Open(procFilePath("buddyinfo")) - if err != nil { - return nil, err - } - defer file.Close() - - return parseBuddyInfo(file) -} - -func parseBuddyInfo(r io.Reader) (buddyInfo, error) { - var ( - buddyInfo = buddyInfo{} - scanner = bufio.NewScanner(r) - ) - - for scanner.Scan() { - var err error - line := scanner.Text() - parts := strings.Fields(string(line)) - node := strings.TrimRight(parts[1], ",") - zone := strings.TrimRight(parts[3], ",") - arraySize := len(parts[4:]) - sizes := make([]float64, arraySize) - for i := 0; i < arraySize; i++ { - sizes[i], err = strconv.ParseFloat(parts[i+4], 64) - if err != nil { - return nil, fmt.Errorf("invalid value in buddyinfo: %s", err) - } - } - - if _, ok := buddyInfo[node]; !ok { - buddyInfo[node] = make(map[string][]float64) - } - buddyInfo[node][zone] = sizes - } - - return buddyInfo, nil -}