diff options
author | mpursley <mpursley@gmail.com> | 2019-02-10 06:20:42 -0800 |
---|---|---|
committer | Ben Kochie <superq@gmail.com> | 2019-02-10 15:20:42 +0100 |
commit | 1ba436e1949c7ab8af83642dc973cb30b118966a (patch) | |
tree | d98f01f5a8463b1f1447ed80ecf0c90048556636 /text_collector_examples | |
parent | 18fc512fc4d50c2463fa4de8845d33c04a0ed529 (diff) | |
download | prometheus_node_collector-1ba436e1949c7ab8af83642dc973cb30b118966a.tar.bz2 prometheus_node_collector-1ba436e1949c7ab8af83642dc973cb30b118966a.tar.xz prometheus_node_collector-1ba436e1949c7ab8af83642dc973cb30b118966a.zip |
add md_info_detail.sh (#1204)
Signed-off-by: Matt Pursley <mpursley@gmail.com>
Diffstat (limited to 'text_collector_examples')
-rwxr-xr-x | text_collector_examples/md_info_detail.sh | 87 | ||||
-rw-r--r--[-rwxr-xr-x] | text_collector_examples/smartmon.sh | 0 |
2 files changed, 87 insertions, 0 deletions
diff --git a/text_collector_examples/md_info_detail.sh b/text_collector_examples/md_info_detail.sh new file mode 100755 index 0000000..6d45248 --- /dev/null +++ b/text_collector_examples/md_info_detail.sh | |||
@@ -0,0 +1,87 @@ | |||
1 | #!/usr/bin/env bash | ||
2 | # Note: This script uses "mdadm --detail" to get some of the metrics, so it must be run as root. | ||
3 | # It is designed to be run periodically in a cronjob, and output to /var/lib/node_exporter/textfile_collector/md_info_detail.prom | ||
4 | # $ cat /etc/cron.d/prometheus_md_info_detail | ||
5 | # * * * * * bash /var/lib/node_exporter/md_info_detail.sh > /var/lib/node_exporter/md_info_detail.prom.$$ && mv /var/lib/node_exporter/md_info_detail.prom.$$ /var/lib/node_exporter/md_info_detail.prom | ||
6 | |||
7 | set -eu | ||
8 | |||
9 | for MD_DEVICE in /dev/md/*; do | ||
10 | # Subshell to avoid eval'd variables from leaking between iterations | ||
11 | ( | ||
12 | # Resolve symlink to discover device, e.g. /dev/md127 | ||
13 | MD_DEVICE_NUM=$(readlink -f "${MD_DEVICE}") | ||
14 | |||
15 | # Remove /dev/ prefix | ||
16 | MD_DEVICE_NUM=${MD_DEVICE_NUM#/dev/} | ||
17 | MD_DEVICE=${MD_DEVICE#/dev/md/} | ||
18 | |||
19 | # Query sysfs for info about md device | ||
20 | SYSFS_BASE="/sys/devices/virtual/block/${MD_DEVICE_NUM}/md" | ||
21 | MD_LAYOUT=$(cat "${SYSFS_BASE}/layout") | ||
22 | MD_LEVEL=$(cat "${SYSFS_BASE}/level") | ||
23 | MD_METADATA_VERSION=$(cat "${SYSFS_BASE}/metadata_version") | ||
24 | MD_NUM_RAID_DISKS=$(cat "${SYSFS_BASE}/raid_disks") | ||
25 | |||
26 | # Remove 'raid' prefix from RAID level | ||
27 | MD_LEVEL=${MD_LEVEL#raid} | ||
28 | |||
29 | # Output disk metrics | ||
30 | for RAID_DISK in ${SYSFS_BASE}/rd[0-9]*; do | ||
31 | DISK=$(readlink -f "${RAID_DISK}/block") | ||
32 | DISK_DEVICE=$(basename "${DISK}") | ||
33 | RAID_DISK_DEVICE=$(basename "${RAID_DISK}") | ||
34 | RAID_DISK_INDEX=${RAID_DISK_DEVICE#rd} | ||
35 | RAID_DISK_STATE=$(cat "${RAID_DISK}/state") | ||
36 | |||
37 | DISK_SET="" | ||
38 | # Determine disk set using logic from mdadm: https://github.com/neilbrown/mdadm/commit/2c096ebe4b | ||
39 | if [[ ${RAID_DISK_STATE} == "in_sync" && ${MD_LEVEL} == 10 && $((MD_LAYOUT & ~0x1ffff)) ]]; then | ||
40 | NEAR_COPIES=$((MD_LAYOUT & 0xff)) | ||
41 | FAR_COPIES=$(((MD_LAYOUT >> 8) & 0xff)) | ||
42 | COPIES=$((NEAR_COPIES * FAR_COPIES)) | ||
43 | |||
44 | if [[ $((MD_NUM_RAID_DISKS % COPIES == 0)) && $((COPIES <= 26)) ]]; then | ||
45 | DISK_SET=$((RAID_DISK_INDEX % COPIES)) | ||
46 | fi | ||
47 | fi | ||
48 | |||
49 | echo -n "node_md_disk_info{disk_device=\"${DISK_DEVICE}\", md_device=\"${MD_DEVICE_NUM}\"" | ||
50 | if [[ -n ${DISK_SET} ]]; then | ||
51 | SET_LETTERS=({A..Z}) | ||
52 | echo -n ", md_set=\"${SET_LETTERS[${DISK_SET}]}\"" | ||
53 | fi | ||
54 | echo "} 1" | ||
55 | done | ||
56 | |||
57 | # Get output from mdadm --detail (Note: root/sudo required) | ||
58 | MDADM_DETAIL_OUTPUT=$(mdadm --detail /dev/"${MD_DEVICE_NUM}") | ||
59 | |||
60 | # Output RAID "Devices", "Size" and "Event" metrics, from the output of "mdadm --detail" | ||
61 | while IFS= read -r line ; do | ||
62 | # Filter out these keys that have numberic values that increment up | ||
63 | if echo "$line" | grep -E -q "Devices :|Array Size :| Used Dev Size :|Events :"; then | ||
64 | MDADM_DETAIL_KEY=$(echo "$line" | cut -d ":" -f 1 | tr -cd '[a-zA-Z0-9]._-') | ||
65 | MDADM_DETAIL_VALUE=$(echo "$line" | cut -d ":" -f 2 | cut -d " " -f 2 | sed 's:^ ::') | ||
66 | echo "node_md_info_${MDADM_DETAIL_KEY}{md_device=\"${MD_DEVICE_NUM}\", md_name=\"${MD_DEVICE}\", raid_level=\"${MD_LEVEL}\", md_num_raid_disks=\"${MD_NUM_RAID_DISKS}\", md_metadata_version=\"${MD_METADATA_VERSION}\"} ${MDADM_DETAIL_VALUE}" | ||
67 | fi | ||
68 | done <<< "$MDADM_DETAIL_OUTPUT" | ||
69 | |||
70 | # Output RAID detail metrics info from the output of "mdadm --detail" | ||
71 | # NOTE: Sending this info as labels rather than separate metrics, because some of them can be strings. | ||
72 | echo -n "node_md_info{md_device=\"${MD_DEVICE_NUM}\", md_name=\"${MD_DEVICE}\", raid_level=\"${MD_LEVEL}\", md_num_raid_disks=\"${MD_NUM_RAID_DISKS}\", md_metadata_version=\"${MD_METADATA_VERSION}\"" | ||
73 | while IFS= read -r line ; do | ||
74 | # Filter for lines with a ":", to use for Key/Value pairs in labels | ||
75 | if echo "$line" | grep -E -q ":" ; then | ||
76 | # Exclude lines with these keys, as they're values are numbers that increment up and captured in individual metrics above | ||
77 | if echo "$line" | grep -E -qv "Array Size|Used Dev Size|Events|Update Time" ; then | ||
78 | echo -n ", " | ||
79 | MDADM_DETAIL_KEY=$(echo "$line" | cut -d ":" -f 1 | tr -cd '[a-zA-Z0-9]._-') | ||
80 | MDADM_DETAIL_VALUE=$(echo "$line" | cut -d ":" -f 2- | sed 's:^ ::') | ||
81 | echo -n "${MDADM_DETAIL_KEY}=\"${MDADM_DETAIL_VALUE}\"" | ||
82 | fi | ||
83 | fi | ||
84 | done <<< "$MDADM_DETAIL_OUTPUT" | ||
85 | echo "} 1" | ||
86 | ) | ||
87 | done | ||
diff --git a/text_collector_examples/smartmon.sh b/text_collector_examples/smartmon.sh index 25ad7ed..25ad7ed 100755..100644 --- a/text_collector_examples/smartmon.sh +++ b/text_collector_examples/smartmon.sh | |||