Instrumente um aplicativo Python com o cliente Jaeger para relatar dados de rastreamento ao Managed Service for OpenTelemetry. Após a conexão, o console do ARMS exibe a topologia do aplicativo, traces, transações anômalas e lentas, além da análise de SQL.
Para recursos avançados e capacidades de rastreamento, recomendamos conectar seu aplicativo ao Managed Service for OpenTelemetry usando o protocolo OpenTelemetry.
Nossos guias detalhados de integração do OpenTelemetry e melhores práticas ajudam você a começar a usar o Managed Service for OpenTelemetry. Para mais informações, consulte Conectar um aplicativo.
Como funciona
O Jaeger suporta duas arquiteturas de relatório de dados:
Sem o agente Jaeger: O cliente Jaeger envia dados de rastreamento diretamente para o backend do Managed Service for OpenTelemetry.
Com o agente Jaeger: O cliente Jaeger envia dados de rastreamento para um agente Jaeger em execução local, que os encaminha ao backend via gRPC.
Restrições
O cliente Jaeger para Python (v1.25) só consegue relatar dados de rastreamento por meio do agente Jaeger, não via HTTP. Consulte Client Library Features.
A comunicação entre o cliente e o agente ocorre via UDP, protocolo que não garante a entrega. Para minimizar a perda de dados, execute ambos no mesmo host.
Pré-requisitos
Antes de começar, certifique-se de ter:
Docker 20.10.7 instalado
Python 3.8.5 instalado
O endpoint e o token de autenticação obtidos na página Cluster Configurations no console do Managed Service for OpenTelemetry
Etapa 1: Iniciar o agente Jaeger
-
Baixe a imagem do agente Jaeger:
docker pull jaegertracing/jaeger-agent:1.25 -
Inicie o contêiner do agente Jaeger. Substitua os placeholders abaixo pelos valores da página Cluster Configurations:
Placeholder
Descrição
<endpoint>Endpoint gRPC do Managed Service for OpenTelemetry
<auth>Token de autenticação
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> -
Verifique se o agente está em execução. O status
Upconfirma que o agente foi iniciado. Caso o contêiner não esteja em execução, verifique os logs:docker ps --filter name=jaeger-agentdocker logs jaeger-agent
Etapa 2: Instrumentar o aplicativo Python
-
Instale os pacotes necessários. Salve o conteúdo abaixo em um arquivo
requirements.txte, em seguida, instale os pacotes: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 -
Crie um arquivo Python (por exemplo,
tracing_demo.py) com o código a seguir. Principais parâmetros de configuração:Parâmetro
Valor
Descrição
sampler.typeconstAmostra todos os traces. Em produção, utilize
probabilisticcom um valor menor paraparam.sampler.param1Com o tipo
const, o valor1indica amostragem total; já0desativa a amostragem.reporting_host127.0.0.1Endereço do agente Jaeger. Mantenha como
127.0.0.1quando executar no mesmo host.reporting_port6831Porta UDP na qual o agente Jaeger escuta spans.
service_namemytest3Nome que identifica seu aplicativo no console do 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() -
Execute o arquivo. Se a inicialização for bem-sucedida, a saída de depuração mostrará a configuração do tracer e confirmará que os spans estão sendo relatados ao agente Jaeger.
python tracing_demo.py
Verificar dados de rastreamento no console
Faça login no console do ARMS. No painel de navegação à esquerda, escolha Application Monitoring > Applications.
-
Na página Applications, selecione uma região na barra de navegação superior e clique em nome do seu aplicativo.
NotaSe o ícone
aparecer na coluna Language, o aplicativo utiliza o Application Monitoring. Um hífen (-) indica o uso do Managed Service for OpenTelemetry. -
Na seção Application Overview, visualize as principais métricas de desempenho e a topologia.

-
No painel de navegação à esquerda, clique em Application Details. A aba Overview apresenta o resumo do aplicativo.

-
Clique em aba Traces para visualizar os dados de rastreamento relatados pelo seu aplicativo.

Solucionar problemas de dados de rastreamento ausentes
Caso os dados de rastreamento não apareçam no console após a execução do aplicativo, verifique os itens a seguir:
|
Problema |
Ação |
|
Agente Jaeger parado |
Execute |
|
Endpoint ou token incorretos |
Valide se os valores de |
|
Agente e cliente em hosts diferentes |
O envio de dados via UDP pelo cliente Jaeger não é confiável entre hosts distintos. Execute o agente no mesmo host do aplicativo e configure |
|
Spans não liberados |
Garanta que |
|
Conectividade de rede |
Confirme se o host consegue alcançar o endpoint do Managed Service for OpenTelemetry na porta gRPC configurada. |
Operações comuns do Jaeger
Os exemplos a seguir abordam operações frequentes de rastreamento com Jaeger. Para mais detalhes, consulte Getting Started.
Criar um 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()
Criar e 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 serviços
# 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={})