aboutsummaryrefslogtreecommitdiff
path: root/text_collector_examples
diff options
context:
space:
mode:
authormpursley <mpursley@gmail.com>2019-02-10 06:20:42 -0800
committerBen Kochie <superq@gmail.com>2019-02-10 15:20:42 +0100
commit1ba436e1949c7ab8af83642dc973cb30b118966a (patch)
treed98f01f5a8463b1f1447ed80ecf0c90048556636 /text_collector_examples
parent18fc512fc4d50c2463fa4de8845d33c04a0ed529 (diff)
downloadprometheus_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-xtext_collector_examples/md_info_detail.sh87
-rw-r--r--[-rwxr-xr-x]text_collector_examples/smartmon.sh0
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
7set -eu
8
9for 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 )
87done
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