Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use golang.org/x/sys/unix instead of syscall in diskio #3384

Merged
merged 2 commits into from
Oct 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 11 additions & 12 deletions plugins/inputs/system/disk.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package system

import (
"fmt"
"log"
"regexp"
"strings"

Expand Down Expand Up @@ -166,14 +167,13 @@ func (s *DiskIOStats) Gather(acc telegraf.Accumulator) error {
var varRegex = regexp.MustCompile(`\$(?:\w+|\{\w+\})`)

func (s *DiskIOStats) diskName(devName string) string {
di, err := s.diskInfo(devName)
if err != nil {
// discard error :-(
// We can't return error because it's non-fatal to the Gather().
// And we have no logger, so we can't log it.
if len(s.NameTemplates) == 0 {
return devName
}
if di == nil {

di, err := s.diskInfo(devName)
if err != nil {
log.Printf("W! Error gathering disk info: %s", err)
return devName
}

Expand All @@ -200,14 +200,13 @@ func (s *DiskIOStats) diskName(devName string) string {
}

func (s *DiskIOStats) diskTags(devName string) map[string]string {
di, err := s.diskInfo(devName)
if err != nil {
// discard error :-(
// We can't return error because it's non-fatal to the Gather().
// And we have no logger, so we can't log it.
if len(s.DeviceTags) == 0 {
return nil
}
if di == nil {

di, err := s.diskInfo(devName)
if err != nil {
log.Printf("W! Error gathering disk info: %s", err)
return nil
}

Expand Down
36 changes: 19 additions & 17 deletions plugins/inputs/system/disk_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,51 +5,53 @@ import (
"fmt"
"os"
"strings"
"syscall"

"golang.org/x/sys/unix"
)

type diskInfoCache struct {
stat syscall.Stat_t
values map[string]string
udevDataPath string
values map[string]string
}

var udevPath = "/run/udev/data"

func (s *DiskIOStats) diskInfo(devName string) (map[string]string, error) {
fi, err := os.Stat("/dev/" + devName)
var err error
var stat unix.Stat_t

path := "/dev/" + devName
err = unix.Stat(path, &stat)
if err != nil {
return nil, err
}
stat, ok := fi.Sys().(*syscall.Stat_t)
if !ok {
return nil, nil
}

if s.infoCache == nil {
s.infoCache = map[string]diskInfoCache{}
}
ic, ok := s.infoCache[devName]
if ok {
return ic.values, nil
} else {
ic = diskInfoCache{
stat: *stat,
values: map[string]string{},
}
s.infoCache[devName] = ic
}
di := ic.values

major := stat.Rdev >> 8 & 0xff
minor := stat.Rdev & 0xff
udevDataPath := fmt.Sprintf("%s/b%d:%d", udevPath, major, minor)

di := map[string]string{}

f, err := os.Open(fmt.Sprintf("%s/b%d:%d", udevPath, major, minor))
s.infoCache[devName] = diskInfoCache{
udevDataPath: udevDataPath,
values: di,
}

f, err := os.Open(udevDataPath)
if err != nil {
return nil, err
}
defer f.Close()
scnr := bufio.NewScanner(f)

scnr := bufio.NewScanner(f)
for scnr.Scan() {
l := scnr.Text()
if len(l) < 4 || l[:2] != "E:" {
Expand Down