Application Insightの構成にはいくつかの混乱があります。 Visual Studioを使用してアプリケーション自体で構成したり、Azure Portalを使用してApp Serviceで構成したりできます。
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 PortalのApp Serviceで[Application Insights]タブを開いても、Application Insightに接続するように勧められます。次に、ウィザードは新しい計測キーを構成に追加します。
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で設定キーが異なる場合に備えて
まず、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);
_
ここで、Configuration
はIConfigurationRoot
です。このオーバーロードは、環境変数または見つかった場合はappsettings.jsonからそれをロードします。
さらにプログラムで制御したい場合は、
_services.AddApplicationInsightsTelemetry(options => {
// some logic here, where you can override the default behavior described above
});
_