diff options
-rwxr-xr-x | text_collector_examples/md_info.sh | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/text_collector_examples/md_info.sh b/text_collector_examples/md_info.sh new file mode 100755 index 0000000..c89f10f --- /dev/null +++ b/text_collector_examples/md_info.sh | |||
@@ -0,0 +1,56 @@ | |||
1 | #!/usr/bin/env bash | ||
2 | set -eu | ||
3 | |||
4 | for MD_DEVICE in /dev/md/*; do | ||
5 | # Subshell to avoid eval'd variables from leaking between iterations | ||
6 | ( | ||
7 | # Resolve symlink to discover device, e.g. /dev/md127 | ||
8 | MD_DEVICE_NUM=$(readlink -f "${MD_DEVICE}") | ||
9 | |||
10 | # Remove /dev/ prefix | ||
11 | MD_DEVICE_NUM=${MD_DEVICE_NUM#/dev/} | ||
12 | MD_DEVICE=${MD_DEVICE#/dev/md/} | ||
13 | |||
14 | # Query sysfs for info about md device | ||
15 | SYSFS_BASE="/sys/devices/virtual/block/${MD_DEVICE_NUM}/md" | ||
16 | MD_LAYOUT=$(cat "${SYSFS_BASE}/layout") | ||
17 | MD_LEVEL=$(cat "${SYSFS_BASE}/level") | ||
18 | MD_METADATA_VERSION=$(cat "${SYSFS_BASE}/metadata_version") | ||
19 | MD_NUM_RAID_DISKS=$(cat "${SYSFS_BASE}/raid_disks") | ||
20 | |||
21 | # Remove 'raid' prefix from RAID level | ||
22 | MD_LEVEL=${MD_LEVEL#raid} | ||
23 | |||
24 | # Output disk metrics | ||
25 | for RAID_DISK in ${SYSFS_BASE}/rd[0-9]*; do | ||
26 | DISK=$(readlink -f "${RAID_DISK}/block") | ||
27 | DISK_DEVICE=$(basename "${DISK}") | ||
28 | RAID_DISK_DEVICE=$(basename "${RAID_DISK}") | ||
29 | RAID_DISK_INDEX=${RAID_DISK_DEVICE#rd} | ||
30 | RAID_DISK_STATE=$(cat "${RAID_DISK}/state") | ||
31 | |||
32 | DISK_SET="" | ||
33 | # Determine disk set using logic from mdadm: https://github.com/neilbrown/mdadm/commit/2c096ebe4b | ||
34 | if [[ ${RAID_DISK_STATE} == "in_sync" && ${MD_LEVEL} == 10 && $((MD_LAYOUT & ~0x1ffff)) ]]; then | ||
35 | NEAR_COPIES=$((MD_LAYOUT & 0xff)) | ||
36 | FAR_COPIES=$(((MD_LAYOUT >> 8) & 0xff)) | ||
37 | COPIES=$((NEAR_COPIES * FAR_COPIES)) | ||
38 | |||
39 | if [[ $((MD_NUM_RAID_DISKS % COPIES == 0)) && $((COPIES <= 26)) ]]; then | ||
40 | DISK_SET=$((RAID_DISK_INDEX % COPIES)) | ||
41 | fi | ||
42 | fi | ||
43 | |||
44 | echo -n "node_md_disk_info{disk_device=\"${DISK_DEVICE}\", md_device=\"${MD_DEVICE_NUM}\"" | ||
45 | if [[ -n ${DISK_SET} ]]; then | ||
46 | SET_LETTERS=({A..Z}) | ||
47 | echo -n ", md_set=\"${SET_LETTERS[${DISK_SET}]}\"" | ||
48 | fi | ||
49 | echo "} 1" | ||
50 | done | ||
51 | |||
52 | # Output RAID array metrics | ||
53 | # NOTE: Metadata version is a label rather than a separate metric because the version can be a string | ||
54 | echo "node_md_info{md_device=\"${MD_DEVICE_NUM}\", md_name=\"${MD_DEVICE}\", raid_level=\"${MD_LEVEL}\", md_metadata_version=\"${MD_METADATA_VERSION}\"} 1" | ||
55 | ) | ||
56 | done | ||