Skip to content

Commit

Permalink
load: Update plugin structure
Browse files Browse the repository at this point in the history
  • Loading branch information
ppmathis committed Apr 26, 2019
1 parent 3c2cb86 commit bef7834
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 24 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ require (
github.com/theckman/go-flock v0.7.1
github.com/ziutek/telnet v0.0.0-20180329124119-c3b780dc415b
golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d // indirect
golang.org/x/sys v0.0.0-20190424175732-18eb32c0e2f0 // indirect
golang.org/x/sys v0.0.0-20190425045458-9f0b1ff7b46a // indirect
google.golang.org/appengine v1.4.0 // indirect
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7 // indirect
google.golang.org/grpc v1.20.1 // indirect
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190424175732-18eb32c0e2f0 h1:V+O002es++Mnym06Rj/S6Fl7VCsgRBgVDGb/NoZVHUg=
golang.org/x/sys v0.0.0-20190424175732-18eb32c0e2f0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190425045458-9f0b1ff7b46a h1:8cVTj31lbQ2I9z63Y1LjjHVKGisLuXDt12kKR0+r89w=
golang.org/x/sys v0.0.0-20190425045458-9f0b1ff7b46a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
Expand Down
30 changes: 15 additions & 15 deletions mod-system/load.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,26 @@ import (
"github.com/snapserv/nagocheck/shared"
"github.com/snapserv/nagopher"
"math"
"runtime"
)

type loadPlugin struct {
shared.Plugin

stats loadStats
PerCPU bool
}

type loadSummarizer struct {
shared.PluginSummarizer
}

type loadStats struct {
cpuCores uint
loadAverage1 float64
loadAverage5 float64
loadAverage15 float64
}

func newLoadPlugin() *loadPlugin {
return &loadPlugin{
Plugin: shared.NewPlugin(),
Expand Down Expand Up @@ -70,23 +78,15 @@ func (p *loadPlugin) Probe(warnings nagopher.WarningCollection) (metrics []nagop
return metrics, err
}

loadAverages, err := getLoadAverages()
if err != nil {
if err := p.stats.Collect(p.PerCPU); err != nil {
return metrics, err
}

metricNames := []string{"load1", "load5", "load15"}
cpuCount := runtime.NumCPU()

for key, loadAverage := range loadAverages {
if p.PerCPU {
loadAverage /= float64(cpuCount)
}

metrics = append(metrics, nagopher.MustNewNumericMetric(
metricNames[key], loadAverage, "", &valueRange, "load",
))
}
metrics = append(metrics,
nagopher.MustNewNumericMetric("load1", p.stats.loadAverage1, "", &valueRange, "load"),
nagopher.MustNewNumericMetric("load5", p.stats.loadAverage5, "", &valueRange, "load"),
nagopher.MustNewNumericMetric("load15", p.stats.loadAverage15, "", &valueRange, "load"),
)

return metrics, nil
}
Expand Down
36 changes: 30 additions & 6 deletions mod-system/load_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,49 @@ package modsystem
import (
"fmt"
"io/ioutil"
"runtime"
"strconv"
"strings"
)

func getLoadAverages() (loadAverages [3]float64, _ error) {
bytes, err := ioutil.ReadFile("/proc/loadavg")
var procLoadavgPath = "/proc/loadavg"

func (s *loadStats) Collect(perCPU bool) error {
s.cpuCores = uint(runtime.NumCPU())
if err := s.collectLoadAverages(perCPU); err != nil {
return err
}

return nil
}

func (s *loadStats) collectLoadAverages(perCPU bool) error {
bytes, err := ioutil.ReadFile(procLoadavgPath)
if err != nil {
return loadAverages, fmt.Errorf("load: could not read /proc/loadavg file (%s)", err.Error())
return fmt.Errorf("could not read load averages from [%s]: %s", procLoadavgPath, err.Error())
}

values := strings.Split(string(bytes), " ")
if len(values) < 3 {
return fmt.Errorf("could not parse unknown format from [%s]: expected 3 space-separated values", procLoadavgPath)
}

loadAverages := make([]float64, 0, 3)
for i := 0; i < 3; i++ {
value, err := strconv.ParseFloat(values[i], strconv.IntSize)
if err != nil {
return loadAverages, fmt.Errorf("load: could not parse [%s] as float (%s)", values[i], err.Error())
return fmt.Errorf("could not parse [%s] as float (%s)", values[i], err.Error())
}

loadAverages[i] = value
if perCPU {
value /= float64(s.cpuCores)
}
loadAverages = append(loadAverages, value)
}

return loadAverages, nil
s.loadAverage1 = loadAverages[0]
s.loadAverage5 = loadAverages[1]
s.loadAverage15 = loadAverages[2]

return nil
}

0 comments on commit bef7834

Please sign in to comment.