Мониторинг статистики Django проектов с помощью Pinba на Debian GNU/Linux

В данном топике, будет рассказано о пошаговой настройке и конфигурации проекта и сервера с использованием связки pinba-engine + pinboard + django-pinba, для сбора и визулизации статистики проектов на Django.

Все проекты являются бесплатными и их исходный код доступен на GitHub под лицензиями GPL или MIT.

Почему pinba?


В команде есть проекты, которые были написаны на php. Посещаемость у проектов достаточно высокая(свыше 200к). Есть очень много узких мест. Часто после каких-либо обновлений и новшеств, мы получали огромные тормоза, о которых узнавали не сразу. Нужно было решение, которое повернуто лицом к заказчику и программисту. Закачик очень не любит zabbix и munin. Решение нашлось. Это был pinboard и pinba. Заказчику понравилось. Он попросил прикрутить pinba ко всем проектам, которые крутились на django.

Поехали


Настройка состоит из нескольких частей:
1. Установка pinba-engine-mysql в качестве сервера для мониторинга(на Debian GNU/Linux)
2. Установка pinboard, для просмотра текущего состояния проекта
3. Установка батарейки django-pinba, для отправки статистики

1. Установка pinba-engine-mysql в качестве сервера для мониторинга(на Debian GNU/Linux)


1.1. Подключаем дополнительный репозиторий, от автора проекта pinba:
# echo "deb http://php53.dotdeb.org stable all" >> /etc/apt/sources.list && echo "deb-src http://php53.dotdeb.org stable all" >> /etc/apt/sources.list
# gpg --keyserver keys.gnupg.net --recv-key 89DF5277 && gpg -a --export 89DF5277 | sudo apt-key add -
# apt-get update && apt-get upgrade -y

1.2. Установливаем MySQL и Pinba-Engine:
# apt-get install dialog mysql-server -y
# apt-get install pinba-engine-mysql-5.5 -y

1.3. Проверяем слушает ли pinba-engine-mysql нужный нам порт:
# netstat -uln|grep :30002

2. Установка pinboard, для просмотра текущего состояния проекта


2.1. Устанавливаем все необходимые зависимости:
# apt-get install git-core nginx php5-fpm curl php-apc php5-cli php5-mysqlnd vim -y

2.2. Клонируем проект и подтягиваем необходимые пакеты:
# cd /var/www/ && git clone git://github.com/intaro/pinboard.git && cd ./pinboard
# git checkout v1.0
# curl -sS https://getcomposer.org/installer | php && php composer.phar install
# cp config/parameters.yml.dist config/parameters.yml

2.3. Настраиваем параметры подключения к БД:
# vim config/parameters.yml

2.4. Мигрируем и регистрируем задания в кроне:
# ./console migrations:migrate
# ./console register-crontab

2.5. Настраиваем виртуальный хост nginx:
# touch /etc/nginx/sites-available/pinba.conf && ln -s /etc/nginx/sites-available/pinba.conf /etc/nginx/sites-enabled/ && vim /etc/nginx/sites-enabled/pinba.conf

2.6. Вставляем конифигурацию вирутального хоста и указываем необходимый server_name:
server {
    listen 80;
    server_name pinboard.example.com;
    root /var/www/pinboard/web;

    location = / {
        try_files @site @site;
    }

    location / {
        try_files $uri $uri/ @site;
    }

    location ~ \.php$ {
       return 404;
    }

    location @site {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root/index.php;
        fastcgi_param HTTPS $https if_not_empty;
    }

    location ~ /\.(ht|svn|git) {
        deny  all;
    }
}

2.7. Перезагружаем демон nginx:
# /etc/init.d/nginx restart

2.8. Добавляем конфигурацию тайм-зоны в php.ini:
# sed -i 's/;date.timezone =/date.timezone = Europe\/Moscow/g' /etc/php5/cli/php.ini /etc/php5/fpm/php.ini

2.9. Проверим работу скрипта, прописанного в кроне:
# /var/www/pinboard/console aggregate

Если скрипт выполнил работу без ошибок, значит все работает верно. На этом настройка pinboard закончена.

3. Установка батарейки django-pinba, для отправки статистики


3.1. Установим батарейку:
$ pip install django-pinba

3.2. Откроем файл настройки settings.py и добавим django-pinba в MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = (
    'pinba.middleware.PinbaMiddleware',
    ...
)

3.3. Укажем настройки нашего сервера с pinba-engine:
PINBA_SERVER = '192.168.55.11'
PINBA_PORT = 30002
PINBA_ENABLED = True

Желательно не держать статистику на одном сервере с проектом.

Заключение


Теперь можно открыть в окне браузера наш сайт, подождать некоторое время, которое было указано в crontab для pinboard, и любоваться красивыми графиками. Нагрузку для теста, можно создать с помощью утилиты ab или wget.

Интерфейс выглядит следующим образом:
image

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 14

    +1
    О, не знал про такой интерфейс. Очень круто выглядит.
    Спасибо, добавил ссылку на pinba.org.
      0
      Спасибо за ссылку :)
      +1
      Как удачно то! Я только подумал, что для нашего проекта не помешала бы какая-нибудь статистика. Буду пробовать! Спасибо за статью! :)

      Только у меня вопрос один есть: а статистику по всем проектам, крутящимся на одном сервере, можно вывести всю сразу?? Или надо отдельный порт для каждого?
        +1
        Сервер статистики один. База так же одна. В интерфейсе Pinboard можно выбрать необходимый хост, для просмотра статистики по нему.
        0
        А что насчет ключевой функции пинбы?
        image
          0
          Думаю это вопрос к разработчикам pinboard. Судя по скринам такой функции нет.
            0
            Судя по всему, muxx как раз один из разработчиков.
            Вопрос к нему.
              0
              Да, сейчас действительно нет такой функции. Мы в первую очередь хотели отразить общую картину: время формирования и потребление памяти 90/95/99/100% страниц, а также выявить проблемные участки: медленные страницы, страницы с 500-тыми статусами.

              С этим графиком есть такая проблема: он не работает в проектах с единой точкой входа. Ок, мы пишем request_uri вместо script_name (см github.com/intaro/pinboard/wiki/Configure-sending-of-readable-script-names-in-Pinba), но тогда уникальных адресов становится достаточно много и график не отражает того, что должен был отображать. С другой стороны request_uri удобен, т.к. pinboard логирует медленные, тяжелые и ошибочные страницы и уведомляем о них, это удобно.
                0
                Думаю, я не намного навру, если напишу, что 90% django проектов работают под uwsgi. А он имеет встроенный сервер статистики, с которого элементарно снимаются данные для ваших графиков и визуализируются при помощи munin. При этом не используется база данных и не добавляется лишний код в обработку каждого реквеста.

                Поздравляю, вы изобрели велосипед! ;)

                Что можно сделать. Привязываться к urls.py и вытаскивать оттуда точки входа. Тогда можно будет получить более-менее похожую картину.
                  0
                  Pinba и соответственно Pinboard был изначально для PHP :)

                  И среднее время как раз не очень показательно. Мы у себя смотрим на 95% и отталкиваемся от того, что в эту цифру должны укладываться запросы, в которых срабатывает кеширование, а в остальные 5% — запросы, которые лезут в БД.
                    0
                    Ильяс, а я правильно понял, что вы перекладываете из сырых данных в свои таблицы и потом строите по этому графики?
                    А можно узнать зачем?

                    Предполагалось, что существующие виды отчетов как раз вот такие случаи все должны решать.
                    Если не решают, то либо вы что-то не так делаете, либо вам не хватает какого-то функционала. Вопрос — какого?
                    Кстати, недавно добавились еще медиана, произвольные перцентили по времени запроса + т.н. «гистограмма» частот (т.е. можно посмотреть «внутрь» среднего числа и построить графики распределения времени запроса, например).
                      0
                      Нам как раз персентелей и не хвататало, я заметил, что они недавно появились, это очень здорово, будем переходить на них. А в остальном мы только дампим отчеты пинбы, чтобы видеть их за предыдущие периоды и логгируем медленные, тяжелые и 500-ые страницы.
                    0
                    uWSGI Stats Server — это статистика одного сервера, которую он сам отдаёт.
                    Pinba изначально предназначалась для автоматического сбора и агрегации данных с множества серверов.
                    Плюс в неё с самого начала закладывались таймеры, который позволяют засекать время определённых участков кода и строить агрегированные отчеты уже по операциям, а не по запросам.

                    >При этом не используется база данных и не добавляется лишний код в обработку каждого реквеста.
                    Если не использовать таймеры, то ничего не добавляется, вся статистика собирается и отсылается автоматом (в PHP. Хотя и в других языках тоже наверняка).
                      0
                      Есть не только uWSGI. Мотивы описаны в начале топика.

            Only users with full accounts can post comments. Log in, please.