Monitoramento de aplicações Go: 3 ferramentas para logging e tracing

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que sua aplicação Go está silenciosa e como corrigir isso?

\n

Você escreveu um microsserviço perfeito em Go. Ele passa em todos os testes, inicia rapidamente e consome pouca memória. Você o implanta em produção — e uma hora depois os usuários reclamam de lentidão. Você acessa o servidor, olha para o terminal vazio e percebe: a aplicação está silenciosa. Sem logs, sem métricas, sem entender o que deu errado.

\n

Situação familiar? Bem-vindo ao mundo da observability (observabilidade) de aplicações Go. Sem monitoramento e logging, seu código é uma caixa preta. Hoje vamos ver como transformá-lo em um sistema transparente, onde cada atraso e cada erro são visíveis como na palma da mão.

\n

Vou mostrar três ferramentas funcionais, exemplos reais de código em Go e dar um checklist que salvará sua produção. Vamos lá!

\n\n

1. Logging estruturado: como parar de escrever no console e começar a viver

\n

O ingênuo fmt.Println("Erro:", err) é coisa do passado. No logging Go moderno, é preciso ordem: formato JSON, níveis (debug, info, warn, error), campos para busca. Conheça o rei — a biblioteca zap da Uber.

\n\n

Por que o zap?

\n
    \n
  • Velocidade: ele é 10 a 100 vezes mais rápido que o log padrão em altas cargas.
  • \n
  • Estrutura: você adiciona chaves e valores, em vez de concatenar strings.
  • \n
  • Flexibilidade: pode escrever em arquivo, stdout, Elasticsearch — onde quiser.
  • \n
\n\n

Instalação e exemplo básico

\n
go get -u go.uber.org/zap
\n\n

Código de um logger simples:

\n
package main\n\nimport (\n    "go.uber.org/zap"\n)\n\nfunc main() {\n    logger, _ := zap.NewProduction()\n    defer logger.Sync() // libera o buffer antes de sair\n\n    logger.Info("Serviço iniciado",\n        zap.String("env", "production"),\n        zap.Int("port", 8080),\n    )\n\n    // Exemplo com erro\n    err := someFunction()\n    if err != nil {\n        logger.Error("Não foi possível executar a operação",\n            zap.Error(err),\n            zap.String("module", "database"),\n        )\n    }\n}
\n\n

Na saída, você obtém um JSON limpo:

\n
{"level":"info","ts":1700000000.123,"msg":"Serviço iniciado","env":"production","port":8080}
\n\n

Agora qualquer ferramenta como Kibana ou Grafana Loki consegue analisar esses logs por campos. Quer encontrar todos os erros no módulo "database" da última hora? Um clique.

\n\n

Dica: não registre segredos e PII

\n

Adicione uma verificação: se o campo contiver senha ou email — masqueie-o. Use zap.String("user", "***") para dados sensíveis.

\n\n

2. Métricas e monitoramento: transformando código em dashboard

\n

Logs são bons, mas falam sobre o passado. Métricas são o pulso da sua aplicação em tempo real. Para monitoramento de aplicações Go, o padrão de fato é Prometheus + sua biblioteca cliente.

\n\n

O que medir?

\n
    \n
  • RPS (requisições por segundo) — carga no serviço.
  • \n
  • Latência (p50, p95, p99) — tempo de resposta.
  • \n
  • Taxa de erro — porcentagem de erros.
  • \n
  • Goroutines — vazamentos de goroutines.
  • \n
  • Memória / CPU — recursos.
  • \n
\n\n

Exemplo: adicionando métricas ao servidor HTTP

\n
package main\n\nimport (\n    "net/http"\n    "github.com/prometheus/client_golang/prometheus"\n    "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n    requestCount = prometheus.NewCounterVec(\n        prometheus.CounterOpts{\n            Name: "http_requests_total",\n            Help: "Total number of HTTP requests",\n        },\n        []string{"method", "endpoint", "status"},\n    )\n    requestDuration = prometheus.NewHistogramVec(\n        prometheus.HistogramOpts{\n            Name:    "http_request                

Blogs

Book Recommendations