Skip to content

Commit

Permalink
Add and use sysReadFile in hwmon collector (prometheus#728)
Browse files Browse the repository at this point in the history
  • Loading branch information
mdlayher authored and oblitorum committed Apr 9, 2024
1 parent 3575434 commit 7bcb5af
Showing 1 changed file with 25 additions and 2 deletions.
27 changes: 25 additions & 2 deletions collector/hwmon_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"regexp"
"strconv"
"strings"
"syscall"

"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
Expand Down Expand Up @@ -61,8 +62,8 @@ func cleanMetricName(name string) string {
}

func addValueFile(data map[string]map[string]string, sensor string, prop string, file string) {
raw, e := ioutil.ReadFile(file)
if e != nil {
raw, err := sysReadFile(file)
if err != nil {
return
}
value := strings.Trim(string(raw), "\n")
Expand All @@ -74,6 +75,28 @@ func addValueFile(data map[string]map[string]string, sensor string, prop string,
data[sensor][prop] = value
}

// sysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly.
func sysReadFile(file string) ([]byte, error) {
f, err := os.Open(file)
if err != nil {
return nil, err
}
defer f.Close()

// On some machines, hwmon drivers are broken and return EAGAIN. This causes
// Go's ioutil.ReadFile implementation to poll forever.
//
// Since we either want to read data or bail immediately, do the simplest
// possible read using syscall directly.
b := make([]byte, 128)
n, err := syscall.Read(int(f.Fd()), b)
if err != nil {
return nil, err
}

return b[:n], nil
}

// explodeSensorFilename splits a sensor name into <type><num>_<property>.
func explodeSensorFilename(filename string) (ok bool, sensorType string, sensorNum int, sensorProperty string) {
matches := hwmonFilenameFormat.FindStringSubmatch(filename)
Expand Down

0 comments on commit 7bcb5af

Please sign in to comment.