web-dev-qa-db-fra.com

Utilisation d'une instance statique de TelemetryClient avec Application Insights

J'ai un site Web ASP.NET MVC et j'implémente Application Insights. En ce moment, j'enregistre un événement de trace comme suit:

private static TelemetryClient _APM;
private static TelemetryClient APM
{
    get
    {
        if (_APM == null) { _APM = new TelemetryClient(); }
        return _APM;
    }
}

public static void Trace(string Message)
{
    APM.TrackTrace(Message);
}

Comme vous pouvez le voir, cela conserverait une seule instance statique de TelemetryClient pour toutes les traces. Est-ce ainsi que nous sommes censés utiliser le client? Ou sommes-nous censés créer une nouvelle instance de TelemetryClient pour chaque journal?

18
William

Selon la documentation vous devez:

... utilisez une instance de TelemetryClient pour chaque module de votre application. Par exemple, vous pouvez avoir un TelemetryClient dans votre service Web pour signaler les demandes http entrantes, et un autre dans une classe middleware pour signaler les événements de logique métier.

Il est probablement coûteux de créer un nouveau client de télémétrie pour chaque journal, donc selon la structure de votre application, vous avez probablement raison d'utiliser le modèle singleton que vous avez décrit dans votre article.

16
darth_phoenixx

La citation complète référencée par darth_phoenixx se lit en fait:

TelemetryClient est thread-safe.

Pour ASP.NET et Java, les demandes HTTP entrantes sont automatiquement capturées. Vous souhaiterez peut-être créer des instances supplémentaires de TelemetryClient pour un autre module de votre application. Par exemple, vous pouvez avoir une instance TelemetryClient dans votre classe de middleware pour signaler les événements de logique métier. Vous pouvez définir des propriétés telles que UserId et DeviceId pour identifier la machine. Ces informations sont attachées à tous les événements envoyés par l'instance.

TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";

Ce dernier morceau est extrêmement important. Si vous écrivez quelque chose comme une application Web où l'UserId pourrait changer, vous devriez probablement réutiliser une instance du client de télémétrie pour chaque étendue dans laquelle ces valeurs seraient toutes les mêmes (comme chaque demande), mais pas comme un statique/singleton exemple.

Mettre à jour

Dans ASP.NET Core, Application Insights fait un usage intensif de l'injection de dépendances et enregistre TelemetryClient en tant que singleton!

Cela signifie que vous devez éviter définir des variables sur le contexte client que vous ne souhaitez pas utiliser dans l'application, et plutôt utiliser les initialiseurs de télémétrie pour définir des choses comme l'ID utilisateur sur chaque objet de télémétrie.

6
StriplingWarrior