@@ -2,6 +2,7 @@ package collector
2
2
3
3
import (
4
4
"fmt"
5
+ "math"
5
6
"strings"
6
7
"sync"
7
8
@@ -438,18 +439,27 @@ func parseChassisFan(ch chan<- prometheus.Metric, chassisID string, chassisFan r
438
439
chassisFanStaus := chassisFan .Status
439
440
chassisFanStausHealth := chassisFanStaus .Health
440
441
chassisFanStausState := chassisFanStaus .State
441
- chassisFanRPM := chassisFan .Reading
442
+ chassisFanRPM := float64 ( chassisFan .Reading )
442
443
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 )
449
450
450
451
chassisFanPercentage := chassisFanRPM
451
452
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
+ }
453
463
}
454
464
455
465
// chassisFanStatusLabelNames :=[]string{BaseLabelNames,"fan_name","fan_member_id")
@@ -462,14 +472,14 @@ func parseChassisFan(ch chan<- prometheus.Metric, chassisID string, chassisFan r
462
472
if chassisFanStausStateValue , ok := parseCommonStatusState (chassisFanStausState ); ok {
463
473
ch <- prometheus .MustNewConstMetric (chassisMetrics ["chassis_fan_state" ].desc , prometheus .GaugeValue , chassisFanStausStateValue , chassisFanLabelvalues ... )
464
474
}
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 ... )
473
483
}
474
484
475
485
func parseChassisPowerInfoVoltage (ch chan <- prometheus.Metric , chassisID string , chassisPowerInfoVoltage redfish.Voltage , wg * sync.WaitGroup ) {
0 commit comments