Files
telegraf-bcachefs-input/bcachefs_time_stats.sh
T

109 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
function to_ns()
{
local val unit
read -r val unit <<< "$1"
case "$unit" in
ns) echo "$val" ;;
us) echo $(( val * 1000 )) ;;
ms) echo $(( val * 1000000 )) ;;
s) echo $(( val * 1000000000 )) ;;
m) echo $(( val * 60 * 1000000000 )) ;;
h) echo $(( val * 3600 * 1000000000 )) ;;
d) echo $(( val * 86400 * 1000000000 )) ;;
w) echo $(( val * 604800 * 1000000000 )) ;;
eon) echo 0 ;; # bcachefs uses this as "infinite"
*) echo 0 ;;
esac
}
cd /sys/fs/bcachefs
for uuid in *; do
cd "$uuid/time_stats"
for stat in * ; do
count=""
dur_min=""
dur_max=""
dur_total=""
mean_since=""
mean_recent=""
stddev_since=""
stddev_recent=""
in_duration=0
while IFS= read -r line; do
# trim leading whitespace
line="${line#"${line%%[![:space:]]*}"}"
case "$line" in
count:*)
count="${line#count:}"
count="${count//[[:space:]]/}"
;;
"duration of events")
in_duration=1
;;
"time between events")
in_duration=0
;;
min:*)
(( in_duration )) && dur_min="${line#min:}"
;;
max:*)
(( in_duration )) && dur_max="${line#max:}"
;;
total:*)
(( in_duration )) && dur_total="${line#total:}"
;;
mean:*)
if (( in_duration )); then
rest="${line#mean:}"
read -r ms_val ms_unit mr_val mr_unit <<< "$rest"
mean_since="$ms_val $ms_unit"
mean_recent="$mr_val $mr_unit"
fi
;;
stddev:*)
if (( in_duration )); then
rest="${line#stddev:}"
read -r ss_val ss_unit sr_val sr_unit <<< "$rest"
stddev_since="$ss_val $ss_unit"
stddev_recent="$sr_val $sr_unit"
fi
;;
esac
done < "$stat"
# trim leading whitespace
for v in dur_min dur_max dur_total mean_since mean_recent stddev_since stddev_recent; do
eval "$v=\"\${$v#\"\${$v%%[![:space:]]*}\"}\""
done
dur_min_ns=$(to_ns "$dur_min")
dur_max_ns=$(to_ns "$dur_max")
dur_total_ns=$(to_ns "$dur_total")
mean_since_ns=$(to_ns "$mean_since")
mean_recent_ns=$(to_ns "$mean_recent")
stddev_since_ns=$(to_ns "$stddev_since")
stddev_recent_ns=$(to_ns "$stddev_recent")
printf "bcachefs_time_stats,uuid=%s,fspath=/mnt,stat=%s " "$uuid" "$stat"
printf "count=%si," "$count"
printf "dur_min_ns=%si,dur_max_ns=%si,dur_total_ns=%si," \
"$dur_min_ns" "$dur_max_ns" "$dur_total_ns"
printf "mean_since_ns=%si,mean_recent_ns=%si," \
"$mean_since_ns" "$mean_recent_ns"
printf "stddev_since_ns=%si,stddev_recent_ns=%si\n" \
"$stddev_since_ns" "$stddev_recent_ns"
done
cd ..
done