PHPのWebアプリケーションでNew Relicのカスタムイベントを使ってみる

自作のWEBアプリでジョブの結果を監視するためにNew Relicのカスタムイベントを使ってみましたので備忘録を残します。

New RelicにはAPMやBrowserなどにNew Relic側が用意したいろいろなイベントがレポートされますが、カスタムイベントは自由に内容を決めれるもので、レポートするタイミングも自由に決めれます。カスタムイベントはダッシュボードのQuery Builderを使えばNRQLである条件を満たしたカスタムイベントだけクエリしたり、アラートの条件に使ったりできます。今回は、PHPのエージェントを使ってカスタムイベントを送ってみました。

まず、PHP用にNew Relicへデータを送るプロキシデーモンのコンテナを立ち上げます。

docker run --name newrelic-php-daemon --net=webapp -d newrelic/php-daemon

PHPを実行するイメージ(今回はphp:8.2-apacheをカスタマイズしたイメージを使用)をベースに、new relicのPHPエージェントの拡張モジュールをインストールしたイメージを構築します。なお、このイメージを起動するコンテナのネットワークはプロキシデーモンと同じwebappを使用する前提です。

ARG IMAGE_NAME
FROM ${IMAGE_NAME}

ARG NEW_RELIC_AGENT_VERSION
ARG NEW_RELIC_LICENSE_KEY
ARG NEW_RELIC_APPNAME

RUN curl -L https://download.newrelic.com/php_agent/archive/${NEW_RELIC_AGENT_VERSION}/newrelic-php5-${NEW_RELIC_AGENT_VERSION}-linux.tar.gz | tar -C /tmp -zx \
    && export NR_INSTALL_USE_CP_NOT_LN=1 \
    && export NR_INSTALL_SILENT=1 \
    && /tmp/newrelic-php5-${NEW_RELIC_AGENT_VERSION}-linux/newrelic-install install \
    && rm -rf /tmp/newrelic-php5-* /tmp/nrinstall*

RUN sed -i -e "s/REPLACE_WITH_REAL_KEY/${NEW_RELIC_LICENSE_KEY}/" \
    -e "s/newrelic.appname[[:space:]]=[[:space:]].*/newrelic.appname=\"${NEW_RELIC_APPNAME}\"/" \
    -e '$anewrelic.daemon.address="newrelic-php-daemon:31339"' \
    $(php -r "echo(PHP_CONFIG_FILE_SCAN_DIR);")/newrelic.ini

あとは、WEBアプリでnewrelic_record_custom_eventというAPIを使ってイベントを登録します。

 newrelic_record_custom_event("MyAppReport", ["result"=>$result,"reason"=>$reason]);

第一引数はイベントタイプを指定しますが、使用可能な文字は限られているようです。正規表現で表すと、”^[a-zA-Z0-9:_ ]+$”にマッチする必要があるようです(PHPエージェントのエラーログから抽出)。あと、予約されているイベントタイプは指定できないようです。

New RelicのダッシュボードのQuery Your Dataから登録されたカスタムイベントをクエリできます。

SELECT * FROM MyAppReport SINCE 24 days AGO

あとはアラートの条件やポリシーを設定すれば、監視できそうです。

ちなみに、プロキシデーモン(php-daemon)は10分間何もトランザクションがないとスリープするようです。スリープするとプロキシデーモンのコンテナには以下のようなログが出力されます。

2024/03/23 21:41:02.020681 (13) Info: removing "myapp" with run id "*****" for lack of activity within 10m0s

このページによると、スリープ状態でエージェントからトランザクションを送ってもデーモンがウェイクアップするだけで処理されないみたいです(後続のトランザクションから処理される)。そのため、5分ごとにヘルスチェック用のURL(PHPでOKという文字列を返すだけのもの)にアクセスするようにしています。

Comments

Copied title and URL