Table of Contents

Manuelle Requests im Session Analyzer

Der Broker protokolliert automatisch jeden Request im SessionLogging. Bei Services gibt es keine Requests, die generell von einer FS-Logik überwacht und sicher einer "Session" zugeordnet werden können. Um jedoch auch Services in die Protokollierung einfließen zu lassen, kann man gezielt eigene Requests protokollieren.

Die eigentliche Session hängt am Global. Jede Instanz eines GlobalObject ist gleichzeitig auch eine eigene Session und erzeugt somit auch einen eigenen Datensatz in der SessionLogging-Tabelle. Bei Services kann das verschiedene Auswirkungen haben:

  • Wenn in einer Service-Methode ein neues Global erzeugt wird (Property GenerateGlobalObjects an der Service-Methode), dann bedeutet das JEDES mal eine neue Session.
  • In Umgebungen mit mehreren Globals (z.B. Job-Server) baut auch dort jedes Global eine eigene Session auf. Somit erzeugt ein laufender Service mehrere Einträge im SessionLogging.
  • Die Session "läuft", solange das Global existiert. Dadurch können sich Sessions über einen sehr langen Zeitraum - ggf. mehrere Tage oder Wochen - erstrecken. Zeitliche Zusammenhänge lassen sich dadurch sehr bedingt erfassen.

Die DB-Commands werden über die Connection automatisch am Global gesammelt - und zwar über die komplette Session und nicht nur während der protokollieren Requests.

Nur dann, wenn mindestens 1 Request protokolliert wurde, landet die Session im Runtime-Repository.

Requests protokollieren

Das Session-Logging ist ursprünglich für Broker-Requests ausgelegt und betrachtet deshalb die Folgenden Informationen:

  • FormName (der FullName des Forms)
  • ControlName
  • EventName

Es wird die Anzahl und die Gesamt-Zeit der Requests gespeichert. Dabei wird nach allen 3 Informationen gruppiert.

Auch die manuellen Requests müssen aus diesen Informationen bestehen. Es muss selbst entschieden werden, wie man diese 3 Felder mit eigenen Informationen bestückt.

Beispiel Job-Server:

  • FormName = "JobServer"
  • ControlName = FullName der Component (also Art des Jobs)
  • EventName = ID des Jobs (so lassen sich verschiedene Job-Konfigurationen unterscheiden)

Über this.Global.SessionLogging werden verschiedene Varianten für die Protokollierung angeboten:

Variante 1

RequestDisposable(string formName, string controlName, string eventName)

Es wird ein Disposable zurückgegeben. Ein using-Block übernimmt automatisch die Zeit-Messung.

Beispiel:

using(this.Global.SessionLogging.RequestDisposable("MyForm", "MyControl", "MyEvent"))
{
    // Code ...
}

Variante 2

RequestDisposable()

Es wird ein Objekt mit dem Typ SessionRequestDisposable zurückgegeben. Wenn die Request-Informationen erst im Laufe der Verarbeitung bekannt sind, können sie an diesem Objekt gesetzt werden. Der Request wird am Ende nur protokolliert, wenn am SessionRequestDisposable-Objekt mindestens 1 Information gesetzt ist.

Der Using-Block übernimmt automatisch die Zeit-Messung.

using(SessionRequestDisposable request = this.Global.SessionLogging.RequestDisposable())
{
    // Code ...

    request.FormName = "MyForm";
    request.ControlName = "MyControl";
    request.EventName = "MyEvent";

    // Code ...
}

Variante 3

AddRequest(string formName, string controlName, string eventName, TimeSpan duration)

Die Zeit-Messung erfolgt manuell - z.B. über eine Stopwatch.

System.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew();
try
{
    // Code ...
}
finally
{
    this.Global.SessionLogging.AddRequest("MyForm", "MyControl", "MyEvent", stopwatch.Elapsed);
}