Engineering

Como correlacionar logs e traces de APM facilmente para melhorar a observabilidade

O monitoramento de performance de aplicação (APM) e o logging fornecem um insight crítico do seu ecossistema. Quando combinados com contexto, podem fornecer pistas vitais para resolver problemas nas suas aplicações.

Conforme os dados de log que você analisa vão se tornando mais complexos, pode ser complicado navegar até as partes relevantes usando ferramentas tradicionais. Com o Elastic Observability (com tecnologia do Elastic Stack), correlacionar os logs com o APM é muito simples, bastando alguns cliques no Kibana. Veja facilmente no seu app da Web os logs relacionados a uma solicitação específica que o usuário fez para uma transação específica.

Visualização de logs de traces no Elastic APM

Temos abaixo uma captura de tela do Elastic APM, mostrando um bom detalhamento de todas as operações envolvidas em uma determinada transação. Se clicarmos em Actions (Ações):

Clique em “Actions” (Ações) no canto superior direito de sua amostra de trace no Elastic APM

Selecione Show trace logs (Mostrar logs de traces):

Clique em “Show trace logs” (Mostrar logs de traces).

E aí está:

Agora você pode ver os logs associados ao trace no Elastic APM.

Essas mensagens são detalhes extras relacionados a essa transação específica. Esse tipo de detalhe realmente só pode ser fornecido por um log, pois não se encaixaria no APM ou em qualquer outro tipo de monitoramento. Agora temos excelente flexibilidade para adicionar detalhes extras às nossas transações, graças ao Elastic Stack que integra essas diferentes facetas do monitoramento. Ter esses diferentes tipos de dados em um único datastore nos permite dinamizar nossas investigações.

Instalação e configuração do Agente Python do Elastic APM

Você pode estar pensando: “Tudo isso é muito bom, mas como posso alcançar resultados semelhantes no meu sistema?”

Vamos dar uma olhada em um exemplo e ver como integrar logs e traces de APM. Aqui está o código relevante do app do Python mostrado nas capturas de tela acima. Precisamos de uma maneira de adicionar algumas informações a cada solicitação que um usuário faz ao nosso app.

Primeiro, o básico: precisamos instalar o Agente Python do Elastic APM. Vamos adicioná-lo como uma dependência. Este é um app do Flask, e é por isso que aparece [flask] entre colchetes após o nome da dependência — os detalhes de cada framework compatível podem ser encontrados na documentação do Agente Python.

# em requirements.txt 
elastic-apm[flask]==5.3.3

Primeiro, vamos ter certeza de que já temos as importações certas:

# em app.py 
import logging 
from elasticapm.contrib.flask import ElasticAPM 
from elasticapm.handlers.logging import Formatter

Então, vamos configurar o Agente Python para enviar informações ao APM Server:

# em app.py 
app = Flask(__name__)  # inicializar o app normalmente 
app.config['ELASTIC_APM'] = { 
  'SERVICE_NAME': 'foodbankhero', 

  # Definir URL customizada do APM Server (padrão: http://localhost:8200) 
  'SERVER_URL': 'http://localhost:8200' 

  # Usar se o APM Server exigir um token 
  # O APM Server pode ser configurado para exigir um token de segurança, de modo que não possa ser inundado com dados aleatórios por terceiros. 
  # 'SECRET_TOKEN': '' 
} 
apm = ElasticAPM(app)  # a linha mágica que instrumenta o nosso app do Flask com APM

Configuração dos logs

Agora, vamos configurar os logs para que possam ser correlacionados com os traces de APM, conforme mostrado nas capturas de tela acima:

# em app.py 
fh = logging.FileHandler('foodbankhero.log') 

# importamos um Formatador customizado do Agente Python anteriormente 
formatter = Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") 
fh.setFormatter(formatter) 
logging.getLogger().addHandler(fh) 

# ... em algum lugar dentro do app ... 
logging.getLogger().info(‘Foodbank {} needs {} items’.format(id, len(items))) 
logging.getLogger().info(‘Returning {} foodbank records’.format(len(results)))

Aqui está um exemplo de como seus logs ficarão agora:

2020-05-12 01:57:14,029 - flask.app - INFO - 172.22.0.1 - - [12/May/2020 01:57:15] "GET / HTTP/1.1" 200 - | elasticapm transaction.id=f31f884b961a6089 trace.id=02bd57be0eff9979c94951d0d53e80c0 span.id=None

Com essa configuração, cada linha de log para cada solicitação será aumentada com informações de rastreamento, até mesmo solicitações de ativos estáticos (se o seu app estiver configurado para atendê-los). Por exemplo:

2020-05-12 01:57:14,029 - werkzeug - INFO - 172.22.0.1 - - [12/May/2020 01:57:14] "GET /favicon.ico HTTP/1.1" 404 - | elasticapm transaction.id=f31f884b961a6089  
trace.id=02bd57be0eff9979c94951d0d53e80c0 span.id=None

Experimente o Elastic APM

Você está pronto(a) para quebrar o tradicional isolamento dos dados e resolver problemas mais rapidamente com contexto? O Elastic Observability simplifica a correlação de dados e a navegação até o que você precisa na velocidade do pensamento.

Veja como é fácil começar a usar o Elastic APM — basta adicionar algumas linhas de código ao seu projeto e começar a enviar dados para o Elasticsearch. Experimente correlacionar seus logs e APM com uma avaliação gratuita no Elastic Cloud