mirror of
https://github.com/ClusterCockpit/cc-metric-collector.git
synced 2025-10-21 21:35:06 +02:00
Fix startup error of iostat collector
This commit is contained in:
@@ -20,18 +20,17 @@ import (
|
|||||||
lp "github.com/ClusterCockpit/cc-lib/ccMessage"
|
lp "github.com/ClusterCockpit/cc-lib/ccMessage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Konstante für den Pfad zu /proc/diskstats
|
|
||||||
const IOSTATFILE = `/proc/diskstats`
|
const IOSTATFILE = `/proc/diskstats`
|
||||||
|
|
||||||
type IOstatCollectorConfig struct {
|
type IOstatCollectorConfig struct {
|
||||||
ExcludeMetrics []string `json:"exclude_metrics,omitempty"`
|
ExcludeMetrics []string `json:"exclude_metrics,omitempty"`
|
||||||
// Neues Feld zum Ausschließen von Devices per JSON-Konfiguration
|
|
||||||
ExcludeDevices []string `json:"exclude_devices,omitempty"`
|
ExcludeDevices []string `json:"exclude_devices,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type IOstatCollectorEntry struct {
|
type IOstatCollectorEntry struct {
|
||||||
lastValues map[string]int64
|
currentValues map[string]int64
|
||||||
tags map[string]string
|
lastValues map[string]int64
|
||||||
|
tags map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
type IOstatCollector struct {
|
type IOstatCollector struct {
|
||||||
@@ -105,16 +104,27 @@ func (m *IOstatCollector) Init(config json.RawMessage) error {
|
|||||||
if _, skip := stringArrayContains(m.config.ExcludeDevices, device); skip {
|
if _, skip := stringArrayContains(m.config.ExcludeDevices, device); skip {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
values := make(map[string]int64)
|
currentValues := make(map[string]int64)
|
||||||
|
lastValues := make(map[string]int64)
|
||||||
for m := range m.matches {
|
for m := range m.matches {
|
||||||
values[m] = 0
|
currentValues[m] = 0
|
||||||
|
lastValues[m] = 0
|
||||||
|
}
|
||||||
|
for name, idx := range m.matches {
|
||||||
|
if idx < len(linefields) {
|
||||||
|
if value, err := strconv.ParseInt(linefields[idx], 0, 64); err == nil {
|
||||||
|
currentValues[name] = value
|
||||||
|
lastValues[name] = value // Set last to current for first read
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m.devices[device] = IOstatCollectorEntry{
|
m.devices[device] = IOstatCollectorEntry{
|
||||||
tags: map[string]string{
|
tags: map[string]string{
|
||||||
"device": device,
|
"device": device,
|
||||||
"type": "node",
|
"type": "node",
|
||||||
},
|
},
|
||||||
lastValues: values,
|
currentValues: currentValues,
|
||||||
|
lastValues: lastValues,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.init = true
|
m.init = true
|
||||||
@@ -153,18 +163,22 @@ func (m *IOstatCollector) Read(interval time.Duration, output chan lp.CCMessage)
|
|||||||
if _, ok := m.devices[device]; !ok {
|
if _, ok := m.devices[device]; !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// Update current and last values
|
||||||
entry := m.devices[device]
|
entry := m.devices[device]
|
||||||
for name, idx := range m.matches {
|
for name, idx := range m.matches {
|
||||||
if idx < len(linefields) {
|
if idx < len(linefields) {
|
||||||
x, err := strconv.ParseInt(linefields[idx], 0, 64)
|
x, err := strconv.ParseInt(linefields[idx], 0, 64)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
diff := x - entry.lastValues[name]
|
// Calculate difference using previous current and new value
|
||||||
y, err := lp.NewMessage(name, entry.tags, m.meta, map[string]interface{}{"value": int(diff)}, time.Now())
|
diff := x - entry.currentValues[name]
|
||||||
|
y, err := lp.NewMetric(name, entry.tags, m.meta, int(diff), time.Now())
|
||||||
if err == nil {
|
if err == nil {
|
||||||
output <- y
|
output <- y
|
||||||
}
|
}
|
||||||
|
// Update last to previous current, and current to new value
|
||||||
|
entry.lastValues[name] = entry.currentValues[name]
|
||||||
|
entry.currentValues[name] = x
|
||||||
}
|
}
|
||||||
entry.lastValues[name] = x
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.devices[device] = entry
|
m.devices[device] = entry
|
||||||
|
Reference in New Issue
Block a user