Мониторинг на коленке: NGINX -> Rsyslog -> Logstash -> Graphite

nginx-to-graphite_miniatureВ недавней статье рассматривался рецепт того, как можно быстро посредством Graphite визуализировать метрики, полученные из произвольного PHP-приложения. В настоящей же статье рассмотрим, как можно собрать и визуализировать в Graphite скорость загрузки страниц взятую из логов Nginx. В отличие от предыдущего рецепта этот не требует изменять Web-приложение.

Отмазка

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

Предлагаемое решение

nginx-to-graphite

По шагам:

  • На сервере с Web-приложением, где установлен и работает Nginx:
    1. Настриваем Nginx логировать информацию о запрошенных страницах (uri) и времени генерации страниц (request_time) в отдельный файл.
    2. Настраиваем Rsyslog перенаправлять новые записи из этого файла в Rsyslog на удалённом сервере, где установлен Graphite
  • На сервере с Graphite:
    1. Настраиваем Rsyslog собирать информацию, присланную с Web-серверов и складывать в локальный файл
    2. Настраиваем Logstash записи из этого файла перенаправлять в StatsD (в нашем случае будет использоваться удобная замена — Bucky)
    3. Настраиваем Bucky и Graphite (в этой статье этот момент опущен, поскольку уже описывался в Мониторинг на коленке: PHP -> StatsD(Bucky) -> Graphite)

Настройка сервера с Web-приложением

Настройка Nginx

Определим в конфигурации Nginx новый формат логов (log_format) с минимумом необходимых нам данных, а в настройки виртуального хоста добавим дополнительную инструкцию access_log.

Например так:

Эти настройки обеспечивают нас сбором данных в файле /var/log/web-app/performance.log вида:

Настройка Rsyslog

Отправим их теперь на сервер с Graphite. Для этого отредактируем конфигурацию Rsyslog следующим образом (актуально как минимум для CentOS 6.6, Rsyslog 7.4 — RPM пакет rsyslog7):

Создадим новый файл /etc/rsyslog.d/forward_web-app_performance-log.conf:

В двух словах, магия между $ModLoad и $InputRunFileMonitor мониторит указанный файл и при появлении новых записей в нём перенаправляет их в local6.  В последних двух строчках содержимое local6 отсылается на удалённый Rsyslog-сервер.

Магическая 174 тут интерпретируется на удалённом сервере как  local5.info. Об этом позже.

Источник local6 (да и local5) тут выбран произвольно, если выберете другой — убедитесь, что он ни с каким другим не пересекается.

Чтобы не захламлять /var/log/messages отредактируйте следующую строку /etc/rsyslog.conf, добавив в неё local6.none:

 

Настройка сервера-сборщика логов

Rsyslog

На принимающем сервере создадим /etc/rsyslog.d/web-app_performance_log.conf:

Здесь local5.info соответствует магической цифре 174 в файле конфигурации отправителя (подробнее в магию этих соответствий можно прочитать тут).

Почистим /var/log/messages от мусора, как мы это делали на сервере-отправителе:

Хорошо, после перезапуска rsyslog и отладки в итоге мы получим файл /var/log/web-app_performance.log с содержимым вроде:

Теперь необходимо этот файл преобразовать в формат понятный StatsD и скормить потребителю.

Для этого воспользуемся Logstash.

Настройка Logstash

Содержимое файла конфигурации /etc/logstash/conf.d/web-app_performance-log.conf:

Тут:

  • В input указываем, из какого файла брать данные
  • В filter:
    • grok — проанализируем строки журнала, выберем из него значения uri и duration
    • graphite_dirsmutate — видоизменим uri для более удобоваримого его отображения в Graphite. Например: /licenses/download-license.php видоизменится в licenses.download-license_php.
  • В output инструктируем Logstash преобразованные данные писать в StatsD

Настройка Graphite и StatsD

В данном рецепте StatsD заменён на Bucky — компактный маленький сервер для сбора и трансляции метрик для Graphite, который поддерживает в том числе и StatsD интерфейс.

Описание настройки данных сервисов можно найти в предыдущей статье Мониторинг на коленке: PHP -> StatsD(Bucky) -> Graphite.

 

Готово!

 

  • Aleksey Karelin

    Nginx c версии 1.7.1 сам умеет отправлять в syslog, а logstash принимать syslog данные, то есть два звена из схемы можно убрать. В осблуживании данный подход проще. А под разные метркии можно ставить в конфиге nginx определнный тег, тогда еще проще маркированные данные обрабатывать в logsyash.

    • otokarev

      Соглашусь, для надёжности можно упростить.