Node_Exporter/vendor/github.com/hodgesds/perf-utils/fs_utils.go
Daniel Hodges 7882009870 Add perf exporter (#1274)
Signed-off-by: Daniel Hodges <hodges.daniel.scott@gmail.com>
2019-05-07 13:21:41 +02:00

103 lines
2.3 KiB
Go

// +build linux
package perf
import (
"bufio"
"fmt"
"os"
"strings"
)
const (
// DebugFS is the filesystem type for debugfs.
DebugFS = "debugfs"
// TraceFS is the filesystem type for tracefs.
TraceFS = "tracefs"
// ProcMounts is the mount point for file systems in procfs.
ProcMounts = "/proc/mounts"
// PerfMaxStack is the mount point for the max perf event size.
PerfMaxStack = "/proc/sys/kernel/perf_event_max_stack"
// PerfMaxContexts is a sysfs mount that contains the max perf contexts.
PerfMaxContexts = "/proc/sys/kernel/perf_event_max_contexts_per_stack"
// SyscallsDir is a constant of the default tracing event syscalls directory.
SyscallsDir = "/sys/kernel/debug/tracing/events/syscalls/"
// TracingDir is a constant of the default tracing directory.
TracingDir = "/sys/kernel/debug/tracing"
)
var (
// ErrNoMount is when there is no such mount.
ErrNoMount = fmt.Errorf("no such mount")
)
// TraceFSMount returns the first found mount point of a tracefs file system.
func TraceFSMount() (string, error) {
mounts, err := GetFSMount(TraceFS)
if err != nil {
return "", err
}
if len(mounts) == 0 {
return "", ErrNoMount
}
return mounts[0], nil
}
// DebugFSMount returns the first found mount point of a debugfs file system.
func DebugFSMount() (string, error) {
mounts, err := GetFSMount(DebugFS)
if err != nil {
return "", err
}
if len(mounts) == 0 {
return "", ErrNoMount
}
return mounts[0], nil
}
// GetFSMount is a helper function to get a mount file system type.
func GetFSMount(mountType string) ([]string, error) {
mounts := []string{}
file, err := os.Open(ProcMounts)
if err != nil {
return mounts, err
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
mountInfo := strings.Split(scanner.Text(), " ")
if len(mountInfo) > 3 && mountInfo[2] == mountType {
mounts = append(mounts, mountInfo[1])
}
}
if err := scanner.Err(); err != nil {
return mounts, err
}
return mounts, file.Close()
}
// fileToStrings is a helper method that reads a line line by line and returns
// a slice of strings.
func fileToStrings(path string) ([]string, error) {
res := []string{}
f, err := os.Open(path)
if err != nil {
return res, err
}
scanner := bufio.NewScanner(f)
for scanner.Scan() {
res = append(res, scanner.Text())
}
if err := scanner.Err(); err != nil {
return res, err
}
return res, nil
}