Browse Source

megacli: prevent crash when drive temperature is N/A

Intel SSD do not report their temperature in MegaCLI output
Drive Temperature : N/A
pull/97/head
Alexis Letessier 9 years ago
parent
commit
0028abc077
  1. 3
      collector/fixtures/megacli
  2. 2
      collector/fixtures/megacli_disks.txt
  3. 17
      collector/megacli.go
  4. 28
      collector/megacli_test.go

3
collector/fixtures/megacli

@ -0,0 +1,3 @@
#!/usr/bin/env bash
cat fixtures/megacli_disks.txt

2
collector/fixtures/megacli_disks.txt

@ -83,7 +83,7 @@ Foreign State: None
Device Speed: Unknown Device Speed: Unknown
Link Speed: Unknown Link Speed: Unknown
Media Type: Hard Disk Device Media Type: Hard Disk Device
Drive Temperature :37C (98.60 F) Drive Temperature : N/A
PI Eligibility: No PI Eligibility: No
Drive is formatted for PI information: No Drive is formatted for PI information: No
PI: No PI PI: No PI

17
collector/megacli.go

@ -196,17 +196,18 @@ func (c *megaCliCollector) updateDisks() error {
for enc, encStats := range stats { for enc, encStats := range stats {
for slot, slotStats := range encStats { for slot, slotStats := range encStats {
tStr := slotStats["Drive Temperature"]
tStr = tStr[:strings.Index(tStr, "C")]
t, err := strconv.ParseFloat(tStr, 64)
if err != nil {
return err
}
encStr := strconv.Itoa(enc) encStr := strconv.Itoa(enc)
slotStr := strconv.Itoa(slot) slotStr := strconv.Itoa(slot)
c.driveTemperature.WithLabelValues(encStr, slotStr).Set(t) tStr := slotStats["Drive Temperature"]
if strings.Index(tStr, "C") > 0 {
tStr = tStr[:strings.Index(tStr, "C")]
t, err := strconv.ParseFloat(tStr, 64)
if err != nil {
return err
}
c.driveTemperature.WithLabelValues(encStr, slotStr).Set(t)
}
for _, i := range counters { for _, i := range counters {
counter, err := strconv.ParseFloat(slotStats[i], 64) counter, err := strconv.ParseFloat(slotStats[i], 64)

28
collector/megacli_test.go

@ -3,8 +3,11 @@
package collector package collector
import ( import (
"flag"
"os" "os"
"testing" "testing"
"github.com/prometheus/client_golang/prometheus"
) )
const ( const (
@ -48,7 +51,32 @@ func TestMegaCliDisks(t *testing.T) {
t.Fatalf("Unexpected drive temperature: %s", stats[32][0]["Drive Temperature"]) t.Fatalf("Unexpected drive temperature: %s", stats[32][0]["Drive Temperature"])
} }
if stats[32][1]["Drive Temperature"] != "N/A" {
t.Fatalf("Unexpected drive temperature: %s", stats[32][2]["Drive Temperature"])
}
if stats[32][3]["Predictive Failure Count"] != "23" { if stats[32][3]["Predictive Failure Count"] != "23" {
t.Fatal() t.Fatal()
} }
} }
func TestMegaCliCollectorDoesntCrash(t *testing.T) {
if err := flag.Set("collector.megacli.command", "./fixtures/megacli"); err != nil {
t.Fatal(err)
}
collector, err := NewMegaCliCollector()
if err != nil {
t.Fatal(err)
}
sink := make(chan prometheus.Metric)
go func() {
for {
<-sink
}
}()
err = collector.Update(sink)
if err != nil {
t.Fatal(err)
}
}

Loading…
Cancel
Save