Ablaufverfolgung eingehender Anfragen mit dem X-Ray-SDK für Python -Middleware - AWS X-Ray

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.

Ablaufverfolgung eingehender Anfragen mit dem X-Ray-SDK für Python -Middleware

Wenn Sie die Middleware zu Ihrer Anwendung hinzufügen und einen Segmentnamen konfigurieren, erstellt das X-Ray SDK für Python ein Segment für jede gesampelte Anfrage. Dieses Segment umfasst Dauer, Methode und Status der HTTP-Anforderung. Die zusätzliche Instrumentierung schafft Untersegmente zu diesem Segment.

Das X-Ray-SDK für Python unterstützt die folgende Middleware zur Instrumentierung eingehender HTTP-Anforderungen:

  • Django

  • Flask

  • Bottle

Anmerkung

FürAWS Lambda Funktionen erstellt Lambda für jede gesampelte Anfrage ein Segment. Weitere Informationen finden Sie unter AWS Lambda und AWS X-Ray.

Ein BeispielWorker für eine Python-Funktion, die in Lambda instrumentiert ist, finden Sie unter.

Für Skripts oder Python-Anwendungen auf anderen Frameworks können Sie Segmente manuell erstellen.

Jedes Segment hat einen Namen, der Ihre Anwendung in der Service Map identifiziert. Das Segment kann statisch benannt werden, oder Sie können das SDK so konfigurieren, dass es basierend auf dem Host-Header in der eingehenden Anfrage dynamisch benannt wird. Mit der dynamischen Benennung können Sie Traces basierend auf dem Domainnamen in der Anfrage gruppieren und einen Standardnamen anwenden, wenn der Name nicht mit einem erwarteten Muster übereinstimmt (z. B. wenn der Host-Header gefälscht ist).

Weitergeleitete Anfragen

Wenn ein Load Balancer oder ein anderer Vermittler eine Anfrage an Ihre Anwendung weiterleitet, entnimmt X-Ray die Client-IP aus demX-Forwarded-For Header in der Anfrage und nicht von der Quell-IP im IP-Paket. Die Client-IP, die für eine weitergeleitete Anfrage aufgezeichnet wurde, kann gefälscht sein und sollte daher nicht vertrauenswürdig sein.

Wenn eine Anfrage weitergeleitet wird, legt das SDK ein zusätzliches Feld im Segment fest, um dies anzuzeigen. Wenn das Segment das Feld enthält, das aufx_forwarded_for gesetzt isttrue, wurde die Client-IP demX-Forwarded-For Header der HTTP-Anfrage entnommen.

Die Middleware erzeugt für jede eingehende Anfrage ein Segment mit einem http-Block mit folgenden Informationen:

  • HTTP-Methode — GET, POST, PUT, DELETE usw.

  • Client-Adresse — Die IP-Adresse des Clients, der die Anfrage gesendet hat.

  • Antwortcode — Der HTTP-Antwortcode für die abgeschlossene Anfrage.

  • Zeitpunkt — Die Startzeit (als die Anfrage empfangen wurde) und die Endzeit (als die Antwort gesendet wurde).

  • Benutzeragent — Deruser-agent aus der Anfrage.

  • Inhaltslänge — Diecontent-length aus der Antwort.

Hinzufügen der Middleware zu Ihrer Anwendung (Django)

Fügen Sie die Middleware zur MIDDLEWARE-Liste in Ihrer settings.py-Datei hinzu. Die X-Ray-Middleware sollte die erste Zeile in Ihrer settings.py-Datei darstellen, um sicherzugehen, dass Anfragen, die in anderen Middlewares fehlschlagen, aufgezeichnet werden.

Beispiel settings.py - X-Ray-SDK für Python-Middleware
MIDDLEWARE = [ 'aws_xray_sdk.ext.django.middleware.XRayMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware' ]

Fügen Sie die X-Ray SDK Django-App zurINSTALLED_APPS Liste in Ihrersettings.py Datei hinzu. Dadurch kann der X-Ray-Recorder während des Starts Ihrer App konfiguriert werden.

Beispiel settings.py - X-Ray-SDK für die Python Django-App
INSTALLED_APPS = [ 'aws_xray_sdk.ext.django', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]

Konfigurieren Sie einen Segmentnamen in Ihrer settings.py-Datei.

Beispiel settings.py — Segmentname
XRAY_RECORDER = { 'AWS_XRAY_TRACING_NAME': 'My application', 'PLUGINS': ('EC2Plugin',), }

Dadurch wird der X-Ray-Recorder angewiesen, Anfragen, die von Ihrer Django-Anwendung bedient werden, mit der standardmäßigen Samplingrate zu verfolgen. Sie können den Recorder in Ihrer Django-Einstellungsdatei konfigurieren, um benutzerdefinierte Samplingregeln anzuwenden oder andere Einstellungen zu ändern.

Anmerkung

Daplugins sie als Tupel übergeben werden, stellen Sie sicher, dass Sie, bei der Angabe eines einzelnen Plugins einen Nachbau angeben. Beispiel: plugins = ('EC2Plugin',)

Hinzufügen der Middleware zu Ihrer Anwendung (Flask)

Um Ihre Flask-Anwendung zu instrumentieren, konfigurieren Sie zunächst einen Segmentnamen im xray_recorder. Verwenden Sie dann die XRayMiddleware-Funktion zum Patchen Ihrer Flask-Anwendung im Code.

Beispiel app.py
from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.ext.flask.middleware import XRayMiddleware app = Flask(__name__) xray_recorder.configure(service='My application') XRayMiddleware(app, xray_recorder)

Dadurch wird der X-Ray-Recorder angewiesen, Anfragen, die von Ihrer Flask-Anwendung bearbeitet wurden, mit der standardmäßigen Samplingrate zu verfolgen. Sie können den Recorder im Code konfigurieren, um benutzerdefinierte Samplingregeln anzuwenden oder andere Einstellungen zu ändern.

Hinzufügen der Middleware zu Ihrer Anwendung (Bottle)

Um Ihre Bottle-Anwendung zu instrumentieren, konfigurieren Sie zunächst einen Segmentnamen im xray_recorder. Verwenden Sie dann die XRayMiddleware-Funktion zum Patchen Ihrer Bottle-Anwendung im Code.

Beispiel app.py
from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.ext.bottle.middleware import XRayMiddleware app = Bottle() xray_recorder.configure(service='fallback_name', dynamic_naming='My application') app.install(XRayMiddleware(xray_recorder))

Dadurch wird der X-Ray-Recorder angewiesen, Anfragen, die von Ihrer Bottle-Anwendung bearbeitet wurden, mit der standardmäßigen Samplingrate zu verfolgen. Sie können den Recorder im Code konfigurieren, um benutzerdefinierte Samplingregeln anzuwenden oder andere Einstellungen zu ändern.

Manuelle Instrumentierung von Python-Code

Wenn Sie weder Django noch Flask verwenden, können Sie Segmente manuell erstellen. Sie können für jede eingehende Anfrage ein Segment erstellen oder Segmente um gepatchte HTTP- oderAWS SDK-Clients erstellen, um dem Rekorder den Kontext zum Hinzufügen von Untersegmenten bereitzustellen.

Beispiel main.py — Manuelle Instrumentierung
from aws_xray_sdk.core import xray_recorder # Start a segment segment = xray_recorder.begin_segment('segment_name') # Start a subsegment subsegment = xray_recorder.begin_subsegment('subsegment_name') # Add metadata and annotations segment.put_metadata('key', dict, 'namespace') subsegment.put_annotation('key', 'value') # Close the subsegment and segment xray_recorder.end_subsegment() xray_recorder.end_segment()

Konfiguration einer Segmentbenennungsstrategie

AWS X-Rayverwendet einen Dienstnamen, um Ihre Anwendung zu identifizieren und sie von den anderen Anwendungen, Datenbanken, externen APIs undAWS Ressourcen zu unterscheiden, die Ihre Anwendung verwendet. Wenn das X-Ray SDK Segmente für eingehende Anfragen generiert, zeichnet es den Dienstnamen Ihrer Anwendung im Namensfeld des Segments auf.

Das X-Ray SDK kann Segmente nach dem Hostnamen im HTTP-Request-Header benennen. Dieser Header kann jedoch gefälscht sein, was zu unerwarteten Knoten in Ihrer Service-Map führen kann. Um zu verhindern, dass das SDK Segmente aufgrund von Anfragen mit gefälschten Host-Headern falsch benennt, müssen Sie einen Standardnamen für eingehende Anfragen angeben.

Wenn Ihre Anwendung Anfragen für mehrere Domänen verarbeitet, können Sie das SDK so konfigurieren, dass es eine dynamische Benennungsstrategie verwendet, die dies in Segmentnamen widerspiegelt. Eine dynamische Benennungsstrategie ermöglicht es dem SDK, den Hostnamen für Anfragen zu verwenden, die einem erwarteten Muster entsprechen, und den Standardnamen auf Anfragen anzuwenden, die dies nicht tun.

Beispielsweise könnten Sie eine einzelne Anwendung haben, die Anfragen an drei Subdomänen verarbeitet —www.example.comapi.example.com, undstatic.example.com. Sie können eine dynamische Benennungsstrategie mit dem Muster verwenden,*.example.com um Segmente für jede Subdomain mit einem anderen Namen zu identifizieren, was zu drei Service-Knoten auf der Service-Map führt. Wenn Ihre Anwendung Anfragen mit einem Hostnamen empfängt, der nicht mit dem Muster übereinstimmt, sehen Sie in der Service-Map einen vierten Knoten mit einem von Ihnen angegebenen Ausweichnamen.

Wenn Sie denselben Namen für alle Anfragesegmente verwenden möchten, geben Sie bei der Konfiguration des Recorders den Namen Ihrer Anwendung, wie in den vorherigen Abschnitten gezeigt, ein.

Eine dynamische Benennungsstrategie definiert ein Muster, dem Hostnamen entsprechen sollten, sowie einen Standardnamen, der verwendet wird, wenn der Hostname in der HTTP-Anforderung nicht mit diesem Muster übereinstimmt. Zur dynamischen Segmentbenennung fügen Sie die DYNAMIC_NAMING-Einstellung zu Ihrer settings.py-Datei hinzu.

Beispiel settings.py — Dynamische Benennung
XRAY_RECORDER = { 'AUTO_INSTRUMENT': True, 'AWS_XRAY_TRACING_NAME': 'My application', 'DYNAMIC_NAMING': '*.example.com', 'PLUGINS': ('ElasticBeanstalkPlugin', 'EC2Plugin') }

Sie können "*" im Muster verwenden, um eine Übereinstimmung mit einer beliebigen Zeichenfolge zu erzielen, oder "?" für die Übereinstimmung mit einem einzelnen Zeichen. Für Flask konfigurieren Sie den Recorder im Code.

Beispiel main.py — Segmentname
from aws_xray_sdk.core import xray_recorder xray_recorder.configure(service='My application') xray_recorder.configure(dynamic_naming='*.example.com')
Anmerkung

Sie können den mit der AWS_XRAY_TRACING_NAME-Umgebungsvariablen in Code definierten standardmäßigen Dienstnamen überschreiben.