Remove obsolete megacli collector. (#798)

This collector has been replaced by the textfile collector tool
`storcli.py`.
This commit is contained in:
Ben Kochie 2018-01-23 11:25:42 +01:00 committed by GitHub
parent 1ad5ba4dc7
commit 111e3af437
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 0 additions and 856 deletions

View file

@ -80,7 +80,6 @@ tcpstat | Exposes TCP connection status information from `/proc/net/tcp` and `/p
Name | Description | OS
---------|-------------|----
gmond | Exposes statistics from Ganglia. | _any_
megacli | Exposes RAID statistics from MegaCLI. | Linux
### Textfile Collector

View file

@ -1111,25 +1111,6 @@ node_md_is_active{device="md6"} 1
node_md_is_active{device="md7"} 1
node_md_is_active{device="md8"} 1
node_md_is_active{device="md9"} 1
# HELP node_megacli_drive_count megacli: drive error and event counters
# TYPE node_megacli_drive_count gauge
node_megacli_drive_count{enclosure="32",slot="0",type="Media Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="0",type="Other Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="0",type="Predictive Failure Count"} 0
node_megacli_drive_count{enclosure="32",slot="1",type="Media Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="1",type="Other Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="1",type="Predictive Failure Count"} 0
node_megacli_drive_count{enclosure="32",slot="2",type="Media Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="2",type="Other Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="2",type="Predictive Failure Count"} 0
node_megacli_drive_count{enclosure="32",slot="3",type="Media Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="3",type="Other Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="3",type="Predictive Failure Count"} 23
# HELP node_megacli_drive_temperature_celsius megacli: drive temperature
# TYPE node_megacli_drive_temperature_celsius gauge
node_megacli_drive_temperature_celsius{enclosure="32",slot="0"} 37
node_megacli_drive_temperature_celsius{enclosure="32",slot="2"} 39
node_megacli_drive_temperature_celsius{enclosure="32",slot="3"} 38
# HELP node_memory_Active_anon_bytes Memory information field Active_anon_bytes.
# TYPE node_memory_Active_anon_bytes gauge
node_memory_Active_anon_bytes 2.068484096e+09
@ -2643,7 +2624,6 @@ node_scrape_collector_success{collector="ipvs"} 1
node_scrape_collector_success{collector="ksmd"} 1
node_scrape_collector_success{collector="loadavg"} 1
node_scrape_collector_success{collector="mdadm"} 1
node_scrape_collector_success{collector="megacli"} 1
node_scrape_collector_success{collector="meminfo"} 1
node_scrape_collector_success{collector="meminfo_numa"} 1
node_scrape_collector_success{collector="mountstats"} 1

View file

@ -1141,25 +1141,6 @@ node_md_is_active{device="md6"} 1
node_md_is_active{device="md7"} 1
node_md_is_active{device="md8"} 1
node_md_is_active{device="md9"} 1
# HELP node_megacli_drive_count megacli: drive error and event counters
# TYPE node_megacli_drive_count gauge
node_megacli_drive_count{enclosure="32",slot="0",type="Media Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="0",type="Other Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="0",type="Predictive Failure Count"} 0
node_megacli_drive_count{enclosure="32",slot="1",type="Media Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="1",type="Other Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="1",type="Predictive Failure Count"} 0
node_megacli_drive_count{enclosure="32",slot="2",type="Media Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="2",type="Other Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="2",type="Predictive Failure Count"} 0
node_megacli_drive_count{enclosure="32",slot="3",type="Media Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="3",type="Other Error Count"} 0
node_megacli_drive_count{enclosure="32",slot="3",type="Predictive Failure Count"} 23
# HELP node_megacli_drive_temperature_celsius megacli: drive temperature
# TYPE node_megacli_drive_temperature_celsius gauge
node_megacli_drive_temperature_celsius{enclosure="32",slot="0"} 37
node_megacli_drive_temperature_celsius{enclosure="32",slot="2"} 39
node_megacli_drive_temperature_celsius{enclosure="32",slot="3"} 38
# HELP node_memory_Active Memory information field Active.
# TYPE node_memory_Active gauge
node_memory_Active 2.287017984e+09
@ -2673,7 +2654,6 @@ node_scrape_collector_success{collector="ipvs"} 1
node_scrape_collector_success{collector="ksmd"} 1
node_scrape_collector_success{collector="loadavg"} 1
node_scrape_collector_success{collector="mdadm"} 1
node_scrape_collector_success{collector="megacli"} 1
node_scrape_collector_success{collector="meminfo"} 1
node_scrape_collector_success{collector="meminfo_numa"} 1
node_scrape_collector_success{collector="mountstats"} 1

View file

@ -1,3 +0,0 @@
#!/usr/bin/env bash
cat "$(dirname "$0")/megacli_disks.txt"

View file

@ -1,280 +0,0 @@
Adapter #0
==============================================================================
Versions
================
Product Name : PERC 6/i Integrated
Serial No : 1234567890123456
FW Package Build: 6.3.3.0002
Mfg. Data
================
Mfg. Date : 06/24/08
Rework Date : 06/24/08
Revision No :
Battery FRU : N/A
Image Versions in Flash:
================
FW Version : 1.22.52-1909
BIOS Version : 2.04.00
WebBIOS Version : 1.1-46-e_15-Rel
Ctrl-R Version : 1.02-015B
Preboot CLI Version: 01.00-022:#%00005
Boot Block Version : 1.00.00.01-0011
Pending Images in Flash
================
None
PCI Info
================
Controller Id : 0000
Vendor Id : 1000
Device Id : 0060
SubVendorId : 1028
SubDeviceId : 1f0c
Host Interface : PCIE
Link Speed : 0
Number of Frontend Port: 0
Device Interface : PCIE
Number of Backend Port: 8
Port : Address
0 5000c50028f2083d
1 5000c50023cb3f39
2 5000c50023cea805
3 5000c50029124491
4 0000000000000000
5 0000000000000000
6 0000000000000000
7 0000000000000000
HW Configuration
================
SAS Address : 5a4badb01e219100
BBU : Present
Alarm : Absent
NVRAM : Present
Serial Debugger : Present
Memory : Present
Flash : Present
Memory Size : 256MB
TPM : Absent
On board Expander: Absent
Upgrade Key : Absent
Temperature sensor for ROC : Absent
Temperature sensor for controller : Absent
Settings
================
Current Time : 14:55:23 7/4, 2014
Predictive Fail Poll Interval : 300sec
Interrupt Throttle Active Count : 16
Interrupt Throttle Completion : 50us
Rebuild Rate : 30%
PR Rate : 30%
BGI Rate : 30%
Check Consistency Rate : 30%
Reconstruction Rate : 30%
Cache Flush Interval : 4s
Max Drives to Spinup at One Time : 2
Delay Among Spinup Groups : 12s
Physical Drive Coercion Mode : 128MB
Cluster Mode : Disabled
Alarm : Disabled
Auto Rebuild : Enabled
Battery Warning : Enabled
Ecc Bucket Size : 15
Ecc Bucket Leak Rate : 1440 Minutes
Restore HotSpare on Insertion : Disabled
Expose Enclosure Devices : Disabled
Maintain PD Fail History : Disabled
Host Request Reordering : Enabled
Auto Detect BackPlane Enabled : SGPIO/i2c SEP
Load Balance Mode : Auto
Use FDE Only : No
Security Key Assigned : No
Security Key Failed : No
Security Key Not Backedup : No
Default LD PowerSave Policy : Controller Defined
Maximum number of direct attached drives to spin up in 1 min : 0
Auto Enhanced Import : No
Any Offline VD Cache Preserved : No
Allow Boot with Preserved Cache : No
Disable Online Controller Reset : No
PFK in NVRAM : No
Use disk activity for locate : No
POST delay : 90 seconds
BIOS Error Handling : Stop On Errors
Current Boot Mode :Normal
Capabilities
================
RAID Level Supported : RAID0, RAID1, RAID5, RAID6, RAID00, RAID10, RAID50, RAID60, PRL 11, PRL 11 with spanning, SRL 3 supported, PRL11-RLQ0 DDF layout with no span, PRL11-RLQ0 DDF layout with span
Supported Drives : SAS, SATA
Allowed Mixing:
Mix in Enclosure Allowed
Status
================
ECC Bucket Count : 0
Limitations
================
Max Arms Per VD : 32
Max Spans Per VD : 8
Max Arrays : 128
Max Number of VDs : 64
Max Parallel Commands : 1008
Max SGE Count : 80
Max Data Transfer Size : 8192 sectors
Max Strips PerIO : 42
Max LD per array : 16
Min Strip Size : 8 KB
Max Strip Size : 1.0 MB
Max Configurable CacheCade Size: 0 GB
Current Size of CacheCade : 0 GB
Current Size of FW Cache : 0 MB
Device Present
================
Virtual Drives : 1
Degraded : 0
Offline : 0
Physical Devices : 5
Disks : 4
Critical Disks : 0
Failed Disks : 0
Supported Adapter Operations
================
Rebuild Rate : Yes
CC Rate : Yes
BGI Rate : Yes
Reconstruct Rate : Yes
Patrol Read Rate : Yes
Alarm Control : Yes
Cluster Support : No
BBU : Yes
Spanning : Yes
Dedicated Hot Spare : Yes
Revertible Hot Spares : Yes
Foreign Config Import : Yes
Self Diagnostic : Yes
Allow Mixed Redundancy on Array : No
Global Hot Spares : Yes
Deny SCSI Passthrough : No
Deny SMP Passthrough : No
Deny STP Passthrough : No
Support Security : No
Snapshot Enabled : No
Support the OCE without adding drives : No
Support PFK : No
Support PI : No
Support Boot Time PFK Change : No
Disable Online PFK Change : No
Support Shield State : No
Block SSD Write Disk Cache Change: No
Supported VD Operations
================
Read Policy : Yes
Write Policy : Yes
IO Policy : Yes
Access Policy : Yes
Disk Cache Policy : Yes
Reconstruction : Yes
Deny Locate : No
Deny CC : No
Allow Ctrl Encryption: No
Enable LDBBM : No
Support Breakmirror : No
Power Savings : No
Supported PD Operations
================
Force Online : Yes
Force Offline : Yes
Force Rebuild : Yes
Deny Force Failed : No
Deny Force Good/Bad : No
Deny Missing Replace : No
Deny Clear : No
Deny Locate : No
Support Temperature : No
NCQ : No
Disable Copyback : No
Enable JBOD : No
Enable Copyback on SMART : No
Enable Copyback to SSD on SMART Error : No
Enable SSD Patrol Read : No
PR Correct Unconfigured Areas : Yes
Error Counters
================
Memory Correctable Errors : 0
Memory Uncorrectable Errors : 0
Cluster Information
================
Cluster Permitted : No
Cluster Active : No
Default Settings
================
Phy Polarity : 0
Phy PolaritySplit : 0
Background Rate : 30
Strip Size : 64kB
Flush Time : 4 seconds
Write Policy : WB
Read Policy : None
Cache When BBU Bad : Disabled
Cached IO : No
SMART Mode : Mode 6
Alarm Disable : No
Coercion Mode : 128MB
ZCR Config : Unknown
Dirty LED Shows Drive Activity : No
BIOS Continue on Error : 0
Spin Down Mode : None
Allowed Device Type : SAS/SATA Mix
Allow Mix in Enclosure : Yes
Allow HDD SAS/SATA Mix in VD : No
Allow SSD SAS/SATA Mix in VD : No
Allow HDD/SSD Mix in VD : No
Allow SATA in Cluster : No
Max Chained Enclosures : 1
Disable Ctrl-R : No
Enable Web BIOS : No
Direct PD Mapping : Yes
BIOS Enumerate VDs : Yes
Restore Hot Spare on Insertion : No
Expose Enclosure Devices : No
Maintain PD Fail History : No
Disable Puncturing : No
Zero Based Enclosure Enumeration : Yes
PreBoot CLI Enabled : No
LED Show Drive Activity : No
Cluster Disable : Yes
SAS Disable : No
Auto Detect BackPlane Enable : SGPIO/i2c SEP
Use FDE Only : No
Enable Led Header : No
Delay during POST : 0
EnableCrashDump : No
Disable Online Controller Reset : No
EnableLDBBM : No
Un-Certified Hard Disk Drives : Block
Treat Single span R1E as R10 : No
Max LD per array : 16
Power Saving option : All power saving options are enabled
Default spin down time in minutes: 0
Enable JBOD : No
Time taken to detect CME : 60s
Exit Code: 0x00

View file

@ -1,197 +0,0 @@
Adapter #0
Enclosure Device ID: 32
Slot Number: 0
Drive's position: DiskGroup: 0, Span: 0, Arm: 0
Enclosure position: N/A
Device Id: 0
WWN:
Sequence Number: 2
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 0
Last Predictive Failure Event Seq Number: 0
PD Type: SAS
Raw Size: 419.186 GB [0x3465f870 Sectors]
Non Coerced Size: 418.686 GB [0x3455f870 Sectors]
Coerced Size: 418.625 GB [0x34540000 Sectors]
Sector Size: 0
Firmware state: Online, Spun Up
Device Firmware Level: ES64
Shield Counter: 0
Successful diagnostics completion on : N/A
SAS Address(0): 0x5000c50028f2083d
SAS Address(1): 0x0
Connected Port Number: 0(path0)
Inquiry Data: SEAGATE ST3450857SS ES643SK26856
FDE Capable: Not Capable
FDE Enable: Disable
Secured: Unsecured
Locked: Unlocked
Needs EKM Attention: No
Foreign State: None
Device Speed: Unknown
Link Speed: Unknown
Media Type: Hard Disk Device
Drive Temperature :37C (98.60 F)
PI Eligibility: No
Drive is formatted for PI information: No
PI: No PI
Port-0 :
Port status: Active
Port's Linkspeed: Unknown
Port-1 :
Port status: Active
Port's Linkspeed: Unknown
Drive has flagged a S.M.A.R.T alert : No
Enclosure Device ID: 32
Slot Number: 1
Drive's position: DiskGroup: 0, Span: 0, Arm: 1
Enclosure position: N/A
Device Id: 1
WWN:
Sequence Number: 2
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 0
Last Predictive Failure Event Seq Number: 0
PD Type: SAS
Raw Size: 419.186 GB [0x3465f870 Sectors]
Non Coerced Size: 418.686 GB [0x3455f870 Sectors]
Coerced Size: 418.625 GB [0x34540000 Sectors]
Sector Size: 0
Firmware state: Online, Spun Up
Device Firmware Level: ES62
Shield Counter: 0
Successful diagnostics completion on : N/A
SAS Address(0): 0x5000c50023cb3f39
SAS Address(1): 0x0
Connected Port Number: 1(path0)
Inquiry Data: SEAGATE ST3450857SS ES623SK16HLC
FDE Capable: Not Capable
FDE Enable: Disable
Secured: Unsecured
Locked: Unlocked
Needs EKM Attention: No
Foreign State: None
Device Speed: Unknown
Link Speed: Unknown
Media Type: Hard Disk Device
Drive Temperature : N/A
PI Eligibility: No
Drive is formatted for PI information: No
PI: No PI
Port-0 :
Port status: Active
Port's Linkspeed: Unknown
Port-1 :
Port status: Active
Port's Linkspeed: Unknown
Drive has flagged a S.M.A.R.T alert : No
Enclosure Device ID: 32
Slot Number: 2
Drive's position: DiskGroup: 0, Span: 1, Arm: 0
Enclosure position: N/A
Device Id: 2
WWN:
Sequence Number: 2
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 0
Last Predictive Failure Event Seq Number: 0
PD Type: SAS
Raw Size: 419.186 GB [0x3465f870 Sectors]
Non Coerced Size: 418.686 GB [0x3455f870 Sectors]
Coerced Size: 418.625 GB [0x34540000 Sectors]
Sector Size: 0
Firmware state: Online, Spun Up
Device Firmware Level: ES62
Shield Counter: 0
Successful diagnostics completion on : N/A
SAS Address(0): 0x5000c50023cea805
SAS Address(1): 0x0
Connected Port Number: 2(path0)
Inquiry Data: SEAGATE ST3450857SS ES623SK189BR
FDE Capable: Not Capable
FDE Enable: Disable
Secured: Unsecured
Locked: Unlocked
Needs EKM Attention: No
Foreign State: None
Device Speed: Unknown
Link Speed: Unknown
Media Type: Hard Disk Device
Drive Temperature :39C (102.20 F)
PI Eligibility: No
Drive is formatted for PI information: No
PI: No PI
Port-0 :
Port status: Active
Port's Linkspeed: Unknown
Port-1 :
Port status: Active
Port's Linkspeed: Unknown
Drive has flagged a S.M.A.R.T alert : No
Enclosure Device ID: 32
Slot Number: 3
Drive's position: DiskGroup: 0, Span: 1, Arm: 1
Enclosure position: N/A
Device Id: 3
WWN:
Sequence Number: 2
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 23
Last Predictive Failure Event Seq Number: 0
PD Type: SAS
Raw Size: 419.186 GB [0x3465f870 Sectors]
Non Coerced Size: 418.686 GB [0x3455f870 Sectors]
Coerced Size: 418.625 GB [0x34540000 Sectors]
Sector Size: 0
Firmware state: Online, Spun Up
Device Firmware Level: ES64
Shield Counter: 0
Successful diagnostics completion on : N/A
SAS Address(0): 0x5000c50029124491
SAS Address(1): 0x0
Connected Port Number: 3(path0)
Inquiry Data: SEAGATE ST3450857SS ES643SK27GQ9
FDE Capable: Not Capable
FDE Enable: Disable
Secured: Unsecured
Locked: Unlocked
Needs EKM Attention: No
Foreign State: None
Device Speed: Unknown
Link Speed: Unknown
Media Type: Hard Disk Device
Drive Temperature :38C (100.40 F)
PI Eligibility: No
Drive is formatted for PI information: No
PI: No PI
Port-0 :
Port status: Active
Port's Linkspeed: Unknown
Port-1 :
Port status: Active
Port's Linkspeed: Unknown
Drive has flagged a S.M.A.R.T alert : No
Exit Code: 0x00

View file

@ -1,238 +0,0 @@
// Copyright 2015 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build !nomegacli
package collector
import (
"bufio"
"io"
"os/exec"
"strconv"
"strings"
"github.com/prometheus/client_golang/prometheus"
"gopkg.in/alecthomas/kingpin.v2"
)
const (
defaultMegaCli = "megacli"
adapterHeaderSep = "================"
)
var (
megacliCommand = kingpin.Flag("collector.megacli.command", "Command to run megacli.").Default(defaultMegaCli).String()
)
type megaCliCollector struct {
cli string
driveTemperature *prometheus.GaugeVec
driveCounters *prometheus.GaugeVec
drivePresence *prometheus.GaugeVec
}
func init() {
registerCollector("megacli", defaultDisabled, NewMegaCliCollector)
}
// NewMegaCliCollector returns a new Collector exposing RAID status through
// megacli.
func NewMegaCliCollector() (Collector, error) {
warnDeprecated("megacli")
return &megaCliCollector{
cli: *megacliCommand,
driveTemperature: prometheus.NewGaugeVec(prometheus.GaugeOpts{
Namespace: namespace,
Name: "megacli_drive_temperature_celsius",
Help: "megacli: drive temperature",
}, []string{"enclosure", "slot"}),
driveCounters: prometheus.NewGaugeVec(prometheus.GaugeOpts{
Namespace: namespace,
Name: "megacli_drive_count",
Help: "megacli: drive error and event counters",
}, []string{"enclosure", "slot", "type"}),
drivePresence: prometheus.NewGaugeVec(prometheus.GaugeOpts{
Namespace: namespace,
Name: "megacli_adapter_disk_presence",
Help: "megacli: disk presence per adapter",
}, []string{"type"}),
}, nil
}
func (c *megaCliCollector) Update(ch chan<- prometheus.Metric) error {
if err := c.updateAdapter(); err != nil {
return err
}
if err := c.updateDisks(); err != nil {
return err
}
c.driveTemperature.Collect(ch)
c.driveCounters.Collect(ch)
c.drivePresence.Collect(ch)
return nil
}
func parseMegaCliDisks(r io.Reader) (map[int]map[int]map[string]string, error) {
var (
stats = map[int]map[int]map[string]string{}
scanner = bufio.NewScanner(r)
curEnc = -1
curSlot = -1
)
for scanner.Scan() {
var err error
text := strings.TrimSpace(scanner.Text())
parts := strings.SplitN(text, ":", 2)
if len(parts) != 2 { // Adapter #X
continue
}
key := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
switch {
case key == "Enclosure Device ID":
curEnc, err = strconv.Atoi(value)
if err != nil {
return nil, err
}
case key == "Slot Number":
curSlot, err = strconv.Atoi(value)
if err != nil {
return nil, err
}
case curSlot != -1 && curEnc != -1:
if _, ok := stats[curEnc]; !ok {
stats[curEnc] = map[int]map[string]string{}
}
if _, ok := stats[curEnc][curSlot]; !ok {
stats[curEnc][curSlot] = map[string]string{}
}
stats[curEnc][curSlot][key] = value
}
}
return stats, scanner.Err()
}
func parseMegaCliAdapter(r io.Reader) (map[string]map[string]string, error) {
var (
raidStats = map[string]map[string]string{}
scanner = bufio.NewScanner(r)
header = ""
last = ""
)
for scanner.Scan() {
text := strings.TrimSpace(scanner.Text())
if text == adapterHeaderSep {
header = last
raidStats[header] = map[string]string{}
continue
}
last = text
if header == "" { // skip Adapter #X and separator
continue
}
parts := strings.SplitN(text, ":", 2)
if len(parts) != 2 { // these section never include anything we are interested in
continue
}
key := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
raidStats[header][key] = value
}
return raidStats, scanner.Err()
}
func (c *megaCliCollector) updateAdapter() error {
cmd := exec.Command(c.cli, "-AdpAllInfo", "-aALL")
pipe, err := cmd.StdoutPipe()
if err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
stats, err := parseMegaCliAdapter(pipe)
if err != nil {
return err
}
if err := cmd.Wait(); err != nil {
return err
}
for k, v := range stats["Device Present"] {
value, err := strconv.ParseFloat(v, 64)
if err != nil {
return err
}
c.drivePresence.WithLabelValues(k).Set(value)
}
return nil
}
func (c *megaCliCollector) updateDisks() error {
var counters = []string{"Media Error Count", "Other Error Count", "Predictive Failure Count"}
cmd := exec.Command(c.cli, "-PDList", "-aALL")
pipe, err := cmd.StdoutPipe()
if err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
stats, err := parseMegaCliDisks(pipe)
if err != nil {
return err
}
if err := cmd.Wait(); err != nil {
return err
}
for enc, encStats := range stats {
for slot, slotStats := range encStats {
encStr := strconv.Itoa(enc)
slotStr := strconv.Itoa(slot)
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)
if err != nil {
return err
}
c.driveCounters.WithLabelValues(encStr, slotStr, i).Set(counter)
}
}
}
return nil
}

View file

@ -1,95 +0,0 @@
// Copyright 2015 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build !nomegacli
package collector
import (
"os"
"testing"
"github.com/prometheus/client_golang/prometheus"
"gopkg.in/alecthomas/kingpin.v2"
)
const (
testMegaCliAdapter = "fixtures/megacli_adapter.txt"
testMegaCliDisks = "fixtures/megacli_disks.txt"
physicalDevicesExpected = "5"
virtualDevicesDegraded = "0"
)
func TestMegaCliAdapter(t *testing.T) {
data, err := os.Open(testMegaCliAdapter)
if err != nil {
t.Fatal(err)
}
stats, err := parseMegaCliAdapter(data)
if err != nil {
t.Fatal(err)
}
if stats["Device Present"]["Physical Devices"] != physicalDevicesExpected {
t.Fatalf("Unexpected device count: %s != %s", stats["Device Present"]["Physical Devices"], physicalDevicesExpected)
}
if stats["Device Present"]["Degraded"] != virtualDevicesDegraded {
t.Fatalf("Unexpected degraded device count: %s != %s", stats["Device Present"]["Degraded"], virtualDevicesDegraded)
}
}
func TestMegaCliDisks(t *testing.T) {
data, err := os.Open(testMegaCliDisks)
if err != nil {
t.Fatal(err)
}
stats, err := parseMegaCliDisks(data)
if err != nil {
t.Fatal(err)
}
if stats[32][0]["Drive Temperature"] != "37C (98.60 F)" {
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.Fatalf("Unexpected predictive failure count: %s", stats[32][3]["Predictive Failure Count"])
}
}
func TestMegaCliCollectorDoesntCrash(t *testing.T) {
if _, err := kingpin.CommandLine.Parse([]string{"--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)
}
}

View file

@ -31,7 +31,6 @@ enabled_collectors=$(cat << COLLECTORS
stat
textfile
bonding
megacli
wifi
xfs
zfs
@ -95,7 +94,6 @@ fi
$(for c in ${enabled_collectors}; do echo --collector.${c} ; done) \
$(for c in ${disabled_collectors}; do echo --no-collector.${c} ; done) \
--collector.textfile.directory="collector/fixtures/textfile/two_metric_files/" \
--collector.megacli.command="collector/fixtures/megacli" \
--collector.wifi.fixtures="collector/fixtures/wifi" \
--collector.qdisc.fixtures="collector/fixtures/qdisc/" \
--web.listen-address "127.0.0.1:${port}" \