Contratos de Eventos

Validação antes do processamento

Tutorial de validação JSON Schema no consumidor com métricas e tratamento de erro.

Avançado 40 min 35 pontos Leitura 0%

Nesta aula você vai

  • Validar payload na entrada do consumidor
  • Rejeitar eventos inválidos com motivo rastreável
  • Instrumentar métricas de falha de contrato

Validação antes do processamento

Nesta aula você vai validar o evento order.created no consumidor antes de tocar regra de negócio.

Arquivos usados

  • services/payment-service/internal/consumer/order_created_consumer.go
  • services/payment-service/internal/validators/order_created_validator.go
  • contracts/events/order.created/v1/schema.json

Passo 1 - Carregue schema no startup

func NewOrderCreatedValidator(path string) (*Validator, error) {
  schemaBytes, err := os.ReadFile(path)
  if err != nil { return nil, err }
  return validator.New(schemaBytes)
}

Inicialização:

v, err := validators.NewOrderCreatedValidator("contracts/events/order.created/v1/schema.json")

Passo 2 - Valide antes de processar

func (c *OrderCreatedConsumer) Handle(msg []byte) error {
  if err := c.validator.Validate(msg); err != nil {
    c.metrics.ContractInvalidTotal.WithLabelValues("order.created", "payment-service").Inc()
    c.logger.Warn("contract_invalid", "error", err)
    return ErrContractInvalid
  }
  return c.service.ProcessOrderCreated(msg)
}

Passo 3 - Teste com payload válido e inválido

services/payment-service/internal/tests/contract/order_created_consumer_test.go:

func TestHandle_ShouldRejectInvalidPayload(t *testing.T) {
  err := consumer.Handle([]byte(`{"eventType":"order.created","eventVersion":"v1"}`))
  require.ErrorIs(t, err, consumers.ErrContractInvalid)
}

Comando:

cd services/payment-service
go test ./internal/tests/contract/... -v

Passo 4 - Exponha métrica Prometheus

Nome recomendado:

event_contract_invalid_total{event="order.created",consumer="payment-service"}

Validação:

curl -s http://localhost:9090/metrics | rg event_contract_invalid_total

Resultado esperado

  • Evento inválido é rejeitado imediatamente.
  • Não há escrita parcial em banco.
  • Métrica de contrato inválido incrementa.
  • Log aponta campo quebrado do schema.

Resumo

Você implementou fail-fast em consumidor com validação de contrato, melhorando confiabilidade e observabilidade do pipeline de eventos.