diff --git a/collectors/iostatMetric.go b/collectors/iostatMetric.go index 8715d7e..5df0469 100644 --- a/collectors/iostatMetric.go +++ b/collectors/iostatMetric.go @@ -2,24 +2,24 @@ package collectors import ( "bufio" - "os" - - cclog "github.com/ClusterCockpit/cc-metric-collector/pkg/ccLogger" - lp "github.com/ClusterCockpit/cc-energy-manager/pkg/cc-message" - - // "log" "encoding/json" "errors" + "os" "strconv" "strings" "time" + + cclog "github.com/ClusterCockpit/cc-metric-collector/pkg/ccLogger" + lp "github.com/ClusterCockpit/cc-lib/ccMessage" ) +// Konstante für den Pfad zu /proc/diskstats const IOSTATFILE = `/proc/diskstats` -const IOSTAT_SYSFSPATH = `/sys/block` 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 { @@ -76,7 +76,7 @@ func (m *IOstatCollector) Init(config json.RawMessage) error { if len(m.matches) == 0 { return errors.New("no metrics to collect") } - file, err := os.Open(string(IOSTATFILE)) + file, err := os.Open(IOSTATFILE) if err != nil { cclog.ComponentError(m.name, err.Error()) return err @@ -87,17 +87,24 @@ func (m *IOstatCollector) Init(config json.RawMessage) error { for scanner.Scan() { line := scanner.Text() linefields := strings.Fields(line) + if len(linefields) < 3 { + continue + } device := linefields[2] + if strings.Contains(device, "loop") { continue } + if _, skip := stringArrayContains(m.config.ExcludeDevices, device); skip { + continue + } values := make(map[string]int64) for m := range m.matches { values[m] = 0 } m.devices[device] = IOstatCollectorEntry{ tags: map[string]string{ - "device": linefields[2], + "device": device, "type": "node", }, lastValues: values, @@ -112,7 +119,7 @@ func (m *IOstatCollector) Read(interval time.Duration, output chan lp.CCMessage) return } - file, err := os.Open(string(IOSTATFILE)) + file, err := os.Open(IOSTATFILE) if err != nil { cclog.ComponentError(m.name, err.Error()) return @@ -126,10 +133,16 @@ func (m *IOstatCollector) Read(interval time.Duration, output chan lp.CCMessage) continue } linefields := strings.Fields(line) + if len(linefields) < 3 { + continue + } device := linefields[2] if strings.Contains(device, "loop") { continue } + if _, skip := stringArrayContains(m.config.ExcludeDevices, device); skip { + continue + } if _, ok := m.devices[device]; !ok { continue } diff --git a/collectors/iostatMetric.md b/collectors/iostatMetric.md index e3e8604..74172db 100644 --- a/collectors/iostatMetric.md +++ b/collectors/iostatMetric.md @@ -4,12 +4,17 @@ ```json "iostat": { "exclude_metrics": [ - "read_ms" + "io_read_ms" ], + "exclude_devices": [ + "nvme0n1p1", + "nvme0n1p2", + "md127" + ] } ``` -The `iostat` collector reads data from `/proc/diskstats` and outputs a handful **node** metrics. If a metric is not required, it can be excluded from forwarding it to the sink. +The `iostat` collector reads data from `/proc/diskstats` and outputs a handful **node** metrics. If a metric or device is not required, it can be excluded from forwarding it to the sink. Metrics: * `io_reads`