自作の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