Skip to content

Instantly share code, notes, and snippets.

@mttjohnson
Last active February 25, 2020 10:05
Show Gist options
  • Select an option

  • Save mttjohnson/19f3bd4db35444b6c49ef5c9d7f8192c to your computer and use it in GitHub Desktop.

Select an option

Save mttjohnson/19f3bd4db35444b6c49ef5c9d7f8192c to your computer and use it in GitHub Desktop.
Redis Activity Monitoring
# Poll for various system stats for monitoring system
# Just copy and paste the commands into a bash prompt
# Use Ctrl-C to exit the polling
# Defaults that can be overriden
[[ -z "$REDIS_CONN" ]] && REDIS_CONN="-h 127.0.0.1 -p 6379"
[[ -z "$SLEEP_SECONDS" ]] && SLEEP_SECONDS=60
# Header info
CUR_TIME='timestamp'
REDIS_CONNECTIONS="CON"
REDIS_COMMANDS="COMMANDS"
REDIS_BYTES_SENT="KBIT_SEC_SENT"
REDIS_CMD_LIST="
cmdstat_del
cmdstat_exists
cmdstat_sadd
cmdstat_srem
cmdstat_sinter
cmdstat_smembers
cmdstat_hget
cmdstat_hmset
cmdstat_expire
cmdstat_ping
cmdstat_psync
cmdstat_replconf
cmdstat_flushdb
cmdstat_info
cmdstat_monitor
cmdstat_slowlog
"
PRINT_REDIS_COMMANDSTATS=""
PRINT_REDIS_COMMANDSTATS_SPACES="0"
REDIS_COMMANDSTAT_SPACES="9"
while read -r EACH_REDIS_CMD; do
if [ ! -z "${EACH_REDIS_CMD}" ]; then
PRINT_REDIS_COMMANDSTATS="${PRINT_REDIS_COMMANDSTATS}$(printf "%-${REDIS_COMMANDSTAT_SPACES}s" "$(echo "${EACH_REDIS_CMD}" | perl -p -e 's/cmdstat_//')")"
PRINT_REDIS_COMMANDSTATS_SPACES=$(echo "scale=0 ; ${PRINT_REDIS_COMMANDSTATS_SPACES} + ${REDIS_COMMANDSTAT_SPACES}" | bc)
fi
done <<< "${REDIS_CMD_LIST}"
ROW_TEMPLATE="%-20s %-5s %-8s %-13s %-${PRINT_REDIS_COMMANDSTATS_SPACES}s\n"
ECHO_HEADER=1
while true; do
[ $ECHO_HEADER -eq 1 ] && ECHO_HEADER=0 && printf "$ROW_TEMPLATE" "$CUR_TIME" "$REDIS_CONNECTIONS" "$REDIS_COMMANDS" "$REDIS_BYTES_SENT" "$PRINT_REDIS_COMMANDSTATS"
CUR_TIME=$(date '+%Y-%m-%d %H:%M:%S')
# Redis Info
REDIS_INFO=$(redis-cli $REDIS_CONN info all)
[[ -z "$CURR_REDIS_CONNECTIONS" ]] && CURR_REDIS_CONNECTIONS="0"
LAST_REDIS_CONNECTIONS=""
REDIS_CONNECTIONS=""
[[ ! -z "$REDIS_CONN" ]] && LAST_REDIS_CONNECTIONS=${CURR_REDIS_CONNECTIONS}
[[ ! -z "$REDIS_CONN" ]] && CURR_REDIS_CONNECTIONS="$(echo "${REDIS_INFO}" | grep total_connections_received: | cut -d: -f2 | tr -d '\r' | tr -d '\n')"
[[ ! -z "$REDIS_CONN" ]] && REDIS_CONNECTIONS="$(expr ${CURR_REDIS_CONNECTIONS} - ${LAST_REDIS_CONNECTIONS} | tr -d '\r' | tr -d '\n')"
[[ -z "$CURR_REDIS_COMMANDS" ]] && CURR_REDIS_COMMANDS="0"
LAST_REDIS_COMMANDS=""
REDIS_COMMANDS=""
[[ ! -z "$REDIS_CONN" ]] && LAST_REDIS_COMMANDS=${CURR_REDIS_COMMANDS}
[[ ! -z "$REDIS_CONN" ]] && CURR_REDIS_COMMANDS=$(echo "${REDIS_INFO}" | grep total_commands_processed: | cut -d: -f2 | tr -d '\r' | tr -d '\n')
[[ ! -z "$REDIS_CONN" ]] && REDIS_COMMANDS=$(expr ${CURR_REDIS_COMMANDS} - ${LAST_REDIS_COMMANDS} | tr -d '\r' | tr -d '\n')
[[ -z "$CURR_REDIS_BYTES_SENT" ]] && CURR_REDIS_BYTES_SENT="0"
LAST_REDIS_BYTES_SENT=""
REDIS_BYTES_SENT=""
[[ ! -z "$REDIS_CONN" ]] && LAST_REDIS_BYTES_SENT=${CURR_REDIS_BYTES_SENT}
[[ ! -z "$REDIS_CONN" ]] && CURR_REDIS_BYTES_SENT=$(echo "${REDIS_INFO}" | grep total_net_output_bytes: | cut -d: -f2 | tr -d '\r' | tr -d '\n')
[[ ! -z "$REDIS_CONN" ]] && REDIS_BYTES_SENT=$(printf '%.2f' $(echo "scale=2 ; (${CURR_REDIS_BYTES_SENT} - ${LAST_REDIS_BYTES_SENT}) / 8 / 1024 / $SLEEP_SECONDS" | bc))
# Redis Command Stats
PRINT_REDIS_COMMANDSTATS=""
while read -r EACH_REDIS_CMD; do
if [ ! -z "${EACH_REDIS_CMD}" ]; then
CURR_VARNAME=CURR_REDIS_CMD_${EACH_REDIS_CMD}
LAST_VARNAME=LAST_REDIS_CMD_${EACH_REDIS_CMD}
VARNAME=REDIS_CMD_${EACH_REDIS_CMD}
[[ -z "${!CURR_VARNAME}" ]] && declare "${CURR_VARNAME}"="0"
declare "${LAST_VARNAME}"=""
declare "${VARNAME}"=""
[[ ! -z "$REDIS_CONN" ]] && declare "${LAST_VARNAME}"=${!CURR_VARNAME}
[[ ! -z "$REDIS_CONN" ]] && declare "${CURR_VARNAME}"=$(echo "${REDIS_INFO}" | grep ${EACH_REDIS_CMD}: | cut -d: -f2 | cut -d, -f1 | cut -d= -f2 | tr -d '\r' | tr -d '\n')
[[ -z "${!CURR_VARNAME}" ]] && declare "${CURR_VARNAME}"="0"
[[ ! -z "$REDIS_CONN" ]] && declare "${VARNAME}"=$(expr ${!CURR_VARNAME} - ${!LAST_VARNAME} | tr -d '\r' | tr -d '\n')
PRINT_REDIS_COMMANDSTATS="${PRINT_REDIS_COMMANDSTATS}$(printf "%-${REDIS_COMMANDSTAT_SPACES}s" "${!VARNAME}")"
fi
done <<< "${REDIS_CMD_LIST}"
printf "$ROW_TEMPLATE" "$CUR_TIME" "$REDIS_CONNECTIONS" "$REDIS_COMMANDS" "$REDIS_BYTES_SENT" "$PRINT_REDIS_COMMANDSTATS"
sleep $SLEEP_SECONDS
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment