Observability API
O Sagaweaw expõe uma API REST completa para monitorar sagas, consultar métricas e gerenciar dead letters. Todos os endpoints exigem autenticação por token.
Segurança
Por padrão, todos os endpoints retornam 403 se o token não estiver configurado.
Configuração
sagaweaw:
observability:
enabled: true
token: ${SAGAWEAW_TOKEN} # obrigatório
Para desabilitar completamente a API:
sagaweaw:
observability:
enabled: false
Autenticação
Passe o token em qualquer um dos dois formatos:
# Bearer token (padrão)
Authorization: Bearer <token>
# Header alternativo
X-Sagaweaw-Token: <token>
Endpoints de Sagas
GET /api/sagas
Lista sagas com paginação e filtros opcionais.
Query params:
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
page | int | 0 | Página (0-indexed) |
size | int | 50 | Itens por página |
status | string | — | Filtrar por status (FAILED, COMPLETED, etc.) |
name | string | — | Busca por nome da saga (contains, case-insensitive) |
id | string | — | Busca por prefixo de ID da saga |
idempotencyKey | string | — | Busca exata por chave de idempotência |
from | ISO 8601 | — | Data inicial (2024-01-01T00:00:00Z) |
to | ISO 8601 | — | Data final |
Exemplos:
# Últimas 50 sagas
curl -H "Authorization: Bearer $TOKEN" /api/sagas
# Sagas que falharam hoje
curl -H "Authorization: Bearer $TOKEN" \
"/api/sagas?status=FAILED&from=2024-01-15T00:00:00Z"
# Buscar por nome (contains)
curl -H "Authorization: Bearer $TOKEN" \
"/api/sagas?name=pix"
# Buscar por prefixo de ID
curl -H "Authorization: Bearer $TOKEN" \
"/api/sagas?id=01934abc"
# Buscar por idempotency key
curl -H "Authorization: Bearer $TOKEN" \
"/api/sagas?idempotencyKey=order-abc-123"
# Paginação
curl -H "Authorization: Bearer $TOKEN" \
"/api/sagas?page=2&size=25"
Resposta — array de SagaInstance:
[
{
"id": "01934...",
"name": "pix-payment",
"status": { "type": "COMPLETED", "completedAt": "2024-01-15T10:05:00Z", "durationMs": 312 },
"contextJson": "{\"transactionId\":\"...\"}",
"steps": [
{
"name": "validate-dict",
"order": 0,
"status": { "type": "COMPLETED" },
"attempt": 1,
"maxAttempts": 3,
"durationMs": 45,
"executedAt": "2024-01-15T10:04:59Z",
"completedAt": "2024-01-15T10:05:00Z"
}
],
"createdAt": "2024-01-15T10:04:58Z",
"updatedAt": "2024-01-15T10:05:00Z",
"version": 4
}
]
GET /api/sagas/{id}
Retorna uma saga específica pelo ID.
curl -H "Authorization: Bearer $TOKEN" /api/sagas/01934abc-...
- 200 — saga encontrada
- 404 — saga não existe
GET /api/sagas/{id}/events
Retorna o log de auditoria imutável da saga — todas as transições de estado em ordem cronológica.
curl -H "Authorization: Bearer $TOKEN" /api/sagas/01934abc-.../events
Resposta:
[
{
"id": "...",
"sagaId": "01934abc-...",
"stepName": null,
"eventType": "SAGA_STARTED",
"payload": null,
"createdAt": "2024-01-15T10:04:58Z"
},
{
"id": "...",
"sagaId": "01934abc-...",
"stepName": "validate-dict",
"eventType": "STEP_COMPLETED",
"payload": "{\"durationMs\":45}",
"createdAt": "2024-01-15T10:05:00Z"
}
]
- 200 — lista de eventos (pode ser vazia)
- 404 — saga não existe