From 0028abc0777e8a86fa965847e3ca7b96df4a07ba Mon Sep 17 00:00:00 2001 From: Alexis Letessier Date: Sat, 25 Jul 2015 16:45:45 +0200 Subject: [PATCH] megacli: prevent crash when drive temperature is N/A Intel SSD do not report their temperature in MegaCLI output Drive Temperature : N/A --- collector/fixtures/megacli | 3 +++ collector/fixtures/megacli_disks.txt | 2 +- collector/megacli.go | 17 +++++++++-------- collector/megacli_test.go | 28 ++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 9 deletions(-) create mode 100755 collector/fixtures/megacli diff --git a/collector/fixtures/megacli b/collector/fixtures/megacli new file mode 100755 index 00000000..42135854 --- /dev/null +++ b/collector/fixtures/megacli @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +cat fixtures/megacli_disks.txt diff --git a/collector/fixtures/megacli_disks.txt b/collector/fixtures/megacli_disks.txt index a3374250..e6565274 100644 --- a/collector/fixtures/megacli_disks.txt +++ b/collector/fixtures/megacli_disks.txt @@ -83,7 +83,7 @@ Foreign State: None Device Speed: Unknown Link Speed: Unknown Media Type: Hard Disk Device -Drive Temperature :37C (98.60 F) +Drive Temperature : N/A PI Eligibility: No Drive is formatted for PI information: No PI: No PI diff --git a/collector/megacli.go b/collector/megacli.go index f66da864..2d657fc1 100644 --- a/collector/megacli.go +++ b/collector/megacli.go @@ -196,17 +196,18 @@ func (c *megaCliCollector) updateDisks() error { for enc, encStats := range stats { 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) 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 { counter, err := strconv.ParseFloat(slotStats[i], 64) diff --git a/collector/megacli_test.go b/collector/megacli_test.go index 72e52afb..3169e33f 100644 --- a/collector/megacli_test.go +++ b/collector/megacli_test.go @@ -3,8 +3,11 @@ package collector import ( + "flag" "os" "testing" + + "github.com/prometheus/client_golang/prometheus" ) const ( @@ -48,7 +51,32 @@ func TestMegaCliDisks(t *testing.T) { 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" { 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) + } +}