Observabilidade
Introdução ao documento
Este documento registra apenas os mecanismos de observabilidade que possuem evidência no repositório: probes HTTP, telemetria browser com Datadog, Google Analytics, logs por console.*, envio de logs de negócio ao backend e logs operacionais dos workflows GitHub Actions. Onde houver recomendação operacional, ela será marcada como inferência.
Fato observado:
- A aplicação expõe rotas
/api/health,/api/livenesse/api/readiness. Evidências:src/app/api/health/route.ts:3-31,src/app/api/liveness/route.ts:3-11,src/app/api/readiness/route.ts:3-23. - O cliente inicializa
datadogRumedatadogLogsa partir de/api/envs. Evidências:src/app/start/DatadogStart.tsx:11-47,src/app/api/envs/route.ts:6-26. - O layout injeta Google Analytics. Evidências:
src/app/layout.tsx:6,src/app/layout.tsx:51,src/app/layout.tsx:81-90.
Versionamento
- Documento atualizado em
2026-03-20. - Revisar quando mudarem bootstrap de telemetria, endpoints de healthcheck, naming de envs ou fluxos de deploy.
Fato observado:
- A aplicação versionada no repositório está em
0.1.4. Evidências:package.json:2-3. - O healthcheck inclui campo de versão baseado em
NEXT_APP_VERSION. Evidências:src/app/api/health/route.ts:6-19.
Referencial teórico
O referencial teórico adotado aqui é o que o próprio repositório implementa: health/liveness/readiness em HTTP, telemetria client-side orientada a RUM/logs, e logs técnicos por console.* em rotas, hooks e serviços.
Fato observado:
- Docker usa
HEALTHCHECKcontra/api/health. Evidências:Dockerfile:72-74. - Kubernetes usa
livenessProbeereadinessProbecontra/api/livenesse/api/readiness. Evidências:helm/templates/deployment.yaml:53-64. - O browser bootstrap ativa
trackUserInteractions,trackResourcesetrackLongTasksno Datadog RUM. Evidências:src/app/start/DatadogStart.tsx:19-32.
Padrão de logs
1. Logs técnicos por console.*
Fato observado:
- As rotas de API e serviços usam
console.errorpara falhas operacionais. Exemplos:src/app/api/health/route.ts:20-30,src/app/api/submissions/route.ts:21-37,src/app/api/submissions/route.ts:73-89,src/app/api/jitsi/config/route.ts:11-17,src/services/StatusService.ts:79-83. - Há logs de depuração em integrações de quiz e cache em memória. Exemplos:
src/services/quizApi.ts:65-77,src/services/quizApi.ts:197,src/hooks/useGetDataWithCache.ts:5-24.
2. Logs browser enviados ao Datadog
Fato observado:
datadogLogs.inité chamado comforwardErrorsToLogs: true. Evidências:src/app/start/DatadogStart.tsx:34-41.- A inicialização usa
clientToken,env,versionesessionSampleRatevindos de/api/envs. Evidências:src/app/start/DatadogStart.tsx:14-41,src/app/api/envs/route.ts:7-24.
3. Logs de negócio enviados ao backend WordPress
Fato observado:
- Existe envio de log de negócio para
POST /dhedalos/v1/logs. Evidências:src/app/services/external/LogsService.ts:3-15. - O login de participantes dispara
sendLogcom açãoLogou no HUBpara cadaenroll_id. Evidências:src/utils/authOptions.ts:71-83. - O helper de cliente reencaminha falhas de envio para
console.error. Evidências:src/utils/sendLog.ts:3-12.
Inferência operacional:
- O formato predominante de logs técnicos é não estruturado, porque o código usa strings livres em
console.log,console.error,console.warneconsole.info, sem envelope padrão ou correlation id versionado.
Healthchecks
| Sinal | Endpoint/uso | O que retorna | Evidências |
|---|---|---|---|
| Health geral | GET /api/health | status, timestamp, uptime, version, node_version, memory.used, memory.total, env | src/app/api/health/route.ts:3-31 |
| Liveness | GET /api/liveness | status: ok, timestamp | src/app/api/liveness/route.ts:3-11 |
| Readiness | GET /api/readiness | status: ready, timestamp ou 503 com status: not_ready | src/app/api/readiness/route.ts:3-23 |
| Container health | HEALTHCHECK do Docker | curl -f http://localhost:3000/api/health | Dockerfile:72-74 |
| Probes do cluster | livenessProbe e readinessProbe do chart | leitura de /api/liveness e /api/readiness | helm/templates/deployment.yaml:53-64 |
Observação importante:
- A rota de readiness não verifica dependências externas; o próprio código comenta que isso "pode incluir verificações de dependências externas se necessário", mas hoje apenas responde
readydentro detry/catch. Evidências:src/app/api/readiness/route.ts:4-14.
Métricas-chave
Métricas/sinais expostos pelo próprio código
| Sinal | Tipo | Origem | Evidências |
|---|---|---|---|
| Disponibilidade do processo | status HTTP de /api/liveness | rota Next.js | src/app/api/liveness/route.ts:3-11, helm/templates/deployment.yaml:53-58 |
| Prontidão para tráfego | status HTTP de /api/readiness | rota Next.js | src/app/api/readiness/route.ts:3-23, helm/templates/deployment.yaml:59-64 |
| Saúde detalhada do processo | status, uptime, env, version | rota Next.js | src/app/api/health/route.ts:6-19 |
| Uso de heap | memory.used, memory.total | rota Next.js | src/app/api/health/route.ts:12-15 |
| Versão executada | NEXT_APP_VERSION em /api/health e /api/envs | runtime | src/app/api/health/route.ts:10, src/app/api/envs/route.ts:8 |
| Interações de usuário | trackUserInteractions | Datadog RUM | src/app/start/DatadogStart.tsx:28-31 |
| Recursos de navegador | trackResources | Datadog RUM | src/app/start/DatadogStart.tsx:29-31 |
| Long tasks no browser | trackLongTasks | Datadog RUM | src/app/start/DatadogStart.tsx:29-31 |
| Erros de cliente enviados a logs | forwardErrorsToLogs | Datadog Logs | src/app/start/DatadogStart.tsx:34-41 |
Dependências observáveis que merecem acompanhamento
Fato observado:
/api/envsé dependência direta do bootstrap de Datadog. Evidências:src/app/start/DatadogStart.tsx:14-17,src/app/api/envs/route.ts:6-26./api/submissionse/api/submissions/files/...dependem deSUBMISSIONS_URL,SUBMISSIONS_APP_KEYeSUBMISSIONS_STORAGE_URL. Evidências:src/app/api/submissions/route.ts:1-19,src/app/api/submissions/route.ts:41-83,src/app/api/submissions/files/[...path]/route.ts:17-35./api/schedule/slotdepende de sessão e de serviços externos de agenda/turma. Evidências:src/app/api/schedule/slot/route.ts:7-18,src/app/api/schedule/slot/route.ts:34-53.
Onde olhar logs
Processo local ou container da aplicação
Fato observado:
- O código emite
console.*em rotas API, hooks e serviços. Exemplos:src/app/api/health/route.ts:20-30,src/app/api/submissions/route.ts:21-37,src/services/quizApi.ts:65-77,src/hooks/useGetDataWithCache.ts:5-24.
Inferência operacional:
- Em execução local, esses eventos devem aparecer no terminal do
next devounext start. - Em execução containerizada, esses eventos tendem a sair em
stdout/stderrdo processo Node e, por consequência, nos logs do runtime do container. O repositório não versiona a ferramenta de coleta desses logs.
Navegador e Datadog
Fato observado:
- O bootstrap de observabilidade do browser acontece em
DatadogStart, renderizado noRootLayout. Evidências:src/app/layout.tsx:7,src/app/layout.tsx:81,src/app/start/DatadogStart.tsx:10-47. - A inicialização falha com
console.errorse/api/envsnão responder corretamente. Evidências:src/app/start/DatadogStart.tsx:45-47.
Inferência operacional:
- Para falhas client-side, olhar primeiro o console do navegador e a aba de rede para
/api/envs. - Se
NEXT_DATADOG_*estiverem configuradas, olhar também os eventos em Datadog Browser RUM/Logs.
GitHub Actions
Fato observado:
- Build, push de imagem e deploy Helm são executados em
CI/CD Pipeline. Evidências:.github/workflows/ci-cd-pipeline.yml:13-124. - Testes E2E rodam no workflow
Cypress Tests (Cloud - Parallel)e publicam artefatos de vídeo e screenshot. Evidências:.github/workflows/cypress.yml:11-104.
Inferência operacional:
- Em falhas de build, deploy ou E2E, o primeiro ponto de inspeção deve ser o log do job correspondente no GitHub Actions.
Logs de negócio
Fato observado:
- Eventos de negócio são enviados ao backend WordPress em
/dhedalos/v1/logs. Evidências:src/app/services/external/LogsService.ts:3-15,src/utils/authOptions.ts:71-83.
Pendência:
- O repositório não informa onde esses eventos são consultados no backend ou em qual ferramenta ficam armazenados.
Alertas recomendados
As recomendações abaixo são inferências operacionais apoiadas nos sinais já existentes no repositório.
- Alertar quando
/api/healthretornar não-200, porque esse endpoint é usado peloHEALTHCHECKdo container. Evidências:src/app/api/health/route.ts:3-31,Dockerfile:72-74. - Alertar quando
/api/livenessou/api/readinessretornarem não-200, porque essas probes influenciam a permanência do pod no tráfego. Evidências:src/app/api/liveness/route.ts:3-11,src/app/api/readiness/route.ts:3-23,helm/templates/deployment.yaml:53-64. - Alertar sobre ausência de telemetria browser quando
/api/envsfalhar ou quandoNEXT_DATADOG_*vierem vazios, porqueDatadogStartdepende disso para inicialização. Evidências:src/app/start/DatadogStart.tsx:14-47,src/app/api/envs/route.ts:7-24. - Alertar sobre aumento de erro nas rotas de proxy críticas
/api/submissions,/api/submissions/files/...e/api/schedule/slot, porque elas encapsulam dependências externas e retornam erros explícitos de integração. Evidências:src/app/api/submissions/route.ts:21-37,src/app/api/submissions/route.ts:73-89,src/app/api/submissions/files/[...path]/route.ts:19-24,src/app/api/submissions/files/[...path]/route.ts:30-35,src/app/api/schedule/slot/route.ts:10-18,src/app/api/schedule/slot/route.ts:39-62. - Alertar sobre degradação de quiz no browser se os logs
[QuizAPI]passarem a concentrar falhas HTTP. Evidências:src/services/quizApi.ts:65-99.
Pendências
- Não há dashboard, monitor monitorado como código, regra de alerta versionada ou SLO versionado neste repositório. Evidências:
.github/workflows/ci-cd-pipeline.yml:1-124,helm/templates/deployment.yaml:1-78, ausência de outros artefatos de observabilidade versionados no inventário do repositório. - O naming de envs de observabilidade diverge entre
.env.examplee/api/envs. Evidências:.env.example:16-19,src/app/api/envs/route.ts:10-21,helm/templates/secret.yaml:24-28. - A rota
/api/readinessainda não verifica dependências externas críticas. Evidências:src/app/api/readiness/route.ts:4-14. - A aplicação não implementa logging estruturado nem correlation id de ponta a ponta. Evidências:
src/app/api/health/route.ts:20-30,src/app/api/submissions/route.ts:21-37,src/services/quizApi.ts:65-77,src/hooks/useGetDataWithCache.ts:5-24.