Mit Tags unerwartete Bugs aufspüren
Wie das Execution-Tagging in MoSKito 2.8.5 mit @TagParameter und @TagReturnValue funktioniert und wie uns Tags in Kombination mit Tracern halfen, einen echten Bug durch ungültige Postleitzahlen aufzuspüren.
MoSKito bietet viele leistungsstarke Funktionen: Es kann nahezu jeden Aspekt Ihrer Anwendung überwachen und ist das weltweit beste Open-Source-APM für Java. Manchmal kann all diese Funktionalität für den Benutzer jedoch etwas überwältigend sein, und es kann schwierig werden herauszufinden, wie Sie Ihre Anwendung effizient überwachen. Um dem zu begegnen und Ihnen ein Beispiel für Problemlösung mit MoSKito zu geben, gewähren wir Ihnen heute einen Einblick in einen realen Fall, in dem wir mit MoSKito Bugs aufgespürt und eine Anwendung optimiert haben.
Execution-Tagging
Das Release MoSKito 2.8.5 bringt einige neue und spannende Werkzeuge mit! Eine der neuesten Funktionen ist die Möglichkeit, eine Ausführung mit Tags zu versehen.
Tags können automatisch vergeben werden, etwa User-Agent oder IP. Sie können auch aus Session- oder Request-Attributen und -Parametern übernommen werden. Standardmäßig erzeugt MoSKito bei der Verwendung von Tracern die folgenden Tags:

Das wirklich Coole an Tags ist, dass wir fast alles als Tag verwenden können! Sie können jeden Parameter eines beliebigen Java-Methodenaufrufs taggen, indem Sie in der Methodendeklaration direkt vor dem Typ des getaggten Parameters die Annotation @TagParameter(name = “tagName”) verwenden. Natürlich funktioniert dasselbe auch mit den Rückgabewerten jeder Methode – verwenden Sie dazu einfach @TagReturnValue(name = “tagName”) vor der Methodendeklaration. Hier ein Beispiel, wie eine solche annotierte Methode aussehen kann:
@TagReturnValue(name = "notificationId")
public String sendNotificationAboutOrder(String customerId, @TagParameter(name = "email") String email, String message)
Sowohl der E-Mail-Parameter als auch der Rückgabewert mit der Notification-ID werden von MoSKito überwacht und stehen im System zur Verfügung, automatisch verknüpft mit jeder Journey oder jedem Error.
Gehen Sie nicht davon aus, dass Sie nur Strings als Tags verwenden können – Sie können jedes beliebige Java-Objekt taggen, zum Beispiel eine Order.
@TagReturnValue(name = "order")
public Order placeOrder(@TagParameter(name = "customerId") String customerId, String... items)
Diese Methode erzeugt bei der Überwachung mit einem Tracer folgende Tags:

Mit dem kommenden Release MoSKito 2.8.6 machen wir Tags noch robuster. Wir zeigen Ihnen alle verfügbaren Tags in einer übersichtlichen UI, zusammen mit den Tag-Werten und ihrer Häufigkeit. Außerdem können Sie neue Tags im laufenden Betrieb hinzufügen.

Wenn Sie derzeit eine ältere Version von MoSKito Inspect verwenden, können Sie diese neue UI trotzdem ausprobieren. Dazu müssen Sie die moskito-inspect.json Ihres MoSKito Inspect bearbeiten und den Parameter betaMode auf true setzen.
Bugs mit Tags aufspüren
Wenn Tags mit Tracern kombiniert werden, sehen Sie nicht nur, woher die Lastspitzen in Ihrer Anwendung stammen, sondern auch, was sie verursacht. Als Programmierer machen wir zwangsläufig Fehler, und die Möglichkeit, Details jedes Methodenaufrufs zu sehen, erweist sich beim Aufspüren unerwarteter Bugs als äußerst nützlich.
In einem aktuellen Fall stießen wir auf ein Problem, bei dem einige Requests eine enorme CPU-Auslastung verursachten und viel Ausführungszeit beanspruchten. Bei der Untersuchung der Tags dieser lang laufenden Requests stellten wir fest, dass sie alle eine Gemeinsamkeit hatten – sie verwendeten dieselbe ungültige Postleitzahl. Es stellte sich heraus, dass das System versuchte, die besten Lieferoptionen für eine Postleitzahl zu finden, die schlicht nicht existiert. Und der Fall solcher ungültigen Postleitzahlen war nicht gerade gut getestet.
Das Monitoring Ihrer Anwendung mit MoSKito verhindert nicht, dass sich unerwartete Bugs in Ihre Anwendung einschleichen, aber es macht es auf jeden Fall viel einfacher, sie aufzuspüren!