Wie würden Sie brechen und melden Sie sich die Ausführungszeiten der verschiedenen Teile Ihrer Anwendung?

StackOverflow https://stackoverflow.com/questions/1026009

  •  06-07-2019
  •  | 
  •  

Frage

Wir haben eine Web-Anwendung erstellt, die SOAP-Nachrichten akzeptiert, tut einige Verarbeitung, auf einen anderen Web-Service ruft, Massagen die Antwort und sendd es wieder auf den ursprünglichen Anrufer.

Wir möchten loggen sein, in einer einzigen Zeile, die verschiedenen Ausführungszeiten für diese verschiedenen Schritte. Wir verwenden log4j mit dem JBossWS Stack. Mit anderen Worten, wir würden die Log-Ausgabe in etwa so aussehen mögen:

2009-06-10T16:19:31.487 3336/2449/861

Dabei gilt 3336ms die Gesamtzeit ist die Anforderung ausgegeben dient, 2449ms ist die Zeit für die Web-Service-Antwort warten verbracht, und 861ms ist die Zeit damit verbracht intern die Daten zu massieren.

passieren Diese verschiedenen Berechnungen an verschiedenen Orten in unserem Code und wir können nicht nur Zeit jeder von ihnen und einen Anruf an den Logger am Ende einer einzigen Methode machen. Einer von uns hat vorgeschlagen, log4j MDC für das als einen armen Mann Satz globaler Variablen mit den verschiedenen Ausführungen Zeiten zu verfolgen.

Also meine Fragen sind:

  1. Ist das ein schrecklicher Missbrauch des primären Absicht des MDC?
  2. Wenn ja, wie würden Sie diese sonst tun?
War es hilfreich?

Lösung

Weitere Informationen finden sie unter SLF4J Profiler . Interessanterweise. tt wurde entwickelt, um das exakt gleiche Bedürfnis zu beantworten, das ist die Leistung von SOAP-Aufrufen zu messen und zu verbessern.

Andere Tipps

Klingt wie ein Job für Perf4J .

Ich würde folgendes tun:

  1. erstellen PerformanceTimer Klasse, die macht:
    • recordWaitedForWebServerReponse (operationId, Zeit);
    • recordMassagedData (operationId, Zeit);
    • andere Methoden, bei Bedarf
  2. injizieren diese Klasse, wo es gebraucht wird;
  3. haben die PerformanceTimer eine gleichzeitige Karte OperationId halten -> OperationTimingData;
  4. auf dem Methodenaufruf bekannt, dass die letzte sein, rufen Sie Log4j mit der Ausgabe, die Sie gewünscht wird.

Während es wäre sicherlich arbeiten, schrecken sie zurück ich bei dem Gedanken, auch. Mein Vorschlag wäre, eine Timing-Klasse zu erstellen, zu diesem Zweck der ThreadLocal eine Variable pro Anfrage erstellen verwendet.

Wenn die Anfrage kommt, erstellen Sie die Variable (eine long mit der Startzeit). Wenn bereits die Variable vorhanden ist, lassen Sie es allein. Wenn wird das Ergebnis zurück an den Client gesendet, können Sie die Dauer berechnen und protokollieren.

würde ich Frühling und aspektorientierte Programmierung, es zu tun. Das Schöne daran ist, dass ich einmal die Logik schreiben würde und wende es deklarativ überall, wo ich es brauchte.

Eine einfache Möglichkeit ist System.currentTimeMillis() zu verwenden, die Zeit in Millisekunden zurück. Die Differenz zwischen dem millisec zu Beginn des Verfahrens und die milli Sekunden am Ende des Verfahrens wird der milli SEC genommen geben für diese bestimmte Methode auszuführen. Hoffe, dass System.currentTimeMillis() wird Ihnen helfen.

Wir verwenden diese nur in unserem ersten Anfrage Filter:

logger.trace("Init");
long start = System.currentTimeMillis();

//do stuff here 

long stop = System.currentTimeMillis();
String time = Util.getTimeDifferenceInSec(start, stop);
logger.trace("Complete in " + time + " sec");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top