Zu OpenTelemetry Python migrieren - 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.

Zu OpenTelemetry Python migrieren

Dieses Handbuch hilft Ihnen bei der Migration von Python-Anwendungen vom X-Ray SDK zur OpenTelemetry Instrumentierung. Es behandelt sowohl automatische als auch manuelle Instrumentierungsansätze mit Codebeispielen für gängige Szenarien.

Automatische Instrumentierungslösungen ohne Code

Mit X-Ray SDK mussten Sie Ihren Anwendungscode ändern, um Anfragen zu verfolgen. OpenTelemetry bietet automatische Instrumentierungslösungen ohne Code zur Rückverfolgung von Anfragen. Mit haben Sie die Möglichkeit OpenTelemetry, automatische Instrumentierungslösungen ohne Code zu verwenden, um Anfragen zu verfolgen.

Nullcode mit basierten automatischen Instrumentierungen OpenTelemetry

  1. Verwenden der automatischen Instrumentierung von AWS Distro for OpenTelemetry (ADOT) für Python — Informationen zur automatischen Instrumentierung für Python-Anwendungen finden Sie unter Tracing and Metrics with the AWS Distro for Python Auto-Instrumentation. OpenTelemetry

    (Optional) Sie können CloudWatch Application Signals auch bei der automatischen Instrumentierung Ihrer Anwendungen AWS mit der automatischen ADOT-Python-Instrumentierung aktivieren, um den aktuellen Anwendungsstatus zu überwachen und die langfristige Anwendungsleistung anhand Ihrer Geschäftsziele zu verfolgen. Application Signals bietet Ihnen einen einheitlichen, anwendungsorientierten Überblick über Ihre Anwendungen, Services und Abhängigkeiten und unterstützt Sie bei der Überwachung und Diagnose des Zustands Ihrer Anwendungen.

  2. Verwendung der automatischen OpenTelemetry Python-Zero-Code-Instrumentierung — Informationen zur automatischen Instrumentierung mit OpenTelemetry Python finden Sie unter Python-Zero-Code-Instrumentierung.

Instrumentieren Sie Ihre Anwendungen manuell

Sie können Ihre Anwendungen mithilfe des pip Befehls manuell instrumentieren.

With X-Ray SDK
pip install aws-xray-sdk
With OpenTelemetry SDK
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp opentelemetry-propagator-aws-xray

Initialisierung des Tracing-Setups

With X-Ray SDK

In X-Ray xray_recorder wird das Global initialisiert und verwendet, um Segmente und Untersegmente zu generieren.

With OpenTelemetry SDK
Anmerkung

X-Ray Remote Sampling kann derzeit nicht für OpenTelemetry Python konfiguriert werden. Unterstützung für X-Ray Remote Sampling ist derzeit jedoch über die ADOT Auto-Instrumentation for Python verfügbar.

In OpenTelemetry müssen Sie eine globale initialisieren. TracerProvider Auf diese Weise können Sie einen Tracer erwerbenTracerProvider, mit dem Sie Spans an einer beliebigen Stelle in Ihrer Anwendung generieren können. Es wird empfohlen, die folgenden Komponenten zu konfigurieren:

  • OTLPSpanExporter— Erforderlich für den Export von Traces zum CloudWatch Agent/Collector OpenTelemetry

  • Ein AWS X-Ray Propagator — Erforderlich für die Weitergabe des Trace-Kontextes an AWS Dienste, die in X-Ray integriert sind

from opentelemetry import ( trace, propagate ) from opentelemetry.sdk.trace import TracerProvider from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.propagators.aws import AwsXRayPropagator # Sends generated traces in the OTLP format to an OTel Collector running on port 4318 otlp_exporter = OTLPSpanExporter(endpoint="http://localhost:4318/v1/traces") # Processes traces in batches as opposed to immediately one after the other span_processor = BatchSpanProcessor(otlp_exporter) # More configurations can be done here. We will visit them later. # Sets the global default tracer provider provider = TracerProvider(active_span_processor=span_processor) trace.set_tracer_provider(provider) # Configures the global propagator to use the X-Ray Propagator propagate.set_global_textmap(AwsXRayPropagator()) # Creates a tracer from the global tracer provider tracer = trace.get_tracer("my.tracer.name") # Use this tracer to create Spans

Mit ADOT Auto-Instrumentation für Python

Sie können die automatische ADOT-Instrumentierung für Python verwenden, um Ihre Python-Anwendungen automatisch zu konfigurieren OpenTelemetry . Durch die automatische ADOT-Instrumentierung müssen Sie keine manuellen Codeänderungen vornehmen, um eingehende Anfragen zu verfolgen oder Bibliotheken wie das AWS SDK oder die HTTP-Clients zu verfolgen. Weitere Informationen finden Sie unter Tracing and Metrics with the AWS Distro for OpenTelemetry Python Auto-Instrumentation.

Die automatische ADOT-Instrumentierung für Python unterstützt:

  • Röntgenfernabtastung durch die Umgebungsvariable export OTEL_TRACES_SAMPLER=xray

  • Übertragung des X-Ray-Trace-Kontextes (standardmäßig aktiviert)

  • Ressourcenerkennung (Ressourcenerkennung für Amazon- EC2, Amazon ECS- und Amazon EKS-Umgebungen ist standardmäßig aktiviert)

  • Automatische Bibliotheksinstrumentierungen für alle unterstützten OpenTelemetry Instrumentierungen sind standardmäßig aktiviert. Sie können sie selektiv über die OTEL_PYTHON_DISABLED_INSTRUMENTATIONS Umgebungsvariable deaktivieren. (alle sind standardmäßig aktiviert)

  • Manuelles Erstellen von Spans

Von X-Ray-Service-Plug-ins bis hin zu OpenTelemetry AWS Ressourcenanbietern

Das X-Ray-SDK bietet Plug-ins, die Sie hinzufügen könnenxray_recorder, um plattformspezifische Informationen aus dem gehosteten Service wie Amazon EC2, Amazon ECS und Elastic Beanstalk zu erfassen. Es ist den Resource Providers insofern ähnlich OpenTelemetry , als es die Informationen als Ressourcenattribute erfasst. Es sind mehrere Ressourcenanbieter für verschiedene AWS Plattformen verfügbar.

  • Beginnen Sie mit der Installation des AWS Erweiterungspakets, pip install opentelemetry-sdk-extension-aws

  • Konfigurieren Sie den gewünschten Ressourcendetektor. Das folgende Beispiel zeigt, wie der EC2 Amazon-Ressourcenanbieter im OpenTelemetry SDK konfiguriert wird

    from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.extension.aws.resource.ec2 import ( AwsEc2ResourceDetector, ) from opentelemetry.sdk.resources import get_aggregated_resources provider = TracerProvider( active_span_processor=span_processor, resource=get_aggregated_resources([ AwsEc2ResourceDetector(), ])) trace.set_tracer_provider(provider)

Nachverfolgung eingehender Anfragen

With X-Ray SDK

Das X-Ray-Python-SDK unterstützt Anwendungsframeworks wie Django, Flask und Bottle bei der Verfolgung der eingehenden Anfragen für Python-Anwendungen, die auf ihnen ausgeführt werden. Dies erfolgt durch Hinzufügen XRayMiddleware zur Anwendung für jedes Framework.

With OpenTelemetry SDK

OpenTelemetry bietet Instrumentierungen für Django und Flask über die spezifischen Instrumentierungsbibliotheken. In ist keine Instrumentierung für Bottle verfügbar OpenTelemetry, Anwendungen können dennoch mithilfe der WSGI-Instrumentation verfolgt werden. OpenTelemetry

Für das folgende Codebeispiel benötigen Sie die folgende Abhängigkeit:

pip install opentelemetry-instrumentation-flask

Sie müssen das SDK initialisieren und das globale OpenTelemetry SDK registrieren, TracerProvider bevor Sie Instrumentierungen für Ihr Anwendungsframework hinzufügen können. Ohne sie werden die Trace-Operationen funktionieren. no-ops Sobald Sie den Global konfiguriert habenTracerProvider, können Sie den Instrumentor für Ihr Anwendungsframework verwenden. Das folgende Beispiel demonstriert eine Flask-Anwendung.

from flask import Flask from opentelemetry import trace from opentelemetry.instrumentation.flask import FlaskInstrumentor from opentelemetry.sdk.extension.aws.resource import AwsEc2ResourceDetector from opentelemetry.sdk.resources import get_aggregated_resources from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter provider = TracerProvider(resource=get_aggregated_resources( [ AwsEc2ResourceDetector(), ])) processor = BatchSpanProcessor(ConsoleSpanExporter()) provider.add_span_processor(processor) trace.set_tracer_provider(provider) # Creates a tracer from the global tracer provider tracer = trace.get_tracer("my.tracer.name") app = Flask(__name__) # Instrument the Flask app FlaskInstrumentor().instrument_app(app) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()

AWS SDK-Instrumentierung

With X-Ray SDK

Das X-Ray-Python-SDK verfolgt die AWS SDK-Client-Anfrage, indem es die botocore Bibliothek patcht. Weitere Informationen finden Sie unter Nachverfolgen von AWS SDK-Aufrufen mit dem X-Ray-SDK für Python. In Ihrer Anwendung wird die patch_all() Methode verwendet, um alle Bibliotheken zu instrumentieren oder selektiv mithilfe von boto3 Bibliotheken zu patchen. botocore patch((['botocore'])) Jede der ausgewählten Methoden instrumentiert alle Boto3-Clients in Ihrer Anwendung und generiert ein Untersegment für jeden Aufruf, der mit diesen Clients getätigt wird.

With OpenTelemetry SDK

Für das folgende Codebeispiel benötigen Sie die folgende Abhängigkeit:

pip install opentelemetry-instrumentation-botocore

Verwenden Sie die OpenTelemetry Botocore-Instrumentation programmgesteuert, um alle Boto3-Clients in Ihrer Anwendung zu instrumentieren. Das folgende Beispiel demonstriert die Instrumentierung. botocore

import boto3 import opentelemetry.trace as trace from botocore.exceptions import ClientError from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.resources import get_aggregated_resources from opentelemetry.sdk.trace.export import ( BatchSpanProcessor, ConsoleSpanExporter, ) from opentelemetry.instrumentation.botocore import BotocoreInstrumentor provider = TracerProvider() processor = BatchSpanProcessor(ConsoleSpanExporter()) provider.add_span_processor(processor) trace.set_tracer_provider(provider) # Creates a tracer from the global tracer provider tracer = trace.get_tracer("my.tracer.name") # Instrument BotoCore BotocoreInstrumentor().instrument() # Initialize S3 client s3 = boto3.client("s3", region_name="us-east-1") # Your bucket name bucket_name = "my-example-bucket" # Get bucket location (as an example of describing it) try: response = s3.get_bucket_location(Bucket=bucket_name) region = response.get("LocationConstraint") or "us-east-1" print(f"Bucket '{bucket_name}' is in region: {region}") # Optionally, get bucket's creation date via list_buckets buckets = s3.list_buckets() for bucket in buckets["Buckets"]: if bucket["Name"] == bucket_name: print(f"Bucket created on: {bucket['CreationDate']}") break except ClientError as e: print(f"Failed to describe bucket: {e}")

Instrumentierung ausgehender HTTP-Aufrufe über Anfragen

With X-Ray SDK

Das X-Ray-Python-SDK verfolgt ausgehende HTTP-Aufrufe anhand von Anfragen, indem es die Anforderungsbibliothek patcht. Weitere Informationen finden Sie unter Verfolgen von Aufrufen von Downstream-HTTP-Webdiensten mithilfe des X-Ray-SDK für Python. In Ihrer Anwendung können Sie die patch_all() Methode verwenden, um alle Bibliotheken zu instrumentieren, oder indem Sie die Anforderungsbibliotheken selektiv patchen, indem Sie patch((['requests'])) Jede der Optionen instrumentiert die requests Bibliothek und generiert ein Untersegment für jeden Aufruf, der über sie erfolgt. requests

With OpenTelemetry SDK

Für das folgende Codebeispiel benötigen Sie die folgende Abhängigkeit:

pip install opentelemetry-instrumentation-requests

Verwenden Sie die OpenTelemetry Requests Instrumentation programmgesteuert, um die Anforderungsbibliothek so zu instrumentieren, dass sie Traces für HTTP-Anfragen generiert, die von ihr in Ihrer Anwendung gestellt werden. Weitere Informationen finden Sie unter Instrumentation von OpenTelemetry Anfragen. Das folgende Beispiel zeigt die Instrumentierung der requests Bibliothek.

from opentelemetry.instrumentation.requests import RequestsInstrumentor # Instrument Requests RequestsInstrumentor().instrument() ... example_session = requests.Session() example_session.get(url="https://example.com")

Alternativ können Sie die zugrunde liegende urllib3 Bibliothek auch instrumentieren, um HTTP-Anfragen zu verfolgen:

# pip install opentelemetry-instrumentation-urllib3 from opentelemetry.instrumentation.urllib3 import URLLib3Instrumentor # Instrument urllib3 URLLib3Instrumentor().instrument() ... example_session = requests.Session() example_session.get(url="https://example.com")

Instrumentierungsunterstützung für andere Bibliotheken

Die vollständige Liste der unterstützten Bibliotheksinstrumentationen für OpenTelemetry Python finden Sie unter Unterstützte Bibliotheken, Frameworks, Anwendungsserver und JVMs.

Alternativ können Sie in der OpenTelemetry Registry suchen, um herauszufinden, ob Instrumentierung OpenTelemetry unterstützt wird. Suchen Sie in der Registry nach, um mit der Suche zu beginnen.

Manuelles Erstellen von Trace-Daten

Sie können Segmente und Untersegmente mithilfe von xray_recorder in Ihrer Python-Anwendung erstellen. Weitere Informationen finden Sie unter Manuelles Instrumentieren von Python-Code. Sie können den Trace-Daten auch manuell Anmerkungen und Metadaten hinzufügen.

Spans mit SDK erstellen OpenTelemetry

Verwenden Sie die start_as_current_span API, um einen Bereich zu starten und ihn für die Erstellung von Spans festzulegen. Beispiele zum Erstellen von Spans finden Sie unter Spans erstellen. Sobald ein Bereich gestartet wurde und sich im aktuellen Bereich befindet, können Sie ihm weitere Informationen hinzufügen, indem Sie Attribute, Ereignisse, Ausnahmen, Links usw. hinzufügen. So wie wir in X-Ray Segmente und Untersegmente haben, gibt es auch hier verschiedene Arten von Spannen. OpenTelemetry Nur die SERVER Typbereiche werden in Röntgensegmente umgewandelt, während andere in Röntgenuntersegmente umgewandelt werden.

from opentelemetry import trace from opentelemetry.trace import SpanKind import time tracer = trace.get_tracer("my.tracer.name") # Create a new span to track some work with tracer.start_as_current_span("parent", kind=SpanKind.SERVER) as parent_span: time.sleep(1) # Create a nested span to track nested work with tracer.start_as_current_span("child", kind=SpanKind.CLIENT) as child_span: time.sleep(2) # the nested span is closed when it's out of scope # Now the parent span is the current span again time.sleep(1) # This span is also closed when it goes out of scope

Hinzufügen von Anmerkungen und Metadaten zu Traces mit SDK OpenTelemetry

Das X-Ray-Python-SDK bietet separate APIs put_metadata Funktionen zum Hinzufügen von Anmerkungen und Metadaten zu einem Trace. put_annotation Im OpenTelemetry SDK sind die Anmerkungen und Metadaten einfach Attribute in einem Bereich, die über die set_attribute API hinzugefügt werden.

Span-Attribute, bei denen es sich um Anmerkungen zu einem Trace handeln soll, werden unter dem reservierten Schlüssel hinzugefügt, aws.xray.annotations dessen Wert eine Liste von Schlüssel-Wert-Annotationspaaren ist. Alle anderen Span-Attribute werden zu Metadaten für das konvertierte Segment oder Untersegment.

Wenn Sie den ADOT-Collector verwenden, können Sie außerdem konfigurieren, welche Span-Attribute in X-Ray-Anmerkungen konvertiert werden sollen, indem Sie das indexed_attributes in der Collector-Konfiguration angeben.

Das folgende Beispiel zeigt, wie Sie mithilfe des SDK Anmerkungen und Metadaten zu einer Ablaufverfolgung hinzufügen. OpenTelemetry

with tracer.start_as_current_span("parent", kind=SpanKind.SERVER) as parent_span: parent_span.set_attribute("TransactionId", "qwerty12345") parent_span.set_attribute("AccountId", "1234567890") # This will convert the TransactionId and AccountId to be searchable X-Ray annotations parent_span.set_attribute("aws.xray.annotations", ["TransactionId", "AccountId"]) with tracer.start_as_current_span("child", kind=SpanKind.CLIENT) as child_span: # The MicroTransactionId will be converted to X-Ray metadata for the child subsegment child_span.set_attribute("MicroTransactionId", "micro12345")

Lambda-Instrumentierung

Um Ihre Lambda-Funktionen auf X-Ray zu überwachen, aktivieren Sie X-Ray und fügen der Funktionsaufrufrolle entsprechende Berechtigungen hinzu. Wenn Sie Downstream-Anfragen von Ihrer Funktion verfolgen, würden Sie den Code außerdem mit dem X-Ray-Python-SDK instrumentieren.

OpenTelemetry Für X-Ray wird empfohlen, die CloudWatch Application Signals Lambda-Schicht bei ausgeschalteten Application Signals zu verwenden. Dadurch wird Ihre Funktion automatisch instrumentiert und Spans für den Funktionsaufruf und alle nachgelagerten Anfragen Ihrer Funktion generiert. Wenn Sie neben der Ablaufverfolgung auch Anwendungssignale verwenden möchten, um den Zustand Ihrer Funktion zu überwachen, finden Sie weitere Informationen unter Aktivieren Ihrer Anwendungen auf Lambda.

  • Suchen Sie den erforderlichen Lambda-Layer-ARN für Ihre Funktion aus AWS Lambda Layer for OpenTelemetry ARNs und fügen Sie ihn hinzu.

  • Stellen Sie die folgenden Umgebungsvariablen für Ihre Funktion ein.

    • AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument— Dadurch wird die automatische Instrumentierung für die Funktion geladen

    • OTEL_AWS_APPLICATION_SIGNALS_ENABLED=false— Dadurch wird die Überwachung von Anwendungssignalen deaktiviert

Manuelles Erstellen von Spans mit Lambda-Instrumentierung

Darüber hinaus können Sie innerhalb Ihrer Funktion benutzerdefinierte Zeitspannen generieren, um die Arbeit zu verfolgen. Sie können dies tun, indem Sie nur das opentelemetry-api Paket in Verbindung mit der automatischen Lambda-Layer-Instrumentierung von Application Signals verwenden.

  1. Nehmen Sie das opentelemetry-api als Abhängigkeit in Ihre Funktion auf

  2. Der folgende Codeausschnitt ist ein Beispiel für die Generierung benutzerdefinierter Spans

    from opentelemetry import trace # Get the tracer (auto‑configured by the Application Signals layer) tracer = trace.get_tracer(__name__) def handler(event, context): # This span is a child of the layer's root span with tracer.start_as_current_span("my-custom-span") as span: span.set_attribute("key1", "value1") span.add_event("custom-event", {"detail": "something happened"}) # Any logic you want to trace result = some_internal_logic() return { "statusCode": 200, "body": result }