From 62432038802b588ea3a8752cf4703e492cfc13f3 Mon Sep 17 00:00:00 2001 From: Thomas Roehl Date: Mon, 20 Oct 2025 17:03:55 +0200 Subject: [PATCH] Fix startup error of iostat collector --- collectors/iostatMetric.go | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/collectors/iostatMetric.go b/collectors/iostatMetric.go index 61ba61d..29780ba 100644 --- a/collectors/iostatMetric.go +++ b/collectors/iostatMetric.go @@ -20,18 +20,17 @@ import ( lp "github.com/ClusterCockpit/cc-lib/ccMessage" ) -// Konstante für den Pfad zu /proc/diskstats const IOSTATFILE = `/proc/diskstats` type IOstatCollectorConfig struct { ExcludeMetrics []string `json:"exclude_metrics,omitempty"` - // Neues Feld zum Ausschließen von Devices per JSON-Konfiguration ExcludeDevices []string `json:"exclude_devices,omitempty"` } type IOstatCollectorEntry struct { - lastValues map[string]int64 - tags map[string]string + currentValues map[string]int64 + lastValues map[string]int64 + tags map[string]string } type IOstatCollector struct { @@ -105,16 +104,27 @@ func (m *IOstatCollector) Init(config json.RawMessage) error { if _, skip := stringArrayContains(m.config.ExcludeDevices, device); skip { continue } - values := make(map[string]int64) + currentValues := make(map[string]int64) + lastValues := make(map[string]int64) 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{ tags: map[string]string{ "device": device, "type": "node", }, - lastValues: values, + currentValues: currentValues, + lastValues: lastValues, } } m.init = true @@ -153,18 +163,22 @@ func (m *IOstatCollector) Read(interval time.Duration, output chan lp.CCMessage) if _, ok := m.devices[device]; !ok { continue } + // Update current and last values entry := m.devices[device] for name, idx := range m.matches { if idx < len(linefields) { x, err := strconv.ParseInt(linefields[idx], 0, 64) if err == nil { - diff := x - entry.lastValues[name] - y, err := lp.NewMessage(name, entry.tags, m.meta, map[string]interface{}{"value": int(diff)}, time.Now()) + // Calculate difference using previous current and new value + diff := x - entry.currentValues[name] + y, err := lp.NewMetric(name, entry.tags, m.meta, int(diff), time.Now()) if err == nil { 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