RRD: Статистика онлайн-пользователей для ejabberd
Пара скриптов для построения статистики числа онлайн-пользователей для Jabber-сервера Ejabberd. Статистика строится путем вызова утилиты ejabberdctl и занесения полученных данных в RRD-базу - соответственно, для работы скрипта необходимо установить еще и rrdtool. Далее по данным из базы строятся несколько графиков в виде png-файлов, которые можно разместить на веб-страничке сайта сервера.
Первый скрипт занимается созданием базы (если она не существует). Скрипт должен выполняться от рута (для работы ejabberdctl):
#!/bin/bash
# Путь к базе данных
dbf='/home/stats/ejstat.rrd'
if [ ! -e "${dbf}" ]
then
rrdtool create "${dbf}" --step 60 \
DS:ejcn:GAUGE:120:U:U \
RRA:AVERAGE:0.5:1:80 \
RRA:AVERAGE:0.5:8:210 \
RRA:AVERAGE:0.5:80:600 \
RRA:AVERAGE:0.5:600:1100
fi
#cn="$(/usr/sbin/ejabberdctl connected_users_number)"
cn="$(/usr/sbin/vzctl exec xmpp '/usr/sbin/ejabberdctl connected_users_number')"
rrdtool update "${dbf}" $(date +%s):${cn}
Второй скрипт строит по полученным данным графики. При наличии прав на чтение RRD-базы его можно запускать от непривилегированного пользователя.
#!/bin/bash
# Путь к каталогу, куда складывать графики
imgpath='/home/stats/site/graphs/'
mkgraph() {
if [ "$3" == 'normal' ];then
size='--width 500 --height 200'
elif [ "$3" == 'large' ]; then
size='--width 900 --height 450'
fi
nice -n 19 rrdtool graph "${2}" --imgformat PNG \
DEF:ejcn="${1}":ejcn:AVERAGE \
CDEF:cdef=ejcn,1,* \
LINE2:ejcn#74afea:' ' \
GPRINT:cdef:LAST:"Сейчас\: %8.0lf" \
GPRINT:cdef:MIN:"Мин.\: %8.0lf" \
GPRINT:cdef:AVERAGE:"Ср.\: %8.0lf" \
GPRINT:cdef:MAX:"Пик\: %8.0lf" \
AREA:ejcn#75b0eb \
${size} \
--title "${4}" \
-s ${5} \
--lower-limit 0 \
--upper-limit 10 \
--watermark="${HOSTNAME}" \
--slope-mode \
--lazy
}
img="${1##*/}";img="${img%.rrd}"
mkgraph "${1}" "${imgpath}""${img}".h.png 'normal' "${2}, час" -75min
mkgraph "${1}" "${imgpath}""${img}".h.large.png 'large' "${2}, час" -75min
mkgraph "${1}" "${imgpath}""${img}".d.png 'normal' "${2}, день" -27h
mkgraph "${1}" "${imgpath}""${img}".d.large.png 'large' "${2}, день" -27h
mkgraph "${1}" "${imgpath}""${img}".m.png 'normal' "${2}, месяц" -33d
mkgraph "${1}" "${imgpath}""${img}".m.large.png 'large' "${2}, месяц" -33d
mkgraph "${1}" "${imgpath}""${img}".y.png 'normal' "${2}, год" -15mon
mkgraph "${1}" "${imgpath}""${img}".y.large.png 'large' "${2}, год" -15mon
Оба скрипта необходимо добавить в crontab, первый - для рута в виде
* * * * * /path/to/ejstat.sh
для обновления данных раз в минуту, второй - или тоже для рута (не забываем chmod'ать/chown'ать полученные картинки), или для более подходящего пользователя в виде
* * * * * /path/to/ejstatgraph.sh /home/stats/ejstat.rrd "Онлайн-пользователи"
Значения путей тут и в скриптах подставляем свои