Stichprobenüberschreibungen – Azure Monitor Application Insights für Java
Hinweis
Die Funktion für Stichprobenüberschreibungen ist allgemein verfügbar, beginnend ab Version 3.5.0.
Mithilfe von Stichprobenüberschreibungen können Sie den Standardprozentsatz der Stichprobenentnahme überschreiben. Hier einige Beispiele:
- Legen Sie den Prozentsatz der Stichprobenentnahme für überflüssige Integritätsprüfungen auf 0 (oder einen kleinen Wert) fest.
- Legen Sie den Prozentsatz der Stichprobenentnahme für überflüssige Abhängigkeitsaufrufe auf 0 (oder einen kleinen Wert) fest.
- Legen Sie den Prozentsatz der Stichprobenentnahme für einen wichtigen Anforderungstyp (z. B.
/login
) auf 100 fest, auch wenn die Standardstichprobenentnahme auf einen niedrigeren Wert festgelegt ist.
Terminologie
Bevor wir uns mit Stichprobenüberschreibungen befassen, sollten wir zunächst die Benennung span erläutern. Ein span ist eine allgemeine Bezeichnung für Folgendes:
- Eine eingehende Anforderung
- Eine ausgehende Abhängigkeit (z. B. ein Remoteaufruf eines anderen Diensts)
- Eine In-Process-Abhängigkeit (z. B. Vorgänge, die von Unterkomponenten des Diensts durchgeführt werden)
Bei Stichprobenüberschreibungen sind die folgenden span-Komponenten wichtig:
- Attribute
Die span-Attribute stehen sowohl für die standardmäßigen als auch die benutzerdefinierten Eigenschaften einer bestimmten Anforderung oder Abhängigkeit.
Erste Schritte
Zunächst erstellen Sie eine Konfigurationsdatei namens applicationinsights.json. Speichern Sie diese im gleichen Verzeichnis, in dem sich auch applicationinsights-agent-*.jar befindet. Verwenden Sie hierfür die folgende Vorlage.
{
"connectionString": "...",
"sampling": {
"percentage": 10,
"overrides": [
{
"telemetryType": "request",
"attributes": [
...
],
"percentage": 0
},
{
"telemetryType": "request",
"attributes": [
...
],
"percentage": 100
}
]
}
}
Funktionsweise
telemetryType
(telemetryKind
in Application Insights 3.4.0) muss entweder request
, dependency
, trace
(log) oder exception
sein.
Wenn ein span-Element gestartet wird, werden der Typ des span-Elements und die im span-Element vorhandenen Attribute verwendet, um zu überprüfen, ob eine der Stichprobenüberschreibungen übereinstimmt.
Übereinstimmungen können entweder strict
oder regexp
sein. Übereinstimmungen bei regulären Ausdrücken werden für den gesamten Attributwert ausgeführt. Wenn Sie also einen Wert abgleichen möchten, der an einer beliebigen Stelle abc
enthält, müssen Sie .*abc.*
verwenden.
Eine Stichprobenüberschreibung kann mehrere Attributkriterien angeben. In diesem Fall müssen alle übereinstimmen, damit die Stichprobenüberschreibung übereinstimmt.
Wenn eine der Stichprobenüberschreibungen übereinstimmt, wird die Stichprobenentnahme in Prozent verwendet, um zu entscheiden, ob vom span-Element eine Stichprobe entnommen werden soll.
Nur die erste übereinstimmende Stichprobenüberschreibung wird verwendet.
Wenn keine Stichprobenüberschreibungen übereinstimmen:
- Wenn es sich um den ersten Bereich in der Ablaufverfolgung handelt, wird die Konfiguration der obersten Ebene verwendet.
- Wenn es sich nicht um den ersten Bereich in der Ablaufverfolgung handelt, wird die übergeordnete Stichprobenentscheidung verwendet.
Beispiel: Unterdrücken der Erfassung von Telemetriedaten für Integritätsprüfungen
Mit diesem Beispiel wird die Erfassung von Telemetriedaten für alle Anforderungen an /health-checks
unterdrückt.
Zudem wird damit auch die Erfassung von allen nachgelagerten span-Elementen (Abhängigkeiten) unterdrückt, die normalerweise unter /health-checks
erfasst werden.
{
"connectionString": "...",
"sampling": {
"overrides": [
{
"telemetryType": "request",
"attributes": [
{
"key": "url.path",
"value": "/health-check",
"matchType": "strict"
}
],
"percentage": 0
}
]
}
}
Beispiel: Unterdrücken der Erfassung von Telemetriedaten für einen störenden Abhängigkeitsaufruf
Mit diesem Beispiel wird die Erfassung von Telemetriedaten für alle GET my-noisy-key
-redis-Aufrufe unterdrückt.
{
"connectionString": "...",
"sampling": {
"overrides": [
{
"telemetryType": "dependency",
"attributes": [
{
"key": "db.system",
"value": "redis",
"matchType": "strict"
},
{
"key": "db.statement",
"value": "GET my-noisy-key",
"matchType": "strict"
}
],
"percentage": 0
}
]
}
}
Beispiel: 100%iges Erfassen von Telemetriedaten für einen wichtigen Anforderungstyp
Mit diesem Beispiel werden für /login
Telemetriedaten zu 100 % erfasst.
Da nachgelagerte Bereiche (Abhängigkeiten) die Sampling-Entscheidung des übergeordneten Bereichs respektieren (sofern keine Sampling-Übersteuerung für diesen nachgelagerten Bereich vorliegt), werden sie auch für alle „/login“-Anfragen gesammelt.
{
"connectionString": "...",
"sampling": {
"percentage": 10
},
"sampling": {
"overrides": [
{
"telemetryType": "request",
"attributes": [
{
"key": "url.path",
"value": "/login",
"matchType": "strict"
}
],
"percentage": 100
}
]
}
}
Für Sampling verfügbare Span-Attribute
Span-Attributnamen basieren auf den Semantikkonventionen von OpenTelemetry. (HTTP, Messaging, Datenbank, RPC)
https://github.com/open-telemetry/semantic-conventions/blob/main/docs/README.md
Hinweis
Um die genaue Menge der von Application Insights Java für Ihre Anwendung erfassten Attribute zu sehen, legen Sie die Selbstdiagnoseebene auf „Debuggen“ fest, und suchen Sie nach Debugmeldungen, die mit dem Text „exporting span“ beginnen.
Hinweis
Nur Attribute, die zu Beginn des span-Attributs festgelegt wurden, stehen für die Stichprobenentnahme zur Verfügung. Daher können Attribute wie http.response.status_code
oder Anforderungsdauer, die später erfasst werden, durch die OpenTelemetry Java-Erweiterung gefiltert werden. Hier ist eine Beispielerweiterung, die Spans basierend auf der Anforderungsdauer filtert.
Problembehandlung
Wenn Sie regexp
verwenden und die Stichprobenüberschreibung nicht funktioniert, versuchen Sie es mit dem regulären Ausdruck .*
. Wenn die Stichprobenentnahme jetzt funktioniert, bedeutet dies, dass ein Problem mit dem ersten regulären Ausdruck vorliegt. Lesen Sie diese Dokumentation zu regulären Ausdrücken.
Wenn es mit .*
nicht funktioniert, haben Sie möglicherweise ein Syntaxproblem in Ihrem application-insights.json file
. Sehen Sie sich die Application Insights-Protokolle an, und überprüfen Sie, ob Warnmeldungen angezeigt werden.