Migrar a OpenTelemetry Python - AWS X-Ray

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Migrar a OpenTelemetry Python

Esta guía le ayuda a migrar las aplicaciones de Python del SDK de X-Ray a la OpenTelemetry instrumentación. Abarca los enfoques de instrumentación automática y manual, con ejemplos de código para escenarios comunes.

Soluciones de instrumentación automática sin código

Con el SDK de X-Ray, tenías que modificar el código de tu aplicación para rastrear las solicitudes. OpenTelemetry ofrece soluciones de autoinstrumentación sin código para rastrear las solicitudes. Con OpenTelemetry, tiene la opción de utilizar soluciones de autoinstrumentación sin código para rastrear las solicitudes.

Código cero con instrumentaciones automáticas basadas OpenTelemetry

  1. Uso de la AWS distribución para la instrumentación automática OpenTelemetry (ADOT) para Python: para obtener información sobre la instrumentación automática para aplicaciones de Python, consulte Seguimiento y métricas con la distribución para la AWS instrumentación automática de Python. OpenTelemetry

    (Opcional) También puede habilitar CloudWatch Application Signals al instrumentar automáticamente sus aplicaciones AWS con la instrumentación automática de ADOT Python para monitorear el estado actual de las aplicaciones y realizar un seguimiento del rendimiento de las aplicaciones a largo plazo en comparación con sus objetivos comerciales. Application Signals le proporciona una visión unificada y centrada en las aplicaciones de sus aplicaciones, servicios y dependencias y lo ayuda a supervisar y evaluar el estado de las aplicaciones.

  2. Uso de la instrumentación automática de código cero de OpenTelemetry Python: para la instrumentación automática con Python OpenTelemetry , consulte Instrumentación de código cero de Python.

Instrumente sus aplicaciones manualmente

Puede instrumentar manualmente sus aplicaciones mediante el pip comando.

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

Inicialización de la configuración de rastreo

With X-Ray SDK

En X-Ray, el global xray_recorder se inicializa y se usa para generar segmentos y subsegmentos.

With OpenTelemetry SDK
nota

El muestreo remoto de X-Ray no está disponible actualmente para configurarlo para OpenTelemetry Python. Sin embargo, el soporte para el muestreo remoto de rayos X está disponible actualmente a través de la instrumentación automática de ADOT para Python.

En OpenTelemetry, necesita inicializar un global. TracerProvider Con estoTracerProvider, puede adquirir un Tracer que puede usar para generar intervalos en cualquier parte de su aplicación. Se recomienda configurar los siguientes componentes:

  • OTLPSpanExporter— Necesario para exportar las trazas al CloudWatch OpenTelemetry agente/recopilador

  • Un propagador de AWS rayos X: necesario para propagar el contexto de rastreo a AWS los servicios integrados con X-Ray

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

Con la instrumentación automática de ADOT para Python

Puede utilizar la instrumentación automática de ADOT para Python para configurar automáticamente OpenTelemetry sus aplicaciones de Python. Al utilizar la instrumentación automática de ADOT, no es necesario realizar cambios manuales en el código para rastrear las solicitudes entrantes ni para rastrear bibliotecas como el AWS SDK o los clientes HTTP. Para obtener más información, consulte Seguimiento y métricas con la AWS distribución para la instrumentación automática de OpenTelemetry Python.

La autoinstrumentación de ADOT para Python admite:

  • Muestreo remoto de rayos X a través de la variable de entorno export OTEL_TRACES_SAMPLER=xray

  • Propagación del contexto de trazas de rayos X (habilitada de forma predeterminada)

  • Detección de recursos (la detección de recursos para los entornos de Amazon EC2, Amazon ECS y Amazon EKS está habilitada de forma predeterminada)

  • Las instrumentaciones de biblioteca automáticas para todas las OpenTelemetry instrumentaciones compatibles están habilitadas de forma predeterminada. Puede desactivarlas de forma selectiva a través de la variable de entorno. OTEL_PYTHON_DISABLED_INSTRUMENTATIONS (todas están activadas por defecto)

  • Creación manual de tramos

Desde complementos del servicio de X-Ray hasta proveedores de OpenTelemetry AWS recursos

El SDK de X-Ray incluye complementos que se pueden añadir xray_recorder para capturar la información específica de la plataforma desde el servicio hospedado, como Amazon EC2, Amazon ECS y Elastic Beanstalk. Es similar a los proveedores de recursos, ya OpenTelemetry que captura la información como atributos de recursos. Hay varios proveedores de recursos disponibles para diferentes AWS plataformas.

  • Comience por instalar el paquete AWS de extensión, pip install opentelemetry-sdk-extension-aws

  • Configure el detector de recursos deseado. El siguiente ejemplo muestra cómo configurar el proveedor de EC2 recursos de Amazon en el OpenTelemetry SDK.

    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)

Rastreo de las solicitudes entrantes

With X-Ray SDK

El SDK de Python de X-Ray admite marcos de aplicaciones como Django, Flask y Bottle para rastrear las solicitudes entrantes de las aplicaciones de Python que se ejecutan en ellos. Esto se hace añadiendo elementos XRayMiddleware a la aplicación para cada marco.

With OpenTelemetry SDK

OpenTelemetry proporciona instrumentaciones para Django y Flask a través de las bibliotecas de instrumentación específicas. No hay instrumentación para Bottle disponible en OpenTelemetry, pero aún se pueden rastrear las aplicaciones utilizando la instrumentación WSGI. OpenTelemetry

Para el siguiente ejemplo de código, necesita la siguiente dependencia:

pip install opentelemetry-instrumentation-flask

Debe inicializar el OpenTelemetry SDK y registrar el global TracerProvider antes de añadir instrumentaciones al marco de su aplicación. Sin él, las operaciones de rastreo lo serán. no-ops Una vez que haya configurado lo globalTracerProvider, puede usar el instrumento como marco de aplicación. El siguiente ejemplo muestra una aplicación Flask.

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 Instrumentación del SDK

With X-Ray SDK

El SDK de Python de X-Ray rastrea la solicitud del cliente del AWS SDK parcheando la botocore biblioteca. Para obtener más información, consulta Rastrear las llamadas AWS del SDK con el SDK de X-Ray para Python. En su aplicación, el patch_all() método se utiliza para instrumentar todas las bibliotecas o aplicar parches de forma selectiva utilizando las boto3 bibliotecas botocore o bibliotecas que utilizan. patch((['botocore'])) Cualquiera de los métodos elegidos instrumenta todos los clientes de Boto3 de su aplicación y genera un subsegmento para cualquier llamada realizada con estos clientes.

With OpenTelemetry SDK

Para el siguiente ejemplo de código, necesitará la siguiente dependencia:

pip install opentelemetry-instrumentation-botocore

Utilice la instrumentación de OpenTelemetry Botocore mediante programación para instrumentar todos los clientes de Boto3 de su aplicación. El siguiente ejemplo muestra la instrumentación. 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}")

Instrumentar las llamadas HTTP salientes mediante solicitudes

With X-Ray SDK

El SDK de Python de X-Ray rastrea las llamadas HTTP salientes a través de solicitudes parcheando la biblioteca de solicitudes. Para obtener más información, consulte Rastreo de llamadas a servicios web HTTP descendentes mediante el SDK de X-Ray para Python. En su aplicación, puede usar el patch_all() método para instrumentar todas las bibliotecas o parchear selectivamente las bibliotecas de solicitudes mediante el uso de. patch((['requests'])) Cualquiera de las opciones instrumenta la requests biblioteca y genera un subsegmento para cualquier llamada realizada a través de ella. requests

With OpenTelemetry SDK

Para el siguiente ejemplo de código, necesitarás la siguiente dependencia:

pip install opentelemetry-instrumentation-requests

Utilice la instrumentación de OpenTelemetry solicitudes mediante programación para instrumentar la biblioteca de solicitudes a fin de generar seguimientos de las solicitudes HTTP que realice en su aplicación. Para obtener más información, consulta OpenTelemetry la sección Instrumentación de solicitudes. El siguiente ejemplo muestra la instrumentación de la requests biblioteca.

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

Como alternativa, también puedes instrumentar la urllib3 biblioteca subyacente para rastrear las solicitudes HTTP:

# 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")

Soporte de instrumentación para otras bibliotecas

Puede encontrar la lista completa de instrumentaciones de biblioteca compatibles para OpenTelemetry Python en Bibliotecas, marcos, servidores de aplicaciones y. JVMs

También puedes buscar en el OpenTelemetry Registro si es OpenTelemetry compatible con la instrumentación. Consulte el Registro para empezar a buscar.

Creación manual de datos de rastreo

Puede crear segmentos y subsegmentos utilizando xray_recorder la aplicación Python. Para obtener más información, consulte Instrumentación manual del código Python. También puede añadir manualmente anotaciones y metadatos a los datos de rastreo.

Creación de tramos con el SDK OpenTelemetry

Usa la start_as_current_span API para iniciar un intervalo y configúralo para crearlo. Para ver ejemplos sobre la creación de intervalos, consulta Cómo crear intervalos. Una vez que se inicia un intervalo y se encuentra en el ámbito actual, puede añadirle más información añadiendo atributos, eventos, excepciones, enlaces, etc. Al igual que tenemos segmentos y subsegmentos en X-Ray, hay diferentes tipos de intervalos. OpenTelemetry Solo los tramos del SERVER tipo se convierten en segmentos de rayos X, mientras que otros se convierten en subsegmentos de rayos X.

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

Añadir anotaciones y metadatos a las trazas con el SDK OpenTelemetry

El SDK de Python de X-Ray proporciona anotaciones put_annotation y metadatos independientes APIs put_metadata para añadir anotaciones y metadatos a una traza. En el OpenTelemetry SDK, las anotaciones y los metadatos son simplemente atributos de un intervalo que se agregan a través de la set_attribute API.

Los atributos de intervalo que desee que sean anotaciones en un rastreo se agregan bajo la clave reservada, aws.xray.annotations cuyo valor es una lista de pares de anotaciones clave-valor. Todos los demás atributos del intervalo se convierten en metadatos del segmento o subsegmento convertido.

Además, si utiliza el recopilador ADOT, puede configurar qué atributos de tramo deben convertirse en anotaciones de X-Ray especificándolos indexed_attributes en la configuración del recopilador.

El siguiente ejemplo muestra cómo añadir anotaciones y metadatos a un rastreo mediante el SDK. 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")

Instrumentación Lambda

Para monitorear sus funciones lambda en X-Ray, habilite X-Ray y agregue los permisos adecuados al rol de invocación de la función. Además, si está rastreando las solicitudes posteriores de su función, estaría instrumentando el código con el SDK de Python de X-Ray.

En OpenTelemetry el caso de X-Ray, se recomienda utilizar la capa lambda de CloudWatch Application Signals con Application Signals desactivada. Esto instrumentará automáticamente su función y generará intervalos para la invocación de la función y cualquier solicitud posterior de su función. Además del rastreo, si está interesado en usar Application Signals para monitorear el estado de su función, consulte Habilitar sus aplicaciones en Lambda.

  • Busque el ARN de la capa Lambda necesario para su función en AWS Lambda Layer for y agréguelo. OpenTelemetry ARNs

  • Defina las siguientes variables de entorno para su función.

    • AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument— Esto carga la instrumentación automática de la función

    • OTEL_AWS_APPLICATION_SIGNALS_ENABLED=false— Esto deshabilitará el monitoreo de las señales de la aplicación

Creación manual de tramos con instrumentación Lambda

Además, puede generar intervalos personalizados dentro de su función para realizar un seguimiento del trabajo. Puede hacerlo utilizando solo el opentelemetry-api paquete junto con la autoinstrumentación de la capa lambda de Application Signals.

  1. Incluya el opentelemetry-api como una dependencia en su función

  2. El siguiente fragmento de código es un ejemplo para generar intervalos personalizados

    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 }