Add perf exporter (#1274)
Signed-off-by: Daniel Hodges <hodges.daniel.scott@gmail.com>
This commit is contained in:
parent
0c6b90be4e
commit
7882009870
41 changed files with 4285 additions and 0 deletions
102
vendor/github.com/hodgesds/perf-utils/fs_utils.go
generated
vendored
Normal file
102
vendor/github.com/hodgesds/perf-utils/fs_utils.go
generated
vendored
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
// +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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue