diff --git a/collectors/README.md b/collectors/README.md index 4e0f805..adfb82f 100644 --- a/collectors/README.md +++ b/collectors/README.md @@ -67,7 +67,7 @@ A collector reads data from any source, parses it to metrics and submits these m * `Read(duration time.Duration, output chan ccMessage.CCMessage)`: Read, parse and submit data to the `output` channel as [`CCMessage`](https://github.com/ClusterCockpit/cc-lib/blob/main/ccMessage/README.md). If the collector has to measure anything for some duration, use the provided function argument `duration`. * `Close()`: Closes down the collector. -It is recommanded to call `setup()` in the `Init()` function. +It is recommended to call `setup()` in the `Init()` function. Finally, the collector needs to be registered in the `collectorManager.go`. There is a list of collectors called `AvailableCollectors` which is a map (`collector_type_string` -> `pointer to MetricCollector interface`). Add a new entry with a descriptive name and the new collector. @@ -100,11 +100,12 @@ func (m *SampleCollector) Init(config json.RawMessage) error { } m.name = "SampleCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } if len(config) > 0 { - err := json.Unmarshal(config, &m.config) - if err != nil { - return err + if err := json.Unmarshal(config, &m.config); err != nil { + return fmt.Errorf("%s Init(): json.Unmarshal() call failed: %w", m.name, err) } } m.meta = map[string]string{"source": m.name, "group": "Sample"} diff --git a/collectors/beegfsmetaMetric.go b/collectors/beegfsmetaMetric.go index b6ad47f..82130b4 100644 --- a/collectors/beegfsmetaMetric.go +++ b/collectors/beegfsmetaMetric.go @@ -61,7 +61,9 @@ func (m *BeegfsMetaCollector) Init(config json.RawMessage) error { "rmXA", "setXA", "mirror"} m.name = "BeegfsMetaCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true // Set default beegfs-ctl binary diff --git a/collectors/beegfsstorageMetric.go b/collectors/beegfsstorageMetric.go index 0b65d60..e4cb0c7 100644 --- a/collectors/beegfsstorageMetric.go +++ b/collectors/beegfsstorageMetric.go @@ -54,7 +54,9 @@ func (m *BeegfsStorageCollector) Init(config json.RawMessage) error { "storInf", "unlnk"} m.name = "BeegfsStorageCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true // Set default beegfs-ctl binary diff --git a/collectors/cpufreqCpuinfoMetric.go b/collectors/cpufreqCpuinfoMetric.go index 34647f9..3c66cac 100644 --- a/collectors/cpufreqCpuinfoMetric.go +++ b/collectors/cpufreqCpuinfoMetric.go @@ -41,9 +41,10 @@ func (m *CPUFreqCpuInfoCollector) Init(config json.RawMessage) error { return nil } - m.setup() - m.name = "CPUFreqCpuInfoCollector" + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true m.meta = map[string]string{ "source": m.name, diff --git a/collectors/cpufreqMetric.go b/collectors/cpufreqMetric.go index 8b516f5..80c3a92 100644 --- a/collectors/cpufreqMetric.go +++ b/collectors/cpufreqMetric.go @@ -48,7 +48,9 @@ func (m *CPUFreqCollector) Init(config json.RawMessage) error { } m.name = "CPUFreqCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true if len(config) > 0 { err := json.Unmarshal(config, &m.config) diff --git a/collectors/cpustatMetric.go b/collectors/cpustatMetric.go index 98365cf..fdb9cde 100644 --- a/collectors/cpustatMetric.go +++ b/collectors/cpustatMetric.go @@ -39,7 +39,9 @@ type CpustatCollector struct { func (m *CpustatCollector) Init(config json.RawMessage) error { m.name = "CpustatCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true m.meta = map[string]string{"source": m.name, "group": "CPU"} m.nodetags = map[string]string{"type": "node"} diff --git a/collectors/customCmdMetric.go b/collectors/customCmdMetric.go index a46852c..6df2052 100644 --- a/collectors/customCmdMetric.go +++ b/collectors/customCmdMetric.go @@ -10,6 +10,7 @@ package collectors import ( "encoding/json" "errors" + "fmt" "log" "os" "os/exec" @@ -49,7 +50,9 @@ func (m *CustomCmdCollector) Init(config json.RawMessage) error { return err } } - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } for _, c := range m.config.Commands { cmdfields := strings.Fields(c) command := exec.Command(cmdfields[0], cmdfields[1:]...) diff --git a/collectors/diskstatMetric.go b/collectors/diskstatMetric.go index 6ae58f0..8176790 100644 --- a/collectors/diskstatMetric.go +++ b/collectors/diskstatMetric.go @@ -10,6 +10,7 @@ package collectors import ( "bufio" "encoding/json" + "fmt" "os" "strings" "syscall" @@ -36,7 +37,9 @@ func (m *DiskstatCollector) Init(config json.RawMessage) error { m.name = "DiskstatCollector" m.parallel = true m.meta = map[string]string{"source": m.name, "group": "Disk"} - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } if len(config) > 0 { if err := json.Unmarshal(config, &m.config); err != nil { return err diff --git a/collectors/gpfsMetric.go b/collectors/gpfsMetric.go index 7dc7e13..34eff87 100644 --- a/collectors/gpfsMetric.go +++ b/collectors/gpfsMetric.go @@ -43,11 +43,11 @@ type GpfsCollectorConfig struct { } type GpfsMetricDefinition struct { - name string - desc string - prefix string - unit string - calc string + name string + desc string + prefix string + unit string + calc string } type GpfsCollector struct { @@ -56,251 +56,251 @@ type GpfsCollector struct { config GpfsCollectorConfig sudoCmd string skipFS map[string]struct{} - lastTimestamp map[string]time.Time // Store timestamp of lastState per filesystem to derive bandwidths - definitions []GpfsMetricDefinition // all metrics to report + lastTimestamp map[string]time.Time // Store timestamp of lastState per filesystem to derive bandwidths + definitions []GpfsMetricDefinition // all metrics to report lastState map[string]GpfsCollectorState // one GpfsCollectorState per filesystem } var GpfsAbsMetrics = []GpfsMetricDefinition{ { - name: "gpfs_num_opens", - desc: "number of opens", - prefix: "_oc_", - unit: "requests", - calc: "none", + name: "gpfs_num_opens", + desc: "number of opens", + prefix: "_oc_", + unit: "requests", + calc: "none", }, { - name: "gpfs_num_closes", - desc: "number of closes", - prefix: "_cc_", - unit: "requests", - calc: "none", + name: "gpfs_num_closes", + desc: "number of closes", + prefix: "_cc_", + unit: "requests", + calc: "none", }, { - name: "gpfs_num_reads", - desc: "number of reads", - prefix: "_rdc_", - unit: "requests", - calc: "none", + name: "gpfs_num_reads", + desc: "number of reads", + prefix: "_rdc_", + unit: "requests", + calc: "none", }, { - name: "gpfs_num_writes", - desc: "number of writes", - prefix: "_wc_", - unit: "requests", - calc: "none", + name: "gpfs_num_writes", + desc: "number of writes", + prefix: "_wc_", + unit: "requests", + calc: "none", }, { - name: "gpfs_num_readdirs", - desc: "number of readdirs", - prefix: "_dir_", - unit: "requests", - calc: "none", + name: "gpfs_num_readdirs", + desc: "number of readdirs", + prefix: "_dir_", + unit: "requests", + calc: "none", }, { - name: "gpfs_num_inode_updates", - desc: "number of Inode Updates", - prefix: "_iu_", - unit: "requests", - calc: "none", + name: "gpfs_num_inode_updates", + desc: "number of Inode Updates", + prefix: "_iu_", + unit: "requests", + calc: "none", }, { - name: "gpfs_bytes_read", - desc: "bytes read", - prefix: "_br_", - unit: "bytes", - calc: "none", + name: "gpfs_bytes_read", + desc: "bytes read", + prefix: "_br_", + unit: "bytes", + calc: "none", }, { - name: "gpfs_bytes_written", - desc: "bytes written", - prefix: "_bw_", - unit: "bytes", - calc: "none", + name: "gpfs_bytes_written", + desc: "bytes written", + prefix: "_bw_", + unit: "bytes", + calc: "none", }, } var GpfsDiffMetrics = []GpfsMetricDefinition{ { - name: "gpfs_num_opens_diff", - desc: "number of opens (diff)", - prefix: "_oc_", - unit: "requests", - calc: "difference", + name: "gpfs_num_opens_diff", + desc: "number of opens (diff)", + prefix: "_oc_", + unit: "requests", + calc: "difference", }, { - name: "gpfs_num_closes_diff", - desc: "number of closes (diff)", - prefix: "_cc_", - unit: "requests", - calc: "difference", + name: "gpfs_num_closes_diff", + desc: "number of closes (diff)", + prefix: "_cc_", + unit: "requests", + calc: "difference", }, { - name: "gpfs_num_reads_diff", - desc: "number of reads (diff)", - prefix: "_rdc_", - unit: "requests", - calc: "difference", + name: "gpfs_num_reads_diff", + desc: "number of reads (diff)", + prefix: "_rdc_", + unit: "requests", + calc: "difference", }, { - name: "gpfs_num_writes_diff", - desc: "number of writes (diff)", - prefix: "_wc_", - unit: "requests", - calc: "difference", + name: "gpfs_num_writes_diff", + desc: "number of writes (diff)", + prefix: "_wc_", + unit: "requests", + calc: "difference", }, { - name: "gpfs_num_readdirs_diff", - desc: "number of readdirs (diff)", - prefix: "_dir_", - unit: "requests", - calc: "difference", + name: "gpfs_num_readdirs_diff", + desc: "number of readdirs (diff)", + prefix: "_dir_", + unit: "requests", + calc: "difference", }, { - name: "gpfs_num_inode_updates_diff", - desc: "number of Inode Updates (diff)", - prefix: "_iu_", - unit: "requests", - calc: "difference", + name: "gpfs_num_inode_updates_diff", + desc: "number of Inode Updates (diff)", + prefix: "_iu_", + unit: "requests", + calc: "difference", }, { - name: "gpfs_bytes_read_diff", - desc: "bytes read (diff)", - prefix: "_br_", - unit: "bytes", - calc: "difference", + name: "gpfs_bytes_read_diff", + desc: "bytes read (diff)", + prefix: "_br_", + unit: "bytes", + calc: "difference", }, { - name: "gpfs_bytes_written_diff", - desc: "bytes written (diff)", - prefix: "_bw_", - unit: "bytes", - calc: "difference", + name: "gpfs_bytes_written_diff", + desc: "bytes written (diff)", + prefix: "_bw_", + unit: "bytes", + calc: "difference", }, } var GpfsDeriveMetrics = []GpfsMetricDefinition{ { - name: "gpfs_opens_rate", - desc: "number of opens (rate)", - prefix: "_oc_", - unit: "requests/sec", - calc: "derivative", + name: "gpfs_opens_rate", + desc: "number of opens (rate)", + prefix: "_oc_", + unit: "requests/sec", + calc: "derivative", }, { - name: "gpfs_closes_rate", - desc: "number of closes (rate)", - prefix: "_oc_", - unit: "requests/sec", - calc: "derivative", + name: "gpfs_closes_rate", + desc: "number of closes (rate)", + prefix: "_oc_", + unit: "requests/sec", + calc: "derivative", }, { - name: "gpfs_reads_rate", - desc: "number of reads (rate)", - prefix: "_rdc_", - unit: "requests/sec", - calc: "derivative", + name: "gpfs_reads_rate", + desc: "number of reads (rate)", + prefix: "_rdc_", + unit: "requests/sec", + calc: "derivative", }, { - name: "gpfs_writes_rate", - desc: "number of writes (rate)", - prefix: "_wc_", - unit: "requests/sec", - calc: "derivative", + name: "gpfs_writes_rate", + desc: "number of writes (rate)", + prefix: "_wc_", + unit: "requests/sec", + calc: "derivative", }, { - name: "gpfs_readdirs_rate", - desc: "number of readdirs (rate)", - prefix: "_dir_", - unit: "requests/sec", - calc: "derivative", + name: "gpfs_readdirs_rate", + desc: "number of readdirs (rate)", + prefix: "_dir_", + unit: "requests/sec", + calc: "derivative", }, { - name: "gpfs_inode_updates_rate", - desc: "number of Inode Updates (rate)", - prefix: "_iu_", - unit: "requests/sec", - calc: "derivative", + name: "gpfs_inode_updates_rate", + desc: "number of Inode Updates (rate)", + prefix: "_iu_", + unit: "requests/sec", + calc: "derivative", }, { - name: "gpfs_bw_read", - desc: "bytes read (rate)", - prefix: "_br_", - unit: "bytes/sec", - calc: "derivative", + name: "gpfs_bw_read", + desc: "bytes read (rate)", + prefix: "_br_", + unit: "bytes/sec", + calc: "derivative", }, { - name: "gpfs_bw_write", - desc: "bytes written (rate)", - prefix: "_bw_", - unit: "bytes/sec", - calc: "derivative", + name: "gpfs_bw_write", + desc: "bytes written (rate)", + prefix: "_bw_", + unit: "bytes/sec", + calc: "derivative", }, } var GpfsTotalMetrics = []GpfsMetricDefinition{ { - name: "gpfs_bytes_total", - desc: "bytes total", - prefix: "bytesTotal", - unit: "bytes", - calc: "none", + name: "gpfs_bytes_total", + desc: "bytes total", + prefix: "bytesTotal", + unit: "bytes", + calc: "none", }, { - name: "gpfs_bytes_total_diff", - desc: "bytes total (diff)", - prefix: "bytesTotal", - unit: "bytes", - calc: "difference", + name: "gpfs_bytes_total_diff", + desc: "bytes total (diff)", + prefix: "bytesTotal", + unit: "bytes", + calc: "difference", }, { - name: "gpfs_bw_total", - desc: "bytes total (rate)", - prefix: "bytesTotal", - unit: "bytes/sec", - calc: "derivative", + name: "gpfs_bw_total", + desc: "bytes total (rate)", + prefix: "bytesTotal", + unit: "bytes/sec", + calc: "derivative", }, { - name: "gpfs_iops", - desc: "iops", - prefix: "iops", - unit: "requests", - calc: "none", + name: "gpfs_iops", + desc: "iops", + prefix: "iops", + unit: "requests", + calc: "none", }, { - name: "gpfs_iops_diff", - desc: "iops (diff)", - prefix: "iops", - unit: "requests", - calc: "difference", + name: "gpfs_iops_diff", + desc: "iops (diff)", + prefix: "iops", + unit: "requests", + calc: "difference", }, { - name: "gpfs_iops_rate", - desc: "iops (rate)", - prefix: "iops", - unit: "requests/sec", - calc: "derivative", + name: "gpfs_iops_rate", + desc: "iops (rate)", + prefix: "iops", + unit: "requests/sec", + calc: "derivative", }, { - name: "gpfs_metaops", - desc: "metaops", - prefix: "metaops", - unit: "requests", - calc: "none", + name: "gpfs_metaops", + desc: "metaops", + prefix: "metaops", + unit: "requests", + calc: "none", }, { - name: "gpfs_metaops_diff", - desc: "metaops (diff)", - prefix: "metaops", - unit: "requests", - calc: "difference", + name: "gpfs_metaops_diff", + desc: "metaops (diff)", + prefix: "metaops", + unit: "requests", + calc: "difference", }, { - name: "gpfs_metaops_rate", - desc: "metaops (rate)", - prefix: "metaops", - unit: "requests/sec", - calc: "derivative", + name: "gpfs_metaops_rate", + desc: "metaops (rate)", + prefix: "metaops", + unit: "requests/sec", + calc: "derivative", }, } @@ -310,9 +310,10 @@ func (m *GpfsCollector) Init(config json.RawMessage) error { return nil } - var err error m.name = "GpfsCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true // Set default mmpmon binary @@ -320,7 +321,7 @@ func (m *GpfsCollector) Init(config json.RawMessage) error { // Read JSON configuration if len(config) > 0 { - err = json.Unmarshal(config, &m.config) + err := json.Unmarshal(config, &m.config) if err != nil { log.Print(err.Error()) return err @@ -366,7 +367,7 @@ func (m *GpfsCollector) Init(config json.RawMessage) error { if m.config.Sudo && !strings.HasPrefix(m.config.Mmpmon, "/") { return fmt.Errorf("when using sudo, mmpmon_path must be provided and an absolute path: %s", m.config.Mmpmon) } - + // Check if mmpmon is in executable search path p, err := exec.LookPath(m.config.Mmpmon) if err != nil { @@ -416,11 +417,11 @@ func (m *GpfsCollector) Init(config json.RawMessage) error { for _, def := range GpfsTotalMetrics { if _, skip := stringArrayContains(m.config.ExcludeMetrics, def.name); !skip { // only send total metrics of the types requested - if ( def.calc == "none" && m.config.SendAbsoluteValues ) || - ( def.calc == "difference" && m.config.SendDiffValues ) || - ( def.calc == "derivative" && m.config.SendDerivedValues ) { + if (def.calc == "none" && m.config.SendAbsoluteValues) || + (def.calc == "difference" && m.config.SendDiffValues) || + (def.calc == "derivative" && m.config.SendDerivedValues) { m.definitions = append(m.definitions, def) - } + } } } } else if m.config.SendBandwidths { @@ -456,7 +457,7 @@ func (m *GpfsCollector) Read(interval time.Duration, output chan lp.CCMessage) { } else { cmd = exec.Command(m.config.Mmpmon, "-p", "-s") } - + cmd.Stdin = strings.NewReader("once fs_io_s\n") cmdStdout := new(bytes.Buffer) cmdStderr := new(bytes.Buffer) @@ -617,7 +618,7 @@ func (m *GpfsCollector) Read(interval time.Duration, output chan lp.CCMessage) { } case "derivative": if vnew_ok && vold_ok && timeDiff > 0 { - value = float64(vnew - vold) / timeDiff + value = float64(vnew-vold) / timeDiff if value.(float64) < 0 { value = 0 } diff --git a/collectors/infinibandMetric.go b/collectors/infinibandMetric.go index 28baac8..96ad611 100644 --- a/collectors/infinibandMetric.go +++ b/collectors/infinibandMetric.go @@ -65,7 +65,9 @@ func (m *InfinibandCollector) Init(config json.RawMessage) error { var err error m.name = "InfinibandCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true m.meta = map[string]string{ "source": m.name, diff --git a/collectors/iostatMetric.go b/collectors/iostatMetric.go index 79c1e9d..e429d4d 100644 --- a/collectors/iostatMetric.go +++ b/collectors/iostatMetric.go @@ -11,6 +11,7 @@ import ( "bufio" "encoding/json" "errors" + "fmt" "os" "strconv" "strings" @@ -45,7 +46,9 @@ func (m *IOstatCollector) Init(config json.RawMessage) error { m.name = "IOstatCollector" m.parallel = true m.meta = map[string]string{"source": m.name, "group": "Disk"} - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } if len(config) > 0 { err = json.Unmarshal(config, &m.config) if err != nil { diff --git a/collectors/ipmiMetric.go b/collectors/ipmiMetric.go index ea56899..9e6f34d 100644 --- a/collectors/ipmiMetric.go +++ b/collectors/ipmiMetric.go @@ -43,7 +43,9 @@ func (m *IpmiCollector) Init(config json.RawMessage) error { } m.name = "IpmiCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true m.meta = map[string]string{ "source": m.name, diff --git a/collectors/likwidMetric.go b/collectors/likwidMetric.go index fe4b0ca..74a65a5 100644 --- a/collectors/likwidMetric.go +++ b/collectors/likwidMetric.go @@ -234,7 +234,9 @@ func (m *LikwidCollector) Init(config json.RawMessage) error { return fmt.Errorf("error setting environment variable LIKWID_FORCE=1: %v", err) } } - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.meta = map[string]string{"group": "PerfCounter"} cclog.ComponentDebug(m.name, "Get cpulist and init maps and lists") diff --git a/collectors/loadavgMetric.go b/collectors/loadavgMetric.go index b0cbd98..5f43c08 100644 --- a/collectors/loadavgMetric.go +++ b/collectors/loadavgMetric.go @@ -42,7 +42,9 @@ type LoadavgCollector struct { func (m *LoadavgCollector) Init(config json.RawMessage) error { m.name = "LoadavgCollector" m.parallel = true - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } if len(config) > 0 { err := json.Unmarshal(config, &m.config) if err != nil { diff --git a/collectors/lustreMetric.go b/collectors/lustreMetric.go index c4428eb..f67086b 100644 --- a/collectors/lustreMetric.go +++ b/collectors/lustreMetric.go @@ -302,7 +302,9 @@ func (m *LustreCollector) Init(config json.RawMessage) error { return err } } - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.tags = map[string]string{"type": "node"} m.meta = map[string]string{"source": m.name, "group": "Lustre"} diff --git a/collectors/memstatMetric.go b/collectors/memstatMetric.go index 00919ad..ba035f4 100644 --- a/collectors/memstatMetric.go +++ b/collectors/memstatMetric.go @@ -127,7 +127,9 @@ func (m *MemstatCollector) Init(config json.RawMessage) error { if len(m.matches) == 0 { return errors.New("no metrics to collect") } - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } if m.config.NodeStats { if stats := getStats(MEMSTATFILE); len(stats) == 0 { diff --git a/collectors/netstatMetric.go b/collectors/netstatMetric.go index f2535c1..57833a4 100644 --- a/collectors/netstatMetric.go +++ b/collectors/netstatMetric.go @@ -11,6 +11,7 @@ import ( "bufio" "encoding/json" "errors" + "fmt" "os" "strconv" "strings" @@ -65,7 +66,9 @@ func getCanonicalName(raw string, aliasToCanonical map[string]string) string { func (m *NetstatCollector) Init(config json.RawMessage) error { m.name = "NetstatCollector" m.parallel = true - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.lastTimestamp = time.Now() const ( diff --git a/collectors/nfsMetric.go b/collectors/nfsMetric.go index 72bf08c..80c2e68 100644 --- a/collectors/nfsMetric.go +++ b/collectors/nfsMetric.go @@ -189,13 +189,17 @@ type Nfs4Collector struct { func (m *Nfs3Collector) Init(config json.RawMessage) error { m.name = "Nfs3Collector" m.version = `v3` - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } return m.MainInit(config) } func (m *Nfs4Collector) Init(config json.RawMessage) error { m.name = "Nfs4Collector" m.version = `v4` - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } return m.MainInit(config) } diff --git a/collectors/nfsiostatMetric.go b/collectors/nfsiostatMetric.go index 1cce7d4..2ec89b7 100644 --- a/collectors/nfsiostatMetric.go +++ b/collectors/nfsiostatMetric.go @@ -102,7 +102,9 @@ func (m *NfsIOStatCollector) readNfsiostats() map[string]map[string]int64 { func (m *NfsIOStatCollector) Init(config json.RawMessage) error { var err error = nil m.name = "NfsIOStatCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true m.meta = map[string]string{"source": m.name, "group": "NFS", "unit": "bytes"} m.tags = map[string]string{"type": "node"} diff --git a/collectors/numastatsMetric.go b/collectors/numastatsMetric.go index 0344b24..969ef23 100644 --- a/collectors/numastatsMetric.go +++ b/collectors/numastatsMetric.go @@ -72,7 +72,9 @@ func (m *NUMAStatsCollector) Init(config json.RawMessage) error { m.name = "NUMAStatsCollector" m.parallel = true - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.meta = map[string]string{ "source": m.name, "group": "NUMA", diff --git a/collectors/nvidiaMetric.go b/collectors/nvidiaMetric.go index f743e1b..9513764 100644 --- a/collectors/nvidiaMetric.go +++ b/collectors/nvidiaMetric.go @@ -64,7 +64,9 @@ func (m *NvidiaCollector) Init(config json.RawMessage) error { m.config.ProcessMigDevices = false m.config.UseUuidForMigDevices = false m.config.UseSliceForMigDevices = false - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } if len(config) > 0 { err = json.Unmarshal(config, &m.config) if err != nil { diff --git a/collectors/raplMetric.go b/collectors/raplMetric.go index 7978745..f46aadf 100644 --- a/collectors/raplMetric.go +++ b/collectors/raplMetric.go @@ -54,9 +54,10 @@ func (m *RAPLCollector) Init(config json.RawMessage) error { return nil } - var err error = nil m.name = "RAPLCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true m.meta = map[string]string{ "source": m.name, @@ -66,7 +67,7 @@ func (m *RAPLCollector) Init(config json.RawMessage) error { // Read in the JSON configuration if len(config) > 0 { - err = json.Unmarshal(config, &m.config) + err := json.Unmarshal(config, &m.config) if err != nil { cclog.ComponentError(m.name, "Error reading config:", err.Error()) return err diff --git a/collectors/rocmsmiMetric.go b/collectors/rocmsmiMetric.go index a44ed3f..80fe502 100644 --- a/collectors/rocmsmiMetric.go +++ b/collectors/rocmsmiMetric.go @@ -52,7 +52,9 @@ func (m *RocmSmiCollector) Init(config json.RawMessage) error { // Always set the name early in Init() to use it in cclog.Component* functions m.name = "RocmSmiCollector" // This is for later use, also call it early - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } // Define meta information sent with each metric // (Can also be dynamic or this is the basic set with extension through AddMeta()) //m.meta = map[string]string{"source": m.name, "group": "AMD"} diff --git a/collectors/sampleMetric.go b/collectors/sampleMetric.go index c124f04..4303107 100644 --- a/collectors/sampleMetric.go +++ b/collectors/sampleMetric.go @@ -9,6 +9,7 @@ package collectors import ( "encoding/json" + "fmt" "time" cclog "github.com/ClusterCockpit/cc-lib/v2/ccLogger" @@ -41,7 +42,9 @@ func (m *SampleCollector) Init(config json.RawMessage) error { // Always set the name early in Init() to use it in cclog.Component* functions m.name = "SampleCollector" // This is for later use, also call it early - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } // Tell whether the collector should be run in parallel with others (reading files, ...) // or it should be run serially, mostly for collectors actually doing measurements // because they should not measure the execution of the other collectors diff --git a/collectors/sampleTimerMetric.go b/collectors/sampleTimerMetric.go index 86026bb..cb597bf 100644 --- a/collectors/sampleTimerMetric.go +++ b/collectors/sampleTimerMetric.go @@ -9,6 +9,7 @@ package collectors import ( "encoding/json" + "fmt" "sync" "time" @@ -40,7 +41,9 @@ func (m *SampleTimerCollector) Init(name string, config json.RawMessage) error { // Always set the name early in Init() to use it in cclog.Component* functions m.name = "SampleTimerCollector" // This is for later use, also call it early - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } // Define meta information sent with each metric // (Can also be dynamic or this is the basic set with extension through AddMeta()) m.meta = map[string]string{"source": m.name, "group": "SAMPLE"} diff --git a/collectors/schedstatMetric.go b/collectors/schedstatMetric.go index a1b4525..a9ce9df 100644 --- a/collectors/schedstatMetric.go +++ b/collectors/schedstatMetric.go @@ -50,7 +50,9 @@ func (m *SchedstatCollector) Init(config json.RawMessage) error { // Always set the name early in Init() to use it in cclog.Component* functions m.name = "SchedstatCollector" // This is for later use, also call it early - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } // Tell whether the collector should be run in parallel with others (reading files, ...) // or it should be run serially, mostly for collectors acutally doing measurements // because they should not measure the execution of the other collectors diff --git a/collectors/selfMetric.go b/collectors/selfMetric.go index 7010b70..9c77db7 100644 --- a/collectors/selfMetric.go +++ b/collectors/selfMetric.go @@ -9,6 +9,7 @@ package collectors import ( "encoding/json" + "fmt" "runtime" "syscall" "time" @@ -34,7 +35,9 @@ type SelfCollector struct { func (m *SelfCollector) Init(config json.RawMessage) error { var err error = nil m.name = "SelfCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true m.meta = map[string]string{"source": m.name, "group": "Self"} m.tags = map[string]string{"type": "node"} diff --git a/collectors/slurmCgroupMetric.go b/collectors/slurmCgroupMetric.go index 245f0c5..662532a 100644 --- a/collectors/slurmCgroupMetric.go +++ b/collectors/slurmCgroupMetric.go @@ -103,7 +103,9 @@ func (m *SlurmCgroupCollector) readFile(path string) ([]byte, error) { func (m *SlurmCgroupCollector) Init(config json.RawMessage) error { var err error m.name = "SlurmCgroupCollector" - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } m.parallel = true m.meta = map[string]string{"source": m.name, "group": "SLURM"} m.tags = map[string]string{"type": "hwthread"} diff --git a/collectors/tempMetric.go b/collectors/tempMetric.go index 2507246..3471992 100644 --- a/collectors/tempMetric.go +++ b/collectors/tempMetric.go @@ -58,7 +58,9 @@ func (m *TempCollector) Init(config json.RawMessage) error { m.name = "TempCollector" m.parallel = true - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } if len(config) > 0 { err := json.Unmarshal(config, &m.config) if err != nil { diff --git a/collectors/topprocsMetric.go b/collectors/topprocsMetric.go index 140796e..f195682 100644 --- a/collectors/topprocsMetric.go +++ b/collectors/topprocsMetric.go @@ -49,7 +49,9 @@ func (m *TopProcsCollector) Init(config json.RawMessage) error { if m.config.Num_procs <= 0 || m.config.Num_procs > MAX_NUM_PROCS { return fmt.Errorf("num_procs option must be set in 'topprocs' config (range: 1-%d)", MAX_NUM_PROCS) } - m.setup() + if err := m.setup(); err != nil { + return fmt.Errorf("%s Init(): setup() call failed: %w", m.name, err) + } command := exec.Command("ps", "-Ao", "comm", "--sort=-pcpu") command.Wait() _, err = command.Output()