View a markdown version of this page

Konfigurieren Sie die Sichtbarkeit von HTTP-Endpunkten - Amazon CloudWatch

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 sind, 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. Daher stellen Benutzer möglicherweise fest, dass Dienste mit mehreren Endpunkten, die dasselbe Präfix verwenden, nur einen begrenzten Einblick in den Betriebszustand einzelner Endpunkte haben. Sie können die folgenden Schritte ausführen, um die Endpunkte für den Dienstbetrieb mit der gewünschten Granularität zu konfigurieren.

Wichtig

Das Ändern der Sichtbarkeit der Endpunkte ist eine bahnbrechende Änderung, da es sich auf die metrischen Dimensionen der Anwendungssignale für den Servicebetrieb auswirkt. Denken Sie daran, Ihre SLO-Schwellenwerte, Alarme und and/or Dashboards entsprechend zu aktualisieren.

AWS Distro for OpenTelemetry (ADOT) -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 längste passende Präfix für das url.path Attribut des HTTP-Serverbereichs, um den Operationsnamen zu ermitteln. Platzhaltermuster entsprechen jedem einzelnen URL-Segment und können mit{placeholder}, :placeholder oder gekennzeichnet werden. * Nachdem Sie die Variable gesetzt 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 Endpunkten zu unterscheiden.

Um dies 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 an. Mehrere Anfragen können mit derselben konfigurierten Vorlage gelöst werden:

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 Spannamen beizubehalten, sodass er nach dem Operationsnamen von Application Signals analysiert werden CloudWatch kann. Weitere Informationen finden Sie unter Senden von OTLP-Daten an. CloudWatch

Option 1 (empfohlen): Transformation Collector-side

Verwenden Sie den Transformationsprozessor, um Span-Namen auf der Grundlage von URL-Mustern festzulegen. Der Transformationsprozessor verwendet OTTL (OpenTelemetry Transformation Language) und kann das name Span-Feld direkt ändern.

Ordnet Regeln von der oberflächlichsten zur tiefsten Reihenfolge — Anweisungen werden sequentiell ausgeführt, sodass spezifischere Treffer weiter unten in der Liste die zuvor festgelegten allgemeinen Treffer außer Kraft setzen. 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: Span-Name im Anwendungscode festlegen

Sie können den Spannamen für Serverbereiche in Ihrem Anwendungscode mithilfe der OpenTelemetry API manuell festlegen. Stellen Sie den Namen so ein, dass {HTTP_METHOD} {route_template} 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'); }