Posted at

Linux Docker コンテナに New Relic .NET Coreエージェントをインストールする方法

公式ドキュメントに記載されていますが、まず.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は次のようになります。


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コマンドで確認できるようになります。


newrelic.config

<configuration xmlns="urn:newrelic-config" agentEnabled="true">

<log level="debug" console="true"/>
<!--以下略-->

Dockerfile内のポート開放やdotnet publishなどは適宜書き換えてください。これで、docker buildして実行すれば監視されるはずです。New Relic上にメトリクスが表示されない場合はログを確認してみましょう。