webentwicklung-frage-antwort-db.com.de

Hinzufügen benutzerdefinierter Eigenschaften für jede Anforderung in Application Insights-Metriken

Ich mag es, benutzerdefinierte Kennzahlen zu Metriken hinzuzufügen, die von Application Insights zu jeder Anforderung meiner App verwendet werden. Ich möchte beispielsweise die Benutzeranmeldung und den Mandantencode hinzufügen, z. B. kann ich die Metriken im Azure-Portal segmentieren/gruppieren.

Die relevante Dokumentseite scheint die folgende zu sein: Standardeigenschaftswerte setzen

Das Beispiel bezieht sich jedoch auf ein Ereignis (d. H. gameTelemetry.TrackEvent("WinGame");), nicht auf eine HTTP-Anforderung:

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

Meine Fragen :

  1. Was ist der relevante Code für eine Anforderung, da ich derzeit keinen spezifischen Code habe (er wird automatisch vom App Insights SDK verwaltet): Ist das Erstellen eines TelemetryContext ausreichend? Soll ich auch einen TelemetryClient anlegen und wenn ja, sollte ich ihn mit der aktuellen Anfrage verknüpfen? Wie ?
  2. Wo soll ich diesen Code einfügen? Ist es in der Application_BeginRequest-Methode von global.asax in Ordnung?
25
JYL

Es scheint, dass das Hinzufügen neuer Eigenschaften zu einer bestehenden Anfrage mit ITelemetryInitializer wie angegeben here möglich ist.

Ich habe die Beispielklasse wie unten angegeben erstellt und die neue Eigenschaft "LoggedInUser" hinzugefügt, um Telemetrie anzufordern. 

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

    }
}

Registrieren Sie diese Klasse beim Anwendungsstartereignis . Das folgende Beispiel wird aus der von mir erstellten Beispiel-MVC-Anwendung herausgeschnitten

 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());
    }
}

Nun sehen Sie die benutzerdefinierte Eigenschaft "LoggedInUserName" unter der Gruppe der benutzerdefinierten Anforderungseigenschaften. (siehe Screenshot unten)

Appinsight mit benutzerdefinierter Eigenschaft

17
Jitendra Patil

Im Zusammenhang mit der ersten Frage "Wie kann ich meiner Anfrage ein benutzerdefiniertes Ereignis hinzufügen/was ist der relevante Code einer Anfrage", denke ich, dass die Hauptverwirrung hier mit der Benennung zusammenhängt. 

Als Erstes müssen wir darauf hinweisen, dass es verschiedene Arten von Informationen gibt, die wir mit Application Insights erfassen können:

  1. Benutzerdefiniertes Ereignis
  2. Anfordern
  3. Ausnahme
  4. Spur
  5. Seitenansicht
  6. Abhängigkeit

Sobald wir dies wissen, können wir sagen, dass TrackEvent mit "Custom Events" zusammenhängt, da TrackRequest mit Requests zusammenhängt.

Wenn wir eine Anfrage speichern möchten, müssen wir Folgendes tun:

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

Stellen wir uns also vor, dass Ihre Benutzeranmeldung und der Tenant-Code beide Zeichenfolgen sind. Wir könnten eine neue Anfrage stellen, um diese Informationen mit folgendem Code zu protokollieren:

    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);
    }

Es reicht nicht aus, nur einen TelemetryContext zu verwenden, da wir einen Weg brauchen, um die Informationen zu senden. Hier kommt der TelemetryClient zum Einsatz.

Ich hoffe, es hilft.

13
Pliyo

Wie von Alan erwähnt, können Sie die IContextInitializer-Schnittstelle implementieren, um ALLE von Application Insights gesendeten Telemetrien benutzerdefinierte Eigenschaften hinzuzufügen. Ich würde jedoch auch vorschlagen, in die ITelemtryInitializer-Schnittstelle zu schauen. Es ist dem Kontextinitialisierer sehr ähnlich, wird jedoch für jede gesendete Telemetrie aufgerufen und nicht nur beim Erstellen eines Telemetrie-Clients. Dies scheint mir nützlicher zu sein, um Eigenschaftswerte zu protokollieren, die sich im Laufe der Lebensdauer Ihrer App ändern können, wie z. B. Informationen zu Benutzern und Mandanten, die Sie erwähnt haben.

Ich hoffe das hilft dir weiter. Hier ist ein Blogbeitrag mit einem Beispiel für die Verwendung der ITelemetryInitializer.

2
amayer42

Scrollen Sie in diesem Dokument ein paar Zeilen nach unten, bis dort die Erstellung einer Implementierung von IContextInitializer beschrieben wird. Sie können dies in jeder Methode aufrufen, die aufgerufen wird, bevor die Telemetrie startet.

Ihre benutzerdefinierten Eigenschaften werden zu allen Ereignissen, Ausnahmen, Metriken, Anforderungen und allem hinzugefügt.

0

Sie können das Items-Wörterbuch von static HttpContext.Current als kurzfristigen (nahezu zustandslosen) Speicherplatz verwenden, um Ihre benutzerdefinierten Eigenschaftswerte mit einer benutzerdefinierten ITelemetryInitializer in den Standard-Telemetriehandler zu übergeben.

Implementieren Sie den Handler 

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;
            }
        }
    }
}

Haken Sie es ein. Legen Sie es in Application_Start in global.asax.cs ein.

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

Programmieren Sie die gewünschte benutzerdefinierte Eigenschaft an einer beliebigen Stelle in Ihrer Anforderungspipeline

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