web-dev-qa-db-fra.com

Quelle est la différence entre APPINSIGHTS_INSTRUMENTATIONKEY configuré par Azure et ApplicationInsights: InstrumentationKey?

Il y a une certaine confusion dans la configuration d'Application Insight. Il peut être configuré dans l'application elle-même à l'aide de Visual Studio et dans App Service à l'aide d'Azure Portal.

Visual Studio

Lorsque j'utilise Visual Studio pour ajouter Application Insights Telemetry à mon site Web asp.net core 2.0, il ajoute la configuration suivante à appsettings.json:

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

Je configure ensuite les services AppInsights dans le startup.cs comme ceci:

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

Portail Azure

Cependant, lorsque j'ouvre l'onglet Application Insights dans App Service dans Azure Portal, il suggère toujours de connecter Application Insight. L'assistant ajoute ensuite une nouvelle clé d'intrumentation à la configuration:

enter image description here

  1. Pourquoi il y a deux clés différentes?
  2. Exactement ce que la télémétrie produit App Service et ce que l'application .NET Core elle-même.
  3. Comment puis-je éviter d'avoir configuré InstrumentationKey deux fois?
  4. Quels sont les effets secondaires (par exemple à l'intérieur de l'outillage Visual Studio) de l'utilisation de APPINSIGHTS_INSTRUMENTATIONKEY uniquement. Je veux dire que j'écrirais dans startup.cs:

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

ÉDITER:

Je suis arrivé à la conclusion sur la base de la réponse de Tseng qu'il est préférable d'utiliser APPINSIGHTS_INSTRUMENTATIONKEY à la fois dans le portail Azure et dans appsettings.json.

ASP.NET Core comprend à la fois APPINSIGHTS_INSTRUMENTATIONKEY Et ApplicationInsights:InstrumentationKey, Mais Azure Portal n'est que le premier et il doit s'agir d'une variable d'environnement. Si vous avez utilisé la seconde et essayé de la lire à partir de la configuration quelque part dans le code, vous pourriez facilement vous retrouver avec des valeurs différentes dans Azure Portal et dans votre application exécutée dans Azure.

De plus, si vous lisez manuellement la clé d'instrumentation depuis la configuration, vous devez d'abord regarder APPINSIGHTS_INSTRUMENTATIONKEY Puis ApplicationInsights:InstrumentationKey:

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

car c'est ainsi que fonctionne services.AddApplicationInsightsTelemetry(Configuration);. Juste au cas où il y aurait une clé de paramètre différente dans Azure Portal que dans appsettings.json

11
Liero

Eh bien, le premier est lorsque vous n'hébergez pas sur Azure App Service ou lorsque vous ne souhaitez pas définir de variable d'environnement. Lequel est réellement utilisé, dépend de la façon dont votre générateur de configuration est configuré.

Habituellement, vous avez quelque chose comme ça dans Startup.cs Ou 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

L'ordre dans lequel les appels .AddXxx Sont utilisés importe. Le dernier enregistrement avec une clé correspondante sera utilisé. Ici .AddEnvironmentVariables() est le dernier. Lorsqu'une variable APPINSIGHTS_INSTRUMENTATIONKEY Est définie, elle remplace toutes les valeurs de Appinsights:InstrumentationKey Définies dans les secrets utilisateur, appsettings.Development.json Ou appsettings.json.

Si APPINSIGHTS_INSTRUMENTATIONKEY N'est pas défini, la bibliothèque de configuration examinera les secrets de l'utilisateur et l'utilisera s'il est trouvé. S'il n'est pas trouvé, il recherchera appsettings.Development.json Et s'il ne contient pas la valeur recherchée appsettings.json.

TL; DR : Le formulaire unique appsettings.json ne sera utilisé que lorsqu'aucune variable d'environnement n'est définie.

Mise à jour

Nouvelle réponse

Comme vu dans le code , la méthode d'extension Application Insight pour l'enregistrer remplacera les valeurs de la variable d'environnement ou de appsettings.json lorsqu'elle trouvera les entrées correspondantes.

Remarque : Lorsque vous supprimez la .AddEnvironmentVariables() elle ne sera jamais utilisez la valeur définie dans Azure Portal, car la .AddEnvironmentVariables() charge la variable d'environnement dans la configuration avec la clé APPINSIGHTS_INSTRUMENTATIONKEY (voir ci-dessous).

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

Quand il n'y est pas trouvé, il essaie la clé régulière de appsettings.json ApplicationInsights:InstrumentationKey.

Dans votre exemple

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

La valeur transmise ne sera pas utilisée sauf si vous deux, supprimez la variable d'environnement (ou .AddEnvironmentVariables()) [~ # ~] et [~ # ~] supprimez l'entrée de appsettings.json.

Donc, pour la configuration la plus courante, il suffit d'appeler

services.AddApplicationInsightsTelemetry(Configuration);

Configuration est le IConfigurationRoot. Cette surcharge la chargera à partir de la variable d'environnement ou de appsettings.json si elle est trouvée.

Lorsque vous souhaitez plus de contrôle programmatique sur celui-ci, vous utilisez le

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