Skip to content

Commit 92f1ed2

Browse files
author
Dylan Gardner
committed
Use UpperThreshold for fan percentage calculation if Max is null
1 parent 2c6089f commit 92f1ed2

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

collector/chassis_collector.go

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package collector
22

33
import (
44
"fmt"
5+
"math"
56
"strings"
67
"sync"
78

@@ -438,18 +439,27 @@ func parseChassisFan(ch chan<- prometheus.Metric, chassisID string, chassisFan r
438439
chassisFanStaus := chassisFan.Status
439440
chassisFanStausHealth := chassisFanStaus.Health
440441
chassisFanStausState := chassisFanStaus.State
441-
chassisFanRPM := chassisFan.Reading
442+
chassisFanRPM := float64(chassisFan.Reading)
442443
chassisFanUnit := chassisFan.ReadingUnits
443-
chassisFanRPMLowerCriticalThreshold := chassisFan.LowerThresholdCritical
444-
chassisFanRPMUpperCriticalThreshold := chassisFan.UpperThresholdCritical
445-
chassisFanRPMLowerFatalThreshold := chassisFan.LowerThresholdFatal
446-
chassisFanRPMUpperFatalThreshold := chassisFan.UpperThresholdFatal
447-
chassisFanRPMMin := chassisFan.MinReadingRange
448-
chassisFanRPMMax := chassisFan.MaxReadingRange
444+
chassisFanRPMLowerCriticalThreshold := float64(chassisFan.LowerThresholdCritical)
445+
chassisFanRPMUpperCriticalThreshold := float64(chassisFan.UpperThresholdCritical)
446+
chassisFanRPMLowerFatalThreshold := float64(chassisFan.LowerThresholdFatal)
447+
chassisFanRPMUpperFatalThreshold := float64(chassisFan.UpperThresholdFatal)
448+
chassisFanRPMMin := float64(chassisFan.MinReadingRange)
449+
chassisFanRPMMax := float64(chassisFan.MaxReadingRange)
449450

450451
chassisFanPercentage := chassisFanRPM
451452
if chassisFanUnit != redfish.PercentReadingUnits {
452-
chassisFanPercentage = float32((chassisFanRPM+chassisFanRPMMin)/chassisFanRPMMax) * 100
453+
// Some vendors (e.g. PowerEdge C6420) report null RPMs for Min/Max, as well as Lower/UpperFatal,
454+
// but provide Lower/UpperCritical, so use largest non-null for max. However, we can't know if
455+
// min is null (reported as zero by gofish) or just zero, so we'll have to assume a min of zero
456+
// if Min is not reported...
457+
min := chassisFanRPMMin
458+
max := math.Max(math.Max(chassisFanRPMMax, chassisFanRPMUpperFatalThreshold), chassisFanRPMUpperCriticalThreshold)
459+
chassisFanPercentage = 0
460+
if max != 0 {
461+
chassisFanPercentage = float64((chassisFanRPM+min)/max) * 100
462+
}
453463
}
454464

455465
// chassisFanStatusLabelNames :=[]string{BaseLabelNames,"fan_name","fan_member_id")
@@ -462,14 +472,14 @@ func parseChassisFan(ch chan<- prometheus.Metric, chassisID string, chassisFan r
462472
if chassisFanStausStateValue, ok := parseCommonStatusState(chassisFanStausState); ok {
463473
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_state"].desc, prometheus.GaugeValue, chassisFanStausStateValue, chassisFanLabelvalues...)
464474
}
465-
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm"].desc, prometheus.GaugeValue, float64(chassisFanRPM), chassisFanLabelvalues...)
466-
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_min"].desc, prometheus.GaugeValue, float64(chassisFanRPMMin), chassisFanLabelvalues...)
467-
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_max"].desc, prometheus.GaugeValue, float64(chassisFanRPMMax), chassisFanLabelvalues...)
468-
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_percentage"].desc, prometheus.GaugeValue, float64(chassisFanPercentage), chassisFanLabelvalues...)
469-
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_lower_threshold_critical"].desc, prometheus.GaugeValue, float64(chassisFanRPMLowerCriticalThreshold), chassisFanLabelvalues...)
470-
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_upper_threshold_critical"].desc, prometheus.GaugeValue, float64(chassisFanRPMUpperCriticalThreshold), chassisFanLabelvalues...)
471-
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_lower_threshold_fatal"].desc, prometheus.GaugeValue, float64(chassisFanRPMLowerFatalThreshold), chassisFanLabelvalues...)
472-
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_upper_threshold_fatal"].desc, prometheus.GaugeValue, float64(chassisFanRPMUpperFatalThreshold), chassisFanLabelvalues...)
475+
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm"].desc, prometheus.GaugeValue, chassisFanRPM, chassisFanLabelvalues...)
476+
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_min"].desc, prometheus.GaugeValue, chassisFanRPMMin, chassisFanLabelvalues...)
477+
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_max"].desc, prometheus.GaugeValue, chassisFanRPMMax, chassisFanLabelvalues...)
478+
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_percentage"].desc, prometheus.GaugeValue, chassisFanPercentage, chassisFanLabelvalues...)
479+
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_lower_threshold_critical"].desc, prometheus.GaugeValue, chassisFanRPMLowerCriticalThreshold, chassisFanLabelvalues...)
480+
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_upper_threshold_critical"].desc, prometheus.GaugeValue, chassisFanRPMUpperCriticalThreshold, chassisFanLabelvalues...)
481+
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_lower_threshold_fatal"].desc, prometheus.GaugeValue, chassisFanRPMLowerFatalThreshold, chassisFanLabelvalues...)
482+
ch <- prometheus.MustNewConstMetric(chassisMetrics["chassis_fan_rpm_upper_threshold_fatal"].desc, prometheus.GaugeValue, chassisFanRPMUpperFatalThreshold, chassisFanLabelvalues...)
473483
}
474484

475485
func parseChassisPowerInfoVoltage(ch chan<- prometheus.Metric, chassisID string, chassisPowerInfoVoltage redfish.Voltage, wg *sync.WaitGroup) {

0 commit comments

Comments
 (0)