Est-il possible d'indiquer à Application Insights d'utiliser une InstrumentationKey différente en fonction de l'URL de la requête?
Notre application fonctionne avec différents clients et nous voulons séparer les journaux pour eux dans différentes instances d'Application Insights.
Format d'URL: https://webapi.com/v1/ {client_name} / bla / bla
Ce serait génial de configurer la configuration pour sélectionner InstrumentationKey par nom_client à partir de la requête.
4 Réponses :
Vous pouvez le faire. Si vous avez un enregistreur, faites paramétrer ApplicationInsightsKey et transmettez la clé pour le client à chaque appel, ou injectez-la au chargement si votre application est basée sur le client.
Consultez les documents ici: Séparation de la télémétrie du développement, du test et de la production
Microsoft.ApplicationInsights.Extensibility. TelemetryConfiguration.Active.InstrumentationKey = <App-Insights-Key-for-the-client>
Modifiez simplement la clé Application Insights avant de vous connecter et cela fera le travail.
La modification de .Active ikey affecte d'autres requêtes parallèles. S'il y a une seule demande à un moment donné, cela fonctionne. Mais la plupart des applications ont des demandes parallèles et cela ne fonctionnera pas là-bas.
c'est vrai, exactement ce que j'ai mentionné - «passez la clé pour le client à chaque appel, ou injectez-la en charge si votre application est basée sur le client».
Ce serait génial de configurer la configuration pour sélectionner InstrumentationKey par nom_client de la demande.
Vous pouvez sélectionner dynamiquement le
ikey
selon le client_name de la demande. Tout d'abord, vous devez obtenir l'URL de la requête, puis vérifier le nom_client.Pour ce faire, vous pouvez ajouter le code suivant au fichier
Global.asax
:void Application_BeginRequest(Object source, EventArgs e) { var app = (HttpApplication)source; //get the request url var uriObject = app.Context.Request.Url.ToString(); if (uriObject.Contains("/client_name_1")) { Microsoft.ApplicationInsights.Extensibility. TelemetryConfiguration.Active.InstrumentationKey = "ikey_1"; } else if (uriObject.Contains("/client_name_2")) { Microsoft.ApplicationInsights.Extensibility. TelemetryConfiguration.Active.InstrumentationKey = "ikey_2"; } else { Microsoft.ApplicationInsights.Extensibility. TelemetryConfiguration.Active.InstrumentationKey = "ikey_3"; } }Le résultat du test:
Mais je veux dire que nous utilisons rarement 1 plus d'ikeys dans un environnement. Si votre objectif est de ne pas encombrer les données, je vous suggère de n'utiliser qu'un seul ikey, puis d'utiliser Kusto query pour vos besoins.
Si l'objectif est d'envoyer différents éléments de télémétrie à différentes clés d'instrumentation, la bonne façon d'y parvenir est de modifier l'élément individuel avec un TelemetryInitializer pour avoir le bon ikey.
Un initialiseur comme celui-ci:
item.Context.InstrumentationKey = ikey.
Cet initialiseur doit accéder à HttpContext et décider de l'ikey dynamiquement à partir de la route de la requête / d'autres paramètres.
La modification de TC.Active n'est pas recommandée à cette fin car il s'agit d'un paramètre partagé global.
(Ce n'est pas un cas d'utilisation très courant - mais il y a des équipes au sein de Microsoft qui le font pour les applications à l'échelle PROD)
Grâce aux réponses de @cijothomas et @danpop ( lien ), j'ai pu comprendre la situation dans son ensemble.
p> Étape 1 : Créez un ITelemetryInitializer personnalisé ( Documentation Microsoft ):
var config = new LoggingConfiguration(); ConfigurationItemFactory.Default.Targets.RegisterDefinition("ai", typeof()); ApplicationInsightsTarget aiTarget = new ApplicationInsightsTarget(); aiTarget.InstrumentationKey = "your_key"; aiTarget.Name = "ai"; config.AddTarget("ai", aiTarget); LogManager.Configuration = config;
Étape 2 : enregistrer l'initialiseur personnalisé:
XXX
OU
protected void Application_Start() { // ... TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer()); }
Étape 3 : Apportez quelques ajustements à l'enregistreur (code source tiré de @danpop answer Configuration de la cible Logger ):
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings"> <TelemetryInitializers> <Add Type="Application.WebAPI.MyTelemetryInitializer, Application.WebAPI"/> </TelemetryInitializers> <!--<InstrumentationKey>f8ceb6cf-4357-4776-a2b6-5bbed8d2561c</InstrumentationKey>--> </ApplicationInsights>
Exemples de configuration ILogger: Log4Net, NLog, System.Diagnostics
c'est une API Web .NET Framework? pas .NET core?
@IvanYang C'est un framework .NET
Si la réponse fonctionne, pouvez-vous l'accepter comme réponse? Merci. Ce serait utile pour les autres.
J'ai dû passer à une tâche urgente. Je mettrai à jour la question lorsque je reviendrai à l'intégration d'Application Insights