Merge pull request #346 from mcdan/people/mcdan/issues/219

Fix additional mdadm parsing cases
pull/348/head
Ben Kochie 8 years ago committed by GitHub
commit f8af350ae2

@ -713,10 +713,12 @@ node_load5 0.37
# HELP node_md_blocks Total number of blocks on device. # HELP node_md_blocks Total number of blocks on device.
# TYPE node_md_blocks gauge # TYPE node_md_blocks gauge
node_md_blocks{device="md0"} 248896 node_md_blocks{device="md0"} 248896
node_md_blocks{device="md00"} 4.186624e+06
node_md_blocks{device="md10"} 3.14159265e+08 node_md_blocks{device="md10"} 3.14159265e+08
node_md_blocks{device="md11"} 4.190208e+06 node_md_blocks{device="md11"} 4.190208e+06
node_md_blocks{device="md12"} 3.886394368e+09 node_md_blocks{device="md12"} 3.886394368e+09
node_md_blocks{device="md127"} 3.12319552e+08 node_md_blocks{device="md127"} 3.12319552e+08
node_md_blocks{device="md219"} 7932
node_md_blocks{device="md3"} 5.853468288e+09 node_md_blocks{device="md3"} 5.853468288e+09
node_md_blocks{device="md4"} 4.883648e+06 node_md_blocks{device="md4"} 4.883648e+06
node_md_blocks{device="md6"} 1.95310144e+08 node_md_blocks{device="md6"} 1.95310144e+08
@ -726,10 +728,12 @@ node_md_blocks{device="md9"} 523968
# HELP node_md_blocks_synced Number of blocks synced on device. # HELP node_md_blocks_synced Number of blocks synced on device.
# TYPE node_md_blocks_synced gauge # TYPE node_md_blocks_synced gauge
node_md_blocks_synced{device="md0"} 248896 node_md_blocks_synced{device="md0"} 248896
node_md_blocks_synced{device="md00"} 4.186624e+06
node_md_blocks_synced{device="md10"} 3.14159265e+08 node_md_blocks_synced{device="md10"} 3.14159265e+08
node_md_blocks_synced{device="md11"} 4.190208e+06 node_md_blocks_synced{device="md11"} 4.190208e+06
node_md_blocks_synced{device="md12"} 3.886394368e+09 node_md_blocks_synced{device="md12"} 3.886394368e+09
node_md_blocks_synced{device="md127"} 3.12319552e+08 node_md_blocks_synced{device="md127"} 3.12319552e+08
node_md_blocks_synced{device="md219"} 7932
node_md_blocks_synced{device="md3"} 5.853468288e+09 node_md_blocks_synced{device="md3"} 5.853468288e+09
node_md_blocks_synced{device="md4"} 4.883648e+06 node_md_blocks_synced{device="md4"} 4.883648e+06
node_md_blocks_synced{device="md6"} 1.6775552e+07 node_md_blocks_synced{device="md6"} 1.6775552e+07
@ -739,10 +743,12 @@ node_md_blocks_synced{device="md9"} 523968
# HELP node_md_disks Total number of disks of device. # HELP node_md_disks Total number of disks of device.
# TYPE node_md_disks gauge # TYPE node_md_disks gauge
node_md_disks{device="md0"} 2 node_md_disks{device="md0"} 2
node_md_disks{device="md00"} 1
node_md_disks{device="md10"} 2 node_md_disks{device="md10"} 2
node_md_disks{device="md11"} 2 node_md_disks{device="md11"} 2
node_md_disks{device="md12"} 2 node_md_disks{device="md12"} 2
node_md_disks{device="md127"} 2 node_md_disks{device="md127"} 2
node_md_disks{device="md219"} 2
node_md_disks{device="md3"} 8 node_md_disks{device="md3"} 8
node_md_disks{device="md4"} 2 node_md_disks{device="md4"} 2
node_md_disks{device="md6"} 2 node_md_disks{device="md6"} 2
@ -752,10 +758,12 @@ node_md_disks{device="md9"} 4
# HELP node_md_disks_active Number of active disks of device. # HELP node_md_disks_active Number of active disks of device.
# TYPE node_md_disks_active gauge # TYPE node_md_disks_active gauge
node_md_disks_active{device="md0"} 2 node_md_disks_active{device="md0"} 2
node_md_disks_active{device="md00"} 1
node_md_disks_active{device="md10"} 2 node_md_disks_active{device="md10"} 2
node_md_disks_active{device="md11"} 2 node_md_disks_active{device="md11"} 2
node_md_disks_active{device="md12"} 2 node_md_disks_active{device="md12"} 2
node_md_disks_active{device="md127"} 2 node_md_disks_active{device="md127"} 2
node_md_disks_active{device="md219"} 2
node_md_disks_active{device="md3"} 8 node_md_disks_active{device="md3"} 8
node_md_disks_active{device="md4"} 2 node_md_disks_active{device="md4"} 2
node_md_disks_active{device="md6"} 1 node_md_disks_active{device="md6"} 1
@ -765,10 +773,12 @@ node_md_disks_active{device="md9"} 4
# HELP node_md_is_active Indicator whether the md-device is active or not. # HELP node_md_is_active Indicator whether the md-device is active or not.
# TYPE node_md_is_active gauge # TYPE node_md_is_active gauge
node_md_is_active{device="md0"} 1 node_md_is_active{device="md0"} 1
node_md_is_active{device="md00"} 1
node_md_is_active{device="md10"} 1 node_md_is_active{device="md10"} 1
node_md_is_active{device="md11"} 1 node_md_is_active{device="md11"} 1
node_md_is_active{device="md12"} 1 node_md_is_active{device="md12"} 1
node_md_is_active{device="md127"} 1 node_md_is_active{device="md127"} 1
node_md_is_active{device="md219"} 0
node_md_is_active{device="md3"} 1 node_md_is_active{device="md3"} 1
node_md_is_active{device="md4"} 0 node_md_is_active{device="md4"} 0
node_md_is_active{device="md6"} 1 node_md_is_active{device="md6"} 1

@ -37,4 +37,10 @@ md11 : active (auto-read-only) raid1 sdb2[0] sdc2[1]
md12 : active raid0 sdc2[0] sdd2[1] md12 : active raid0 sdc2[0] sdd2[1]
3886394368 blocks super 1.2 512k chunks 3886394368 blocks super 1.2 512k chunks
md219 : inactive sdb[2](S) sdc[1](S) sda[0](S)
7932 blocks super external:imsm
md00 : active raid0 xvdb[0]
4186624 blocks super 1.2 256k chunks
unused devices: <none> unused devices: <none>

@ -28,9 +28,11 @@ import (
) )
var ( var (
statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`)
raid0lineRE = regexp.MustCompile(`(\d+) blocks .*\d+k chunks`) raid0lineRE = regexp.MustCompile(`(\d+) blocks( super ([0-9\.])*)? \d+k chunks`)
buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`) buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`)
unknownPersonalityLineRE = regexp.MustCompile(`(\d+) blocks (.*)`)
raidPersonalityRE = regexp.MustCompile(`raid[0-9]+`)
) )
type mdStatus struct { type mdStatus struct {
@ -80,7 +82,7 @@ func evalStatusline(statusline string) (active, total, size int64, err error) {
func evalRaid0line(statusline string) (size int64, err error) { func evalRaid0line(statusline string) (size int64, err error) {
matches := raid0lineRE.FindStringSubmatch(statusline) matches := raid0lineRE.FindStringSubmatch(statusline)
if len(matches) != 2 { if len(matches) < 2 {
return 0, fmt.Errorf("invalid raid0 status line: %s", statusline) return 0, fmt.Errorf("invalid raid0 status line: %s", statusline)
} }
@ -92,6 +94,21 @@ func evalRaid0line(statusline string) (size int64, err error) {
return size, nil return size, nil
} }
func evalUnknownPersonalitylineRE(statusline string) (size int64, err error) {
matches := unknownPersonalityLineRE.FindStringSubmatch(statusline)
if len(matches) != 2+1 {
return 0, fmt.Errorf("invalid unknown personality status line: %s", statusline)
}
size, err = strconv.ParseInt(matches[1], 10, 64)
if err != nil {
return 0, fmt.Errorf("%s in statusline: %s", err, statusline)
}
return size, nil
}
// Gets the size that has already been synced out of the sync-line. // Gets the size that has already been synced out of the sync-line.
func evalBuildline(buildline string) (int64, error) { func evalBuildline(buildline string) (int64, error) {
matches := buildlineRE.FindStringSubmatch(buildline) matches := buildlineRE.FindStringSubmatch(buildline)
@ -158,19 +175,28 @@ func parseMdstat(mdStatusFilePath string) ([]mdStatus, error) {
} }
currentMD = mainLine[0] // The name of the md-device. currentMD = mainLine[0] // The name of the md-device.
isActive := (mainLine[2] == "active") // The activity status of the md-device. isActive := (mainLine[2] == "active") // The activity status of the md-device.
personality = mainLine[3] // The personality type of the md-device. personality = ""
for _, possiblePersonality := range mainLine[3:] {
if raidPersonalityRE.MatchString(possiblePersonality) {
personality = possiblePersonality
break
}
}
if len(lines) <= i+3 { if len(lines) <= i+3 {
return mdStates, fmt.Errorf("error parsing mdstat: entry for %s has fewer lines than expected", currentMD) return mdStates, fmt.Errorf("error parsing mdstat: entry for %s has fewer lines than expected", currentMD)
} }
switch personality { switch {
case "raid0": case personality == "raid0":
active = int64(len(mainLine) - 4) // Get the number of devices from the main line. active = int64(len(mainLine) - 4) // Get the number of devices from the main line.
total = active // Raid0 active and total is always the same if active. total = active // Raid0 active and total is always the same if active.
size, err = evalRaid0line(lines[i+1]) // Parse statusline, always present. size, err = evalRaid0line(lines[i+1]) // Parse statusline, always present.
default: case raidPersonalityRE.MatchString(personality):
active, total, size, err = evalStatusline(lines[i+1]) // Parse statusline, always present. active, total, size, err = evalStatusline(lines[i+1]) // Parse statusline, always present.
default:
log.Infof("Personality unknown: %s\n", mainLine)
size, err = evalUnknownPersonalitylineRE(lines[i+1]) // Parse statusline, always present.
} }
if err != nil { if err != nil {

@ -25,6 +25,7 @@ func TestMdadm(t *testing.T) {
} }
refs := map[string]mdStatus{ refs := map[string]mdStatus{
// { "<name>", <active?>, <numDisksActive>, <totalNumDisks>, <amountSynced>, <totalSize>}
"md3": {"md3", true, 8, 8, 5853468288, 5853468288}, "md3": {"md3", true, 8, 8, 5853468288, 5853468288},
"md127": {"md127", true, 2, 2, 312319552, 312319552}, "md127": {"md127", true, 2, 2, 312319552, 312319552},
"md0": {"md0", true, 2, 2, 248896, 248896}, "md0": {"md0", true, 2, 2, 248896, 248896},
@ -36,6 +37,8 @@ func TestMdadm(t *testing.T) {
"md10": {"md10", true, 2, 2, 314159265, 314159265}, "md10": {"md10", true, 2, 2, 314159265, 314159265},
"md11": {"md11", true, 2, 2, 4190208, 4190208}, "md11": {"md11", true, 2, 2, 4190208, 4190208},
"md12": {"md12", true, 2, 2, 3886394368, 3886394368}, "md12": {"md12", true, 2, 2, 3886394368, 3886394368},
"md219": {"md219", false, 2, 2, 7932, 7932},
"md00": {"md00", true, 1, 1, 4186624, 4186624},
} }
for _, md := range mdStates { for _, md := range mdStates {

Loading…
Cancel
Save