xmpp.chapril.org-tools/metrology/collectd_exec_xmpp.sh

117 lines
5.3 KiB
Bash
Executable File

HOSTNAME="${COLLECTD_HOSTNAME:-localhost}"
INTERVAL="${COLLECTD_INTERVAL:-60}"
# required by some ejabberdctl commands
export HOME=/var/lib/ejabberd
export HTTP_UPLOAD_DATADIR="/var/www/xmpp.chapril.org/upload/"
main() {
# do-while hack found here: https://stackoverflow.com/questions/24420342/is-there-a-do-while-loop-in-bash#24421013
while
ejabberdctl_stats
http_upload_disk_usage
captcha_stats
#client_stats # XXX pas encore activée
sleep "$INTERVAL"
do true; done
}
ejabberdctl_stats() {
echo "PUTVAL \"${HOSTNAME}/xmpp_registered_users/count\" interval=$INTERVAL $(date +%s):$(ejabberdctl registered_users chapril.org | wc -l)"
echo "PUTVAL \"${HOSTNAME}/xmpp_active_users/count\" interval=$INTERVAL $(date +%s):$(ejabberdctl connected_users_number)"
echo "PUTVAL \"${HOSTNAME}/xmpp_active_distinct_users/count\" interval=$INTERVAL $(date +%s):$(ejabberdctl connected_users | cut -d@ -f1 | sort -u | wc -l)"
echo "PUTVAL \"${HOSTNAME}/xmpp_s2s_in/count\" interval=$INTERVAL $(date +%s):$(ejabberdctl incoming_s2s_number)"
echo "PUTVAL \"${HOSTNAME}/xmpp_s2s_out/count\" interval=$INTERVAL $(date +%s):$(ejabberdctl outgoing_s2s_number)"
echo "PUTVAL \"${HOSTNAME}/xmpp_muc_total/count\" interval=$INTERVAL $(date +%s):$(ejabberdctl muc_online_rooms muc.chapril.org | wc -l)"
echo "PUTVAL \"${HOSTNAME}/xmpp_accounts_created_lastday/count\" interval=$INTERVAL $(date +%s):$(_count_accounts_created_lastday)"
echo "PUTVAL \"${HOSTNAME}/xmpp_accounts_created_lasthour/count\" interval=$INTERVAL $(date +%s):$(_count_accounts_created_lasthour)"
echo "PUTVAL \"${HOSTNAME}/xmpp_total_mam_rows/count\" interval=$INTERVAL $(date +%s):$(_count_mam_rows)"
echo "PUTVAL \"${HOSTNAME}/xmpp_total_mam_size/count\" interval=$INTERVAL $(date +%s):$(_estimate_mam_size)"
echo -n "PUTVAL \"${HOSTNAME}/xmpp_public_rooms_occupants/count\" interval=$INTERVAL $(date +%s):" ; _xmpp_public_rooms_total_occupants
}
http_upload_disk_usage() {
subfolders_count=$(find ${HTTP_UPLOAD_DATADIR} -mindepth 1 -maxdepth 1 -type d | wc -l)
total_size=$(du --exclude=lost+found -s ${HTTP_UPLOAD_DATADIR} | awk '{print $1}')
avg=$(( ${total_size} / ${subfolders_count} ))
echo "PUTVAL \"${HOSTNAME}/xmpp_upload_data_total/count\" interval=$INTERVAL $(date +%s):${total_size}"
echo "PUTVAL \"${HOSTNAME}/xmpp_upload_data_avg/count\" interval=$INTERVAL $(date +%s):${avg}"
}
captcha_stats() {
echo "PUTVAL \"${HOSTNAME}/xmpp_captcha_lastday/count\" interval=$INTERVAL $(date +%s):$(find /var/lib/ejabberd/chapril_captchas/ -mindepth 1 -maxdepth 1 -type f -mtime -1 | grep -v EXPERIMENTAL | wc -l)"
echo "PUTVAL \"${HOSTNAME}/xmpp_captcha_lasthour/count\" interval=$INTERVAL $(date +%s):$(find /var/lib/ejabberd/chapril_captchas/ -mindepth 1 -maxdepth 1 -type f -mmin -60 | grep -v EXPERIMENTAL | wc -l)"
}
_count_accounts_created_lastday() {
_sql_ejabberd "
select count(*)
from users
where created_at > current_timestamp - interval '1 day'
"
}
_count_accounts_created_lasthour() {
_sql_ejabberd "
select count(*)
from users
where created_at > current_timestamp - interval '1 hour'
"
}
_count_mam_rows() {
_sql_ejabberd "SELECT reltuples::bigint AS estimate FROM pg_class WHERE relname = 'archive'"
}
_estimate_mam_size() {
_sql_ejabberd "
select pg_relation_size(relid) as mam_size
from pg_catalog.pg_statio_user_tables
where relname = 'archive'
"
}
_xmpp_public_rooms_total_occupants() {
# keep results in a cache file for 5 minutes
local cache_file=/var/tmp/cache_collectd_xmpp_rooms.data
if [ ! -f ${cache_file} -o "$(find ${cache_file} -mmin +5 2>/dev/null)" ]; then
_xmpp_list_public_rooms > ${cache_file}
fi
total_occupants=0
while read line; do
total_occupants=$((total_occupants+$(echo ${line} | awk '{print $2}')))
done < ${cache_file}
echo ${total_occupants}
}
_xmpp_list_public_rooms() {
for room in $(ejabberdctl muc_online_rooms muc.chapril.org | cut -d@ -f1) ; do
if ejabberdctl get_room_options ${room} muc.chapril.org | egrep -q '^public\s*true' ; then
echo -n "${room}: "
ejabberdctl get_room_occupants ${room} muc.chapril.org | cut -d@ -f1 | sort -u | wc -l
fi
done | sort -k 2 -nr
}
_sql_ejabberd() {
# XXX the psql command can only works if file /var/lib/ejabberd/.pgpass exists
psql -U ejabberd -h localhost ejabberd -c "${1}" -t | grep -v '^$' | awk '{print $1}'
}
# XXX la syntaxe de la boucle while ci-dessous fait échouer le démarrage de collectd.
# exec plugin: exec_read_one: error = /srv/xmpp.chapril.org/tools/metrology/collectd_exec_xmpp.sh: 44: /srv/xmpp.chapril.org/tools/metrology/collectd_exec_xmpp.sh: Syntax error: redirection unexpected
#client_stats(){
# return 0
# # Fonction pas encore activée car je n'aime pas l'idée de créer dans influxdb autant de noms de métriques que de clients XMPP.
# # Il faut encore étudier le format d'envoi de collectd.
# while read -r line ; do
# clientname=$(echo ${line} | awk '{print $2}')
# count=$(echo ${line} | awk '{print $1}')
# echo "PUTVAL \"${HOSTNAME}/xmpp_client_${clientname}/count\" interval=$INTERVAL $(date +%s):${count}"
# done < <(ejabberdctl connected_users | sed -r 's;^.*@chapril.org/([^. -]+).*;\1;' | sort | uniq -c | sort -n)
#}
main