Integrações de Observabilidade
O Sagaweaw se integra automaticamente com o stack de observabilidade que você já usa — sem configuração extra além do starter.
MDC — Logging Contextualizado
Ao executar qualquer step, o Sagaweaw enriquece o MDC (Mapped Diagnostic Context) com os seguintes campos:
| Campo MDC | Valor |
|---|---|
sagaId | UUID da saga em execução |
sagaName | Nome da saga (@Saga("pix-payment")) |
stepName | Nome do step atual |
attempt | Número da tentativa atual (começa em 1) |
Exemplo de log enriquecido
Com Logback (padrão Spring Boot), adicione %X{sagaId} ao seu pattern para incluir o contexto automaticamente:
<!-- logback-spring.xml -->
<pattern>%d{HH:mm:ss} [%X{sagaName}/%X{stepName}] [attempt=%X{attempt}] %-5level %msg%n</pattern>
Saída:
10:04:59 [pix-payment/validate-dict] [attempt=1] INFO Validating DICT key abc-123
10:05:00 [pix-payment/block-balance] [attempt=1] INFO Blocking balance R$ 150.00
10:05:01 [pix-payment/transmit-to-bacen] [attempt=3] WARN Timeout — retrying in 4s
Quando a saga termina (com sucesso ou falha), os campos MDC são removidos automaticamente — sem vazamento entre threads no pool.
O campo sagaId pode ser propagado via OpenTelemetry, Datadog trace ID ou Elastic APM para correlacionar a saga com spans de rastreamento distribuído.
Micrometer — Métricas Automáticas
O Sagaweaw publica métricas via Micrometer automaticamente quando o micrometer-core está no classpath (incluído por padrão no Spring Boot Actuator).
Métricas disponíveis
| Métrica | Tipo | Tags | Descrição |
|---|---|---|---|
sagaweaw.saga.started | Counter | saga | Total de sagas iniciadas |
sagaweaw.saga.completed | Counter | saga | Total de sagas concluídas |
sagaweaw.saga.failed | Counter | saga | Total de sagas que falharam |
sagaweaw.saga.compensated | Counter | saga | Total de sagas compensadas |
sagaweaw.saga.duration | Timer | saga | Distribuição de duração por saga |
sagaweaw.step.duration | Timer | saga, step | Distribuição de duração por step |
sagaweaw.step.attempts | DistributionSummary | saga, step | Distribuição de tentativas |
sagaweaw.deadletter.created | Counter | saga, step | Dead letters criadas |
Nenhuma configuração necessária
Se o spring-boot-starter-actuator estiver no classpath, as métricas são publicadas automaticamente. Não há bean para declarar nem @EnableSagaMetrics.
<!-- Apenas isso é suficiente -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Prometheus
Com micrometer-registry-prometheus no classpath, as métricas são expostas em /actuator/prometheus no formato Prometheus.
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Exemplos de PromQL
# Taxa de sagas com falha por minuto, por nome de saga
rate(sagaweaw_saga_failed_total[1m])
# Percentil 95 de duração da saga "pix-payment"
histogram_quantile(0.95,
rate(sagaweaw_saga_duration_seconds_bucket{saga="pix-payment"}[5m])
)
# Percentil 99 de duração do step "transmit-to-bacen"
histogram_quantile(0.99,
rate(sagaweaw_step_duration_seconds_bucket{step="transmit-to-bacen"}[5m])
)
# Dead letters criadas na última hora
increase(sagaweaw_deadletter_created_total[1h])
# Taxa de sucesso (últimos 5 minutos)
rate(sagaweaw_saga_completed_total[5m]) /
(rate(sagaweaw_saga_completed_total[5m]) + rate(sagaweaw_saga_failed_total[5m]))
Grafana — Dashboard Recomendado
Configure o Prometheus como datasource e importe um dashboard com os seguintes painéis sugeridos:
┌─────────────────────┬─────────────────────┬─────────────────────┐
│ Taxa de Sucesso │ Sagas/min │ Dead Letters │
│ (gauge, %) │ (time series) │ (stat, vermelho) │
├─────────────────────┴─────────────────────┴─────────────────────┤
│ Duração p50/p95/p99 por saga type (time series por saga) │
├─────────────────────┬─────────────────────────────────────────┤
│ Steps mais lentos │ Tentativas médias por step │
│ (table, p95) │ (bar chart) │
└─────────────────────┴─────────────────────────────────────────┘
O Sagaweaw Dashboard (embutido) é uma lente de debug — ideal para inspecionar sagas individuais, ver timelines de steps e gerenciar dead letters em tempo real.
O Grafana é para observabilidade de produção em larga escala: alertas, retenção histórica, correlação com outras métricas do sistema.
Use os dois.
Configuração Completa
Configuração mínima para ativar tudo:
# application.yml
sagaweaw:
enabled: true
observability:
enabled: true
token: ${SAGAWEAW_TOKEN}
management:
endpoints:
web:
exposure:
include: health, prometheus, metrics
metrics:
tags:
application: ${spring.application.name}
env: ${spring.profiles.active:local}
Com isso você tem, automaticamente:
- MDC enriquecido em todos os logs de steps
- Métricas Micrometer para todos os eventos de saga
- Endpoint
/actuator/prometheuspara scraping pelo Prometheus - Dashboard embutido via
sagaweaw.observability.token