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