Instrumente um aplicativo Python com o cliente Jaeger para enviar 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 Connect an application.
Como funciona
O Jaeger suporta duas arquiteturas de envio de dados:
Sem o agente Jaeger: O cliente Jaeger envia os dados de rastreamento diretamente para o backend do Managed Service for OpenTelemetry.
Com o agente Jaeger: O cliente Jaeger envia os 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; ele não oferece suporte a envio 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 dos pacotes. Para minimizar a perda de dados, execute ambos no mesmo host.
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 encontrados na 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 corretamente. Caso o contêiner não esteja rodando, 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 instale as dependências: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 estiver executando no mesmo host.reporting_port6831Porta UDP na qual o agente Jaeger escuta os 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 debug mostrará a configuração do tracer e confirmará que os spans estão sendo enviados 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, significa que o aplicativo utiliza o Application Monitoring. Um hífen (-) indica o uso do Managed Service for OpenTelemetry. -
Na seção Application Overview, analise as principais métricas de desempenho e a topologia.
A aba Overview Analysis da página Application Overview apresenta as seguintes métricas principais:
Total Requests: quantidade de requisições, incluindo variações semanais e diárias.
Average Response Time: tempo de resposta e sua tendência.
Exceptions: número de requisições com erro.
Span Count: total de spans presentes no trace.
Abaixo dessas métricas, as áreas Services Provided e Dependent Services exibem gráficos de linha com tendências de volume de requisições e tempo médio de resposta.
-
No painel de navegação à esquerda, clique em Application Details. A aba Overview mostra o resumo do aplicativo.
Na página Application Details, a aba Overview é aberta por padrão. Ela exibe a topologia do aplicativo e três gráficos de monitoramento: Requests, response time e Exceptions. A lista de serviços à esquerda apresenta o tempo de resposta, a contagem de requisições e o número de exceções de cada interface.
Clique em aba Traces para visualizar os dados de rastreamento enviados 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 abaixo:
|
Problema |
Ação |
|
Agente Jaeger não está em execução |
Execute |
|
Endpoint ou token incorretos |
Valide se os valores de |
|
Agente e cliente em hosts diferentes |
O cliente Jaeger envia dados via UDP, protocolo pouco confiável entre hosts distintos. Execute o agente no mesmo host do aplicativo e defina |
|
Spans não foram liberados |
Garanta que |
|
Problemas de 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={})