Skip to content

Commit dadd662

Browse files
committed
Squashed Merge of #6 (sensor power type)
commit 9385ad0 Author: willow <[email protected]> Date: Wed Apr 23 17:20:21 2025 +0200 hwmon: use wait group properly commit 4abc9bf Author: willow <[email protected]> Date: Wed Apr 23 17:07:01 2025 +0200 Revert "README: update to v1.0.12" This reverts commit 9ff042d. commit 25d7105 Author: willow <[email protected]> Date: Wed Apr 23 17:04:13 2025 +0200 Revert "changelog: add entry" This reverts commit 5687a42. commit db6a7f1 Author: willow <[email protected]> Date: Wed Apr 23 17:03:54 2025 +0200 Revert "feat: dynamic smonctl" This reverts commit 44797cb. commit f1af90a Author: willow <[email protected]> Date: Wed Apr 23 15:40:13 2025 +0200 README: fix note commit c30d308 Author: willow <[email protected]> Date: Wed Apr 23 15:32:26 2025 +0200 hwmon: name metrics properly commit d102c8a Author: willow <[email protected]> Date: Wed Apr 23 15:29:21 2025 +0200 README: update to v1.0.12 commit bd89e15 Author: willow <[email protected]> Date: Wed Apr 23 15:28:04 2025 +0200 README: remove asic collector warning commit baa9110 Author: willow <[email protected]> Date: Wed Apr 23 15:21:43 2025 +0200 changelog: add entry commit 4f81f4f Author: willow <[email protected]> Date: Wed Apr 23 15:20:08 2025 +0200 hwmon: add power values commit 451ced4 Author: willow <[email protected]> Date: Wed Apr 23 15:17:43 2025 +0200 refactor: align assignments commit ff07bdb Author: willow <[email protected]> Date: Mon Apr 14 16:17:24 2025 +0200 feat: dynamic smonctl commit a43a0c5 Author: willow <[email protected]> Date: Mon Apr 14 16:16:47 2025 +0200 refactor: cleanup hwmon
1 parent 28c8fc9 commit dadd662

File tree

2 files changed

+54
-45
lines changed

2 files changed

+54
-45
lines changed

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
**cumulus-exporter** is a [Prometheus](https://github.com/prometheus/prometheus) exporter, that exposes metrics from switching and routing platforms running on [Cumulus Linux](https://cumulusnetworks.com/products/cumulus-linux/) based hosts alongside the [node_exporter](https://github.com/prometheus/node_exporter).
55

6-
> Do not yet use the ASIC collector, as there is a known bug in current cumulus releases.
7-
86
It provides the following metrics:
97
* Transceiver statistics (RX / TX power, voltage, temperature, ...) by including the [transceiver-exporter](https://github.com/wobcom/transceiver-exporter)
108
* MSTPD statistics (port (forwarding) states)

hwmon/collector.go

Lines changed: 54 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -49,53 +49,59 @@ var (
4949
currentDesc *prometheus.Desc
5050
currentSensorEnabledDesc *prometheus.Desc
5151

52+
powerPresent *prometheus.Desc
53+
powerAllOk *prometheus.Desc
54+
5255
rawValueDesc *prometheus.Desc
5356
)
5457

5558
func init() {
5659
sensorLabels := []string{"driver_path", "hw_mon", "description"}
5760
channelLabels := []string{"driver_path", "hw_mon", "description", "channel"}
5861

59-
voltageMinDesc = prometheus.NewDesc(prefix+"voltage_min_volts", "Voltage min value. Unit: Volts", sensorLabels, nil)
60-
voltageCriticalMinDesc = prometheus.NewDesc(prefix+"voltage_critical_min_volts", "Voltage critical min value. Unit: Volts", sensorLabels, nil)
61-
voltageMaxDesc = prometheus.NewDesc(prefix+"voltage_max_volts", "Voltage max value. Unit: Volts", sensorLabels, nil)
62-
voltageCriticalMaxDesc = prometheus.NewDesc(prefix+"voltage_critical_max_volts", "Voltage critical max value. Unit: Volts", sensorLabels, nil)
63-
voltageDesc = prometheus.NewDesc(prefix+"voltage_volts", "Voltage input value. Unit: Volts", sensorLabels, nil)
64-
voltageLabelInfoDesc = prometheus.NewDesc(prefix+"voltage_info", "Suggested voltage channel label.", channelLabels, nil)
62+
voltageMinDesc = prometheus.NewDesc(prefix+"voltage_min_volts", "Voltage min value. Unit: Volts", sensorLabels, nil)
63+
voltageCriticalMinDesc = prometheus.NewDesc(prefix+"voltage_critical_min_volts", "Voltage critical min value. Unit: Volts", sensorLabels, nil)
64+
voltageMaxDesc = prometheus.NewDesc(prefix+"voltage_max_volts", "Voltage max value. Unit: Volts", sensorLabels, nil)
65+
voltageCriticalMaxDesc = prometheus.NewDesc(prefix+"voltage_critical_max_volts", "Voltage critical max value. Unit: Volts", sensorLabels, nil)
66+
voltageDesc = prometheus.NewDesc(prefix+"voltage_volts", "Voltage input value. Unit: Volts", sensorLabels, nil)
67+
voltageLabelInfoDesc = prometheus.NewDesc(prefix+"voltage_info", "Suggested voltage channel label.", channelLabels, nil)
6568
voltageSensorEnabledDesc = prometheus.NewDesc(prefix+"voltage_sensor_enabled_bool", "1 = sensor enabled, 0 = sensor disabled", sensorLabels, nil)
6669

67-
fanMinDesc = prometheus.NewDesc(prefix+"fan_min_rpm", "Fan minimum value. Unit: revolution/min", sensorLabels, nil)
68-
fanMaxDesc = prometheus.NewDesc(prefix+"fan_max_rpm", "Fan maximum value. Unit: revolution/min", sensorLabels, nil)
69-
fanDesc = prometheus.NewDesc(prefix+"fan_rpm", "Fan input value. Unit: revolution/min", sensorLabels, nil)
70-
fanDivisorDesc = prometheus.NewDesc(prefix+"fan_divisor", "Fan divisor. Integer value in powers of 2 (1, 2, 4, 8, 16, 32, 64, 128).", sensorLabels, nil)
71-
fanPulsesDesc = prometheus.NewDesc(prefix+"fan_pulses", "Number of tachometer pulses per fan revolution", sensorLabels, nil)
72-
fanTargetDesc = prometheus.NewDesc(prefix+"fan_target_rpm", "Desired fan speed. Unit: revolution/min", sensorLabels, nil)
73-
fanLabelsDesc = prometheus.NewDesc(prefix+"fan_info", "Suggested fan channel label", channelLabels, nil)
70+
fanMinDesc = prometheus.NewDesc(prefix+"fan_min_rpm", "Fan minimum value. Unit: revolution/min", sensorLabels, nil)
71+
fanMaxDesc = prometheus.NewDesc(prefix+"fan_max_rpm", "Fan maximum value. Unit: revolution/min", sensorLabels, nil)
72+
fanDesc = prometheus.NewDesc(prefix+"fan_rpm", "Fan input value. Unit: revolution/min", sensorLabels, nil)
73+
fanDivisorDesc = prometheus.NewDesc(prefix+"fan_divisor", "Fan divisor. Integer value in powers of 2 (1, 2, 4, 8, 16, 32, 64, 128).", sensorLabels, nil)
74+
fanPulsesDesc = prometheus.NewDesc(prefix+"fan_pulses", "Number of tachometer pulses per fan revolution", sensorLabels, nil)
75+
fanTargetDesc = prometheus.NewDesc(prefix+"fan_target_rpm", "Desired fan speed. Unit: revolution/min", sensorLabels, nil)
76+
fanLabelsDesc = prometheus.NewDesc(prefix+"fan_info", "Suggested fan channel label", channelLabels, nil)
7477
fanSensorEnabledDesc = prometheus.NewDesc(prefix+"fan_sensor_enabled_bool", "1 = sensor enabled, 0 = sensor disabled", sensorLabels, nil)
7578

76-
temperatureTypeDesc = prometheus.NewDesc(prefix+"temperature_sensor_type_selection_info", "Sensor type selection.", append(sensorLabels, "sensor_type"), nil)
77-
temperatureMaxDesc = prometheus.NewDesc(prefix+"temperature_max_celsius", "Temperature max value. Unit: degree Celsius", sensorLabels, nil)
78-
temperatureMinDesc = prometheus.NewDesc(prefix+"temperature_min_celsius", "Temperature min value. Unit: degree Celsius", sensorLabels, nil)
79-
temperatureMaxHysteresisDesc = prometheus.NewDesc(prefix+"temperature_max_hysteresis_celsius", "Temperature hysteresis value for max limit. Unit: degree Celsius", sensorLabels, nil)
80-
temperatureMinHysteresisDesc = prometheus.NewDesc(prefix+"temperature_min_hysteresis_celsius", "Temperature hysteresis value for min limit. Unit: degree Celsius", sensorLabels, nil)
81-
temperatureDesc = prometheus.NewDesc(prefix+"temperature_celsius", "Temperature input value. Unit: degree Celsius", sensorLabels, nil)
82-
temperatureCriticalMaxDesc = prometheus.NewDesc(prefix+"temperature_critical_max_celsius", "Temperature critical max value, typically greater than corresponding temp_max values. Unit: degree Celsius", sensorLabels, nil)
83-
temperatureCriticalMaxHysteresisDesc = prometheus.NewDesc(prefix+"temperature_critical_max_hysteresis_celsius", "Temperature hysteresis value for critical limit. Unit: degree Celsius", sensorLabels, nil)
84-
temperatureEmergencyMaxDesc = prometheus.NewDesc(prefix+"temperature_emergency_max_celsius", "Temperature emergency max value, for chips supporting more than two upper temperature limits. Unit: degree Celsius", sensorLabels, nil)
79+
temperatureTypeDesc = prometheus.NewDesc(prefix+"temperature_sensor_type_selection_info", "Sensor type selection.", append(sensorLabels, "sensor_type"), nil)
80+
temperatureMaxDesc = prometheus.NewDesc(prefix+"temperature_max_celsius", "Temperature max value. Unit: degree Celsius", sensorLabels, nil)
81+
temperatureMinDesc = prometheus.NewDesc(prefix+"temperature_min_celsius", "Temperature min value. Unit: degree Celsius", sensorLabels, nil)
82+
temperatureMaxHysteresisDesc = prometheus.NewDesc(prefix+"temperature_max_hysteresis_celsius", "Temperature hysteresis value for max limit. Unit: degree Celsius", sensorLabels, nil)
83+
temperatureMinHysteresisDesc = prometheus.NewDesc(prefix+"temperature_min_hysteresis_celsius", "Temperature hysteresis value for min limit. Unit: degree Celsius", sensorLabels, nil)
84+
temperatureDesc = prometheus.NewDesc(prefix+"temperature_celsius", "Temperature input value. Unit: degree Celsius", sensorLabels, nil)
85+
temperatureCriticalMaxDesc = prometheus.NewDesc(prefix+"temperature_critical_max_celsius", "Temperature critical max value, typically greater than corresponding temp_max values. Unit: degree Celsius", sensorLabels, nil)
86+
temperatureCriticalMaxHysteresisDesc = prometheus.NewDesc(prefix+"temperature_critical_max_hysteresis_celsius", "Temperature hysteresis value for critical limit. Unit: degree Celsius", sensorLabels, nil)
87+
temperatureEmergencyMaxDesc = prometheus.NewDesc(prefix+"temperature_emergency_max_celsius", "Temperature emergency max value, for chips supporting more than two upper temperature limits. Unit: degree Celsius", sensorLabels, nil)
8588
temperatureEmergencyMaxHysteresisDesc = prometheus.NewDesc(prefix+"temperature_emergency_max_hysteresis_celsius", "Temperature hysteresis value for emergency limit. Unit: degree Celsius", sensorLabels, nil)
86-
temperatureCriticalMinDesc = prometheus.NewDesc(prefix+"temperature_critical_min_celsius", "Temperature criticial min value, typically lower than corresponding temp_min values. Unit: degree Celsius", sensorLabels, nil)
87-
temperatureCriticalMinHysteresisDesc = prometheus.NewDesc(prefix+"temperature_critical_min_hysteresis_celsius", "Temperature hysteresis value for critical min limit. Unit: degree Celsius", sensorLabels, nil)
88-
temperatureOffsetDesc = prometheus.NewDesc(prefix+"temperature_offset_celsius", "Temperature offset which is added to the temperature reading by the chip. Unit: degree Celsius", sensorLabels, nil)
89-
temperatureLabelDesc = prometheus.NewDesc(prefix+"temperature_label_info", "Suggested temperature channel label", channelLabels, nil)
90-
temperatureSensorEnabledDesc = prometheus.NewDesc(prefix+"temperature_sensor_enabled_bool", "1 = sensor enabled, 0 = sensor disabled", sensorLabels, nil)
91-
92-
currentMaxDesc = prometheus.NewDesc(prefix+"current_max_ampere", "Current max value. Unit: Ampere", sensorLabels, nil)
93-
currentMinDesc = prometheus.NewDesc(prefix+"current_min_ampere", "Current min value. Unit: Ampere", sensorLabels, nil)
94-
currentCriticalMinValue = prometheus.NewDesc(prefix+"current_critical_min_ampere", "Current critical low value. Unit: Ampere", sensorLabels, nil)
95-
currentCriticalMaxValue = prometheus.NewDesc(prefix+"current_critical_max_ampere", "Current critical high value. Unit: Ampere", sensorLabels, nil)
96-
currentDesc = prometheus.NewDesc(prefix+"current_ampere", "Current input value. Unit: Ampere", sensorLabels, nil)
89+
temperatureCriticalMinDesc = prometheus.NewDesc(prefix+"temperature_critical_min_celsius", "Temperature criticial min value, typically lower than corresponding temp_min values. Unit: degree Celsius", sensorLabels, nil)
90+
temperatureCriticalMinHysteresisDesc = prometheus.NewDesc(prefix+"temperature_critical_min_hysteresis_celsius", "Temperature hysteresis value for critical min limit. Unit: degree Celsius", sensorLabels, nil)
91+
temperatureOffsetDesc = prometheus.NewDesc(prefix+"temperature_offset_celsius", "Temperature offset which is added to the temperature reading by the chip. Unit: degree Celsius", sensorLabels, nil)
92+
temperatureLabelDesc = prometheus.NewDesc(prefix+"temperature_label_info", "Suggested temperature channel label", channelLabels, nil)
93+
temperatureSensorEnabledDesc = prometheus.NewDesc(prefix+"temperature_sensor_enabled_bool", "1 = sensor enabled, 0 = sensor disabled", sensorLabels, nil)
94+
95+
currentMaxDesc = prometheus.NewDesc(prefix+"current_max_ampere", "Current max value. Unit: Ampere", sensorLabels, nil)
96+
currentMinDesc = prometheus.NewDesc(prefix+"current_min_ampere", "Current min value. Unit: Ampere", sensorLabels, nil)
97+
currentCriticalMinValue = prometheus.NewDesc(prefix+"current_critical_min_ampere", "Current critical low value. Unit: Ampere", sensorLabels, nil)
98+
currentCriticalMaxValue = prometheus.NewDesc(prefix+"current_critical_max_ampere", "Current critical high value. Unit: Ampere", sensorLabels, nil)
99+
currentDesc = prometheus.NewDesc(prefix+"current_ampere", "Current input value. Unit: Ampere", sensorLabels, nil)
97100
currentSensorEnabledDesc = prometheus.NewDesc(prefix+"current_sensor_enabled_bool", "1 = sensor enabled, 0 = sensor disabled", sensorLabels, nil)
98101

102+
powerPresent = prometheus.NewDesc(prefix+"power_present", "Is Power Present. 1 = present, 0 = missing", sensorLabels, nil)
103+
powerAllOk = prometheus.NewDesc(prefix+"power_all_ok", "Is PSU Ok. 1 = OK, 0 = KO", sensorLabels, nil)
104+
99105
rawValueDesc = prometheus.NewDesc(prefix+"raw_sensor_reading", "Arbitrary sensor reading, see labels on how to interpret this value", []string{"path", "description"}, nil)
100106
}
101107

@@ -152,21 +158,24 @@ func (*Collector) Describe(ch chan<- *prometheus.Desc) {
152158
ch <- currentCriticalMaxValue
153159
ch <- currentDesc
154160
ch <- currentSensorEnabledDesc
161+
162+
ch <- powerPresent
163+
ch <- powerAllOk
155164
}
156165

157166
type parserFunc func(string, string, string) prometheus.Metric
158167

159168
func getParsers(sensorType string) []parserFunc {
160169
return map[string][]parserFunc{
161-
"voltage": []parserFunc{
170+
"voltage": {
162171
makeDefaultParser(voltageMinDesc, "_min", 1000),
163172
makeDefaultParser(voltageCriticalMinDesc, "_lcrit", 1000),
164173
makeDefaultParser(voltageMaxDesc, "_max", 1000),
165174
makeDefaultParser(voltageDesc, "_input", 1000),
166175
makeChannelParser(voltageLabelInfoDesc, "_label"),
167176
makeDefaultParser(voltageSensorEnabledDesc, "_enable", 1),
168177
},
169-
"fan": []parserFunc{
178+
"fan": {
170179
makeDefaultParser(fanMinDesc, "_min", 1),
171180
makeDefaultParser(fanMaxDesc, "_max", 1),
172181
makeDefaultParser(fanDesc, "_input", 1),
@@ -176,7 +185,7 @@ func getParsers(sensorType string) []parserFunc {
176185
makeChannelParser(fanLabelsDesc, "_label"),
177186
makeDefaultParser(fanSensorEnabledDesc, "_enable", 1),
178187
},
179-
"temp": []parserFunc{
188+
"temp": {
180189
makeTemperatureSensorTypeParser(temperatureTypeDesc, "_type"),
181190
makeDefaultParser(temperatureMaxDesc, "_max", 1000),
182191
makeDefaultParser(temperatureMinDesc, "_min", 1000),
@@ -193,15 +202,19 @@ func getParsers(sensorType string) []parserFunc {
193202
makeChannelParser(temperatureLabelDesc, "_label"),
194203
makeDefaultParser(temperatureSensorEnabledDesc, "_enable", 1),
195204
},
196-
"current": []parserFunc{
205+
"current": {
197206
makeDefaultParser(currentMaxDesc, "_max", 1000),
198207
makeDefaultParser(currentMinDesc, "_min", 1000),
199208
makeDefaultParser(currentCriticalMinValue, "_lcrit", 1000),
200209
makeDefaultParser(currentCriticalMaxValue, "_crit", 1000),
201210
makeDefaultParser(currentDesc, "_input", 1000),
202211
makeDefaultParser(currentSensorEnabledDesc, "_enable", 1),
203212
},
204-
"raw": []parserFunc{
213+
"power": {
214+
makeDefaultParser(powerPresent, "_present", 1),
215+
makeDefaultParser(powerAllOk, "_all_ok", 1),
216+
},
217+
"raw": {
205218
makeRawParser(rawValueDesc),
206219
},
207220
}[sensorType]
@@ -255,25 +268,23 @@ func makeRawParser(metricDesc *prometheus.Desc) parserFunc {
255268
}
256269
}
257270

258-
// Name returns the string "HwmonCollector"
259271
func (*Collector) Name() string {
260272
return "HwmonCollector"
261273
}
262274

263-
// Collect implements collector.Collector interface Collect function
264275
func (c *Collector) Collect(metrics chan<- prometheus.Metric, errorChan chan error, done chan struct{}) {
265276
defer func() {
266277
done <- struct{}{}
267278
}()
268279

269280
wg := &sync.WaitGroup{}
270-
wg.Add(len(c.config.Sensors))
271281

272282
for _, sensorConfiguration := range c.config.Sensors {
273-
collectSensor(sensorConfiguration, metrics, wg)
283+
wg.Add(1)
284+
go collectSensor(sensorConfiguration, metrics, wg)
274285
}
275286

276-
//wg.Wait()
287+
wg.Wait()
277288
}
278289

279290
func collectSensor(sensorConfig *SensorConfiguration, metrics chan<- prometheus.Metric, wg *sync.WaitGroup) {

0 commit comments

Comments
 (0)