Pinboard — прокачиваем Pinba для мониторинга PHP

    Intaro PinboardСуществует полезный и нужный инструмент для мониторинга PHP под названием pinba. Он позволяет собирать статистику по выполнению PHP-скриптов вашего проекта. Мы реализовали небольшую систему, которая дополняет Pinba, и назвали ее Pinboard (Pinba board).

    Суть работы


    Pinba хранит исключительно realtime-данные за последние несколько минут, что очень круто, но не всегда удобно. Pinboard же периодически агрегирует эти данные в собственное хранилище и предоставляет простые средства просмотра и анализа этой информации, а в ближайшем будущем и средства простейшего мониторинга.

    Возможности


    Обзор выполнения PHP-скриптов


    Для каждого хоста, к которому подключена pinba, можно посмотреть графики:

    • времени выполнения скриптов;
    • используемой памяти;
    • количества запросов в секунду;
    • и количества запросов с 5хх статусами.

    При этом графики времени выполнения и используемой памяти строятся по перцентилям в виде 4-х кривых. Например, для времени выполнения это:

    • максимальное время выполнения 90% «самых быстрых» запросов
    • максимальное время выполнения 95% «самых быстрых» запросов
    • максимальное время выполнения 99% «самых быстрых» запросов
    • максимальное время всех запросов

    Данные можно смотреть как для всего сайта, так и для отдельных серверов в случае, если сайт обслуживается несколькими серверами.

    Мониторинг самых медленных и самых «тяжелых» скриптов


    В Pinboard можно задать максимально допустимые значения времени выполнения скриптов и используемой ими памяти. Все скрипты, которые не уложились в заданные пределы, фиксируются в Pinboard и доступны в отдельном разделе для просмотра. Можно задать как общие значения, так индивидуальные для отдельно взятых сайтов. Все настройки задаются в yml в таком виде:

    logging:
        # in seconds
        long_request_time:
            global: 1.0
            "supersite1.com": 0.8
            "superfastsite2.com": 0.3
        # max memory usage in kB
        heavy_request:
            global: 30000
            "coolsite.ru": 5000
            "heavysite.ru": 30000
    

    Также, как и в случае обзорной информации, отчеты можно смотреть как для всего сайта, так и для отдельно взятого сервера, обслуживающего сайт.

    Мониторинг запросов с ошибками


    Pinboard отслеживает и фиксирует в отдельном разделе скрипты, которые вернули 5хх статус. В ближайшее время мы добавим возможность уведомления на почту о таких скриптах.

    Live-режим


    В системе предусмотрен отдельный раздел, в котором Pinboard отображает realtime-данные из таблиц pinba. Можно видеть, кто и что в данный момент просматривает на сайте. По каждому запросу выводится информация по времени выполнения и использованной памяти.

    В качестве итога


    У себя мы подключили к Pinboard значительную часть проектов, которые разрабатываем и поддерживаем. На данный момент наш Pinboard фиксирует порядка 2 млн. запросов в сутки. Период хранения мы установили в месяц. За это время набирается порядка 2 Гб данных.

    В ближайшем будущем мы хотим добавить 2 важные фичи:

    • уведомление на почту о страницах с ошибками (done);
    • поддержка тегов pinba.

    В целом мы будем рады пожеланиям, замечаниям и помощи в развитии системы. Проект опубликован под MIT лицензией.

    Ссылки


    Сайт проекта: http://intaro.github.io/pinboard/
    Github: https://github.com/intaro/pinboard
    Документация: https://github.com/intaro/pinboard/wiki
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 50
    • +1
      Скорее всего вы не знали, когда выбирали название, но pinboard — крутая отладочная плата от dihalt. Мне интересно, как он отреагирует на такое название.
      • +15
        Да мне, честно говоря, пофигу. К электронике данный проект не имеет отношения.

        Но для вас, как по мне, название неудачное. Попробуйте нагуглить свой проект по этому названию. Будет попадаться что угодно, только не он :) Мне со своим проектом это на руку, а вот как вам не знаю.
        • +1
          Вы знаете, это слово означает и коммутационную панель как таковую, и доску (например, пробковую) на которую булавками прикрепляют заметки/объявления.

          Думаю, тут отношение примерно то же, как к названию некой ОС — «Окна». Уверен, что спора не возникнет, да и комментарий DIHALT совершенно верен, особенно в части невозможности нагуглить проект по названию.

          Хоть какое-то веб-два-нольное имя подобрать, на тот же www.dotomator.com/web20.html зайти, и понажимать «Generate Name!» )
          • 0
            По поводу окон вы заблуждаетесь, прецедент есть.

            А вообще, я считаю, что суд не прав (microsoft отсудил себе домен windows.ru). Различные продукты в не пересекающихся областях вполне могут иметь одинаковое название, особенно если названием является общеупотребляемое слово.
            • 0
              Об этом и писал ) — патентовать общеупотребимое понятие или слово — некомильфо.

              На фоне истории со смайликами и с авторскими правами на звуки речи (не найду сейчас, чем там закончилось — «по рублю за каждую букву А» — вот уж маразм из маразмов!)

              Или как там, «деньги не пахнут»?
        • +1
          Поддержка MVC?
          • +3
            ?
            • +3
              Всем минусующим — подобная тулза, которая будет показывать, что проблемы всегда в index.php не даёт особого профита; если же будет группировка скриптов лишь по URL — то при достаточно большом кол-ве параметров вы тоже не сможете выявить нормально проблему.
              Поддержка MVC — наверное выразился неправильно, но «правильная» фраза поддержка фреймворков, ещё менее информативна.
              И да, посмотрите на new relic хотя бы в траильном «про» аккаунте — поймёте о чём я толкую
              • +2
                Поддержка фронт-контроллеров или единой точки входа.
                • 0
                  В методе pinba_flush (если я не ошибаюсь), у Вас есть возможность передать в качестве аргумента script_name, т.ч. можете туда URI + QUERY_STRING передавать, чтобы видеть нормальную статистку по компонентам.
                  • 0
                    Ниже привел ссылку на доку, где есть примеры настройки.
                  • 0
                    В Pinboard адреса требуются, чтобы видеть, где у нас скрипт долго думает или присутствует просадка по памяти, или присутствует ошибка. На этот случай мы привели в документации примеры настройки отдачи URL вместо script_name github.com/intaro/pinboard/wiki/Configure-sending-of-readable-script-names-in-Pinba.

                  • 0
                    Как Pinboard влияет на производительность сервера?
                    • +2
                      Исходя из описания — никак, она должна запускаться на отдельной машине и собирать данные из пинбы. Сама пинба оказывает минимальное влияние на производительность благодаря тому, что отправляет собранные данные через UDP (не требуется ожидание подтверждения, как в TCP/IP).
                      • +1
                        Да, указали верно — Pinba отправляет информацию по скрипту после того, как он выполнился и отдал результат веб-серверу, поэтому отрицательного влияния на производительность нет.
                        • 0
                          А после того как он выполнился, что нам другие реквесты выполнять не надо?
                          Или CPU и Net после выполнения конкретных пхп скриптов становятся «бесплатными» ресурсами?
                          Минимально, как написал youROCK выше — это да, но так категорично «отрицательного влияния на производительность нет» это извините даже близко не верно.
                          Здесть коммент по этому поводу от автора пинбы tony2001. Хотя я с ним, скажем так, не во всем согласен — т.е. что мерять бенчмарком тяжко, но все же можно.
                          У меня есть похожий мониторинг, только для python'а и tcl'я, тоже по udp, на сях и таймерах, вообщем похож очень, только я отправляю структуру поменьше (скрипт идентификатор + старт + конец). Так вот, на высоконагруженом сервере, который практически не простаивает, результат видно даже на load average (пример для 8-ми cpu и 1000Mbit):
                          Мониторинг OFF:
                            load average: 8.20, 8.02, 7.94
                          Мониторинг ON:
                            load average: 8.80, 8.48, 8.34
                          

                          Но главное даже не это, главное среднее время за request (отработав одни и те же тест-кейсы):
                          Мониторинг OFF:
                            32154.380 microseconds per request
                          Мониторинг ON:
                            37447.352 microseconds per request
                          

                          Т.е. время отклика выросло на 16 с гаком процентов.
                          Хотя, должен признаться, я php никогда так не грузил — не знаю, как оно поведет себя там.
                          Другое дело, если наши реквесты выполняются секунды — нагрузку просто не видно (не померять) за погрешностью измерений.

                          Мой вывод для себя — влияет минимально, пока есть простои. Однако при высоком load average «паразитное» влияние имеет место быть и весьма ощутимо.
                          • +2
                            Рискну предположить, что рожденный чтобы умереть должен априори иметь больше накладных расходов даже с оптимизаторами, так что скорее всего на пхп нагрузка будет заметно меньше в процентном отношении. Но да, надо тестировать.
                      • 0
                        А есть какие-то аналоги?
                        • 0
                          Чуть более удобный — сервис New Relic, но он стоит каких-то бешеных денег. Есть средства мониторинга munin, nagios и т.д., которые могут дать часть этого функционала. У pinba/Pinboard плюс в детализации, возможности просмотра realtime данных и заточенности под PHP.
                          • +1
                            Не бешеных, до 2 ppm дают скидки, с ними просто нужно уметь общаться. У нас около 70$ за инстанс (Pro). Поддержка у них хорошая, и статистических данных выше крыши, ну и оповещения об ошибках.
                        • 0
                          Мне кажется все же неверно писать о мониторинге PHP-скриптов, т.к. мониторится не конкретный скрипт, а отработка URL-запроса, в котором могут быть задействованы десятки скриптов
                          • +1
                            Я нашел тебя, pinba!
                            • +1
                              Спасибо, для дев-сервера
                              • +1
                                Наиболее полезно как раз на production. Мониторинг скриптов на production под реальной нагрузкой.
                              • +1
                                Спасибо за live-режим! Смотрю и радуюсь :-)
                                Вопрос в студию — почему при заходе на my-pinba.ru/server/mysite.ru/all/mem-usage (закладка «Memory peak usage») вываливается:

                                Sorry, the page you are looking for could not be found.
                                

                                Аналогично в /all/statuses («Statuses»).
                                P.S. Желаю всяческих успехов вашему проекту.
                                • 0
                                  Сейчас выдает 404, когда нет данных для отображения. Завели таск github.com/intaro/pinboard/issues/16, доработаем.
                                  • 0
                                    Спасибо! Ловите плюс в карму! Блин, хотел ещё коммент плюсануть — промазал.
                                    • +1
                                      Пофиксили, в master.
                                • 0
                                  Ещё один вопрос. У меня pinba стоит за Nat. Порт 3300 пробросил через роутер. Соответственно у сервера 3 IP: внешний, локальный и 127.0.0.1 Когда тестировал с 127.0.0.1 всё было хорошо, данные в pinboard live были. Поменял IP на внешний — данные поступать перестали. Поменял и на сервере и на клиенте. Как думаете, в чём косяк может быть?
                                  • +2
                                    Может быть, вы не учли, что Pinba работает по UDP и открыли только TCP/IP порты :)?
                                    • +1
                                      Это было первое, на что я подумал. Но разгадка была в другом.

                                      pinba_address - IP address to listen at (leave it empty if you want to listen at any IP).
                                      

                                      Сделал вот так:

                                      pinba_address=#127.0.0.1
                                      

                                      потом перезагрузил MySQL… и после этого всё равно не заработало (но это я так думал). Надо было просто подождить 15 минут (таймаут агрегации данных, задаваемый при установке pinboard) — и всё в порядке, новые сайты появились в списке!
                                      • 0
                                        Если что, мгновенную проверку можно сделать, зайдя в раздел Live. Там всегда realtime данные.
                                        • 0
                                          Ну так то да, но это если домен уже есть в списке. А то он у меня в списке не появлялся и я отслеживал по Live других доменов.
                                  • +1
                                    Спасибо! Поставил, радуюсь.

                                    Вопрос по встроенной аутентификации:
                                    В доках сказано что в конфиг нужно положить SHA-512 хеш пароля, после 1000 итераций хеширования.
                                    У меня так не заработало.
                                    Я посмотрел код vendor/symfony/security/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php — там, как я понял, 5000 итераций и преобразование в Base 64.
                                    • 0
                                      Посмотрите раздел Security в Wiki, есть команда для добавления нового пользователя.
                                      • 0
                                        А по поводу PasswordEncoder вы правы — там 5000 итераций и base64. Поправили в документации.
                                      • 0
                                        Спасибо за морду! Давно хотел визуализировать пинбу,

                                        Только не до конца понял, как поставить его на хост monitoring-server/pinboard, то есть не нашёл где прописывается base url.
                                        • +1
                                          Вот это проблематично. Для нее требуется отдельный хост. Разместите на поддомене.
                                        • 0
                                          Классная штука, траварищи! Неделю юзаю, не нарадуюсь.
                                          • +1
                                            Добавили еще уведомление на почту о 500-ых ошибках github.com/intaro/pinboard/wiki/Configuration#email-notifications. При обновлении не забудьте запустить ./composer.phar update.
                                            • 0
                                              Отлично! А можно реквестировать ещё добавление круговой диаграммы или гистограммы по процентному соотношению бекендов (хостов) для домена?
                                              • 0
                                                Что за соотношение, по какому значению?
                                                • 0
                                                  Пусть один сайт обслуживает несколько хостов (A, B, C). Круговая диаграмма строится по соотношению количества запросов, обработанных i-ым хостом к общему количеству запросов по всем хостам). Это в статике за всё время.

                                                  А второй график — то же соотношение, но в динамике по определенным временным интервалам. Скажем каждые 5 минут берется срез за 5 предыдущих минут и определяется это соотношение, а потом по этим соотношениям строится гистограмма. Аналогично гистограмме браузеров в Liveinternet.
                                                  • 0
                                                    А в чем смысл этого графика? Как правило, делают n равноправных машин, по которым идет распределение через nginx/upstream либо dns/roundrobin.
                                                    • 0
                                                      Не обязательно, бекэнды можно настраивать по приоритетам например. Или если группа машин в разных ДЦ, и нужно занть их rps.
                                          • 0
                                            А вариант сделать доставку логов Pinba через Logstash в ElasticSearch для просмотра в Kibana не рассматривался? Как бы удобнее иметь один интерфейс и для просмотра логов, статистики итд. итп. Вот и тут такой же был подход избран — github.com/box/Anemometer/wiki, а жаль…
                                            • 0
                                              Pinba уже хранит и агрегирует данные в MySQL со множества проектов. Было удобнее там же формировать отчеты, добавив необходимую функциональность.
                                            • 0
                                              Немного не понял по детализации и группировке данных -доступны ли данные отдельно для каждого сайта или только для всего сервера? То есть, допустим, мне надо статистику по каждому сайту отдельно, а на сервере крутится ХХХ-сайтов.
                                              Неплохо было бы уще какое-то демо, чтобы посмотреть, покликать :-).
                                              • 0
                                                На втором скриншоте видно, что в заголовке адрес сайта, а рядом фильтр по серверам. Т.е. вы видите отчеты по сайту в целом, но если он крутится на нескольких серверах, то можете посмотреть отчеты по работе сайта на каждом отдельном сервере.

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.