web-dev-qa-db-fra.com

Ajout de propriétés personnalisées pour chaque demande dans les métriques Application Insights

Je voudrais ajouter des propriétés personnalisées aux métriques prises par Application Insights à chaque demande de mon application. Par exemple, je souhaite ajouter le nom d'utilisateur et le code de client hébergé, tels que je peux segmenter/grouper les métriques dans le portail Azure.

La page de document pertinente semble être celle-ci: Définir les valeurs de propriété par défaut

Mais l'exemple est pour un événement (c'est-à-dire gameTelemetry.TrackEvent("WinGame");), pas pour une requête HTTP:

var context = new TelemetryContext();
context.Properties["Game"] = currentGame.Name;
var gameTelemetry = new TelemetryClient(context);
gameTelemetry.TrackEvent("WinGame");

Mes questions :

  1. Quel est le code pertinent pour une demande, car je n'ai pas de code spécifique pour le moment (il semble que ce soit géré automatiquement par le kit de développement logiciel App Insights): La création d'une TelemetryContext est-elle suffisante? Devrais-je créer aussi une TelemetryClient et si oui, devrais-je la lier à la demande actuelle? Comment ?
  2. Où devrais-je mettre ce code? Est-ce correct dans la méthode Application_BeginRequest de global.asax?
25
JYL

Il semble possible d'ajouter de nouvelles propriétés à une requête existante en utilisant ITelemetryInitializer comme indiqué here .

J'ai créé un exemple de classe comme indiqué ci-dessous et ajouté une nouvelle propriété appelée "LoggedInUser" pour demander la télémétrie. 

public class CustomTelemetry : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        if (requestTelemetry == null) return;
        requestTelemetry.Properties.Add("LoggedInUserName", "DummyUser");

    }
}

Enregistrez cette classe lors de l'événement de démarrage de l'application . L'exemple ci-dessous est extrait de l'exemple d'application MVC que j'ai créé.

 public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        TelemetryConfiguration.Active.TelemetryInitializers
    .Add(new CustomTelemetry());
    }
}

Vous pouvez maintenant voir que la propriété personnalisée "LoggedInUserName" est affichée sous Groupe de propriétés de demande personnalisé. (s'il vous plaît se référer écran ci-dessous)

Appinsight avec la propriété personnalisée

17
Jitendra Patil

En ce qui concerne la première question "comment ajouter un événement personnalisé à ma demande/quel est le code pertinent à une demande", je pense que la confusion principale est liée à la dénomination. 

La première chose à souligner est qu’il existe différents types d’informations que nous pouvons capturer avec Application Insights:

  1. Événement personnalisé
  2. Demande
  3. Exception
  4. Trace
  5. Vue de page
  6. Dépendance

Une fois que nous le savons, nous pouvons dire que TrackEvent est lié à "Événements personnalisés", tout comme TrackRequest est lié à Requests.

Lorsque nous voulons enregistrer une demande, nous devons procéder comme suit:

 var request = new RequestTelemetry();
 var client = new TelemetryClient();
 request.Name = "My Request";
 client.TrackRequest(countEvent);

Imaginons donc que votre identifiant utilisateur et votre code de locataire soient des chaînes. Nous pourrions faire une nouvelle demande juste pour enregistrer ces informations en utilisant le code suivant:

    public void LogUserNameAndTenant(string userName, string tenantCode)
    {
        var request = new RequestTelemetry();

        request.Name = "My Request";
        request.Context.Properties["User Name"] = userName;
        request.Context.Properties["Tenant Code"] = tenantCode;

        var client = new TelemetryClient();
        client.TrackRequest(request);
    }

Faire juste un TelemetryContext ne suffira pas, car nous avons besoin d'un moyen d'envoyer l'information, et c'est là que le TelemetryClient est mis en place.

J'espère que ça aide.

13
Pliyo

Comme Alan l'a mentionné, vous pouvez implémenter l'interface IContextInitializer pour ajouter des propriétés personnalisées à TOUTES les opérations de télémétrie envoyées par Application Insights. Cependant, je suggérerais également de regarder dans l'interface ITelemtryInitializer. Il ressemble beaucoup à l'initialiseur de contexte, mais il est appelé pour chaque élément de télémétrie envoyé plutôt que seulement lors de la création d'un client de télémétrie. Cela me semble plus utile pour la journalisation des valeurs de propriété susceptibles de changer pendant la durée de vie de votre application, telles que les informations relatives aux utilisateurs et aux locataires, comme vous l'avez mentionné.

J'espère que cela vous aide. Voici un article blog avec un exemple d'utilisation de la variable ITelemetryInitializer.

2
amayer42

Dans cette documentation, faites défiler quelques lignes jusqu'à l'endroit où il est question de créer une implémentation de IContextInitializer. Vous pouvez appeler cela avec n'importe quelle méthode qui sera appelée avant que la télémétrie ne commence à rouler.

Vos propriétés personnalisées seront ajoutées à tous les événements, exceptions, métriques, demandes, etc.

0
Alan Wills -MSFT

Vous pouvez utiliser le dictionnaire Items de HttpContext.Currentcode statique comme espace de stockage à court terme (presque sans état) pour transmettre vos valeurs de propriété personnalisées au gestionnaire de télémétrie par défaut avec une variable ITelemetryInitializer

Gestionnaire d'implémentation 

class AppInsightCustomProps : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        // Is this a TrackRequest() ?
        if (requestTelemetry == null) return;

        var httpCtx = HttpContext.Current;
        if (httpCtx != null)
        {
            var customPropVal = (string)httpCtx.Items["PerRequestMyCustomProp"];
            if (!string.IsNullOrWhiteSpace(customPropVal))
            {
                requestTelemetry.Properties["MyCustomProp"] = customPropVal;
            }
        }
    }
}

Accrochez-le. Mettez ceci à l'intérieur de Application_Start dans global.asax.cs

TelemetryConfiguration.Active.TelemetryInitializers.Add(new AppInsightCustomProps());

Programmez la propriété personnalisée souhaitée, où que vous soyez dans votre pipeline de demandes

if (HttpContext.Current != null)
{
    HttpContext.Current.Items["PerRequestMyCustomProp"] = myCustomPropValue;
}
0
DeepSpace101