🛟 Zögern Sie nicht, uns zu kontaktieren, falls Sie beim
Implementieren benutzerdefinierter Instrumentierungen auf Probleme stoßen. Wir helfen Ihnen gerne!
Einrichtung
Um die Hilfsfunktionen von AppSignal in Ihrer Instrumentierung zu verwenden, müssen Sie zuerstopentelemetry importieren und ein Tracer-Objekt definieren. Abhängig von Ihrer Instrumentierung müssen Sie möglicherweise auch zusätzliche Spans erstellen.
Unsere Beispiel-Anwendungsfälle zeigen, wie Sie Tracer, Spans und Helper verwenden können, um Ihre benutzerdefinierte Instrumentierung zu erstellen.
OpenTelemetry importieren und Tracer definieren
Die AppSignal-Integration für Node.js verwendet OpenTelemetry-Tracer-Objekte. Diese Tracer enthalten verschiedene Funktionen zum Erstellen benutzerdefinierter Instrumentierungen. Der Tracer stellt Funktionen zum Erstellen und Erzeugen neuer Spans bereit. Diese Dokumentation beschreibt, wie Sie Tracer und Spans verwenden können, um Ihre benutzerdefinierte Integration zu implementieren. Sie müssen zuerst das trace-Objekt aus@opentelemetry/api importieren, bevor Sie mit Tracern und Spans arbeiten können. Durch den Aufruf der Funktion getTracer am trace-Objekt kann ein neues Tracer-Objekt erstellt werden. Sie müssen Ihrem Tracer-Objekt in dieser Funktion einen Namen geben, wie im untenstehenden Beispiel, in dem die Funktion getTracer verwendet wird, um einen Tracer mit dem Namen "my interesting app" zu definieren.
Spans
Ein Span ist der Name des Objekts, das wir verwenden, um Daten über die Performance Ihrer Anwendung, etwaige Fehler und den umgebenden Kontext zu erfassen. Ein Span ist Teil eines umfassenderen Trace, einer hierarchischen Darstellung des Datenflusses durch Ihre Anwendung. Spans verfolgen die Start- und Endzeit eines Ereignisses sowie weitere Informationen wie den Namen oder andere damit zusammenhängende Daten. Mehr über Spans erfahren Sie in der OpenTelemetry Tracing Dokumentation.Einen aktiven Span erstellen
Neue Spans können über das trace-Objekt aufgerufen werden. In einem Express- oder Koa-Handler instrumentierter Code befindet sich bereits in einem Span. Sie können neue Spans erstellen, indem Sie die FunktionstartActiveSpan() am Tracer-Objekt aufrufen. Neu erstellte Spans sind die Kinder des Spans, in dem sie erstellt wurden, sofern einer existiert. Sie können Child-Spans verwenden, um die Performance von Aufgaben zu messen, die innerhalb eines Parent-Spans ausgeführt werden.
Sie sollten Ihrem Span einen Namen geben, der seinen Zweck verdeutlicht. Führen Sie alle Aufgaben, die Sie überwachen möchten, innerhalb der Funktion startActiveSpan() aus, wie im folgenden Beispiel.
span.end()
Beispiel-Anwendungsfälle
Bei der Implementierung benutzerdefinierter Instrumentierung möchten Sie möglicherweise das Verhalten bestimmter Funktionen verstehen, z. B. wie lange ihre Ausführung dauert.Helper verwenden
Im folgenden Beispiel sind wir an der Performance unseres „order-coffee”-GET-Endpunkts für verschiedene Kaffeeröstungen interessiert. Um dies zu untersuchen, verwenden wir die FunktionsetAttribute, um einen Tag namens flavor zu erstellen, dessen Wert wir aus den Request-Parametern abrufen.
Hinweis: Da dies innerhalb eines Express-Request-Handlers geschieht, wurde bereits ein Root-Span erstellt.
"picking coffee beans"-Spans, der in der Funktion pickCoffeeBeans definiert ist.
Sobald das Attribut zugewiesen und alle Funktionen ausgeführt wurden, beenden wir den Span mit .end(), um sicherzustellen, dass AppSignal die Start- und Endzeit sowie die zugewiesenen Attribute erhält:

Aktive Spans
Während Tags hilfreich sind, um Performance-Unterschiede in derselben Funktion zu analysieren, geben sie uns keinen Einblick in die Performance von Funktionen, die innerhalb unserer Funktion aufgerufen werden. Um uns tiefere Einblicke in das zu geben, was innerhalb vonpickCoffeeBeans() passiert, erstellen wir einen neuen activeSpan und nennen ihn „picking coffee beans”. Die gesamte Logik, die wir verfolgen möchten, wird innerhalb einer async-Funktion ausgeführt.
Wir await das Promise, das von retrieveDrinkTypes() zurückgegeben wird, damit wir seine Performance als Child-Span des "picking coffee beans"-Spans verfolgen können, den wir in pickCoffeeBeans() erstellt haben.
pickCoffeeBeans(), einschließlich der Performance-Daten der Funktion retrieveDrinkTypes(), was tiefere Einblicke in die Faktoren bietet, die die Gesamt-Performance einer Funktion beeinflussen.
Helper
Um Hilfsfunktionen zu verwenden, müssen Sie diese zuerst aus@appsignal/nodejs importieren. Im folgenden Beispiel wird der Namespace, in dem der Code ausgeführt wird, an AppSignal gemeldet. Alle verfügbaren Hilfsfunktionen sind in der folgenden Dokumentation aufgeführt.
Hilfsfunktionen
- Namespace
- Tag
- Request-Parameter
- Session-Daten setzen
- Request-Header
- Root Name
- Custom Data
- Child Span Helper:
Namespace
Setzt den String-Wert des Namespace des Root-Spans.Tag
Setzt einen Tag, z. B. aus einem Request-Parameter, der als Filter innerhalb der AppSignal-Anwendung verwendet werden kann. Im folgenden Beispiel erstellen wir einen Tag namens color mit dem Wert blue. Sie können Tags mit Namen konfigurieren, die für den Kontext Ihrer Anwendung relevant sind.Request-Parameter
Ein Objekt, das nach JSON serialisierbar ist. Eingehende Request-Parameter, Request-Body und Query-Parameter.Session-Daten setzen
Ein Objekt, das nach JSON serialisierbar ist.Request-Header
Ein String, der den Header-Wert enthält.Root Name
Ermöglicht es Ihnen, den Namen des Trace festzulegen. Samples werden anhand ihres Trace-Namens in Actions gruppiert.Beispiel-Anwendungsfall
Ihre Anwendung hat einen Endpunkt namensGET /coffee.
GET /coffee, aber Ihr Endpunkt verarbeitet mehrere Actions: coffee?action=buy und coffee?action=sell.

GET /coffee verwenden, sind sie konzeptionell sehr unterschiedlich, daher wäre es sinnvoll, dass sie in AppSignal separat gruppiert werden, anstatt im selben GET /coffee-Sample. Dazu können Sie den Helper setRootName() verwenden:
setRootName ändert den Namen des Root-Spans und gruppiert die Samples für die Anfragen coffee?action=buy und coffee?action=sell in separate Actions:

Custom Data
Ein Objekt, das nach JSON serialisierbar ist.Child Span Helper
Die folgenden Helper gelten nur für Child-Spans. Um einen Child-Span zu erstellen, müssen Sie einen neuen Active Span erstellen. Neue Spans sind automatisch Kinder ihres Parent-Spans.Kategorie
Ein String, der die Kategorie des Child-Spans enthält. Der Name sollte. verwenden, um die hierarchische Vererbung der Kategorie auszudrücken. Zum Beispiel: cafe.coffee.cupsize
Name
Ein String, der den Titel des Event-Timelines des Child-Spans enthält.Body
Der Body des Spans kann zusätzliche Informationen über das Ereignis enthalten, wie den HTTP-Request, den verbundenen Host usw. Stellen Sie sicher, dass Sie die Informationen bereinigen, bevor Sie sie dem Span hinzufügen, damit keine personenbezogenen Daten an AppSignal gesendet werden. Diese Informationen sind für den Span sichtbar, wenn Sie mit der Maus über die Event-Timeline fahren. Um SQL-Abfragen im Body des Spans zu speichern, verwenden Sie stattdessen densetSqlBody-Helper.
SQL body
Legen Sie eine SQL-Abfrage als Body des Spans fest, wie er in der Performance-Event-Timeline in der Detailansicht des Incident-Samples erscheint. Dies ist ähnlich demsetBody-Helper, ist aber auf SQL-Abfragen spezialisiert. Jede SQL-Abfrage, die mit diesem Attribut als Body gesetzt wird, wird bereinigt, um zu vermeiden, dass PII (Personal Identifiable Information)-Daten an unsere Server gesendet werden.
Weitere Informationen zur Funktionsweise des Body-Attributs finden Sie im setBody-Helper.
Wenn sowohl die Helper setBody als auch setSqlBody für denselben Span aufgerufen werden, ist der Wert des setSqlBody-Helpers führend und der Wert des setBody-Helpers wird ignoriert.