В данной статье я бы хотел поделиться своим опытом настройки настройки сервиса сбора и визуализации статистики сollectd в связке с graphite. Первый используется как сборщик данных, второй — как хранилище с визуализатором.
Мотивация
До недавнего времени для сбора и отображения статистики я использовал Munin, но его графики меня всегда раздражали (внешний вид) уж не знаю почему. Кроме того у него после обновления постоянно что-то отваливалось и меня это утомило. В связи со всем этим я решил поискать альтернативу и наткнулся на collectd. В целом он показался мне достойной альтернативой, но все веб-визуализаторы, которые я посмотрел для него показались мне маленько убогими и я уже хотел поставить крест на этой затее. И тут, я вспомнил что недавно на работе мы настроили graphite. Я решил попробовать что из этого выйдет.
Цель
Настроить graphite так, чтобы он работал с использованием supervisord, uwsgi и virtualenv и был виден снаружи (nginx). Collectd, при этом, должен отдавать данные graphite напрямую.
Graphite
Для начала нужно создать каталог где будет жить graphite и развернуть там виртуальное окружение.
$ mkdir /var/projects/graphite $ cd /var/projects/graphite $ virtualenv --no-site-packages .env $ virtualenv --relocatable .env $ source .env/bin/activate
Для работы с изображениями graphite использует cairo поэтому необходимо чтобы в системе была установлена эта библиотека. В моем случае все уже есть, поэтому я лишь опишу как установить pycario в виртуальном окружении.
Качаем и устанавливаем py2cairo
$ wget http://cairographics.org/releases/py2cairo-1.10.0.tar.bz2 $ tar -jxf py2cairo-1.10.0.tar.bz2 && cd py2cairo-1.8.10 $ ./waf configure --prefix=$VIRTUAL_ENV $ ./waf build $ ./waf install $ cd .. && rm -R py2cairo-1.8.10 && rm py2cairo-1.10.0.tar.bz2
Ставим whisper
$ wget https://launchpad.net/graphite/0.9/0.9.9/+download/whisper-0.9.9.tar.gz $ tar -xzpf whisper-0.9.9.tar.gz && cd whisper-0.9.9 $ python setup.py install $ cd .. && rm -R whisper-0.9.9 && rm whisper-0.9.9.tar.gz
Ставим carbon
$ wget https://launchpad.net/graphite/0.9/0.9.9/+download/carbon-0.9.9.tar.gz $ tar -xzpf carbon-0.9.9.tar.gz && cd carbon-0.9.9
Для того чтобы все было установлено в нашу песочницу, в файле setup.cfg меняем:
prefix = /opt/graphite
на:
prefix = $VIRTUAL_ENV/..
После чего:
$ python setup.py install $ cd .. && rm -R carbon-0.9.9 && rm carbon-0.9.9.tar.gz
Ставим graphite (webapp)
$ wget https://launchpad.net/graphite/0.9/0.9.9/+download/graphite-web-0.9.9.tar.gz $ tar -xzpf graphite-web-0.9.9.tar.gz && cd graphite-web-0.9.9
С помощью check-dependencies.py проверяем что нужно еще установить, в моем случае это:
$ pip install django django-tagging twisted python-memcached psycopg2 egenix-mx-base
Последние, в принципе, по желанию, но я подумал раз уж он у меня все равно есть, то пусть будет.
По аналогии с карбоном, в файле setup.cfg меняем:
prefix = /opt/graphite
на:
prefix = $VIRTUAL_ENV/..
После чего:
$ python setup.py install $ cd .. && rm -R graphite-web-0.9.9 && rm graphite-web-0.9.9.tar.gz
Настраиваем carbon и graphite
Конфигурационный файл для supervisord будет иметь примерно такой вид:
[program:graphite_uwsgi] command=/usr/bin/uwsgi --pidfile /var/projects/graphite/run/graphite_uwsgi.pid -x /var/projects/graphite/conf/uwsgi.conf --vacuum directory=/var/projects/graphite/webapp/ autostart=true autorestart=true startsecs=5 startretries=3 stopsignal=TERM stopwaitsecs=15 stopretries=1 stopsignal=QUIT redirect_stderr=false stdout_logfile=/var/projects/graphite/storage/log/graphite_uwsgi.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stdout_capture_maxbytes=1MB stderr_logfile=/var/projects/graphite/storage/log/graphite_uwsgi-error.log stderr_logfile_maxbytes=1MB stderr_logfile_backups=10 stderr_capture_maxbytes=1MB [program:carbon] command=/var/projects/graphite/.env/bin/python /var/projects/graphite/bin/carbon-cache.py --debug start priority=1 autostart=true autorestart=true startsecs=3 redirect_stderr=false stdout_logfile=/var/projects/graphite/storage/log/carbon.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stdout_capture_maxbytes=1MB stderr_logfile=/var/projects/graphite/storage/log/carbon-error.log stderr_logfile_maxbytes=1MB stderr_logfile_backups=10 stderr_capture_maxbytes=1MB
Он указывает как нужно запускать бэкенд graphite и и сервер carbon. В моем случае я кладу этот файл в каталог conf песочницы и делаю на него ссылку в каталоге, где supervisord его найдет.
Рядом, я создаю конфиг для uwsgi, который выглядит так:
<uwsgi> <socket>127.0.0.1:8001</socket> <processes>2</processes> <home>/var/projects/graphite/.env</home> <pythonpath>/var/projects/graphite/webapp/</pythonpath> <chdir>/var/projects/graphite/webapp</chdir> <max-requests>2000</max-requests> <touch-reload>/var/projects/graphite/uwsgi.reload</touch-reload> <harakiri>120</harakiri> <post-buffering>8192</post-buffering> <post-buffering-bufsize>65536</post-buffering-bufsize> <master/> <single-interpreter/> <env>DJANGO_SETTINGS_MODULE=graphite.settings</env> <module>wsgi</module> </uwsgi>
Директива module указывает на питоновский модуль, который нужно запустить. В качестве основы я взял graphite.wsgi.example который лежит тут же, поправил его и положил в каталог /var/projects/graphite/webapp с именем wsgi.py. После правок он стал выглядеть так:
import os import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler() # READ THIS # Initializing the search index can be very expensive, please include # the WSGIScriptImport directive pointing to this script in your vhost # config to ensure the index is preloaded before any requests are handed # to the process. from graphite.logger import log log.info("graphite.wsgi - pid %d - reloading search index" % os.getpid()) import graphite.metrics.search
Далее, в каталоге conf переименуем пару файлов:
$ mv carbon.conf.example carbon.conf $ mv storage-schemas.conf.example storage-schemas.conf
Кроме того в каталоге webapp/graphite нужно переименовать файл настроек:
$ mv local_settings.py.example local_settings.py
Также, рекомендуется внести в этот файл необходимые изменения, например, я вписал туда настройки доступа к posgresql.
После правки local_settings для инициализации базы данных graphite нужно выполнить и следовать инструкциям:
$ python webapp/graphite/manage.py syncdb
Nginx для graphite
Я сделал файл такого вида:
server { access_log /var/projects/graphite/storage/log/nginx.access.log main; error_log /var/projects/graphite/storage/log/nginx.error.log info; listen 80; server_name graphite.some_site.com; root /var/projects/graphite/webapp/; location / { include /etc/nginx/uwsgi_params; uwsgi_pass 127.0.0.1:8001; } location /content/ { alias /var/projects/graphite/webapp/content/; } location /graphite/ { } }
Сохранил его в каталоге conf песочницы, рядом с вышеописаными файлами для supervisord и uwsgi, назвал его nginx.conf и сделал симлинк на него в каталоге виртуальных хостов nginx.
Запуск
Перед тем как перезапускать supervisord и nginx нужно исправить права доступа на каталог песочницы таким образом, чтобы файлы и каталоги были доступны на чтение тому пользователю из под которого стартует nginx и supervisord. Кроме этого в каталоги run, storage нужно разрешить писать этим пользователям. В моем случае и supervisor и nginx принадлежат группе www, поэтому я делаю следующее:
$ mkdir /var/projects/graphite/run $ chown myuser:www -R /var/projects/graphite $ cd /var/projects/graphite $ chmod -R 770 storage run
Все, перезапускаем supervisord и nginx. По логам в storage видим что все хорошо, а в браузере по заданному адресу видим graphite.
Collectd
Здесь все гораздо проще :-) Для начала нужно установить в систему сам collectd с набором необходимых плагинов. Я не буду описывать этот процесс, поскольку каждый сам в курсе как устанавливать приложения в том или ином дистрибутиве.
Поскольку от сервиса не требуется хранение данных, то я не стал устанавливать rrd*. Вместо rrftool будет использован graphite. Для того чтобы собранные данные передавались куда следует, нужно установить плагин, который будет этим заниматься. Я остановил свой выбор на collectd-carbon, который написан на python. Сначала я попробовал использовать плагин, написанный на C (collectd-write_graphite), он даже заработал сразу, вот только отсылались какие-то странные имена метрик и я от него отказался.
Настройка плагина проста и незатейлива и ее можно посмотреть на гитхабе по вышеуказанной ссылке.
Итог
На это пожалуй и закончу, поскольку цель достигнута. Я использую данную связку для просмотра статистике на домашнем сервере и в ближайшее время планирую добавить отправку данных сюда же с нескольких внешних машин. Таким образом graphite выступает в роли агрегатора статистики.
Спасибо за внимание, надеюсь что пост будет полезен кому-то еще. Если получилось немного длинновато (и может не совсем гладко кое-где), то прошу прощения.
Ссылки
http://graphite.readthedocs.org/en/1.0/index.html
http://www.frlinux.eu/?p=199
http://graphite.wikidot.com/
http://mldav.blogspot.com/2011/10/debian-graphite.html
http://collectd.org/
Автор: PSyton