В чем разница между APPINSIGHTS_INSTRUMENTATIONKEY, настроенным Azure, и ApplicationInsights: InstrumentationKey? - PullRequest
0 голосов
/ 06 июня 2018

Существует некоторая путаница в конфигурации Application Insight.Его можно настроить в самом приложении с помощью Visual Studio и в службе приложений на портале Azure.

Visual Studio

Когда я использую Visual Studio для , добавьте 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"
  }
}

Затем я настраиваю службы AppInsights в файле startup.cs следующим образом:

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

Azure Portal

Однако, когда я открываю вкладку Application Insights в службе приложений на портале Azure, он все равно предлагает подключить Application Insight.Затем мастер добавляет новый ключ Intrumentation Key в конфигурацию:

enter image description here

  1. Почему существуют два разных ключа?
  2. Точно какая телеметриясоздает службу приложений и то, что само приложение .NET Core.
  3. Как можно избежать двойной настройки InstrumentationKey?
  4. Каковы побочные эффекты (например, в инструментах Visual Studio)используя только APPINSIGHTS_INSTRUMENTATIONKEY.Я имею в виду, что я написал бы в startup.cs:

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

РЕДАКТИРОВАТЬ:

Я пришел к выводу, основываясь на ответе Tseng, что это лучшая практика для использованияAPPINSIGHTS_INSTRUMENTATIONKEY как на портале Azure, так и в appsettings.json.

ASP.NET Core понимает как APPINSIGHTS_INSTRUMENTATIONKEY и ApplicationInsights:InstrumentationKey, но портал Azure только первый, и он должен быть переменной среды.Если вы воспользовались вторым и попытались прочитать его из конфигурации где-то в коде, вы легко могли бы получить разные значения в портале Azure и в своем приложении, работающем в Azure.

Кроме того, если вы читаете вручнуюключ инструментов из конфигурации, вы должны сначала взглянуть на APPINSIGHTS_INSTRUMENTATIONKEY, а затем на ApplicationInsights:InstrumentationKey:

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

, потому что так работает services.AddApplicationInsightsTelemetry(Configuration);.На всякий случай в портале Azure будет другой ключ настройки, чем в appsettings.json

1 Ответ

0 голосов
/ 06 июня 2018

Ну, во-первых, если вы не размещаете службу приложений Azure или не хотите устанавливать переменную среды.Какой из них действительно используется, зависит от того, как настроен ваш конфигуратор.

Обычно у вас есть что-то подобное в 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когда переменная окружения не установлена.

Обновление

Новый ответ

Как видно из кода , метод расширения Application Insight для его регистрации будет переопределять значения из любой переменной средыили из appsettings.json, когда он находит соответствующие записи.

Примечание : при удалении .AddEnvironmentVariables() it никогда не будет использовать значение, установленное в портале 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 удалить запись из appsettings.json.

Так что для наиболее распространенной конфигурации достаточно вызвать

services.AddApplicationInsightsTelemetry(Configuration);

, где Configuration - это IConfigurationRoot.Эта перегрузка будет загружать его из переменной среды или из appsettings.json, если она найдена.

Если вы хотите более программный контроль над ним, вы используете

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