Ingeniería

Cómo correlacionar fácil logs y rastreos de APM para una mejor observabilidad

Tanto el monitoreo de rendimiento de aplicaciones (APM) como el logging proporcionan información crítica sobre tu ecosistema. Cuando se combinan con el contexto, pueden proporcionar pistas clave sobre cómo resolver problemas con tus aplicaciones.

A medida que los datos de log que analizas se vuelven más complejos, navegar a los datos relevantes puede ser complicado con las herramientas tradicionales. Con Elastic Observability (impulsado por el Elastic Stack), correlacionar logs con APM es tan simple como hacer unos pocos clics en Kibana. Ve con facilidad los logs relacionados con una solicitud específica que el usuario realizó para una transacción particular en tu app web.

Visualización de logs de rastreo en Elastic APM

A continuación encontrarás una captura de pantalla de Elastic APM en la que se muestra un buen desglose de todas las operaciones involucradas en una transacción particular. Si hacemos clic en Actions (Acciones):

Clic en "Actions" (Acciones) en la parte superior derecha de la muestra de rastreo en Elastic APM.

Y seleccionamos Show trace logs (Mostrar logs de rastreo):

Clic en "Show trace logs" (Mostrar logs de rastreo).

Et voila:

Ahora puedes ver los logs asociados con el rastreo en Elastic APM.

Estos mensajes son detalles adicionales relacionados con esta transacción específica. Este tipo de detalles solo puede proporcionarlo un log, debido a que no cabría en APM ni en cualquier otro tipo de monitoreo. Ahora contamos con una flexibilidad excelente para agregar detalles adicionales a nuestras transacciones, gracias a que el Elastic Stack combina estas facetas diferentes de monitoreo. Tener estos tipos diferentes de datos en un almacén de datos nos permite reorganizar rápidamente nuestras investigaciones.

Instalación y configuración del Agente de Python de Elastic APM

Quizás pienses: "Todo esto es muy bueno, pero ¿cómo puedo lograr resultados similares en mi sistema?".

Veamos un ejemplo y los pasos para integrar los logs y los rastreos de APM. Este es el código relevante de la app de Python que se muestra en las capturas de pantalla anteriores. Necesitamos una manera de agregar información a cada solicitud que hace un usuario a nuestra app.

Primero, lo básico: debemos instalar el Agente de Python de Elastic APM. Agreguémoslo como una dependencia. Esta es una app de Flask, por lo que dice [flask] en paréntesis tras el nombre de la dependencia; los detalles de cada marco de trabajo soportado se encuentran en los documentos de Agente de Python.

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

Primero, asegurémonos de tener las importaciones correctas:

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

Después, configuremos el Agente de Python para que envíe información al servidor APM:

# en app.py 
app = Flask(__name__)  # inicializa la app como de costumbre 
app.config['ELASTIC_APM'] = { 
  'SERVICE_NAME': 'foodbankhero', 

  # Configura la URL personalizada del servidor APM (predeterminada: http://localhost:8200) 
  'SERVER_URL': 'http://localhost:8200' 

  # Úsala si el servidor APM requiere un token 
  # El servidor APM puede configurarse para requerir un token por seguridad, para que no pueda llenarse de datos aleatorios de terceros. 
  # 'SECRET_TOKEN': '' 
} 
apm = ElasticAPM(app)  # la línea mágica que instrumenta nuestra app de Flask con APM

Configuración de tus logs

Ahora configuremos los logs para que puedan correlacionarse con rastreos de APM como se muestra en las capturas de pantalla anteriores:

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

# antes importamos un formateador personalizado del Agente de Python 
formatter = Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") 
fh.setFormatter(formatter) 
logging.getLogger().addHandler(fh) 

# …en algún lugar en las profundidades de la app... 
logging.getLogger().info(‘Foodbank {} needs {} items’.format(id, len(items))) 
logging.getLogger().info(‘Returning {} foodbank records’.format(len(results)))

Esta es una muestra de cómo se verán tus logs ahora:

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

Con esta configuración, cada línea de log de cada solicitud se incrementará con información de rastreo, incluso las solicitudes de activos estáticos (si tu app está configurada para proporcionarlos). Por ejemplo:

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

Prueba Elastic APM tú mismo

¿Estás listo para derribar los silos tradicionales y resolver problemas más rápido con contexto? Elastic Observability hace que sea fácil correlacionar los datos y navegar a lo que necesitas a la velocidad del pensamiento.

Ve lo fácil que es dar los primeros pasos con Elastic APM; solo agrega unas líneas de código a tu proyecto y comienza a enviar datos a Elasticsearch. Intenta correlacionar tus logs y APM con una prueba gratuita en Elastic Cloud