metrics.sh/lib/main.sh

125 lines
2.4 KiB
Bash
Raw Normal View History

# load utils
for util in ./lib/utils/*.sh; do source $util; done
# init
__METRICS=()
main_load () {
# load reporter
source ./reporters/${REPORTER}.sh
copy_function init __r_${REPORTER}_init
copy_function report __r_${REPORTER}_report
copy_function terminate __r_${REPORTER}_terminate
copy_function docs __r_${REPORTER}_docs
unset -f init report terminate docs
# load metrics
for file in ./metrics/*.sh; do
filename=$(basename $file)
metric=${filename%.*}
# soruce file and copy functions
source $file
copy_function init __m_${metric}_init
copy_function collect __m_${metric}_collect
copy_function terminate __m_${metric}_terminate
copy_function docs __m_${metric}_docs
unset -f init collect terminate docs
# register metric
__METRICS+=($metric)
done
}
main_init () {
TEMP_DIR=$(make_temp_dir)
# register trap
trap '
main_terminate
trap - SIGTERM && kill -- -$$ SIGINT SIGTERM EXIT
' SIGINT SIGTERM EXIT
# init reporter
if is_function __r_${REPORTER}_init; then
__r_${REPORTER}_init
fi
# init metrics
for metric in ${__METRICS[@]}; do
if ! is_function __m_${metric}_init; then
continue
fi
__m_${metric}_init
done
}
main_collect () {
# used by metrics to return results
report () {
local _r_result
if [ -z $2 ]; then
_r_label=$metric
_r_result="$1"
else
_r_label="$metric.$1"
_r_result="$2"
fi
if is_number $_r_result; then
__r_${REPORTER}_report $_r_label $_r_result
fi
}
# collect metrics
for metric in ${__METRICS[@]}; do
if ! is_function __m_${metric}_collect; then
continue
fi
fork () {
__m_${metric}_collect
sleep $INTERVAL
fork
}
fork &
unset -f fork
done
# run forever
tail -f /dev/null # `sleep infinity` is not portable
}
main_terminate () {
# terminate metrics
for metric in ${__METRICS[@]}; do
if ! is_function __m_${metric}_terminate; then
continue
fi
__m_${metric}_terminate
done
# terminate reporter
if is_function __r_${REPORTER}_terminate; then
__r_${REPORTER}_terminate
fi
# delete temporary directory
2015-03-12 21:17:44 +01:00
if [ -d $TEMP_DIR ]; then
rmdir $TEMP_DIR
fi
}
main_docs () {
echo "Available metrics:"
for metric in ${__METRICS[@]}; do
if ! is_function __m_${metric}_docs; then
continue
fi
echo "[$metric]"
__m_${metric}_docs
echo
done
}