Azure和ApplicationInsights配置的APPINSIGHTS_INSTRUMENTATIONKEY之间有什么区别:InstrumentationKey?

时间:2018-06-06 09:53:08

标签: visual-studio asp.net-core azure-web-sites azure-application-insights

Application Insight配置存在一些混淆。它可以使用Visual Studio在应用程序本身中配置,也可以在使用Azure门户的App Service中配置。

Visual Studio

当我使用Visual Studio add Application Insights Telemetry到我的asp.net core 2.0网站时,它将以下配置添加到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门户的App Service中打开Application Insights选项卡时,它仍建议连接Application Insight。然后,向导会在配置中添加新的Intrumentation Key:

enter image description here

  1. 为什么有两个不同的按键?
  2. 遥测技术究竟是什么产生App Service以及.NET Core应用程序本身。
  3. 如何避免两次配置InstrumentationKey?
  4. 仅使用APPINSIGHTS_INSTRUMENTATIONKEY有什么副作用(例如在Visual Studio工具中)。我的意思是我会在startup.cs中写:

    var instrumentationKey= Configuration.GetSection("APPINSIGHTS_INSTRUMENTATIONKEY ").Value;
    services.AddApplicationInsightsTelemetry(opt => opt.InstrumentationKey = instrumentationKey);
    
  5. 编辑:

    我根据Tseng的回答得出结论,最好在Azure门户网站和appsettings.json中同时使用APPINSIGHTS_INSTRUMENTATIONKEY。

    ASP.NET Core同时理解APPINSIGHTS_INSTRUMENTATIONKEYApplicationInsights:InstrumentationKey,但Azure Portal只是第一个,它必须是环境变量。如果您使用了第二个,并尝试从代码中的某个位置读取它,您可以轻松地在Azure门户和在Azure中运行的应用程序中使用不同的值。

    此外,如果您是从配置中手动阅读检测密钥,则应首先查看APPINSIGHTS_INSTRUMENTATIONKEY,然后查看ApplicationInsights:InstrumentationKey

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

    因为services.AddApplicationInsightsTelemetry(Configuration);的工作原理。以防万一Azure Portal中的设置键与appsettings.json中的设置键不同

2 个答案:

答案 0 :(得分:3)

嗯,第一个是当您不在Azure App Service上托管或者您不想设置环境变量时。实际使用哪一个取决于配置构建器的配置方式。

通常,您在Startup.csProgramm.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:InstrumentationKeyappsettings.Development.json中设置的appsettings.json的所有值。

如果未设置APPINSIGHTS_INSTRUMENTATIONKEY,配置库将查看用户机密并在找到时使用它。如果找不到,则会搜索appsettings.Development.json,如果它不包含值搜索appsettings.json

TL; DR :只有在未设置环境变量时才会使用一个表单appsettings.json。

更新

新答案

the code所示,注册它的Application Insight扩展方法将在找到匹配的条目时覆盖环境变量或appsettings.json中的值。

注意:当您删除.AddEnvironmentVariables() 赢得时,使用Azure门户中设置的值,因为.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() AND 从{{删除条目1}}。

因此对于大多数常见配置,它足以调用

appsettings.json

其中services.AddApplicationInsightsTelemetry(Configuration); Configuration。此重载将从环境变量或appsettings.json(如果找到)加载它。

如果您想对它进行更多编程控制,请使用

IConfigurationRoot

答案 1 :(得分:0)

简短答案:

Azure门户中的

APPINSIGHTS_INSTRUMENTATIONKEY优先于appsettings.json中的ApplicationInsights InstrumentationKey 。

您可以使用APPINSIGHTS_INSTRUMENTATIONKEY 覆盖 appsettings.json的设置。

在Azure门户中不应同时拥有