RRD: Статистика онлайн-пользователей для ejabberd

Материал из Linux Wiki
Версия от 12:05, 23 октября 2011; Rain (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигацииПерейти к поиску

Пара скриптов для построения статистики числа онлайн-пользователей для 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 "Онлайн-пользователи"

Значения путей тут и в скриптах подставляем свои