しばやん雑記

Azure Serverless とメイドさんが大好きなフリーランスのプログラマーのブログ

App Service と ASP.NET Core で Application Insights を有効化する方法を整理する

Azure App Service に ASP.NET Core アプリケーションをデプロイする時には、必ず Application Insights を同時に有効化するようにしていますが、有効化の方法として 2 種類が存在しているので軽くまとめておきます。

自分でもこのあたりは割と混乱していたのと、App Service 側の挙動が微妙に変わっていたりしたので一度しっかりと確認しておきたかった部分です。

現時点では以下の 2 つの方法で Application Insights を有効化できるようになっています。ASP.NET Core アプリケーションと言ってますが、ASP.NET でもほぼ同じ扱いです。

  • ASP.NET Core に Application Insights をインストールする
  • App Service の Application Insights 設定から有効化する

最終的に得られる結果*1は同じですが、その実現方法が異なっています。結論から先に書くと ASP.NET Core アプリケーションを再ビルドして Application Insights を組み込めるなら、前者の方が良いです。

後者の App Service から Application Insights を有効化する方法は、アプリケーションの再ビルドが必要ではないというメリットはありますが、モジュールのアップデートが遅いので新機能を使いたい場合に不利です。あと、雑検証しかしてないですがリソースの消費が少し多いようでした。

それぞれの方法について有効化する手順を整理しておきます。アプリケーションに Application Insights をインストールする方法はちょいちょい手順が変わっているので、それのまとめ的な面もあります。

ASP.NET Core に Application Insights をインストールする

インストールの手順は比較的ドキュメントにまとまっているので、あらかじめ読んでおくと良いです。昔は UseApplicationInsights を初期化時に呼び出してましたが、いつの間にか廃止扱いになっていました。

Application Insights の NuGet パッケージはアップデートが結構多いですが、基本的には最新版を使っておけば良いです。今は 2 か月毎にアップデートされるスケジュールのようです。

パッケージをインストールすれば、後は Startup の中で AddApplicationInsightsTelemetry を呼び出せば完了です。有効化については二転三転している気がしますが、今はこれが正解です。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        // UseApplicationInsights は使われなくなった
        services.AddApplicationInsightsTelemetry();

        services.AddControllersWithViews();
    }
}

この状態でデバッグ実行するとローカルモードで動作するので、特に appsettings.json などで Application Insights のキーを設定する必要はないです。

Visual Studio から設定すると、Azure 上の Application Insights と関連付けてしまうことがあるので、手動で行った方が安全だと思っています。作業的には難しくはないですし。

後は App Service にデプロイすれば動くようになりますが、ここからが罠が多い部分です。Azure Portal から新しく App Service を作ると同時に Application Insights も作ることが出来ますが、余計な設定がかなり追加されるので好きではありません。

f:id:shiba-yan:20200225172556p:plain

昔は Application Insights の InstrumentationKey のみ設定されてましたが、今は以下のように大量のキーが追加されます。大半のキーはアプリケーションに Application Insights をインストールした場合には不要です。

f:id:shiba-yan:20200224181552p:plain

この中で必要なのは APPLICATIONINSIGHTS_CONNECTION_STRING だけなので、他はすべて消してよいです。

昔は APPINSIGHTS_INSTRUMENTATIONKEY が必要でしたが、今は接続文字列を使うように変更されたようです。ドキュメントもちゃんとあります。

まだ Azure Portal が対応してないようなので、接続文字列だけだと Application Insights を設定した扱いにはならないようですが、利用する分には全く問題ありません。

ちなみに APPINSIGHTS_INSTRUMENTATIONKEY を追加すると以下のような表示になります。

f:id:shiba-yan:20200225172803p:plain

とはいえ、ドキュメントには両方を同時に設定するのは避けた方が良いと書いてあるので従います。

これで Application Insights にテレメトリが送信されるようになります。App Settings でキーを保持しているので ARM Template や Terraform で設定出来るのと、アプリ側に保持する必要がないので管理が楽です。

App Service の Application Insights 設定から有効化する

Azure Portal にある Application Insights から有効化すると、予めシステムにインストールされている Application Insights Agent が使われます。

以下のようなわかりやすい UI が用意されているので、数回のクリックで有効に出来るのは便利です。

f:id:shiba-yan:20200225193441p:plain

アプリケーションに組み込む必要がなく、再デプロイすらも不要ですが Application Insights Agent のバージョンは App Service で管理されているので、任意のタイミングでアップデートされます。

再ビルド無しに組み込むために HostingStartup や XDT などを組み合わせて実現されているので、その分リソース周りにオーバーヘッドが発生しているように見えます。

こういった部分を自分の管理下から外したくないので、アプリケーションに組み込んだ方が良いでしょう。

*1:Application Insights にテレメトリが送信されるという結果