公式ドキュメントに記載されていますが、まず.NET CoreおよびDockerコンテナ利用時の前提条件を確認しましょう。
.NET Coreエージェントの互換性と要件
Install on Docker container
主だった条件としては次のものがあります。
- .NET Core 2.0以降。ただし、tiered complicationは無効化されます。
- ASP.NET CoreでKestrelで動かす必要があります。Kestrelでない場合はカスタムインストゥルメンテーションを行う必要がありますが、こちらは別の記事にしたいと思います。
- エージェントはアプリと同じコンテナにインストール必要があります
- 必須の環境変数を設定する必要があります。この例ではDockerfileに全て指定していますが、起動時でも構いません。
- エージェントのファイルは.NET Coreプロセスからアクセスできる必要があります
- ブラウザモニタリングは自動では有効化されません。こちらも別の記事で説明します。
- (上のドキュメントにはないですが).NET Core Profile APIを利用しているため、Profile APIを使う他のソフトウェアを同時に使うことはできません。Profile APIを使うものは、例えばスナップショットデバッガーがあります。
エージェントは https://download.newrelic.com/dot_net_agent/latest_release/ からディストリに適したインストーラー形式を選び、インストールします。Microsoftが提供しているASP.NET Coreのコンテナにインストールする場合のDockerfileは次のようになります。
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base
ENV CORECLR_ENABLE_PROFILING=1 \
CORECLR_PROFILER={36032161-FFC0-4B61-B559-F6C5D41BAE5A} \
CORECLR_NEWRELIC_HOME=/usr/local/newrelic-netcore20-agent \
CORECLR_PROFILER_PATH=/usr/local/newrelic-netcore20-agent/libNewRelicProfiler.so \
NEW_RELIC_LICENSE_KEY=<New Relicライセンスキー> \
NEW_RELIC_APP_NAME=<アプリの名前>
ARG NewRelic=./newrelic
COPY $NewRelic ./newrelic
RUN dpkg -i ./newrelic/newrelic-netcore20-agent*.deb
COPY newrelic.config /usr/local/newrelic-netcore20-agent/
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS publish
WORKDIR /src
COPY . .
RUN dotnet publish <csprojファイルのパス> -c Release -o /app
FROM base As final
WORKDIR /app
COPY --from=publish /app /app
ENTRYPOINT [ "dotnet", "<publishしたdllのファイル名>" ]
ディストリはDebianベースなので*.deb
のインストーラーをDockerfileのあるディレクトリの.newrelic
ディレクトリに配置しています。Dockerのビルドの制約上、Dockerfileおよびそれ以下のディレクトリと別の場所にあるファイルはCOPYできないので注意してください。newrelic.config
を編集したい場合はインストールした後に生成されるデフォルトのconfifgを上書きして対応します。この場合、このDockerイメージ内全体に適用されます。例えば、ログレベルと出力先を変更したい場合は以下のように変更したnewrelic.configを用意します。コンソールに出力することで、docker logs
コマンドで確認できるようになります。
<configuration xmlns="urn:newrelic-config" agentEnabled="true">
<log level="debug" console="true"/>
<!--以下略-->
Dockerfile内のポート開放やdotnet publish
などは適宜書き換えてください。これで、docker build
して実行すれば監視されるはずです。New Relic上にメトリクスが表示されない場合はログを確認してみましょう。