Pull to refresh

Настраиваем связку graphite + virtualenv + collectd

Reading time 6 min
Views 12K
В данной статье я бы хотел поделиться своим опытом настройки настройки сервиса сбора и визуализации статистики с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/ {
        access_log off;
        expires 30d;
    }
}

Сохранил его в каталоге 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/

PS

По поводу «телодвижений». Это камень в сторону разработчиков графита, которые, по какой-то причине, не удосужились сделать, к примеру, 1 пакет вместо 3 + маленький скрипт который настроит окружение.
Tags:
Hubs:
+17
Comments 9
Comments Comments 9

Articles