Что такое New Relic и зачем он нужен в этой заметке рассказывать не буду. А расскажу лишь кратко как установить newrelic agent внутрь docker-контейнера для мониторинга производительности приложения. Т.е. речь о APM — Application Performance Monitoring and Management. Рассмотрим 2 варианта: установку в уже запущенном контейнере и настройку через Dockerfile. В данной статье рассмотрена только установка APM-агента в образ docker, установка агента для мониторинга инфраструктуры внутри docker сложна и не имеет смысла. Инфраструктурный агент лучше установить в хостовую систему.
Установка NewRelic в запущенном контейнере
сводится к таким шагам:
Заходим в терминал контейнера, в данном случае сервис так и называется — php, а bash в данном случае терминал.
docker-compose exec php bash
Добавляем репозиторий. Не пугайтесь что он называется newrelic-repo-5-3, он подходит для PHP 5 и 7 версий.
sudo rpm -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
Устанавливаем пакет, снова не обращаем внимание на цифру 5 в названии пакета, с 7-ой версией тоже будет работать.
yum install newrelic-php5
Далее запускаем установщик ньюрелика. Он работает в интерактивном режиме и предложит ввести license key, который можно взять в личном кабинете в разделе APM — Add more — PHP — Get your license key — Reveal license key. Затем установщик предложить выбрать директорию с установленным PHP, можно не париться и просто ввести all.
newrelic-install install
Либо можно воспользоваться бесшумным режимом а затем вручную отредактировать файл конфигурации.
NR_INSTALL_SILENT=1 newrelic-install install
Удаляем временные файлы после установки:
rm -rf /tmp/newrelic-php5-* /tmp/nrinstall*
Затем нужно отредактировать конфиг:
nano /etc/php.d/newrelic.ini
Если инсталлятор не был запущен в интерактивном режиме, то самое время ввести license key:
newrelic.license="<your-key-goes-here>"
А также весьма полезно будет задать имя приложения, чтобы раздельно отслеживать разные апликейшены.
newrelic.appname = "PHP Application"
Ну и наконец нужно перезапустить PHP-FPM сервер, данная команда будет работать только внутри docker в котором php-fpm является command.
kill -USR2 1
Теперь можно почти в реальном времени наблюдать за тем, что происходит в приложении. Лаг составляет около 2-х минут, иногда больше.
Установка NewRelic в docker-образ
Давайте немного отредактируем Dockerfile. Для удобства объявим два аргумента, задающие лицензионный ключ и имя приложения. Если хотите, можете убрать дефолтные значения:
FROM centos:7 ARG NEWRELIC_LICENSE=aeb9d2a95bfafe54657868e0eb4cf9ef02a39d97 ARG NEWRELIC_APPNAME=My-super-app
Затем установка:
RUN rpm -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm && yum install -y newrelic-php5 && NR_INSTALL_SILENT=1 newrelic-install install && rm -rf /tmp/newrelic-php5-* /tmp/nrinstall*
После чего переопределение конфига:
RUN sed -i -e "s/\"REPLACE_WITH_REAL_KEY\"/\"$NEWRELIC_LICENSE\"/" \ -e "s/newrelic.appname = \"PHP Application\"/newrelic.appname = \"$NEWRELIC_APPNAME\"/" \ /etc/php.d/newrelic.ini
Вот и всё, таким нехитрым способом можно предустановить newrelic apm agent в любой docker-image.
Другой способ сборки образа с newrelic agent
Сами же ребята из New Relic предлагаю немного другой подход. Выберите подходящий релиз, и подставьте его в команду curl:
RUN \ curl -L https://download.newrelic.com/php_agent/release/newrelic-php5-8.1.0.209-linux.tar.gz | tar -C /tmp -zx && \ NR_INSTALL_USE_CP_NOT_LN=1 NR_INSTALL_SILENT=1 /tmp/newrelic-php5-*/newrelic-install install && \ rm -rf /tmp/newrelic-php5-* /tmp/nrinstall* && \ sed -i -e 's/"REPLACE_WITH_REAL_KEY"/"Your License Key"/' \ -e 's/newrelic.appname = "PHP Application"/newrelic.appname = "Your Application Name"/' \ /usr/local/etc/php/conf.d/newrelic.ini
Также нужно вставить свой license key вместо «Your License Key» и название приложения вместо «Your Application Name». Вот и всё, теперь в контейнере после сборки сразу будет установлен New Relic агент для сбора статистики о производительности PHP-приложения.
Для ускорения сборки можно заранее выкачать билд с агентом и добавлять его в образ командой COPY или ADD.
Заголовок HTTP «X-NewRelic-ID» … Что это?
В конфигурации по-умолчанию в ньюрелике включена опция трассировки запросов между приложениями. Это выражается в том, что ко всем исходящим запросам, которые делает ваше приложение, например, через CURL будут магическим образом добавляться 2-3 дополнительных HTTP-заголовка:
- X-NewRelic-ID
- X-NewRelic-Transaction
- X-NewRelic-App-Data
Это может быть нежелательно в тех случаях, когда вы делаете запросы к внешним API. В некоторых случая эти заголовки откровенно палят приложение, что может привести к вашей однозначной идентификации и применению санкций или даже к блокировке.
Отключение cross application traces в NewRelic
По-умолчанию в конфиге /var/php.d/newrelic.ini включена такая опция:
;newrelic.cross_application_tracer.enabled = true
Отключить её можно так:
sed -i -e "s/;newrelic.cross_application_tracer.enabled = true/newrelic.cross_application_tracer.enabled = false/" /etc/php.d/newrelic.ini
После чего не забудьте сделать рестарт PHP-FPM сервиса.