Instrumente una aplicación Python con el cliente de Jaeger para reportar datos de trazas a Managed Service for OpenTelemetry. Una vez establecida la conexión, la consola ARMS muestra la topología de la aplicación, las trazas, las transacciones anómalas y lentas, además del análisis SQL.
Para aprovechar funciones avanzadas y capacidades de trazado, se recomienda conectar su aplicación a Managed Service for OpenTelemetry mediante el protocolo OpenTelemetry.
Las guías detalladas de integración y las mejores prácticas de OpenTelemetry le ayudarán a comenzar a trabajar con Managed Service for OpenTelemetry. Para obtener más información, consulte Connect an application.
Funcionamiento
Jaeger admite dos arquitecturas para reportar datos:
Sin el agente de Jaeger: el cliente de Jaeger envía los datos de trazas directamente al backend de Managed Service for OpenTelemetry.
Con el agente de Jaeger: el cliente de Jaeger envía los datos de trazas a un agente de Jaeger que se ejecuta localmente. Este agente los reenvía al backend mediante gRPC.
Restricciones
El cliente de Jaeger para Python (v1.25) solo reporta datos de trazas a través del agente de Jaeger, no por HTTP. Consulte Client Library Features.
El cliente se comunica con el agente mediante UDP, un protocolo que no garantiza la entrega. Para minimizar la pérdida de datos, ejecute ambos componentes en el mismo host.
Paso 1: Iniciar el agente de Jaeger
-
Descargue la imagen del agente de Jaeger:
docker pull jaegertracing/jaeger-agent:1.25 -
Inicie el contenedor del agente de Jaeger. Reemplace los siguientes marcadores de posición con los valores de la página Cluster Configurations:
Marcador de posición
Descripción
<endpoint>Endpoint gRPC de Managed Service for OpenTelemetry
<auth>Token de autenticación
docker run -d --name jaeger-agent \ -p 5775:5775/udp \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778/tcp \ jaegertracing/jaeger-agent:1.25 \ --reporter.type=grpc \ --reporter.grpc.host-port=<endpoint> \ --agent.tags=<auth> -
Compruebe que el agente se está ejecutando. El estado
Upconfirma que el agente inició correctamente. Si el contenedor no se está ejecutando, revise los registros:docker ps --filter name=jaeger-agentdocker logs jaeger-agent
Paso 2: Instrumentar la aplicación Python
-
Instale los paquetes obligatorios. Guarde el siguiente contenido en un archivo
requirements.txty luego instale los paquetes:certifi==2021.5.30 charset-normalizer==2.0.4 idna==3.2 jaeger-client==4.6.0 opentracing==2.4.0 requests==2.26.0 six==1.16.0 threadloop==1.0.2 thrift==0.13.0 tornado==6.1 urllib3==1.26.6pip install -r requirements.txt -
Cree un archivo Python (por ejemplo,
tracing_demo.py) con el siguiente código. A continuación se describen los parámetros de configuración principales:Parámetro
Valor
Descripción
sampler.typeconstMuestrea cada traza. En entornos de producción, utilice
probabilisticcon un valor menor paraparam.sampler.param1Con el tipo
const, el valor1indica que se muestrean todas las trazas y0que no se muestrea ninguna.reporting_host127.0.0.1Dirección del agente de Jaeger. Utilice
127.0.0.1cuando todo se ejecute en el mismo host.reporting_port6831Puerto UDP en el que el agente de Jaeger escucha los spans.
service_namemytest3Nombre que identifica su aplicación en la consola ARMS.
import logging import time from jaeger_client import Config def construct_span(tracer): with tracer.start_span('AliyunTestSpan') as span: span.log_kv({'event': 'test message', 'life': 42}) print("tracer.tags: ", tracer.tags) with tracer.start_span('AliyunTestChildSpan', child_of=span) as child_span: span.log_kv({'event': 'down below'}) return span if __name__ == "__main__": log_level = logging.DEBUG logging.getLogger('').handlers = [] logging.basicConfig(format='%(asctime)s %(message)s', level=log_level) config = Config( config={ 'sampler': { 'type': 'const', # Sample every trace. Use 'probabilistic' in production. 'param': 1, }, 'local_agent': { # The Jaeger agent address. Keep this as 127.0.0.1 when the agent # runs on the same host, which is recommended for UDP reliability. 'reporting_host': '127.0.0.1', 'reporting_port': 6831, }, 'logging': True, }, service_name="mytest3", # Replace with your application name. validate=True ) # Initialize the tracer. This also sets opentracing.tracer. tracer = config.initialize_tracer() span = construct_span(tracer) # Allow the IOLoop to flush buffered spans before closing. # See: https://github.com/jaegertracing/jaeger-client-python/issues/50 time.sleep(2) tracer.close() -
Ejecute el archivo. Si la inicialización es exitosa, la salida de depuración mostrará la configuración del tracer y confirmará que los spans se están reportando al agente de Jaeger.
python tracing_demo.py
Comprobar los datos de trazas en la consola
Inicie sesión en ARMS console. En el panel de navegación izquierdo, seleccione Application Monitoring > Applications.
-
En la página Applications, seleccione una región en la barra de navegación superior y haga clic en el nombre de su aplicación.
NotaSi aparece el icono
en la columna Language, la aplicación utiliza Application Monitoring. Un guion (-) indica que usa Managed Service for OpenTelemetry. -
En la sección Application Overview, revise las métricas de rendimiento clave y la topología.
La pestaña Overview Analysis de la página Application Overview muestra las siguientes métricas principales:
Total Requests: cantidad de solicitudes, con los cambios semanales y diarios.
Average Response Time: tiempo de respuesta y su tendencia.
Exceptions: cantidad de solicitudes anómalas.
Span Count: cantidad total de spans en la traza.
Debajo de estas métricas, las áreas Services Provided y Dependent Services muestran gráficos de líneas de tendencia sobre el volumen de solicitudes y el tiempo medio de respuesta.
-
En el panel de navegación izquierdo, haga clic en Application Details. La pestaña Overview muestra el resumen de la aplicación.
En la página Application Details, la pestaña Overview se muestra de forma predeterminada. Esta presenta la topología de la aplicación y tres gráficos de monitoreo: Requests, response time y Exceptions. La lista de servicios del lado izquierdo indica el tiempo de respuesta, la cantidad de solicitudes y la cantidad de excepciones de cada interfaz.
Haga clic en la pestaña Traces para consultar los datos de trazas reportados desde su aplicación.
Solución de problemas por datos de trazas faltantes
Si los datos de trazas no aparecen en la consola después de ejecutar su aplicación, compruebe lo siguiente:
|
Problema |
Acción |
|
El agente de Jaeger no se está ejecutando |
Ejecute |
|
Endpoint o token incorrectos |
Compruebe que los valores de |
|
El agente y el cliente están en hosts distintos |
El cliente de Jaeger envía datos mediante UDP, un protocolo poco confiable entre hosts diferentes. Ejecute el agente en el mismo host que la aplicación y establezca |
|
Los spans no se vacían |
Asegúrese de llamar a |
|
Problemas de conectividad de red |
Compruebe que el host pueda comunicarse con el endpoint de Managed Service for OpenTelemetry en el puerto gRPC configurado. |
Operaciones comunes de Jaeger
Los siguientes ejemplos abarcan operaciones habituales de trazado con Jaeger. Para obtener más detalles, consulte Getting Started.
Crear un tracer
from jaeger_client import Config
def init_jaeger_tracer(service_name='your-app-name'):
config = Config(config={}, service_name=service_name)
return config.initialize_tracer()
Crear y finalizar spans
# Start a root span (no parent).
tracer.start_span('TestSpan')
# Start a child span.
tracer.start_span('ChildSpan', child_of=span)
# Finish the span.
span.finish()
Propagar SpanContext entre servicios
# Inject: serialize the SpanContext into a carrier for downstream services.
tracer.inject(
span_context=span.context, format=Format.TEXT_MAP, carrier=carrier
)
# Extract: deserialize the SpanContext from an incoming request.
span_ctx = tracer.extract(format=Format.TEXT_MAP, carrier={})