Серверное администрирование / [Из песочницы] Настраиваем связку graphite + virtualenv + collectd

в 15:44, , рубрики: collectd, graphite, python, virtualenv, статистика, метки: , , , ,

В данной статье я бы хотел поделиться своим опытом настройки настройки сервиса сбора и визуализации статистики с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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js