Por que sua aplicação Go está silenciosa e como corrigir isso?
\nVocê 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.
\nSituaçã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.
\nVou mostrar três ferramentas funcionais, exemplos reais de código em Go e dar um checklist que salvará sua produção. Vamos lá!
\n\n1. Logging estruturado: como parar de escrever no console e começar a viver
\nO 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.
Por que o zap?
\n- \n
- Velocidade: ele é 10 a 100 vezes mais rápido que o
logpadrã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
Instalação e exemplo básico
\ngo get -u go.uber.org/zap\n\nCódigo de um logger simples:
\npackage 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\nNa saída, você obtém um JSON limpo:
\n{"level":"info","ts":1700000000.123,"msg":"Serviço iniciado","env":"production","port":8080}\n\nAgora 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\nDica: não registre segredos e PII
\nAdicione uma verificação: se o campo contiver senha ou email — masqueie-o. Use zap.String("user", "***") para dados sensíveis.
2. Métricas e monitoramento: transformando código em dashboard
\nLogs 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\nO 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
Exemplo: adicionando métricas ao servidor HTTP
\npackage 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