Este sitio utiliza cookies para garantizar que obtenga la mejor experiencia en nuestro sitio web.

Instrumentar aplicaciones Golang usando echo + zerolog

¿Ya te pasó ese momento de "¿dónde me equivoqué?" mientras debugueabas una aplicación? Instrumentar tu aplicación es casi como poner una cámara de seguridad para monitorear todo lo que ocurre dentro.

CloudScript Technology
24 de octubre de 20245 min de lectura
Instrumentar aplicaciones Golang usando echo + zerolog

¿Alguna vez viviste ese momento de "¿dónde me equivoqué?" mientras depurabas tu aplicación? Pues bien, instrumentar tu aplicación es casi como colocar una cámara de seguridad para monitorear todo lo que está sucediendo detrás de escena. Y, claro, Elastic APM y Kibana son un dúo dinámico para esto.

Si estás desarrollando en Golang y quieres tener control total sobre lo que está pasando en tu aplicación (y evitar sustos), es hora de integrar todo con Elastic APM. ¡Y lo mejor: hay bibliotecas que hacen ese trabajo arduo por ti! ¿Vamos a conocer algunas?

¿Qué es Elastic APM y por qué lo necesitas?

Elastic APM es básicamente ese detective que contratas para investigar todo lo que está pasando en tu aplicación. Va a monitorear el desempeño, apuntar los errores y darte un reporte bonito en Kibana, todo en tiempo real. Y como tiene una implementación lista para Go, puedes integrarlo rapidito en tu código.

Ahora, si estás pensando "bueno, pero ya uso un logger en mi aplicación", ¡tranquilo! Varias bibliotecas de loggers para Go ya tienen implementaciones para APM, lo que facilita la vida de todos.

¿Por qué echo + zerolog?

Si aún no conoces Echo, es el "auto de Fórmula 1" de los frameworks web en el mundo Go. Rápido, eficiente, y con una API que facilita bastante la creación de APIs REST. Ahora, cuando lo juntas con Zerolog, que es una biblioteca de logging súper rápida y minimalista, tienes un dúo poderoso.

¡Manos a la obra!

Primero vamos a estructurar nuestra aplicación. En este ejemplo vamos a necesitar 3 packages personalizados:

  • mylogger — para iniciar nuestro logger y estandarizar las llamadas de logs
  • mytracer — para iniciar el tracer de APM de nuestra aplicación centralizando las configuraciones necesarias
  • myserver — para iniciar el servidor de la aplicación con las rutas que vamos a utilizar

Va a quedar así:

Package: mylogger

Aquí tenemos el método Init() donde configuramos el logger de la aplicación y dos métodos más de eventos de log para usarlos según sea necesario. En estos eventos ya centralizamos algunas informaciones que serán agregadas a los logs a través del contexto, como informaciones del trace, service name y error cuando sea necesario.

log.go

Package: mytracer

Aquí inicializamos el Tracer de APM, que es quien envía los logs a Kibana.

tracer.go

Package: myserver

Aquí inicializamos nuestro servidor de aplicación y agregamos nuestras rutas. Además, agregamos un middleware personalizado para loguear las peticiones en la consola de la aplicación y el middleware de apmecho donde pasamos el tracer que creamos anteriormente para que APM pueda capturar las peticiones y enviarlas a Kibana automáticamente.

server.go

Aquí está nuestro middleware personalizado que nos posibilita formatear el log como queramos, además de loguear los headers que configuramos en nuestras variables de entorno.

middleware.go

Package: main

Para finalizar nuestra aplicación, vamos a crear el archivo main.go donde vamos a iniciar logger, tracer y server de nuestra aplicación.

main.go

Configurando el entorno

En el directorio ./cmd/ vamos a agregar el archivo .env con las variables de abajo para que el APM tracer sea configurado correctamente en nuestra aplicación.

ELASTIC_APM_SERVICE_NAME=my-app
ELASTIC_APM_SECRET_TOKEN=
ELASTIC_APM_SERVER_URL=http://localhost:8200
ELASTIC_APM_ENVIRONMENT=local
ELASTIC_APM_ENABLED=true
ELASTIC_APM_ACTIVE=true
ELASTIC_APM_LOG_LEVEL=debug
ELASTIC_APM_LOG_FILE=stderr
ELASTIC_APM_SERVICE_VERSION=1.0.0
ELASTIC_APM_CAPTURE_BODY=all
ELASTIC_APM_SANITIZE_FIELD_NAMES=password,secret,passwd,pwd,token #only for POST form fields
LOG_HEADERS=true
LOG_HEADERS_NAMES=header1,header2

Con estas configuraciones esperamos que el body de la petición sea capturado y enviado a APM, que los valores de los campos sensibles enviados en el formulario sean sustituidos por [REDACTED] (actualmente esto solo funciona cuando ejecutamos peticiones usando form-data fields) y que algunos headers sean logueados en la consola de la aplicación al recibir la petición.

Ahora vamos a hacer una petición en nuestra aplicación para visualizar los logs en la consola de la aplicación y las transacciones en Elastic Kibana.

Enviando la petición de mensaje por Postman

Estos son los logs que obtenemos:

{"level":"info","time":1729797526,"service_name":"my-app","trace.id":"a50295e9e1de4956b024b83544bf6d65","transaction.id":"a50295e9e1de4956","span.id":"a50295e9e1de4956","time":1729797526,"message":"Message received"}

{"level":"info","time":1729797526,"service_name":"my-app","trace.id":"a50295e9e1de4956b024b83544bf6d65","transaction.id":"a50295e9e1de4956","span.id":"a50295e9e1de4956","uri":"/message","status":200,"remote_ip":"::1","host":"localhost:8080","method":"POST","error":"","latency":"3.074167ms","user_agent":"PostmanRuntime/7.42.0","headers":{"Header1":["hello"],"Header2":["world"]},"time":1729797526,"time":1729797526,"message":"http_request"}

{"level":"debug","time":"2024-10-24T16:18:49-03:00","message":"sent request with 1 transaction, 0 spans, 0 errors, 1 metricset"}
{"level":"debug","time":"2024-10-24T16:19:09-03:00","message":"gathering metrics"}

Visualizando la petición en Elastic Kibana:

Aquí podemos visualizar las transacciones generadas por nuestra aplicación a través de APM.
Aquí vemos los spans vinculados a la transacción POST /message, el status de la petición y el tiempo de ejecución.
Al entrar en los detalles de la transacción podemos ver toda la información de la petición que realizamos en la aplicación.
Aquí, aún en los detalles de la transacción, podemos ver el body de la petición, ya sanitizado.

Cómo todo esto te facilita la vida

Imagina el escenario: tu aplicación está ejecutándose y de repente notas que algo está mal. Sin un APM, te quedarías ahí, con la cabeza caliente, buscando el problema dentro de los containers, leyendo cientos de logs para entender. Pero, con la instrumentación bien configurada, solo abres Kibana y listo, ahí está el villano de la historia: logs, métricas, errores, todo organizado y listo para el análisis.

La mejor parte de usar estas bibliotecas es que no necesitas reinventar la rueda. Ya tienen la integración necesaria con Elastic APM, lo que significa menos trabajo manual y más tiempo enfocado en lo que realmente importa: ¡construir aplicaciones increíbles!

¿Y entonces, listo para monitorear todo?

Instrumentar tu aplicación Go con Elastic APM y Kibana es casi como ponerte un superpoder en la mano. Vas a tener control total sobre lo que está pasando, identificar cuellos de botella y evitar dolores de cabeza en el futuro. Y lo mejor: estas bibliotecas de logging hacen todo el trabajo pesado por ti.

¡No lo olvides! En CloudScript estamos aquí para apoyarte cuando lo necesites.

Repositorio usado en el ejemplo: https://github.com/jonathanschmittcs/go-intrumentation-echo-zerolog

Saludos,

Jonathan Schmitt.


El poder de un pipeline con previews dinámicos en GitLab
Acelera al equipo de QA y mejora la calidad de las entregas. ¡Hola a todos! ¿Cómo están? En el universo de las metodologías ágiles y DevOps, la búsqueda de ciclos de entrega más cortos y con mayor calidad es una prioridad constante. Por eso, hoy vamos a explorar cómo crear un pipeline con previews dinámicos

VER TAMBIÉN

Deploy con GitHub Actions y ArgoCD: simplificando el proceso
¡Hola, DevOps! ¿Todo bien? En este post, vamos a dejar todo listo para que armes una pipeline de build y deploy de tu aplicación usando GitHub Actions y ArgoCD. Si ya manejas GitHub y ArgoCD, mejor aún, porque la idea acá es ir directo al punto. Paso 1: Organiza

VER TAMBIÉN

Mantente al día

Recibe nuestros artículos sobre DevOps, Kubernetes, Platform Engineering y Cloud Native directamente en tu correo.

Sin spam. Cancela cuando quieras.