Skip to content

fix(logs): rebaixa log por item das APIs para debug - #75

Open
Arthrok wants to merge 1 commit into
mainfrom
fix/log-por-item-apis
Open

Arthrok wants to merge 1 commit into
mainfrom
fix/log-por-item-apis

Conversation

@Arthrok

@Arthrok Arthrok commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator

Problema

As DAGs de API emitem 4 a 5 linhas em INFO por requisição HTTP, dentro de loops de paginação de milhares de iterações. Uma única task de fetch_relatorios_gestao medida em 06/10/2026: 118.232 linhas, 87 MB — e outra execução da mesma task chegou a 178 MB.

Distribuição das repetições nesse arquivo:

Repetições Linha
23.669 [cliente_base.py] Attempt N for GET ...
23.625 [cliente_base.py] Request successful with status N
23.625 [cliente_transferegov.py] Fetched N registros
23.625 [api_relatorios_gestao_dag.py] Buscando relatórios para plano ID
14.734 [api_relatorios_gestao_dag.py] Plano N: N relatórios FINAL
8.891 [api_relatorios_gestao_dag.py] Nenhum relatório encontrado

Somou ~7 GB de log local e foi uma das causas de o disco da VM de homologação chegar a 100% (0 byte livre), derrubando o Airflow.

Agrava o custo: o log estruturado do Airflow 3 repete dag_id, task_id, run_id, ti_id, filename e lineno em toda linha. A média do arquivo é 770 bytes por linha para mensagens de ~110 caracteres — o envelope custa mais que o conteúdo.

O que muda

cliente_base.py — as duas linhas por requisição vão para debug. Beneficia os 11 clientes que herdam dele, não só o transferegov. A visibilidade de falha não se perde: o except já loga warning por tentativa e error ao esgotar as retentativas. A linha de Attempt ainda inclui kwargs, que pode carregar parâmetros de consulta — outro motivo para não ficar em info.

cliente_transferegov_fundo_a_fundo.py — Fetched N registros é por chamada de endpoint, não por task; vai para debug.

api_relatorios_gestao_dag.py — as três linhas por plano vão para debug, e os planos sem relatório passam a ser contados e reportados no resumo que já existia no fim da extração:

Extração concluída com N registros de N planos consultados (N planos sem relatório)

Trocar 8.891 warnings por um número: um warning repetido milhares de vezes para uma condição esperada é ruído, não sinal.

Reversibilidade

Nada se perde de forma irreversível. Com logging_level=DEBUG o detalhe por requisição volta quando for preciso investigar.

Contexto

Terceira das três causas que lotaram o disco. As outras duas:

  • fix(cosmos): desliga install_dbt_deps e corta 94% do log de task #74 (mergeado) — o Cosmos emitia um aviso 1.213 vezes por log de task, 94% de cada arquivo, ~25 GB.
  • O upload de log para o MinIO nunca funcionou (airflow-logs com 0 objetos), então delete_local_logs = True nunca disparava e nada era apagado. Causa identificada: o upload roda no supervisor da task, que não resolve connection pela execution API; a correção é expor AIRFLOW_CONN_MINIO_DEFAULT como env var e está no repo de infra.

🤖 Generated with Claude Code

As DAGs de API emitiam 4 a 5 linhas em INFO por requisicao HTTP, dentro de
loops de paginacao de milhares de iteracoes. Medido em 06/10/2026 numa unica
task de fetch_relatorios_gestao: 118.232 linhas, 87MB -- e outra execucao da
mesma task chegou a 178MB. Distribuicao das repeticoes nesse arquivo:

  23.669  [cliente_base.py] Attempt N for GET ...
  23.625  [cliente_base.py] Request successful with status N
  23.625  [cliente_transferegov.py] Fetched N registros
  23.625  [api_relatorios_gestao_dag.py] Buscando relatorios para plano ID
  14.734  [api_relatorios_gestao_dag.py] Plano N: N relatorios FINAL
   8.891  [api_relatorios_gestao_dag.py] Nenhum relatorio encontrado

Isso somou ~7GB de log local e foi uma das causas de o disco da VM de
homologacao chegar a 100% (0 byte livre), derrubando o Airflow.

O que muda:

- cliente_base.py: as duas linhas por requisicao vao para debug. Beneficia os
  11 clientes que herdam dele, nao so o transferegov. A visibilidade de falha
  nao se perde: o except ja loga warning por tentativa e error ao esgotar as
  retentativas. A linha de Attempt ainda inclui kwargs, que pode carregar
  parametros de consulta -- outro motivo para nao ficar em info.

- cliente_transferegov_fundo_a_fundo.py: "Fetched N registros" e por chamada de
  endpoint, nao por task; vai para debug.

- api_relatorios_gestao_dag.py: as tres linhas por plano vao para debug, e os
  planos sem relatorio passam a ser contados e reportados no resumo que ja
  existia no fim da extracao. Trocar 8.891 warnings por um numero: um warning
  repetido milhares de vezes para uma condicao esperada e ruido, nao sinal.

Nada e perdido de forma irreversivel: com logging_level=DEBUG o detalhe por
requisicao volta quando for preciso investigar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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