Fix mdadm collector issues (#985)

* Send "Personality unknown" to debug, not info, remove unnecessary newline.
* Add support for "linear" personality.
* Always set number of active disks to 0 when a device is inactive.
* Add total disks calculation to unknown personalites.

Signed-off-by: Ben Kochie <superq@gmail.com>
This commit is contained in:
Ben Kochie 2018-07-02 12:38:20 +02:00 committed by GitHub
commit 107e5dfecc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 10 deletions

View file

@ -29,10 +29,10 @@ import (
var (
statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`)
raid0lineRE = regexp.MustCompile(`(\d+) blocks .*\d+k chunks`)
raid0lineRE = regexp.MustCompile(`(\d+) blocks .*\d+k (chunks|rounding)`)
buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`)
unknownPersonalityLineRE = regexp.MustCompile(`(\d+) blocks (.*)`)
raidPersonalityRE = regexp.MustCompile(`raid[0-9]+`)
raidPersonalityRE = regexp.MustCompile(`^(linear|raid[0-9]+)$`)
)
type mdStatus struct {
@ -175,20 +175,25 @@ func parseMdstat(mdStatusFilePath string) ([]mdStatus, error) {
}
}
switch {
case personality == "raid0":
case personality == "raid0" || personality == "linear":
md.disksActive = int64(len(mainLine) - 4) // Get the number of devices from the main line.
md.disksTotal = md.disksActive // Raid0 active and total is always the same if active.
md.blocksTotal, err = evalRaid0line(lines[i+1])
case raidPersonalityRE.MatchString(personality):
md.disksActive, md.disksTotal, md.blocksTotal, err = evalStatusline(lines[i+1])
default:
log.Infof("Personality unknown: %s\n", mainLine)
log.Debugf("Personality unknown: %s", mainLine)
md.disksTotal = int64(len(mainLine) - 3)
md.blocksTotal, err = evalUnknownPersonalitylineRE(lines[i+1])
}
if err != nil {
return mdStates, fmt.Errorf("error parsing mdstat: %s", err)
}
if !md.active {
md.disksActive = 0
}
syncLine := lines[i+2]
if strings.Contains(syncLine, "bitmap") {
syncLine = lines[i+3]