Todos os produtos
Search
Central de documentação

Application Real-Time Monitoring Service:Report trace data from Python applications by using OpenTelemetry

Última atualização: Jul 05, 2026

Instrumente sua aplicação Python com o OpenTelemetry para enviar dados de rastreamento ao Managed Service for OpenTelemetry. Após a conexão, o Application Real-Time Monitoring Service (ARMS) exibe a topologia da aplicação, rastros, transações anômalas, transações lentas e análises de SQL.

Este tópico aborda três abordagens de instrumentação:

  • Instrumentação automática: não requer alterações no código. Um agente do OpenTelemetry instrumenta os frameworks suportados durante a execução.

  • Instrumentação manual: oferece controle total. Adicione spans, atributos e baggage por meio do SDK do OpenTelemetry.

  • Instrumentação combinada: sobreponha spans personalizados à instrumentação automática para obter visibilidade direcionada.

Importante

Dica:

A Alibaba Cloud fornece um agente Python dedicado com observabilidade integrada para frameworks de LLM, incluindo LlamaIndex, Dify, LangChain, OpenAI e Qwen. Ele gera métricas, rastros e dados de profiling contínuo mais ricos do que o agente open source. Para mais detalhes, consulte

Monitorar aplicações Python

.

Pré-requisitos

Frameworks suportados

O OpenTelemetry oferece plug-ins de instrumentação automática para frameworks Python comuns. A tabela a seguir lista os frameworks suportados e seus requisitos de versão. Para a lista completa, consulte opentelemetry-python-contrib.

Nota

Na tabela,

~= V.N

significa

>= V.N

e

== V.*

. Por exemplo,

aiohttp ~= 3,0

indica a versão 3,0 ou posterior dentro da faixa 3.x.

Expandir para visualizar os frameworks Python suportados

**Plug-in**

**Pacote e versão suportados**

opentelemetry-instrumentation-aio-pika

aio_pika - [7.2.0, 10.0.0)

opentelemetry-instrumentation-aiohttp-client

aiohttp ~= 3,0

opentelemetry-instrumentation-aiohttp-server

aiohttp ~= 3,0

opentelemetry-instrumentation-aiopg

aiopg - [0.13.0, 2.0.0)

opentelemetry-instrumentation-asgi

asgiref ~= 3,0

opentelemetry-instrumentation-asyncpg

asyncpg >= 0.12.0

opentelemetry-instrumentation-aws-lambda

aws_lambda

opentelemetry-instrumentation-boto

boto ~= 2,0

opentelemetry-instrumentation-boto3sqs

boto3 ~= 1,0

opentelemetry-instrumentation-botocore

botocore ~= 1,0

opentelemetry-instrumentation-cassandra

cassandra-driver ~= 3,25, scylla-driver ~= 3,25

opentelemetry-instrumentation-celery

celery - [4,0, 6,0)

opentelemetry-instrumentation-confluent-kafka

confluent-kafka - [1.8.2, 2.2.0]

opentelemetry-instrumentation-dbapi

dbapi

opentelemetry-instrumentation-django

django >= 1,10

opentelemetry-instrumentation-elasticsearch

elasticsearch >= 2,0

opentelemetry-instrumentation-falcon

falcon - [1.4.1, 4.0.0)

opentelemetry-instrumentation-fastapi

fastapi ~= 0,58

opentelemetry-instrumentation-flask

flask - [1,0, 3,0)

opentelemetry-instrumentation-grpc

grpcio ~= 1,27

opentelemetry-instrumentation-httpx

httpx >= 0.18.0

opentelemetry-instrumentation-jinja2

jinja2 - [2,7, 4,0)

opentelemetry-instrumentation-kafka-python

kafka-python >= 2,0

opentelemetry-instrumentation-logging

logging

opentelemetry-instrumentation-mysql

mysql-connector-python ~= 8,0

opentelemetry-instrumentation-mysqlclient

mysqlclient < 3

opentelemetry-instrumentation-pika

pika >= 0.12.0

opentelemetry-instrumentation-psycopg2

psycopg2 >= 2.7.3.1

opentelemetry-instrumentation-pymemcache

pymemcache - [1.3.5, 5)

opentelemetry-instrumentation-pymongo

pymongo - [3,1, 5,0)

opentelemetry-instrumentation-pymysql

PyMySQL < 2

opentelemetry-instrumentation-pyramid

pyramid >= 1.7

opentelemetry-instrumentation-redis

redis >= 2,6

opentelemetry-instrumentation-remoulade

remoulade >= 0,50

opentelemetry-instrumentation-requests

requests ~= 2,0

opentelemetry-instrumentation-sklearn

scikit-learn ~= 0.24.0

opentelemetry-instrumentation-sqlalchemy

sqlalchemy

opentelemetry-instrumentation-sqlite3

sqlite3

opentelemetry-instrumentation-starlette

starlette ~= 0.13.0

opentelemetry-instrumentation-system-metrics

psutil >= 5

opentelemetry-instrumentation-tornado

tornado >= 5.1.1

opentelemetry-instrumentation-tortoiseorm

tortoise-orm >= 0.17.0

opentelemetry-instrumentation-urllib

urllib

opentelemetry-instrumentation-urllib3

urllib3 - [1.0.0, 3.0.0)

opentelemetry-instrumentation-wsgi

wsgi

Código de exemplo

Baixe o código de exemplo completo em python-opentelemetry-demo.

Escolha um protocolo de transporte

O Managed Service for OpenTelemetry aceita dados de rastreamento via HTTP e gRPC. Escolha conforme seu ambiente de rede.

**Protocolo**

**Mais indicado para**

**Observações**

HTTP

A maioria dos ambientes

Atravessa proxies e firewalls com facilidade. Não exige cabeçalho de autenticação.

gRPC

Ambientes de baixa latência e alto throughput

Requer o pacote grpcio. Utiliza um cabeçalho Authentication.

Ambas as opções aparecem nos exemplos abaixo. Selecione uma com base nos requisitos da sua rede.

Referência de placeholders

Substitua estes placeholders nos exemplos pelos seus valores reais:

**Placeholder**

**Descrição**

**Onde encontrar**

<your-service-name>

Identifica sua aplicação no console do ARMS.

Definido por você. Exemplo: my-python-app

<host-name>

Nome do host da máquina que executa sua aplicação.

Execute hostname no terminal.

<endpoint>

Endpoint para envio de dados de rastreamento (HTTP ou gRPC).

Console do Managed Service for OpenTelemetry. Consulte Obter informações do ponto de acesso.

<token>

Token de autenticação (apenas gRPC).

Console do Managed Service for OpenTelemetry. Consulte Obter informações do ponto de acesso.

Instrumentação automática

A instrumentação automática é o caminho mais rápido para o rastreamento distribuído. O agente do OpenTelemetry instrumenta os frameworks suportados em tempo de execução, sem exigir alterações no código.

Etapa 1: Instale as dependências

pip install django
pip install requests
pip install opentelemetry-distro \
	opentelemetry-exporter-otlp

opentelemetry-bootstrap -a install

O comando opentelemetry-bootstrap detecta as bibliotecas instaladas e instala automaticamente os plug-ins de instrumentação correspondentes.

Etapa 2: Crie um projeto e uma aplicação Django

  1. Crie um projeto AutoAndManualDemo:

       django-admin startproject AutoAndManualDemo
  2. Crie uma aplicação HelloWorld dentro do projeto:

       cd AutoAndManualDemo
    
       # Create a HelloWorld application in the project.
       python manage.py startapp helloworld

Etapa 3: Adicione o código da aplicação

  1. Adicione o seguinte código ao arquivo AutoAndManualDemo/helloworld/views.py:

       from django.http import HttpResponse
       from datetime import datetime
    
       # Create your views here.
       def hello_world_view(request):
           result = "Hello World!  Current Time =" + str(get_time())
           return HttpResponse(result)
    
       def get_time():
           now = datetime.now()
           return now.strftime("%H:%M:%S")
  2. Crie um arquivo AutoAndManualDemo/helloworld/urls.py e adicione o seguinte código:

       from django.urls import path
    
       from . import views
    
       urlpatterns = [
           path('', views.hello_world_view, name='helloworld')
       ]
  3. Adicione o padrão de URL ao arquivo AutoAndManualDemo/AutoAndManualDemo/urls.py:

       from django.contrib import admin
       from django.urls import path, include
    
       urlpatterns = [
        path('admin/', admin.site.urls),
        path('helloworld/', include('helloworld.urls')),
       ]

Etapa 4: Execute sua aplicação

Prefixe seu comando de inicialização com opentelemetry-instrument e passe a configuração do exporter.

Envio via HTTP

opentelemetry-instrument \
    --traces_exporter console,otlp_proto_http \
    --metrics_exporter none \
    --service_name <your-service-name> \
    --exporter_otlp_traces_endpoint <endpoint> \
    python manage.py runserver --noreload

Para ocultar os dados de rastreamento no console, defina o parâmetro --traces_exporter como --traces_exporter otlp_proto_http.

Nota
  • A flag --noreload impede que o Django execute o método manage.main duas vezes.

  • Se aparecer a mensagem CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False, defina a variável de ambiente antes de executar. Esse erro ocorre porque o opentelemetry-instrument carrega o arquivo de configurações padrão do Django (django/conf/global_settings.py) em vez das configurações do seu projeto.

  export DJANGO_SETTINGS_MODULE=AutoAndManualDemo.settings

Etapa 5: Verifique o envio de rastros

  1. Acesse http://127.0.0.1:8000/helloworld/ no navegador. O console exibirá os dados de rastreamento e os enviará ao Managed Service for OpenTelemetry.

  2. Faça login no console do ARMS.

  3. No painel de navegação à esquerda, escolha Application Monitoring > Applications.

  4. Na página Applications, localize sua aplicação pelo nome do serviço configurado e clique nela.

  5. Na página de detalhes da aplicação, verifique se os rastros aparecem. Você deverá visualizar dados de span correspondentes às solicitações enviadas.

Nota

Se o ícone

icon

aparecer na coluna

Language

, a aplicação está conectada ao Application Monitoring. Um hífen (

-

) indica uma conexão com o Managed Service for OpenTelemetry.

Instrumentação manual

Utilize a instrumentação manual para ter controle granular sobre spans, atributos e propagação de contexto. Essa abordagem adiciona chamadas diretas ao SDK do OpenTelemetry no seu código.

Etapa 1: Instale as dependências

pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp

Etapa 2: Inicialize o OpenTelemetry

Crie um módulo de inicialização (por exemplo, manual.py) que configure o tracer provider e o exporter.

from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
    OTLPSpanExporter as OTLPSpanGrpcExporter,
)
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
    OTLPSpanExporter as OTLPSpanHttpExporter,
)
from opentelemetry.sdk.resources import SERVICE_NAME, HOST_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

def init_opentelemetry():
    resource = Resource(attributes={
        SERVICE_NAME: "<your-service-name>",
        HOST_NAME: "<host-name>",
    })

    # Option A: Export over gRPC
    span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter(
        endpoint="<endpoint>",
        headers=("Authentication=<token>"),
    ))

    # Option B: Export over HTTP (uncomment to use)
    # span_processor = BatchSpanProcessor(OTLPSpanHttpExporter(
    #     endpoint="<endpoint>",
    # ))

    trace_provider = TracerProvider(
        resource=resource,
        active_span_processor=span_processor,
    )
    trace.set_tracer_provider(trace_provider)

Etapa 3: Crie spans

Após a inicialização, obtenha um tracer e crie spans para rastrear operações.

tracer = trace.get_tracer(__name__)

# Context manager pattern
with tracer.start_as_current_span("child_span") as child_span:
    print("hello world")

Aninhe spans para representar relações pai-filho:

def outer_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("parent_span") as parent_span:
        inner_method()

def inner_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("child_span") as child_span:
        print("hello world")

Etapa 4: Recupere o trace ID e o span ID

Extraia o trace ID e o span ID do contexto do span atual. Esses IDs são úteis para correlacionar logs com rastros.

ctx = trace.get_current_span().get_span_context()
trace_id = '{trace:032x}'.format(trace=ctx.trace_id)
span_id = '{span:016x}'.format(span=ctx.span_id)
print(trace_id)
print(span_id)

Etapa 5: Propague metadados personalizados com a Baggage API

A Baggage API do OpenTelemetry propaga pares chave-valor entre spans dentro de um rastro. Use baggage para passar metadados — como IDs de usuário, IDs de tenant ou contexto de solicitação — entre serviços.

from opentelemetry import trace, baggage

def baggage_and_attribute_usage():
    tracer = trace.get_tracer(__name__)

    # Set baggage at the global level
    global_ctx = baggage.set_baggage("key", "value_from_global_ctx")

    # Create a span with custom attributes
    with tracer.start_as_current_span(
        name='baggage_parent_span',
        attributes={'attribute_key': 'value'},
    ) as baggage_parent_span:

        # Set baggage in the parent context
        parent_ctx = baggage.set_baggage("key", "value_from_parent_ctx")

        with tracer.start_as_current_span(
            name='baggage_child_span',
            context=parent_ctx,
        ) as baggage_child_span:

            # Set baggage in the child context
            child_ctx = baggage.set_baggage("key", "value_from_child_ctx")

    # Read baggage values from each context
    print(baggage.get_baggage("key", global_ctx))   # value_from_global_ctx
    print(baggage.get_baggage("key", parent_ctx))    # value_from_parent_ctx
    print(baggage.get_baggage("key", child_ctx))     # value_from_child_ctx

Etapa 6: Execute e verifique

python manual.py

Após a execução da aplicação, verifique os dados de rastreamento no console do ARMS. Siga as etapas na seção Verificar o envio de rastros, em Instrumentação automática.

Expandir para visualizar o código de exemplo completo

from opentelemetry import trace, baggage
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
    OTLPSpanExporter as OTLPSpanGrpcExporter,
)
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
    OTLPSpanExporter as OTLPSpanHttpExporter,
)
from opentelemetry.sdk.resources import SERVICE_NAME, HOST_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

def init_opentelemetry():
    resource = Resource(attributes={
        SERVICE_NAME: "<your-service-name>",
        HOST_NAME: "<host-name>",
    })

    # Export over gRPC
    span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter(
        endpoint="<endpoint>",
        headers=("Authentication=<token>"),
    ))

    # Export over HTTP (uncomment to use)
    # span_processor = BatchSpanProcessor(OTLPSpanHttpExporter(
    #     endpoint="<endpoint>",
    # ))

    trace_provider = TracerProvider(
        resource=resource,
        active_span_processor=span_processor,
    )
    trace.set_tracer_provider(trace_provider)

def inner_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("child_span") as child_span:
        print("hello world")

def outer_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("parent_span") as parent_span:
        inner_method()

def baggage_and_attribute_usage():
    tracer = trace.get_tracer(__name__)
    global_ctx = baggage.set_baggage("key", "value_from_global_ctx")
    with tracer.start_as_current_span(
        name='baggage_parent_span',
        attributes={'attribute_key': 'value'},
    ) as baggage_parent_span:
        parent_ctx = baggage.set_baggage("key", "value_from_parent_ctx")
        with tracer.start_as_current_span(
            name='baggage_child_span',
            context=parent_ctx,
        ) as baggage_child_span:
            child_ctx = baggage.set_baggage("key", "value_from_child_ctx")

    print(baggage.get_baggage("key", global_ctx))
    print(baggage.get_baggage("key", parent_ctx))
    print(baggage.get_baggage("key", child_ctx))

if __name__ == '__main__':
    init_opentelemetry()
    outer_method()
    baggage_and_attribute_usage()

Instrumentação combinada

Combine instrumentações automática e manual para obter ampla cobertura de frameworks pelo agente e adicionar spans personalizados para operações críticas de negócio. Essa abordagem utiliza o agente de instrumentação automática para rastreamento no nível do framework e adiciona chamadas de SDK para spans específicos da aplicação.

Etapa 1: Instale as dependências

pip install django
pip install requests
pip install opentelemetry-sdk
pip install opentelemetry-instrumentation-django
pip install opentelemetry-exporter-otlp

Etapa 2: Crie um projeto e uma aplicação Django

  1. Crie um projeto AutoAndManualDemo:

       django-admin startproject AutoAndManualDemo
  2. Crie uma aplicação HelloWorld dentro do projeto:

       cd AutoAndManualDemo
    
       # Create a HelloWorld application in the project.
       python manage.py startapp helloworld

Etapa 3: Adicione spans personalizados ao seu código

Importe a API de rastreamento do OpenTelemetry e crie spans ao redor das operações que deseja monitorar.

O exemplo de view Django a seguir adiciona dois spans personalizados (hello_world_span e time_span) sobre os spans criados automaticamente pelo plug-in de instrumentação do Django. Modifique o arquivo helloworld/views.py:

from django.http import HttpResponse
from opentelemetry import trace
from datetime import datetime

def hello_world_view(request):
    tracer = trace.get_tracer(__name__)

    with tracer.start_as_current_span("hello_world_span") as hello_world_span:
        result = "Hello World!  Current Time =" + str(get_time())
        return HttpResponse(result)

def get_time():
    now = datetime.now()
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("time_span") as time_span:
        return now.strftime("%H:%M:%S")

Etapa 4: Modifique o arquivo urls.py

  1. Crie um arquivo helloworld/urls.py e adicione o seguinte código:

       from django.urls import path
    
       from . import views
    
       urlpatterns = [
           path('', views.hello_world_view, name='helloworld')
       ]
  2. Adicione o padrão de URL ao arquivo AutoAndManualDemo/AutoAndManualDemo/urls.py:

       from django.contrib import admin
       from django.urls import path, include
    
       urlpatterns = [
        path('admin/', admin.site.urls),
        path('helloworld/', include('helloworld.urls')),
       ]

Etapa 5: Configure o tracer provider

Crie um módulo de inicialização que configure o exporter e o tracer provider. Adicione o seguinte código ao código de inicialização do OpenTelemetry no arquivo manual.py. Importe esse módulo no início da inicialização da sua aplicação (por exemplo, em manage.py ou no seu ponto de entrada WSGI/ASGI).

from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# To use HTTP instead, uncomment the following line and comment out the gRPC import:
# from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import SERVICE_NAME, HOST_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter

resource = Resource(attributes={
    SERVICE_NAME: "<your-service-name>",
    HOST_NAME: "<host-name>",
})

trace.set_tracer_provider(TracerProvider(resource=resource))

# Export traces over gRPC
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(OTLPSpanExporter(
        endpoint="<endpoint>",
        headers="Authentication=<token>",  # Required for gRPC only
    ))
)

# Also print traces to the console (useful for debugging)
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(ConsoleSpanExporter())
)

Etapa 6: Execute e verifique

python manage.py runserver --noreload
Nota
  • A flag --noreload impede que o Django execute o método manage.main duas vezes.

  • Se ocorrer um erro ImportError(symbol not found in flat namespace '_CFRelease'), instale o pacote gRPC:

  pip install grpcio

Envie uma solicitação para http://127.0.0.1:8000/helloworld/ e verifique os dados de rastreamento no console do ARMS. Siga as etapas na seção Verificar o envio de rastros, em Instrumentação automática.

Visualize dados de monitoramento

  1. Faça login no console do ARMS.

  2. No painel de navegação à esquerda, escolha Application Monitoring > Applications.

  3. Na página Applications, clique em nome da sua aplicação.

  4. Na página de detalhes da aplicação, visualize rastros, a topologia da aplicação, transações anômalas, transações lentas e dados de análise de SQL.

Nota

Se o ícone

icon

aparecer na coluna

Language

, a aplicação está conectada ao Application Monitoring. Um hífen (

-

) indica uma conexão com o Managed Service for OpenTelemetry.