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 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:

Beispiel für Ergebnisse der Konfiguration der Endpunktsichtbarkeit
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 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.

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'); }