¿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.

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

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.

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.

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.

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.

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:




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.
VER TAMBIÉN
VER TAMBIÉN
