Установка New Relic для PHP 7.1 в CentOs 7 в docker-контейнере

Что такое 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 сервиса.