mirror of
https://github.com/ClusterCockpit/cc-metric-collector.git
synced 2024-12-25 15:09:05 +01:00
Add error handling
This commit is contained in:
parent
76b69c59b4
commit
f719f1915c
@ -2,14 +2,25 @@ package collectors
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
cclog "github.com/ClusterCockpit/cc-metric-collector/internal/ccLogger"
|
||||||
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
|
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
|
||||||
)
|
)
|
||||||
|
|
||||||
const LOADAVGFILE = `/proc/loadavg`
|
//
|
||||||
|
// LoadavgCollector collects:
|
||||||
|
// * load average of last 1, 5 & 15 minutes
|
||||||
|
// * number of processes currently runnable
|
||||||
|
// * total number of processes in system
|
||||||
|
//
|
||||||
|
// See: https://www.kernel.org/doc/html/latest/filesystems/proc.html
|
||||||
|
//
|
||||||
|
const LOADAVGFILE = "/proc/loadavg"
|
||||||
|
|
||||||
type LoadavgCollectorConfig struct {
|
type LoadavgCollectorConfig struct {
|
||||||
ExcludeMetrics []string `json:"exclude_metrics,omitempty"`
|
ExcludeMetrics []string `json:"exclude_metrics,omitempty"`
|
||||||
@ -32,10 +43,17 @@ func (m *LoadavgCollector) Init(config json.RawMessage) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.meta = map[string]string{"source": m.name, "group": "LOAD"}
|
m.meta = map[string]string{
|
||||||
|
"source": m.name,
|
||||||
|
"group": "LOAD"}
|
||||||
m.tags = map[string]string{"type": "node"}
|
m.tags = map[string]string{"type": "node"}
|
||||||
m.load_matches = []string{"load_one", "load_five", "load_fifteen"}
|
m.load_matches = []string{
|
||||||
m.proc_matches = []string{"proc_run", "proc_total"}
|
"load_one",
|
||||||
|
"load_five",
|
||||||
|
"load_fifteen"}
|
||||||
|
m.proc_matches = []string{
|
||||||
|
"proc_run",
|
||||||
|
"proc_total"}
|
||||||
m.init = true
|
m.init = true
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -45,33 +63,50 @@ func (m *LoadavgCollector) Read(interval time.Duration, output chan lp.CCMetric)
|
|||||||
if !m.init {
|
if !m.init {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
buffer, err := ioutil.ReadFile(string(LOADAVGFILE))
|
buffer, err := ioutil.ReadFile(LOADAVGFILE)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if err != nil {
|
||||||
|
cclog.ComponentError(
|
||||||
|
m.name,
|
||||||
|
fmt.Sprintf("Read(): Failed to read file '%s': %v", LOADAVGFILE, err))
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
now := time.Now()
|
||||||
|
|
||||||
|
// Load metrics
|
||||||
ls := strings.Split(string(buffer), ` `)
|
ls := strings.Split(string(buffer), ` `)
|
||||||
for i, name := range m.load_matches {
|
for i, name := range m.load_matches {
|
||||||
x, err := strconv.ParseFloat(ls[i], 64)
|
x, err := strconv.ParseFloat(ls[i], 64)
|
||||||
if err == nil {
|
if err != nil {
|
||||||
_, skip = stringArrayContains(m.config.ExcludeMetrics, name)
|
cclog.ComponentError(
|
||||||
y, err := lp.New(name, m.tags, m.meta, map[string]interface{}{"value": float64(x)}, time.Now())
|
m.name,
|
||||||
if err == nil && !skip {
|
fmt.Sprintf("Read(): Failed to convert '%s' to float64: %v", ls[i], err))
|
||||||
output <- y
|
continue
|
||||||
}
|
}
|
||||||
|
_, skip = stringArrayContains(m.config.ExcludeMetrics, name)
|
||||||
|
y, err := lp.New(name, m.tags, m.meta, map[string]interface{}{"value": x}, now)
|
||||||
|
if err == nil && !skip {
|
||||||
|
output <- y
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Process metrics
|
||||||
lv := strings.Split(ls[3], `/`)
|
lv := strings.Split(ls[3], `/`)
|
||||||
for i, name := range m.proc_matches {
|
for i, name := range m.proc_matches {
|
||||||
x, err := strconv.ParseFloat(lv[i], 64)
|
x, err := strconv.ParseFloat(lv[i], 64)
|
||||||
if err == nil {
|
if err != nil {
|
||||||
_, skip = stringArrayContains(m.config.ExcludeMetrics, name)
|
cclog.ComponentError(
|
||||||
y, err := lp.New(name, m.tags, m.meta, map[string]interface{}{"value": float64(x)}, time.Now())
|
m.name,
|
||||||
if err == nil && !skip {
|
fmt.Sprintf("Read(): Failed to convert '%s' to float64: %v", lv[i], err))
|
||||||
output <- y
|
continue
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
_, skip = stringArrayContains(m.config.ExcludeMetrics, name)
|
||||||
|
y, err := lp.New(name, m.tags, m.meta, map[string]interface{}{"value": x}, now)
|
||||||
|
if err == nil && !skip {
|
||||||
|
output <- y
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user