-
-
Save dlanderson/2ae81a4da576def641f2 to your computer and use it in GitHub Desktop.
Send ZFS Linux metrics to statsd
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# A port of ZFS stats for FreeBSD plugin to Linux, adapted to send metrics to statsd. | |
# | |
# Author: Daniele Valeriani <[email protected]> | |
# Author of the original munin plugin: David Bjornsson <[email protected]> | |
# Author of the Linux port: Alex Chistyakov <[email protected]> | |
PREFIX="servers.`hostname`.zfs" | |
STATSD_ADDR="YOUR STATSD SERVER" | |
STATSD_PORT="PROBABLY 2003" | |
DATE=`date +%s` | |
NC=`which nc` | |
function arcstats() { | |
awk /^${1}\ /'{print $3}' /proc/spl/kstat/zfs/arcstats | |
} | |
ARC_HITS=`arcstats hits` | |
ARC_MISSES=`arcstats misses` | |
DEMAND_DATA_HITS=`arcstats demand_data_hits` | |
DEMAND_DATA_MISSES=`arcstats demand_data_misses` | |
DEMAND_METADATA_HITS=`arcstats demand_metadata_hits` | |
DEMAND_METADATA_MISSES=`arcstats demand_metadata_misses` | |
MFU_GHOST_HITS=`arcstats mfu_ghost_hits` | |
MFU_HITS=`arcstats mfu_hits` | |
MRU_GHOST_HITS=`arcstats mru_ghost_hits` | |
MRU_HITS=`arcstats mru_hits` | |
PREFETCH_DATA_HITS=`arcstats prefetch_data_hits` | |
PREFETCH_DATA_MISSES=`arcstats prefetch_data_misses` | |
PREFETCH_METADATA_HITS=`arcstats prefetch_metadata_hits` | |
PREFETCH_METADATA_MISSES=`arcstats prefetch_metadata_misses` | |
SIZE=`arcstats size` | |
MRU_SIZE=`arcstats 'p'` | |
MAX_SIZE=`arcstats c_max` | |
MIN_SIZE=`arcstats c_min` | |
TARGET_SIZE=`arcstats c` | |
L2_SIZE=`arcstats l2_size` | |
L2_HDR_SIZE=`arcstats l2_hdr_size` | |
L2_HITS=`arcstats l2_hits` | |
L2_MISSES=`arcstats l2_misses` | |
# Calculations | |
ANON_HITS=$((ARC_HITS-(MFU_HITS+MRU_HITS+MFU_GHOST_HITS+MRU_GHOST_HITS))) | |
ARC_ACCESSES_TOTAL=$((ARC_HITS+ARC_MISSES)) | |
DEMAND_DATA_TOTAL=$((DEMAND_DATA_HITS+DEMAND_DATA_MISSES)) | |
PREFETCH_DATA_TOTAL=$((PREFETCH_DATA_HITS+PREFETCH_DATA_MISSES)) | |
REAL_HITS=$((MFU_HITS+MRU_HITS)) | |
CACHE_HIT_RATIO_PERC=` echo - | awk "{printf \"%.2f\", (100*$ARC_HITS/$ARC_ACCESSES_TOTAL)}"` | |
CACHE_MISS_RATIO_PERC=` echo - | awk "{printf \"%.2f\", (100*$ARC_MISSES/$ARC_ACCESSES_TOTAL)}"` | |
ACTUAL_HIT_RATIO_PERC=` echo - | awk "{printf \"%.2f\", (100*$REAL_HITS/$ARC_ACCESSES_TOTAL)}"` | |
DATA_DEMAND_EFFICIENCY_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_DATA_HITS/$DEMAND_DATA_TOTAL)}"` | |
DATA_PREFETCH_EFFICENCY_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_DATA_HITS/$PREFETCH_DATA_TOTAL)}"` | |
ANONYMOUSLY_USED_PERC=` echo - | awk "{printf \"%.2f\", (100*$ANON_HITS/$ARC_HITS)}"` | |
MOST_RECENTLY_USED_PERC=` echo - | awk "{printf \"%.2f\", (100*$MRU_HITS/$ARC_HITS)}"` | |
MOST_FREQUENTLY_USED_PERC=` echo - | awk "{printf \"%.2f\", (100*$MFU_HITS/$ARC_HITS)}"` | |
MOST_RECENTLY_USED_GHOST_PERC=` echo - | awk "{printf \"%.2f\", (100*$MRU_GHOST_HITS/$ARC_HITS)}"` | |
MOST_FREQUENTLY_USED_GHOST_PERC=` echo - | awk "{printf \"%.2f\", (100*$MFU_GHOST_HITS/$ARC_HITS)}"` | |
DEMAND_DATA_HIT_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_DATA_HITS/$ARC_HITS)}"` | |
DEMAND_DATA_MISS_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_DATA_MISSES/$ARC_MISSES)}"` | |
PREFETCH_DATA_HIT_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_DATA_HITS/$ARC_HITS)}"` | |
PREFETCH_DATA_MISS_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_DATA_MISSES/$ARC_MISSES)}"` | |
DEMAND_METADATA_HIT_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_METADATA_HITS/$ARC_HITS)}"` | |
DEMAND_METADATA_MISS_PERC=` echo - | awk "{printf \"%.2f\", (100*$DEMAND_METADATA_MISSES/$ARC_MISSES)}"` | |
PREFETCH_METADATA_HIT_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_METADATA_HITS/$ARC_HITS)}"` | |
PREFETCH_METADATA_MISSES_PERC=` echo - | awk "{printf \"%.2f\", (100*$PREFETCH_METADATA_MISSES/$ARC_MISSES)}"` | |
if [ $SIZE -gt $TARGET_SIZE ]; then | |
MFU_SIZE=$((SIZE-MRU_SIZE)) | |
else | |
MFU_SIZE=$((TARGET_SIZE-MRU_SIZE)) | |
fi | |
L2_ACCESSES_TOTAL=$((L2_HITS+L2_MISSES)) | |
if [ $L2_ACCESSES_TOTAL -gt 0 ]; then | |
L2_HIT_RATIO_PERC=`echo - | awk "{printf \"%.2f\", (100*$L2_HITS/$L2_ACCESSES_TOTAL)}"` | |
L2_MISS_RATIO_PERC=`echo - | awk "{printf \"%.2f\", (100*$L2_MISSES/$L2_ACCESSES_TOTAL)}"` | |
else | |
L2_HIT_RATIO_PERC=0 | |
L2_MISS_RATIO_PERC=0 | |
fi | |
# Send everything to statsd | |
echo "$PREFIX.arc_hits $ARC_HITS $DATE | |
$PREFIX.arc_misses $ARC_MISSES $DATE | |
$PREFIX.demand_data_hits $DEMAND_DATA_HITS $DATE | |
$PREFIX.demand_data_misses $DEMAND_DATA_MISSES $DATE | |
$PREFIX.demand_metadata_hits $DEMAND_METADATA_HITS $DATE | |
$PREFIX.demand_metadata_misses $DEMAND_METADATA_MISSES $DATE | |
$PREFIX.mfu_ghost_hits $MFU_GHOST_HITS $DATE | |
$PREFIX.mfu_hits $MFU_HITS $DATE | |
$PREFIX.mru_ghost_hits $MRU_GHOST_HITS $DATE | |
$PREFIX.mru_hits $MRU_HITS $DATE | |
$PREFIX.prefetch_data_hits $PREFETCH_DATA_HITS $DATE | |
$PREFIX.prefetch_data_misses $PREFETCH_DATA_MISSES $DATE | |
$PREFIX.prefetch_metadata_hits $PREFETCH_METADATA_HITS $DATE | |
$PREFIX.prefetch_metadata_misses $PREFETCH_METADATA_MISSES $DATE | |
$PREFIX.size $SIZE $DATE | |
$PREFIX.mru_size $MRU_SIZE $DATE | |
$PREFIX.max_size $MAX_SIZE $DATE | |
$PREFIX.min_size $MIN_SIZE $DATE | |
$PREFIX.target_size $TARGET_SIZE $DATE | |
$PREFIX.l2_size $L2_SIZE $DATE | |
$PREFIX.l2_hdr_size $L2_HDR_SIZE $DATE | |
$PREFIX.l2_hits $L2_HITS $DATE | |
$PREFIX.l2_misses $L2_MISSES $DATE | |
$PREFIX.anon_hits $ANON_HITS $DATE | |
$PREFIX.arc_accesses_total $ARC_ACCESSES_TOTAL $DATE | |
$PREFIX.demand_data_total $DEMAND_DATA_TOTAL $DATE | |
$PREFIX.prefetch_data_total $PREFETCH_DATA_TOTAL $DATE | |
$PREFIX.real_hits $REAL_HITS $DATE | |
$PREFIX.cache_hit_ratio_perc $CACHE_HIT_RATIO_PERC $DATE | |
$PREFIX.cache_miss_ratio_perc $CACHE_MISS_RATIO_PERC $DATE | |
$PREFIX.actual_hit_ratio_perc $ACTUAL_HIT_RATIO_PERC $DATE | |
$PREFIX.data_demand_efficiency_perc $DATA_DEMAND_EFFICIENCY_PERC $DATE | |
$PREFIX.data_prefetch_efficency_perc $DATA_PREFETCH_EFFICENCY_PERC $DATE | |
$PREFIX.anonymously_used_perc $ANONYMOUSLY_USED_PERC $DATE | |
$PREFIX.most_recently_used_perc $MOST_RECENTLY_USED_PERC $DATE | |
$PREFIX.most_frequently_used_perc $MOST_FREQUENTLY_USED_PERC $DATE | |
$PREFIX.most_recently_used_ghost_perc $MOST_RECENTLY_USED_GHOST_PERC $DATE | |
$PREFIX.most_frequently_used_ghost_perc $MOST_FREQUENTLY_USED_GHOST_PERC $DATE | |
$PREFIX.demand_data_hit_perc $DEMAND_DATA_HIT_PERC $DATE | |
$PREFIX.demand_data_miss_perc $DEMAND_DATA_MISS_PERC $DATE | |
$PREFIX.prefetch_data_hit_perc $PREFETCH_DATA_HIT_PERC $DATE | |
$PREFIX.prefetch_data_miss_perc $PREFETCH_DATA_MISS_PERC $DATE | |
$PREFIX.demand_metadata_hit_perc $DEMAND_METADATA_HIT_PERC $DATE | |
$PREFIX.demand_metadata_miss_perc $DEMAND_METADATA_MISS_PERC $DATE | |
$PREFIX.prefetch_metadata_hit_perc $PREFETCH_METADATA_HIT_PERC $DATE | |
$PREFIX.prefetch_metadata_misses_perc $PREFETCH_METADATA_MISSES_PERC $DATE | |
$PREFIX.mfu_size $MFU_SIZE $DATE | |
$PREFIX.l2_accesses_total $L2_ACCESSES_TOTAL $DATE | |
$PREFIX.l2_hit_ratio_perc $L2_HIT_RATIO_PERC $DATE | |
$PREFIX.l2_miss_ratio_perc $L2_MISS_RATIO_PERC $DATE" | $NC $STATSD_ADDR $STATSD_PORT |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment