Contratos de Eventos
Validação antes do processamento
Tutorial de validação JSON Schema no consumidor com métricas e tratamento de erro.
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.goservices/payment-service/internal/validators/order_created_validator.gocontracts/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.