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 :
TelemetryContext
est-elle suffisante? Devrais-je créer aussi une TelemetryClient
et si oui, devrais-je la lier à la demande actuelle? Comment ?Application_BeginRequest
de global.asax
?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)
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:
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.
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
.
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.
Vous pouvez utiliser le dictionnaire Items
de HttpContext.Current
code 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;
}