Todos los productos
Search
Centro de documentos

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

Última actualización: Sep 05, 2026

Instrumente su aplicación Python con OpenTelemetry para reportar datos de rastreo a Managed Service for OpenTelemetry. Una vez establecida la conexión, Application Real-Time Monitoring Service (ARMS) muestra la topología de la aplicación, los rastreos, las transacciones anómalas, las transacciones lentas y el análisis de SQL.

Este tema aborda tres enfoques de instrumentación:

  • Instrumentación automática: no requiere cambios en el código. Un agente de OpenTelemetry instrumenta los frameworks compatibles durante la ejecución.

  • Instrumentación manual: ofrece control total. Permite agregar spans, atributos y baggage mediante el SDK de OpenTelemetry.

  • Instrumentación combinada: superpone spans personalizados sobre la instrumentación automática para obtener visibilidad específica.

Importante

Consejo:

Alibaba Cloud proporciona un agente dedicado para Python con observability integrada para frameworks de LLM, incluidos LlamaIndex, Dify, LangChain, OpenAI y Qwen. Este agente genera métricas, rastreos y datos de perfilado continuo más detallados que el agente de código abierto. Para obtener más información, consulte

Monitor Python applications

.

Requisitos previos

Frameworks compatibles

OpenTelemetry ofrece complementos de instrumentación automática para frameworks comunes de Python. La siguiente tabla enumera los frameworks compatibles y sus requisitos de versión. Para consultar la lista completa, visite opentelemetry-python-contrib.

Nota

En la tabla,

~= V.N

significa

>= V.N

y

== V.*

. Por ejemplo,

aiohttp ~= 3.0

indica la versión 3.0 o posterior dentro del rango 3.x.

Expandir para ver los frameworks de Python compatibles

**Complemento**

**Paquete y versión compatibles**

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-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 ejemplo

Descargue el código de ejemplo completo desde python-opentelemetry-demo.

Elección del protocolo de transporte

Managed Service for OpenTelemetry acepta datos de rastreo a través de HTTP y gRPC. Elija el protocolo según su entorno de red.

**Protocolo**

**Recomendado para**

**Notas**

HTTP

La mayoría de los entornos

Atraviesa proxies y firewalls con facilidad. No requiere encabezado de autenticación.

gRPC

Entornos de baja latencia y alto rendimiento

Requiere el paquete grpcio. Utiliza un encabezado Authentication.

Ambas opciones se muestran en los ejemplos siguientes. Seleccione una según sus requisitos de red.

Referencia de marcadores de posición

Reemplace estos marcadores de posición en los ejemplos con sus valores reales:

**Marcador de posición**

**Descripción**

**Dónde encontrarlo**

<your-service-name>

Identifica su aplicación en la consola de ARMS.

Lo define usted. Ejemplo: my-python-app

<host-name>

Nombre del host de la máquina que ejecuta su aplicación.

Ejecute hostname en su terminal.

<endpoint>

Endpoint para reportar datos de rastreo (HTTP o gRPC).

Consola de Managed Service for OpenTelemetry. Consulte Obtención de información del punto de acceso.

<token>

Token de autenticación (solo gRPC).

Consola de Managed Service for OpenTelemetry. Consulte Obtención de información del punto de acceso.

Instrumentación automática

La instrumentación automática es la forma más rápida de implementar el rastreo distribuido. El agente de OpenTelemetry instrumenta los frameworks compatibles durante la ejecución sin necesidad de modificar el código.

Paso 1: Instalación de dependencias

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

opentelemetry-bootstrap -a install

opentelemetry-bootstrap detecta las bibliotecas instaladas e instala automáticamente los complementos de instrumentación correspondientes.

Paso 2: Creación de un proyecto y una aplicación Django

  1. Cree un proyecto AutoAndManualDemo:

       django-admin startproject AutoAndManualDemo
  2. Cree una aplicación HelloWorld dentro del proyecto:

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

Paso 3: Adición de código de la aplicación

  1. Agregue el siguiente código al archivo 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. Cree un archivo AutoAndManualDemo/helloworld/urls.py y agregue el siguiente código:

       from django.urls import path
    
       from . import views
    
       urlpatterns = [
           path('', views.hello_world_view, name='helloworld')
       ]
  3. Agregue el patrón de URL al archivo 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')),
       ]

Paso 4: Ejecución de la aplicación

Anteponga opentelemetry-instrument a su comando de inicio y pase la configuración del exportador.

Reporte a través de 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

Si no desea que la consola muestre los datos de rastreo, establezca el parámetro --traces_exporter como --traces_exporter otlp_proto_http.

Nota
  • El indicador --noreload evita que Django ejecute el método manage.main dos veces.

  • Si aparece el mensaje CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False, configure la variable de entorno antes de ejecutar: Este error ocurre porque opentelemetry-instrument carga el archivo de configuración predeterminado de Django (django/conf/global_settings.py) en lugar de la configuración de su proyecto.

  export DJANGO_SETTINGS_MODULE=AutoAndManualDemo.settings

Paso 5: Verificación del reporte de rastreo

  1. Visite http://127.0.0.1:8000/helloworld/ en un navegador. La consola muestra los datos de rastreo y los reporta a Managed Service for OpenTelemetry.

  2. Inicie sesión en la consola de ARMS.

  3. En el panel de navegación izquierdo, elija Application Monitoring > Applications.

  4. En la página Applications, busque su aplicación por el nombre de servicio que configuró y haga clic en ella.

  5. En la página de detalles de la aplicación, compruebe que aparezcan los rastreos. Debería ver datos de span correspondientes a las solicitudes que envió.

Nota

Si el icono

icon

aparece en la columna

Language

, la aplicación está conectada a Application Monitoring. Un guion (

-

) indica una conexión a Managed Service for OpenTelemetry.

Instrumentación manual

Utilice la instrumentación manual para tener un control detallado sobre los spans, los atributos y la propagación de contexto. Este enfoque agrega llamadas al SDK de OpenTelemetry directamente en su código.

Paso 1: Instalación de dependencias

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

Paso 2: Inicialización de OpenTelemetry

Cree un módulo de inicialización (por ejemplo, manual.py) que configure el proveedor de rastreo y el exportador.

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)

Paso 3: Creación de spans

Después de la inicialización, obtenga un rastreador y cree spans para realizar el seguimiento de las operaciones.

tracer = trace.get_tracer(__name__)

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

Anide spans para representar relaciones padre-hijo:

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

Paso 4: Obtención del ID de rastreo y del ID de span

Extraiga el ID de rastreo y el ID de span del contexto de span actual. Estos identificadores son útiles para correlacionar registros con rastreos.

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)

Paso 5: Propagación de metadatos personalizados con la API Baggage

La API Baggage de OpenTelemetry propaga pares clave-valor a través de los spans dentro de un rastreo. Utilice baggage para pasar metadatos —como IDs de usuario, IDs de inquilino o contexto de solicitud— entre servicios.

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

Paso 6: Ejecución y verificación

python manual.py

Una vez que la aplicación se ejecute, verifique los datos de rastreo en la consola de ARMS. Siga los pasos descritos en la sección Verificación del reporte de rastreo dentro de Instrumentación automática.

Expandir para ver el código de ejemplo 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()

Instrumentación combinada

Combine la instrumentación automática y manual para obtener una amplia cobertura de frameworks mediante el agente y, al mismo tiempo, agregar spans personalizados para operaciones críticas del negocio. Este enfoque utiliza el agente de instrumentación automática para el rastreo a nivel de framework y añade llamadas al SDK para generar spans específicos de la aplicación.

Paso 1: Instalación de dependencias

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

Paso 2: Creación de un proyecto y una aplicación Django

  1. Cree un proyecto AutoAndManualDemo:

       django-admin startproject AutoAndManualDemo
  2. Cree una aplicación HelloWorld dentro del proyecto:

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

Paso 3: Adición de spans personalizados al código

Importe la API de rastreo de OpenTelemetry y cree spans alrededor de las operaciones a las que desea dar seguimiento.

El siguiente ejemplo de vista de Django agrega dos spans personalizados (hello_world_span y time_span) además de los spans creados automáticamente por el complemento de instrumentación de Django. Modifique el archivo 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")

Paso 4: Modificación del archivo urls.py

  1. Cree un archivo helloworld/urls.py y agregue el siguiente código:

       from django.urls import path
    
       from . import views
    
       urlpatterns = [
           path('', views.hello_world_view, name='helloworld')
       ]
  2. Agregue el patrón de URL al archivo 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')),
       ]

Paso 5: Configuración del proveedor de rastreo

Cree un módulo de inicialización que configure el exportador y el proveedor de rastreo. Agregue el siguiente código al código de inicialización de OpenTelemetry en el archivo manual.py. Importe este módulo al inicio de su aplicación (por ejemplo, en manage.py o en su punto 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())
)

Paso 6: Ejecución y verificación

python manage.py runserver --noreload
Nota
  • El indicador --noreload evita que Django ejecute el método manage.main dos veces.

  • Si ocurre un error ImportError(symbol not found in flat namespace '_CFRelease'), instale el paquete gRPC:

  pip install grpcio

Envíe una solicitud a http://127.0.0.1:8000/helloworld/ y verifique los datos de rastreo en la consola de ARMS. Siga los pasos descritos en la sección Verificación del reporte de rastreo dentro de Instrumentación automática.

Consulta de datos de monitoreo

  1. Inicie sesión en la consola de ARMS.

  2. En el panel de navegación izquierdo, elija Application Monitoring > Applications.

  3. En la página Applications, haga clic en el nombre de su aplicación.

  4. En la página de detalles de la aplicación, consulte los rastreos, la topología de la aplicación, las transacciones anómalas, las transacciones lentas y los datos de análisis de SQL.

Nota

Si el icono

icon

aparece en la columna

Language

, la aplicación está conectada a Application Monitoring. Un guion (

-

) indica una conexión a Managed Service for OpenTelemetry.