Konfigurationsbasiertes Java-Trace-SDK
Das konfigurationsbasierte „ Java Trace SDK“ ermöglicht eine deklarative Definition von Spans und den Tags, die diese Spans enthalten sollen, und erstellt Spans durch die Ausführung bestimmter Methoden Ihrer Anwendung.
Die Ausdruckskraft ist vergleichbar mit der der @Span Annotationen und SpanSupport.annotate() Funktionen des programmatischen Trace SDK von Java.
Bevor Sie benutzerdefinierte Ablaufverfolgung implementieren, lesen Sie die Best Practices zur Ablaufverfolgung.
Einführung
Das konfigurationsbasierte SDK reagiert empfindlich auf Änderungen an der Anwendung. Sie können eine Klasse oder eine Methode umbenennen, und plötzlich stimmt die Konfiguration nicht mehr überein, und Sie verlieren Ihre Tracedaten. Wir empfehlen Ihnen, nach Möglichkeit das „ Java Trace SDK“ zu verwenden, da dieses wesentlich widerstandsfähiger gegenüber Codeänderungen ist und über mehr Funktionen verfügt, die Ihnen bei der Erreichung Ihrer Ziele helfen.
Konfiguration
Um das konfigurationsbasierte „ Java “-Trace-SDK zu verwenden, müssen Sie das „ Java “-Trace-SDK wie unter „Aktivieren des „ Java “-Trace-SDK“ beschrieben aktivieren.
Hinweise:
Änderungen an der Konfiguration des konfigurationsbasierten „ Java Trace SDK“ werden vom „ Instana “-Agenten automatisch übernommen. Bereits instrumentierte Anwendungen müssen erneut gestartet werden, damit die geänderte Konfiguration verwendet werden kann.
Das konfigurationsbasierte „ Java “-Trace-SDK ist in der Version „
1.2.351Java “-Trace-Sensor oder höher verfügbar.
Format:
In der folgenden Liste wird das allgemeine Format der Konfiguration beschrieben:
# Java Tracing
com.instana.plugin.javatrace:
instrumentation:
sdk:
targets:
- match:
type: 'interface'|'class'|'baseclass'
name: '<type-name>'
method: '<method-name>'
[argumentTypes:
- '<argument-type-index0>'
- '<argument-type-indexn>']
[returnType: '<return-type-name>']
span:
name: '<span-name>'
[type: '<span-type>']
[stackDepth: <depth>]
[tags:
- kind: 'argument'
name: 'name'
index: 0
- kind: 'return'
name: 'name'
- kind: 'constant'
name: 'name'
value: 'constant-value']
Innerhalb des Schlüssels targets (Ziele) können mehrere Ziele definiert werden, die jeweils eine zu erstellende Spanne angeben. Das Objekt match eines target gibt die Methode an, auf die die Instrumentierung angewendet werden soll. Das Objekt span gibt an, wie die Spanne erstellt wird, einschließlich ihres Namens (der z. B. in unbegrenzten Analysen für den Filter call.name verwendet wird) und welche Tags gesetzt werden sollen.
Methoden zum Instrumentieren abgleichen
Dieses Objekt beschreibt den Codepunkt, an dem eine Instrumentierung stattfinden muss:
type: Typ des zu instrumentierenden Codes; unterstützte Werte:class, Abgleich mit einer konkreten Klasseinterface, Abgleich mit allen Klassen, die die Schnittstelle implementierenbaseclass, Abgleich mit allen Klassen, die die Basisklasse erweitern
name: Vollqualifizierter Name der Klasse, Schnittstelle oder Basisklasse, nach der gesucht werden soll. Bei verschachtelten Klassen wird diea.b.c.OutsideClass$NestedClassNotation erwartetmethod: Name der Methode der angegebenen Klasse, Schnittstelle oder Basisklasse, von der ein Aufruf aufgezeichnet werden soll.argumentTypes: Liste der vollständig qualifizierten Argumenttypen der abzugleichenden Methode (optional)- Bei fehlender Angabe werden Argumente nicht abgeglichen und die Instrumentierung wird bei einer Überlastung auf alle Methoden angewendet.
- Bei Angabe müssen alle Argumente den angegebenen Typen in der Reihenfolge entsprechen, andernfalls stimmt die Methode nicht überein.
returnType: Vollständig qualifizierter zurückgegebener Typ der abzugleichenden Methode (optional)- Bei fehlender Angabe wird der Rückgabetyp nicht beachtet.
- Bei Angabe muss der Rückgabetyp dem angegebenen Typ entsprechen, andernfalls stimmt die Methode nicht überein.
Angeben, wie die Spannen aussehen werden
Dieses Objekt beschreibt die Eigenschaften der Spanne, die erstellt wird, wenn die Methode, die in match beschrieben wird, aufgerufen wird:
name: Name der Spannetype: Typ der Spanne (optional); unterstützte Werte:ENTRY, wird verwendet, um eingehende Aufrufe von externen Systemen anzugebenINTERMEDIATE, wird verwendet, um interne Aufrufe an "interessante" Methoden zu erfassen (Standard)EXIT, wird verwendet, um abgehende Aufrufe an externe Systeme anzugeben
stackDepth: Anzahl der Stack-Frames für die Erfassung des Methodenaufrufs (optional); Standardwert ist0tags: Liste der Tags/Anmerkungen, die erfasst werden sollen, und Angaben dazu, wie deren Werte abgerufen werden können (optional); unterstützte Werte:constant, einen konstanten Wert erfassenkind:constantname: Name des zu erstellenden Tagsvalue: konstanter Wert des zu erstellenden Tags
return, Erfassung des Rückgabewerts des Methodenaufrufs.kind:returnname: Name des zu erstellenden Tags; der Wert ist der Wert des zurückgegebenen Objekts
argument, Erfassung eines bestimmten Argumentwerts des Methodenaufrufs.kind:argumentname: Name des zu erstellenden Tagsindex: 0-basierter Index des Arguments, das als Wert für den Tag erfasst werden soll
null ist, Optional.empty wird das definierte Tag nicht hinzugefügt. Spannen mit fehlenden Tags können in Unbounded Analytics mithilfe des is not present Operators in Verbindung mit dem call.tag Filter abgerufen werden.Fehlerhafte Spannen
Wenn sich Throwable außerhalb einer instrumentierten Methode ausbreitet, wird die Spanne automatisch als fehlerhaft markiert, und der Wert von Throwable#getMessage() wird als Fehlermeldung festgelegt, nach der Sie in Unbounded Analytics über das call.error.message Tag suchen können.
Überprüfen der SDK-Konfiguration
- Überprüfen Sie, ob die Konfiguration erfolgreich geparst wurde. Suchen Sie in den Agent-Protokollen nach einer Meldung, die in etwa wie folgt lautet:
Parsed configuration file /instana-agent/etc/instana/configuration.yaml - Überprüfen Sie, ob die Instrumentierung angewendet wurde. Nach der Analyse protokolliert der Agent eine Meldung, aus der hervorgeht, dass er die SDK-Instrumentierung durchgeführt hat:
... Spent XX ms and XXX KiB of Metaspace for instrumentation [sdk] ... - Aktivieren und überprüfen Sie die SDK-Span-Trace-Protokolle. Um zu überprüfen, ob Spans tatsächlich erstellt werden, aktivieren Sie die Trace-Protokollierung, indem Sie Folgendes unter „ YAML “ hinzufügen:
com.instana.plugin.javatrace: instrumentation: log: type: trace file: /tmp/trace.log
Sobald die Instrumentierung aktiv ist und der instrumentierte Code ausgeführt wird, sollten SDK-Spans ausgegeben werden. Beispiel für ein Trace-Protokollformat:
-|EN|052d6bf37f16034c7:0:52d6bf37f16034c7|sdk:sdk.quarkus-hello|*com.instana.agent.instrumentation.sdk.SdkPlugin:start:789:SdkPlugin.java
Beispiel
Das folgende Snippet zeigt eine Beispielkonfiguration, in der beschrieben wird, wie eine Anwendung, die Batch-Jobs verarbeitet, verfolgt werden kann:
com.instana.plugin.javatrace:
instrumentation:
sdk:
targets:
- match:
type: class
name: com.instana.java.sdk.BatchApplication
method: processBatch
span:
name: Job
type: ENTRY
stackDepth: 2
tags:
- kind: constant
name: endpoint
value: BatchJob
- kind: argument
name: batch.job
index: 0
- match:
type: class
name: com.instana.java.sdk.BatchApplication
method: updateDatabase
span:
name: DatabaseCall
type: EXIT
stackDepth: 2
tags:
- kind: constant
name: db.connection_string
value: jdbc:mysql://127.0.0.1:3306/jobs
- kind: argument
name: db.statement
index: 0
Als erstes wird die Methode processBatch in der Klasse com.instana.java.sdk.BatchApplication
instrumentiert, um Eingangsspannen mit dem Namen Job,
der Annotation endpoint mit dem konstanten Wert BatchJob und der Annotation
batch.job mit dem ersten Argument als zugehörigen Wert zu erstellen.
Zudem erstellen abgehende DB-Aufrufe während der Batchverarbeitung, d. h. Aufrufe der Methode
updateDatabase in derselben Klasse, Ausgangsspannen mit dem Namen DatabaseCall und
der Annotation db.connection_string mit dem konstanten Wert jdbc:mysql://127.0.0.1:3306/jobs
und der Annotation db.statement mit dem ersten Argument des Methodenaufrufs.
Bei der Verarbeitung eines neuen Batches mit processBatch wird ein neuer Trace gestartet und nachfolgende
DB-Aktualisierungen mit updateDatabase werden als untergeordnete Spannen innerhalb dieses Trace aufgelistet. Alle Instana-Funktionen, wie z. B. "Unbegrenzte Analyse", können auf dieselbe Weise auf mit Instana AutoTrace erstellte Traces angewendet werden.
Einschränkungen
Die folgenden Einschränkungen gelten für das konfigurationsbasierte Java-Trace-SDK:
- Die Instrumentierung von Konstruktoren wird nicht unterstützt.
- Das Starten einer Spanne in einer Methode und das Schließen in einer anderen wird nicht unterstützt. Das heißt, das
konfigurationsbasierte SDK hat keine Entsprechung für die Annotationen
@Span.Startund@Span.End. - Das Erfassen aller Argumente oder des Rückgabewerts ohne explizite Erstellung eines
tagwird nicht unterstützt. - Die Angabe von Platzhaltern in der Argumentliste für unwichtige Argumente oder alle übrigen Argumente wird nicht unterstützt; die argumentbasierte Übereinstimmung wird streng durchgeführt.
- Das Angeben von Namensmustern für Klassen oder Methoden wird nicht unterstützt.
- Das Wiederherstellen eines Tracekontextes vor dem Erstellen einer Spanne wird nicht unterstützt. Das heißt, das
konfigurationsbasierte SDK hat keine funktionelle Entsprechung zu
SpanSupport.inheritNext(). - Das konfigurationsbasierte SDK unterstützt keine Instrumentierung von JDK-Klassen.