Você já passou por aquele momento de "onde foi que eu errei?" enquanto debugava sua aplicação? Pois é, instrumentar sua aplicação é quase como colocar uma câmera de segurança para monitorar tudo o que está acontecendo por baixo dos panos. E, claro, o Elastic APM e o Kibana são uma dupla dinâmica para isso.

Se você está desenvolvendo em Golang e quer ter controle total sobre o que está rolando na sua aplicação (e evitar sustos), é hora de integrar tudo com o Elastic APM. E o melhor: tem bibliotecas que fazem esse trabalho árduo por você! Bora conhecer algumas?

O que é Elastic APM e por que você precisa dele?

Elastic APM é basicamente aquele detetive que você contrata para investigar tudo o que está rolando na sua aplicação. Ele vai monitorar o desempenho, apontar os erros e te dar um relatório bonitinho no Kibana, tudo em tempo real. E como ele tem uma implementação pronta para Go, você pode integrá-lo rapidinho no seu código.

Agora, se você está pensando "beleza, mas eu já uso um logger na minha aplicação", fique tranquilo! Várias bibliotecas de loggers para Go já possuem implementações para o APM, o que facilita a vida de todo mundo.

Por que echo + zerolog?

Se você ainda não conhece o Echo, ele é o "carro de Fórmula 1" dos frameworks web no mundo Go. Rápido, eficiente, e com uma API que facilita bastante a criação de APIs REST. Agora, quando você junta o Zerolog, que é uma biblioteca de logging super rápida e minimalista, você tem uma dupla poderosa.

Mãos a obra!

Primeiramente vamos estruturar a nossa aplicação. Neste exemplo vamos precisar de 3 packages customizados:

  • mylogger - para iniciarmos o nosso logger e padronizarmos as chamadas de logs
  • mytracer - para iniciarmos o tracer do APM da nossa aplicação centralizando as configurações necessárias
  • myserver - para iniciarmos o servidor da aplicação com as rotas que iremos utilizar

Vai ficar desse jeitinho aqui:

Package: mylogger

Aqui temos o método Init() onde configuramos o logger da aplicação e mais dois métodos de eventos de log para utilizarmos conforme necessário. Nestes eventos já centralizamos algumas informações que serão adicionadas aos logs através do contexto, como informações do trace, service name e error quando necessário.

log.go

Package: mytracer

Aqui inicializamos o Tracer do APM que é quem faz o envio dos logs para o Kibana.

tracer.go

Package: myserver

Aqui inicializamos o nosso servidor de aplicação e adicionamos nossas rotas. Além disso adicionamos um middleware customizado para logar as requisições no console da aplicação e o middleware do apmecho onde passamos o tracer que criamos anteriormente para que o APM possa capturar as requisições e enviá-las ao Kibana automaticamente.

server.go

Aqui está o nosso middleware customizado que nos possibilita formatar o log da forma que quisermos além de logar os headers que configuramos em nossas variáveis de ambiente.

middleware.go

Package: main

Pra finalizar nossa aplicação, vamos criar o arquivo main.go onde vamos iniciar logger, tracer e server da nossa aplicação.

main.go

Configurando o ambiente

No diretório ./cmd/ vamos adicionar o arquivo .env com as variáveis abaixo para que o APM tracer seja configurado corretamente em nossa aplicação.

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

Com essas configurações esperamos que o body da requisição seja capturado e enviado ao APM, que os valores dos campos sensíveis enviados no formulário sejam substituídos por [REDACTED] (atualmente isso só funciona quando executamos requisições utilizando form-data fields) e que alguns headers sejam logados no console da aplicação ao receber a requisição.

Agora vamos fazer uma requisição em nossa aplicação para visualizarmos os logs no console da aplicação e as transações no Elastic Kibana.

Enviando a request de mensagem pelo Postman

Estes são os logs que obtemos:

{"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 a requisição no Elastic Kibana:

Aqui podemos visualizar as transações geradas pela nossa aplicação pelo APM.
Aqui vemos os spans ligados a transação POST /message, o status da requisição e o tempo de execução.
Ao entrar nos detalhes da transação podemos ver todas as informações da requisição que realizamos na aplicação.
Aqui, ainda nos detalhes da transação, podemos ver o body da requisição, já sanitizado.

Como tudo isso facilita sua vida

Imagine o cenário: sua aplicação está rodando e de repente você nota que algo está errado. Sem um APM, você ficaria lá, de cabeça quente, procurando o problema dentro dos containers, lendo centenas de logs para entender. Mas, com a instrumentação bem configurada, é só abrir o Kibana e pronto, lá está o vilão da história: logs, métricas, erros, tudo organizado e pronto para análise.

A melhor parte de usar essas bibliotecas é que você não precisa reinventar a roda. Elas já têm a integração necessária com o Elastic APM, o que significa menos trabalho manual e mais tempo focado no que realmente importa: construir aplicações incríveis!

E aí, pronto para monitorar tudo?

Instrumentar sua aplicação Go com Elastic APM e Kibana é quase como colocar um superpoder na sua mão. Você vai ter total controle sobre o que está acontecendo, identificar gargalos e evitar dores de cabeça no futuro. E o melhor: essas bibliotecas de logging fazem todo o trabalho pesado por você.

Não se esqueça! Nós da CloudScript estamos aqui para te apoiar no precisar.

Repositório utilizado no exemplo: https://github.com/jonathanschmittcs/go-intrumentation-echo-zerolog

Att,

Jonathan Schmitt

Share this post