Migrar para Python OpenTelemetry - AWS X-Ray

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Migrar para Python OpenTelemetry

Este guia ajuda você a migrar aplicativos Python do X-Ray SDK OpenTelemetry para a instrumentação. Ele abrange abordagens de instrumentação automática e manual, com exemplos de código para cenários comuns.

Soluções de instrumentação automática de código zero

Com o X-Ray SDK, você precisava modificar o código do aplicativo para rastrear solicitações. OpenTelemetry oferece soluções de instrumentação automática de código zero para rastrear solicitações. Com OpenTelemetry, você tem a opção de usar soluções de instrumentação automática de código zero para rastrear solicitações.

Código zero com OpenTelemetry instrumentações automáticas baseadas

  1. Usando a AWS Distro for OpenTelemetry (ADOT) Auto-instrumentation para Python — Para instrumentação automática para aplicativos Python, consulte Rastreamento e métricas com a Distro for Python Auto-Instrumentation. AWS OpenTelemetry

    (Opcional) Você também pode ativar o CloudWatch Application Signals ao instrumentar automaticamente seus aplicativos AWS com a instrumentação automática ADOT Python para monitorar a integridade atual do aplicativo e acompanhar o desempenho de longo prazo do aplicativo em relação aos seus objetivos de negócios. O Application Signals fornece uma visualização unificada e centrada em aplicações para aplicações, serviços e dependências, além de ajudar você a monitorar e realizar a triagem da integridade da aplicação.

  2. Usando a instrumentação automática de código zero do OpenTelemetry Python — Para instrumentação automática com o Python, consulte Instrumentação de código zero do Python. OpenTelemetry

Instrumente manualmente seus aplicativos

Você pode instrumentar manualmente seus aplicativos usando o 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

Inicialização da configuração de rastreamento

With X-Ray SDK

No X-Ray, o global xray_recorder é inicializado e usado para gerar segmentos e subsegmentos.

With OpenTelemetry SDK
nota

No momento, o X-Ray Remote Sampling não está disponível para ser configurado para OpenTelemetry Python. No entanto, o suporte para X-Ray Remote Sampling está atualmente disponível por meio do ADOT Auto-Instrumentation for Python.

Em OpenTelemetry, você precisa inicializar um globalTracerProvider. Usando issoTracerProvider, você pode adquirir um Tracer que pode ser usado para gerar extensões em qualquer lugar do seu aplicativo. É recomendável que você configure os seguintes componentes:

  • OTLPSpanExporter— Necessário para exportar traços para o CloudWatch OpenTelemetry Agente/Coletor

  • Um propagador de AWS raio-X — necessário para propagar o contexto de rastreamento para AWS serviços integrados ao 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

Com a instrumentação automática ADOT para Python

Você pode usar a instrumentação automática ADOT para Python para configurar OpenTelemetry automaticamente seus aplicativos Python. Ao usar a instrumentação automática ADOT, você não precisa fazer alterações manuais no código para rastrear solicitações recebidas ou rastrear bibliotecas, como os AWS clientes SDK ou HTTP. Para obter mais informações, consulte Rastreamento e métricas com a AWS distro for Python OpenTelemetry Auto-Instrumentation.

A instrumentação automática ADOT para Python suporta:

  • Amostragem remota de raio-X por meio da variável de ambiente export OTEL_TRACES_SAMPLER=xray

  • Propagação do contexto de rastreamento do X-Ray (ativada por padrão)

  • Detecção de recursos (a detecção de recursos para ambientes Amazon EC2, Amazon ECS e Amazon EKS é ativada por padrão)

  • As instrumentações automáticas da biblioteca para todas as OpenTelemetry instrumentações suportadas estão habilitadas por padrão. Você pode desativar seletivamente por meio da variável de OTEL_PYTHON_DISABLED_INSTRUMENTATIONS ambiente. (todos estão habilitados por padrão)

  • Criação manual de vãos

De plug-ins de serviço X-Ray a provedores de OpenTelemetry AWS recursos

O X-Ray SDK fornece plug-ins que você pode adicionar ao xray_recorder para capturar as informações específicas da plataforma do serviço hospedado, como Amazon, EC2 Amazon ECS e Elastic Beanstalk. É semelhante aos provedores de recursos, pois captura OpenTelemetry as informações como atributos de recursos. Há vários provedores de recursos disponíveis para diferentes AWS plataformas.

  • Comece instalando o pacote AWS de extensão, pip install opentelemetry-sdk-extension-aws

  • Configure o detector de recursos desejado. O exemplo a seguir mostra como configurar o provedor de EC2 recursos da Amazon no 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)

Rastreando solicitações recebidas

With X-Ray SDK

O X-Ray Python SDK oferece suporte a estruturas de aplicativos como Django, Flask e Bottle para rastrear as solicitações recebidas de aplicativos Python executados nelas. Isso é feito adicionando XRayMiddleware ao aplicativo cada estrutura.

With OpenTelemetry SDK

OpenTelemetry fornece instrumentações para Django e Flask por meio de bibliotecas de instrumentação específicas. Não há instrumentação para Bottle disponível em OpenTelemetry, as aplicações ainda podem ser rastreadas usando a instrumentação WSGI. OpenTelemetry

Para o exemplo de código a seguir, você precisa da seguinte dependência:

pip install opentelemetry-instrumentation-flask

Você deve inicializar o OpenTelemetry SDK e registrar o global TracerProvider antes de adicionar instrumentações à estrutura do seu aplicativo. Sem isso, as operações de rastreamento serãono-ops. Depois de configurar o globalTracerProvider, você pode usar o instrumentor para sua estrutura de aplicativos. O exemplo a seguir demonstra um aplicativo 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 Instrumentação do SDK

With X-Ray SDK

O X-Ray Python SDK rastreia a solicitação do cliente AWS SDK aplicando patches na biblioteca. botocore Para obter mais informações, consulte Rastreando chamadas do AWS SDK com o X-Ray SDK para Python. Em seu aplicativo, o patch_all() método é usado para instrumentar todas as bibliotecas ou corrigir seletivamente usando o botocore ou boto3 bibliotecas usandopatch((['botocore'])). Qualquer um dos métodos escolhidos instrumenta todos os clientes do Boto3 em seu aplicativo e gera um subsegmento para qualquer chamada feita usando esses clientes.

With OpenTelemetry SDK

Para o exemplo de código a seguir, você precisará da seguinte dependência:

pip install opentelemetry-instrumentation-botocore

Use a instrumentação OpenTelemetry Botocore programaticamente para instrumentar todos os clientes do Boto3 em seu aplicativo. O exemplo a seguir demonstra a botocore instrumentação.

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

Instrumentando chamadas HTTP de saída por meio de solicitações

With X-Ray SDK

O X-Ray Python SDK rastreia chamadas HTTP de saída por meio de solicitações corrigindo a biblioteca de solicitações. Para obter mais informações, consulte Rastreamento de chamadas para serviços web HTTP downstream usando o X-Ray SDK para Python. Em seu aplicativo, você pode usar o patch_all() método para instrumentar todas as bibliotecas ou corrigir seletivamente as bibliotecas de solicitações usando. patch((['requests'])) Qualquer uma das opções instrumenta a requests biblioteca, gerando um subsegmento para qualquer chamada feita por meio requests de.

With OpenTelemetry SDK

Para o exemplo de código a seguir, você precisará da seguinte dependência:

pip install opentelemetry-instrumentation-requests

Use a Instrumentação de OpenTelemetry Solicitações programaticamente para instrumentar a biblioteca de solicitações para gerar rastreamentos para solicitações HTTP feitas por ela em seu aplicativo. Para obter mais informações, consulte OpenTelemetry solicitações de instrumentação. O exemplo a seguir demonstra a instrumentação da 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, você também pode instrumentar a urllib3 biblioteca subjacente para rastrear solicitações 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")

Suporte de instrumentação para outras bibliotecas

Você pode encontrar a lista completa de instrumentações de biblioteca compatíveis com OpenTelemetry Python em Bibliotecas, estruturas, servidores de aplicativos e. JVMs

Como alternativa, você pode pesquisar no OpenTelemetry Registro para descobrir se OpenTelemetry suporta instrumentação. Consulte o Registro para começar a pesquisar.

Criação manual de dados de rastreamento

Você pode criar segmentos e subsegmentos usando o xray_recorder em seu aplicativo Python. Para obter mais informações, consulte Instrumentando o código Python manualmente. Você também pode adicionar manualmente anotações e metadados aos dados de rastreamento.

Criação de extensões com OpenTelemetry o SDK

Use a start_as_current_span API para iniciar uma extensão e configurá-la para criar extensões. Para exemplos sobre a criação de extensões, consulte Criação de extensões. Depois que um período é iniciado e está no escopo atual, você pode adicionar mais informações a ele adicionando atributos, eventos, exceções, links e assim por diante. Da mesma forma que temos segmentos e subsegmentos no X-Ray, existem diferentes tipos de extensões. OpenTelemetry Somente os intervalos SERVER de tipo são convertidos em segmentos de raio-X, enquanto outros são convertidos em subsegmentos de raio-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

Adicionar anotações e metadados aos rastreamentos com o SDK OpenTelemetry

O X-Ray Python SDK fornece anotações put_annotation e put_metadata metadados separados APIs a um rastreamento. No OpenTelemetry SDK, as anotações e os metadados são simplesmente atributos em um intervalo, adicionados por meio da API. set_attribute

Os atributos Span que você deseja que sejam anotações em um rastreamento são adicionados à chave reservada, aws.xray.annotations cujo valor é uma lista de pares de anotações de valores-chave. Todos os outros atributos de extensão se tornam metadados no segmento ou subsegmento convertido.

Além disso, se você estiver usando o coletor ADOT, poderá configurar quais atributos de extensão devem ser convertidos em anotações X-Ray especificando o na configuração do indexed_attributes coletor.

O exemplo abaixo demonstra como adicionar anotações e metadados a um rastreamento usando o 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")

Instrumentação Lambda

Para monitorar suas funções lambda no X-Ray, você ativa o X-Ray e adiciona as permissões apropriadas à função de invocação da função. Além disso, se você estiver rastreando solicitações downstream de sua função, estará instrumentando o código com o X-Ray Python SDK.

Com OpenTelemetry o for X-Ray, é recomendável usar a camada lambda do CloudWatch Application Signals com o Application Signals desativado. Isso instrumentará automaticamente sua função e gerará intervalos para a invocação da função e qualquer solicitação posterior de sua função. Além do rastreamento, se você estiver interessado em usar sinais de aplicativos para monitorar a integridade de sua função, consulte Habilitar seus aplicativos no Lambda.

  • Encontre o ARN da camada Lambda necessário para sua função em AWS Lambda Layer for e adicione-o. OpenTelemetry ARNs

  • Defina as seguintes variáveis de ambiente para sua função.

    • AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument— Isso carrega a instrumentação automática para a função

    • OTEL_AWS_APPLICATION_SIGNALS_ENABLED=false— Isso desativará o monitoramento de sinais de aplicativos

Criação manual de extensões com instrumentação Lambda

Além disso, você pode gerar períodos personalizados em sua função para monitorar o trabalho. Você pode fazer isso usando somente o opentelemetry-api pacote em conjunto com a instrumentação automática da camada lambda do Application Signals.

  1. Inclua o opentelemetry-api como uma dependência em sua função

  2. O trecho de código a seguir é um exemplo para gerar extensões personalizadas

    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 }