1
votes

Application Insights pour l'application API Web

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 commentaires

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


4 Réponses :


0
votes

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.


2 commentaires

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».



0
votes

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:

entrez la description de l'image ici

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.


0 commentaires

1
votes

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)


0 commentaires

0
votes

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


0 commentaires