web-dev-qa-db-ja.com

Azureによって構成されたAPPINSIGHTS_INSTRUMENTATIONKEYとApplicationInsights:InstrumentationKeyの違いは何ですか?

Application Insightの構成にはいくつかの混乱があります。 Visual Studioを使用してアプリケーション自体で構成したり、Azure Portalを使用してApp Serviceで構成したりできます。

Visual Studio

Visual Studioを使用して add Application Insights Telemetry をasp.net core 2.0 Webサイトに追加すると、appsettings.jsonに次の構成が追加されます。

_{
// Changes to file post adding Application Insights Telemetry:
  "ApplicationInsights": {
    "InstrumentationKey": "10101010-1010-1010-1010-101010101010"
  }
}
_

次に、startup.csでAppInsightsサービスを次のように構成します。

_var instrumentationKey= Configuration.GetSection("ApplicationInsights:InstrumentationKey").Value;
services.AddApplicationInsightsTelemetry(opt => opt.InstrumentationKey = instrumentationKey);
_

Azureポータル

ただし、Azure PortalのApp Serviceで[Application Insights]タブを開いても、Application Insightに接続するように勧められます。次に、ウィザードは新しい計測キーを構成に追加します。

enter image description here

  1. なぜ2つの異なるキーがあるのですか?
  2. 正確には、どのテレメトリがApp Serviceを生成し、.NET Coreアプリケーション自体を生成します。
  3. InstrumentationKeyが2回設定されるのを回避するにはどうすればよいですか?
  4. APPINSIGHTS_INSTRUMENTATIONKEYのみを使用した場合の副作用(Visual Studioツール内など)は何ですか。つまり、startup.csに次のように記述します。

    _var instrumentationKey= Configuration.GetSection("APPINSIGHTS_INSTRUMENTATIONKEY ").Value;
    services.AddApplicationInsightsTelemetry(opt => opt.InstrumentationKey = instrumentationKey);
    _

編集:

Tsengの回答に基づいて、Azureポータルとappsettings.jsonの両方でAPPINSIGHTS_INSTRUMENTATIONKEYを使用することがベストプラクティスであるという結論に達しました。

ASP.NET Coreは_APPINSIGHTS_INSTRUMENTATIONKEY_と_ApplicationInsights:InstrumentationKey_の両方を認識しますが、Azure Portalは最初のものだけであり、環境変数である必要があります。 2番目を使用し、コードのどこかにあるconfigから読み取ろうとすると、Azure PortalとAzureで実行されているアプリの値が異なる可能性があります。

また、手動で構成からインストルメンテーションキーを読み取る場合は、最初に_APPINSIGHTS_INSTRUMENTATIONKEY_を確認し、次に_ApplicationInsights:InstrumentationKey_を確認する必要があります。

_var instrumentationKey= Configuration.GetSection("APPINSIGHTS_INSTRUMENTATIONKEY")?.Value
    ?? Configuration.GetSection("ApplicationInsights:InstrumentationKey")?.Value;
_

services.AddApplicationInsightsTelemetry(Configuration);も同様に機能するためです。 Azure Portalとappsettings.jsonで設定キーが異なる場合に備えて

16
Liero

まず、Azure App Serviceでホストしない場合、または環境変数を設定したくない場合です。実際に使用されるものは、構成ビルダーの構成方法によって異なります。

通常、あなたはそのようなものを_Startup.cs_または_Programm.cs_に持っています:

_var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    .AddUserSecrets<Startup>()
    .AddEnvironmentVariables(); // Environment Variables override all other
_

_.AddXxx_呼び出しが使用される順序は重要です。一致するキーを持つ最後の登録が使用されます。ここで.AddEnvironmentVariables()は最後のものです。 _APPINSIGHTS_INSTRUMENTATIONKEY_変数が設定されると、ユーザーシークレットの_Appinsights:InstrumentationKey_セットのすべての値、_appsettings.Development.json_または_appsettings.json_が上書きされます。

_APPINSIGHTS_INSTRUMENTATIONKEY_が設定されていない場合、構成ライブラリはユーザーシークレットを調べ、見つかった場合はそれを使用します。見つからない場合は_appsettings.Development.json_を検索し、値が含まれていない場合は_appsettings.json_を検索します。

TL; DR:appsettings.jsonという1つの形式は、環境変数が設定されていない場合にのみ使用されます。

更新

新しい答え

コード に示されているように、登録するApplication Insight拡張メソッドは、一致するエントリが見つかると、環境変数またはappsettings.jsonからの値をオーバーライドします。

.AddEnvironmentVariables()を削除すると、それは削除されませんAzure Portalで設定された値を使用します。これは、.AddEnvironmentVariables()が環境変数をキー_APPINSIGHTS_INSTRUMENTATIONKEY_で構成にロードするためです(以下を参照)。

_private const string InstrumentationKeyFromConfig = "ApplicationInsights:InstrumentationKey";
private const string InstrumentationKeyForWebSites = "APPINSIGHTS_INSTRUMENTATIONKEY";
_

そこに見つからない場合は、appsettings.json _ApplicationInsights:InstrumentationKey_の通常のキーを試します。

あなたの例では

_var instrumentationKey= Configuration.GetSection("APPINSIGHTS_INSTRUMENTATIONKEY ").Value;
services.AddApplicationInsightsTelemetry(opt => opt.InstrumentationKey = instrumentationKey);
_

渡された値は使用されません両方とも環境変数(または.AddEnvironmentVariables())を削除しない限り[〜#〜]および[〜#〜]は、_appsettings.json_からエントリを削除します。

したがって、最も一般的な構成では、

_services.AddApplicationInsightsTelemetry(Configuration);
_

ここで、ConfigurationIConfigurationRootです。このオーバーロードは、環境変数または見つかった場合はappsettings.jsonからそれをロードします。

さらにプログラムで制御したい場合は、

_services.AddApplicationInsightsTelemetry(options => {
    // some logic here, where you can override the default behavior described above
});
_
6
Tseng