Skip to content

ci: job e2e que sobe o compose e prova que os traces chegam - #5

Merged
Roberton003 merged 3 commits into
masterfrom
ci/e2e-compose-traces
Jul 28, 2026
Merged

Roberton003 merged 3 commits into
masterfrom
ci/e2e-compose-traces

Conversation

@Roberton003

Copy link
Copy Markdown
Owner

Contexto

O job test roda contra um Postgres avulso e nunca sobe o compose. Isso deixava sem cobertura, no CI:

  • o Dockerfile e o docker-entrypoint.sh
  • o migrate no boot do container
  • a cadeia de observabilidade inteira: OTel → OTLP → Jaeger

A migração do Jaeger para v2 (3e26446) foi validada só na minha máquina, manualmente. Este job move essa validação para o CI.

O que o job faz

  1. Sobe docker compose up -d --build com portas alternativas — o que de quebra exercita as variáveis de override do compose
  2. Espera o dashboard responder 200 (com timeout, não sleep fixo)
  3. Roda a ingestão dentro do container
  4. Afirma que /api/summary/ devolve sensores e leituras > 0
  5. Gera requests instrumentadas
  6. Consulta a API do Jaeger e exige ao menos um trace do serviço labtelemetry
  7. Despeja logs dos containers em caso de falha; derruba o stack sempre

O passo 6 é o ponto: sem ele, uma quebra no exporter OTel ou no receptor OTLP passa despercebida indefinidamente — foi exatamente o tipo de coisa que só peguei rodando à mão.

Verificação antes do push

Todos os passos foram executados localmente contra o stack real, incluindo o caminho de falha:

Cenário Resultado
Stack saudável 5 traces, operacoes: ['GET api/summary/', 'INSERT', 'SELECT', 'summary'] — passou em ~2s
Container do Jaeger parado passo sai com exit 1 e ::error::nenhum trace ... chegou ao Jaeger

Gate que não sabe reprovar é decoração; este reprova.

Custo

~2-3 min por run (build da imagem + subida do stack), em paralelo com lint e test. timeout-minutes: 15 como teto.

O job `test` roda contra um Postgres avulso e nunca sobe o compose: nada no
CI cobria Dockerfile, entrypoint, migrate no boot ou a cadeia de
observabilidade. A migracao do Jaeger para v2 foi validada so na minha
maquina — este job passa isso para o CI.

O passo central consulta a API do Jaeger e exige ao menos um trace do servico
labtelemetry. Sem ele, uma quebra no exporter OTel ou no receptor OTLP passa
despercebida indefinidamente.

Usa as portas alternativas via variaveis de override, o que de quebra
exercita esse mecanismo do compose.

Passos validados localmente antes do push, incluindo o caminho de falha:
com o container do Jaeger parado, o passo de traces sai com exit 1.
Na primeira execucao verde o job passou vendo apenas spans `SELECT`: os do
psycopg sao exportados antes dos do Django, e a assercao original aceitava
qualquer trace. Uma quebra na instrumentacao HTTP teria passado.

Agora exige ao menos um span `GET ...` de servidor. O loop de retry ja
existente absorve a latencia do BatchSpanProcessor — a espera aumenta um
pouco, a assercao nao encurta.
@Roberton003

Copy link
Copy Markdown
Owner Author

O job pegou um bug na primeira execução

Start stack falhou no runner com:

OCI runtime create failed: exec: "/app/docker-entrypoint.sh": permission denied

Causa raiz: o git registrava docker-entrypoint.sh como 100644. Funcionava na minha máquina só porque o volume local monta tudo como 777 — core.filemode está false aqui, então o bit nunca foi para o índice.

Ou seja: docker compose up --build estava quebrado para qualquer pessoa que clonasse o repositório. É o primeiro comando da seção "Subir tudo com Docker" do README. Nenhum job existente pegava isso, porque nenhum subia o compose.

Corrigido em duas camadas:

  • git update-index --chmod=+x em docker-entrypoint.sh e scripts/publish_wiki.sh (causa raiz)
  • RUN chmod +x no Dockerfile (defesa: download em zip e checkout no Windows perdem o bit de novo)

Verificado com clone limpo local antes do push, e depois no runner.

Assertion apertada após a primeira execução verde

O job passou de primeira vendo apenas spans SELECT — os do psycopg são exportados antes dos do Django, e a assertion original aceitava qualquer trace. Uma quebra na instrumentação HTTP teria passado batido.

Agora exige ao menos um span GET ... de servidor. O log da execução final mostra o loop fazendo exatamente o trabalho dele:

20 traces, operacoes: ['INSERT', 'SELECT']                              ← retry
20 traces, operacoes: ['INSERT', 'SELECT']                              ← retry
20 traces, operacoes: ['GET api/summary/', 'GET dashboard', 'INSERT', 'SELECT', 'summary']  ← passou

A cadeia inteira coberta: Django HTTP, psycopg, e o span manual summary de views.py.

Custo

52 segundos, em paralelo com lint e test.

@Roberton003
Roberton003 merged commit f96dbf1 into master Jul 28, 2026
3 checks passed
@Roberton003
Roberton003 deleted the ci/e2e-compose-traces branch July 28, 2026 23:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant