Spec Backend Com Golang E Gin • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 17.1 — Logs Estruturados de Alto Desempenho com Uber Zap

Contexto: Logs Estruturados de Alto Desempenho com Uber Zap no contexto de Observabilidade com Prometheus Metrics e Zap Logs.

Requisitos de Execução:

  1. Configurar logger Zap em modo JSON com campos tipados zap.String e zap.Int.

Resultado Esperado

Log JSON estruturado emitido com timestamp e caller.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_17_1_SeuNome
  2. Envie na tarefa: Atividade Cap 17 - Observabilidade com Prometheus Metrics e Zap Logs
🔑 Gabarito de Código & Solução Comentada
// logger_zap.go
package main

import (
	"go.uber.org/zap"
)

func CriarLoggerZap() *zap.Logger {
	logger, _ := zap.NewProduction()
	defer logger.Sync()
	logger.Info("Servidor inicializado",
		zap.String("versao", "1.0.0"),
		zap.Int("porta", 8080),
	)
	return logger
}

🔍 Nível 2: Prática

Problema 17.2 — Exposição de Métricas Prometheus no Endpoint /metrics

Contexto: Exposição de Métricas Prometheus no Endpoint /metrics no contexto de Observabilidade com Prometheus Metrics e Zap Logs.

Requisitos de Execução:

  1. Registrar métricas prometheus.NewCounterVec contabilizando total de requisições por status code e expor em /metrics.

Resultado Esperado

GET /metrics -> Métricas do Prometheus expostas com formato padrão OpenMetrics.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_17_2_SeuNome
  2. Envie na tarefa: Atividade Cap 17 - Observabilidade com Prometheus Metrics e Zap Logs
🔑 Gabarito de Código & Solução Comentada
// metrics_prom.go
package main

import (
	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

var reqCounter = prometheus.NewCounterVec(
	prometheus.CounterOpts{Name: "http_requests_total", Help: "Total de requisições HTTP"},
	[]string{"method", "status"},
)

func SetupPrometheus(r *gin.Engine) {
	prometheus.MustRegister(reqCounter)
	r.GET("/metrics", gin.WrapH(promhttp.Handler()))
}

⚡ Nível 3: Integração

Problema 17.3 — Histograma de Latência de Requisições HTTP

Contexto: Histograma de Latência de Requisições HTTP no contexto de Observabilidade com Prometheus Metrics e Zap Logs.

Requisitos de Execução:

  1. Medir tempo de resposta de cada endpoint com prometheus.NewHistogramVec registrando buckets de latência.

Resultado Esperado

Histograma de latência calculado por rota e método.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_17_3_SeuNome
  2. Envie na tarefa: Atividade Cap 17 - Observabilidade com Prometheus Metrics e Zap Logs
🔑 Gabarito de Código & Solução Comentada
// latency_histogram.go
package main

import "github.com/prometheus/client_golang/prometheus"

var LatencyHistogram = prometheus.NewHistogramVec(
	prometheus.HistogramOpts{
		Name:    "http_request_duration_seconds",
		Help:    "Histograma de latência de requisições",
		Buckets: []float64{0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5},
	},
	[]string{"path", "method"},
)

🏆 Nível 4: Desafio Corporativo

Problema 17.4 — Tracing Distribuído com OpenTelemetry (OTel)

Contexto: Tracing Distribuído com OpenTelemetry (OTel) no contexto de Observabilidade com Prometheus Metrics e Zap Logs.

Requisitos de Execução:

  1. Injetar trace span do OpenTelemetry no contexto Gin e propagar headers W3C Trace Context.

Resultado Esperado

Trace ID injetado e propagado em chamadas a microsserviços downstream.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_17_4_SeuNome
  2. Envie na tarefa: Atividade Cap 17 - Observabilidade com Prometheus Metrics e Zap Logs
🔑 Gabarito de Código & Solução Comentada
// otel_tracing.go
package main

import (
	"context"
	"go.opentelemetry.io/otel"
)

func CriarSpan(ctx context.Context, nome string) {
	tr := otel.Tracer("gin-server")
	_, span := tr.Start(ctx, nome)
	defer span.End()
}