Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Konfigurieren Sie die Sichtbarkeit von HTTP-Endpunkten
Diese Seite bietet Anleitungen für Application Signals-Kunden, die erwarten, dass ihre HTTP-Dienstvorgänge durch bestimmte Endpunktnamen getrennt werden, stattdessen aber mehrere Endpunkte in derselben Metrik gruppiert werden. Standardmäßig kürzt Application Signals die Operation Metrikdimension auf das erste URL-Pfadsegment für HTTP-Dienste (z. B. /api/v1/users wirdGET /api), um Metriken mit niedriger Kardinalität beizubehalten. Infolgedessen stellen Benutzer möglicherweise fest, dass Dienste mit mehreren Endpunkten, die dasselbe Präfix verwenden, nur begrenzten Einblick in den Betriebszustand einzelner Endpunkte haben. Sie können die folgenden Schritte ausführen, um die Endpunkte für den Servicebetrieb mit der gewünschten Granularität zu konfigurieren.
Wichtig
Die Änderung der Endpunktsichtbarkeit ist eine bahnbrechende Änderung, da sie sich auf die metrischen Dimensionen von Application Signals für den Servicebetrieb auswirkt. Denken Sie daran, Ihre SLO-Schwellenwerte, Alarme und and/or Dashboards entsprechend zu aktualisieren.
AWS Distribution für die (ADOT- OpenTelemetry ) Lösung
Für Kunden, die AWS Distro for OpenTelemetry (ADOT) verwenden, legen Sie die OTEL_AWS_HTTP_OPERATION_PATHS Umgebungsvariable mit einer kommagetrennten Liste von URL-Pfadvorlagen für den HTTP-Dienst fest:
export OTEL_AWS_HTTP_OPERATION_PATHS="/path/to/endpoint, /another/{placeholder}/endpoint"
Diese Variable verwendet das Präfix, das am längsten mit dem url.path Attribut des HTTP-Servers übereinstimmt, um den Operationsnamen zu bestimmen. Platzhaltermuster entsprechen einem beliebigen URL-Segment und können mit{placeholder}, :placeholder oder gekennzeichnet werden. * Nachdem Sie die Variable festgelegt haben, starten Sie Ihre Anwendung neu, damit die neuen Endpunktgruppierungen wirksam werden.
Diese Variable wird in ADOT für Java Node.js, Python und.NET unterstützt.
Beispiel
Stellen Sie sich einen API-Dienst vor, der den folgenden Datenverkehr empfängt:
GET /api/users GET /api/users/42 GET /api/users/42/orders POST /api/users/99/orders POST /api/users/42/orders GET /api/users/42/orders/7/items GET /api/products
Standardmäßig gruppiert Application Signals all diese Daten in GET /api oder POST /api Servicemetriken, sodass es unmöglich ist, die Leistung zwischen den Endpunkten zu unterscheiden.
Um dieses Problem zu beheben, legen Sie die Umgebungsvariable mit den gewünschten Pfadvorlagen fest:
export OTEL_AWS_HTTP_OPERATION_PATHS="/api/users/{userId}/orders/{orderId}/items, /api/users/{userId}/orders, /api/users/{userId}, /api/users, /api/products"
Bei dieser Konfiguration zeigt Application Signals unterschiedliche Operationen. Mehrere Anfragen können zu derselben konfigurierten Vorlage führen:
| Eingehende Anfragen | Standardvorgang | Mit Konfiguration |
|---|---|---|
GET /api/users |
GET /api |
GET /api/users |
GET /api/users/42 |
GET /api |
GET /api/users/{userId} |
GET /api/users/42/orders |
GET /api |
GET /api/users/{userId}/orders |
POST /api/users/99/orders |
POST /api |
POST /api/users/{userId}/orders |
POST /api/users/42/orders |
POST /api |
POST /api/users/{userId}/orders |
GET /api/users/42/orders/7/items |
GET /api |
GET /api/users/{userId}/orders/{orderId}/items |
GET /api/products |
GET /api |
GET /api/products |
Native OpenTelemetry Lösung
Wenn Sie das native OpenTelemetry SDK (ohne ADOT) verwenden, können Sie den Span-Namen entweder mithilfe des Transformationsprozessors in Ihrem OpenTelemetry Collector oder direkt im Anwendungscode überschreiben.
Anmerkung
Sie müssen Ihren Collector mit einem OTLP-Exporter konfigurieren, um den OpenTelemetry Span-Namen beizubehalten, sodass er nach dem Operationsnamen von Application Signals analysiert werden CloudWatch kann. Weitere Informationen finden Sie unter OTLP-Daten senden an. CloudWatch
Option 1 (empfohlen): Transformation Collector-side
Verwenden Sie den Transformationsprozessorname Span-Feld direkt ändern.
Ordnen Sie die Regeln von den flachsten bis zu den tiefsten an — Anweisungen werden sequentiell ausgeführt, sodass spezifischere Treffer an späterer Stelle in der Liste die allgemeinen Treffer überschreiben, die zuvor festgelegt wurden. Im folgenden Beispiel url.path wird der Wert des span-Attributs abgeglichen und der resultierende Span-Name wird auf die Anforderungsmethode gefolgt vom gewünschten URL-Muster gesetzt.
processors: transform/operation_names: trace_statements: - context: span conditions: - IsMatch(attributes["url.path"], "^/api/contests(/|$)") statements: - set(name, Concat([attributes["http.request.method"], "/api/contests"], " ")) - context: span conditions: - IsMatch(attributes["url.path"], "^/api/contests/[^/]+$") statements: - set(name, Concat([attributes["http.request.method"], "/api/contests/{id}"], " ")) - context: span conditions: - IsMatch(attributes["url.path"], "^/api/contests/[^/]+/leaderboard(/|$)") statements: - set(name, Concat([attributes["http.request.method"], "/api/contests/{id}/leaderboard"], " ")) service: pipelines: traces: receivers: [otlp] processors: [resourcedetection, transform/operation_names, batch] exporters: [otlphttp/xray]
Option 2: Den Span-Namen im Anwendungscode festlegen
Sie können den Span-Namen für Server-Spans in Ihrem Anwendungscode mithilfe der OpenTelemetry API manuell festlegen. Legen Sie den Namen so fest, {HTTP_METHOD} {route_template} dass die Routenvorlage parametrisierte Platzhalter verwendet. Beachten Sie, dass dies eine fest codierte Fallback-Option ist und Sie den Span-Namen in jedem HTTP-Request-Handler manuell aktualisieren müssen, um diese Änderung zu übernehmen.
Java
import io.opentelemetry.api.trace.Span; // Inside your request handler Span.current().updateName("GET /api/contests/{id}/leaderboard");
Python
from opentelemetry import trace # Inside your request handler span = trace.get_current_span() span.update_name("GET /api/contests/{id}/leaderboard")
Go
import "go.opentelemetry.io/otel/trace" // Inside your request handler span := trace.SpanFromContext(ctx) span.SetName("GET /api/contests/{id}/leaderboard")
Node.js
import { trace } from '@opentelemetry/api'; // Inside your request handler const span = trace.getActiveSpan(); if (span) { span.updateName('GET /api/contests/{id}/leaderboard'); }