Skip to content

fix(transferegov): download de anexos em lotes e LPG/PNAB primeiro - #140

Merged
devwallyson merged 1 commit into
mainfrom
fix/download-anexos-lotes
Oct 30, 2026
Merged

devwallyson merged 1 commit into
mainfrom
fix/download-anexos-lotes

Conversation

@devwallyson

Copy link
Copy Markdown
Collaborator

Descrição

Em homologação, as seis bronze_planilha_* da dbt_cosmos falham em toda execução com relation "relatorio_gestao.planilha_..." does not exist. A causa está duas DAGs antes, na download_anexos_transferegov_dag.

O que acontecia:

  1. A buscar_ids_pendentes devolvia até 3000 anexos para a baixar_e_salvar_anexos mapear, um por task.
  2. Em homologação o max_map_length é o padrão do Airflow, 1024. O Airflow recusava a expansão e derrubava a buscar_ids_pendentes depois do return (no log, ela termina em Done. Returned value was: [...]).
  3. Nenhum download rodava. O log da rodada mostra 11378 anexos de planilha no staging, 0 já baixados.
  4. A anunciar_downloads, que tem trigger_rule=ALL_DONE, disparava a extracao_anexos_dag mesmo assim. A extração encontrava 0 anexos com arquivo baixado, terminava verde sem gravar nada, e as tabelas relatorio_gestao.planilha_* nunca eram criadas.

No ambiente local isso não aparece porque o infra/docker-compose.yml sobe AIRFLOW__CORE__MAX_MAP_LENGTH para 15000.

O que muda:

  • Download em lotes. A buscar_ids_pendentes devolve lotes de 50 anexos: 3000 anexos viram 60 tasks, bem abaixo do limite de qualquer ambiente. É o mesmo padrão que a salic_ingestion_trino e a extracao_anexos_dag já usam. Cada lote baixa os anexos em sequência, então o max_active_tis_per_dag=3 continua limitando a três requisições simultâneas à API.
  • Falha por anexo. Um anexo que falha não derruba o lote; ele volta como pendente na próxima rodada. O lote só falha se todos os anexos dele falharem, para que uma API fora do ar apareça vermelha na grade em vez de passar em silêncio.
  • LPG e PNAB primeiro. A lista é ordenada com LPG e PNAB antes de outros, e só depois entra o teto de 3000. Só essas duas políticas viram tabela na extração. outros continua sendo baixado, por último.
  • Log por política. A linha de log da rodada passa a trazer a contagem por política: (lpg N, pnab N, outros N).

Issue relacionada

Nenhuma. A falha foi encontrada direto nos logs de homologação, sem issue aberta.

Tipo de mudança

  • Ingestão — cliente de API, DAG, carga
  • Modelo dbt — transformação, camada, teste
  • Correção de bug ou de inconsistência de dados
  • Infra / CI
  • Documentação
  • Outro: ___

Impacto em dados

  • Schemas e tabelas afetados: raw/transferegov/anexos_arquivos/ no MinIO passa a receber arquivos. Em consequência, as tabelas relatorio_gestao.planilha_{contemplados,editais,dados}_{lpg,pnab_ciclo_1} são criadas pela extração, e as views transferegov.bronze_planilha_* passam a ser construídas. Nenhum schema ou coluna muda no código.

  • Camada: raw → bronze

  • Precisa reexecutar alguma coisa depois do merge? Sim, nesta ordem:

    1. Na download_anexos_transferegov_dag, limpar (Clear) a buscar_ids_pendentes da última execução, junto com as tasks seguintes. Assim ela roda de novo com a mesma cadeia de staging.
    2. A extracao_anexos_dag dispara sozinha quando a anunciar_downloads termina.
    3. Rodar a dbt_cosmos.

    Com 11.378 anexos pendentes e teto de 3000 por rodada, o download completo leva cerca de 4 rodadas, cada uma de algumas horas.

  • Muda número que já está em uso? Não há número anterior para comparar: em homologação essas tabelas nunca existiram. As silvers e golds da Meta 3 que leem das bronzes de planilha passam a ter dado pela primeira vez.

Como testar

make test
poetry run black --check dags/data_ingest/transferegov_fundo_a_fundo/download_anexos_dag.py
poetry run ruff check dags/data_ingest/transferegov_fundo_a_fundo/download_anexos_dag.py

Em homologação, depois do Clear da buscar_ids_pendentes, conferir:

  • a buscar_ids_pendentes fica verde e loga ... nesta rodada em 60 lotes (lpg N, pnab N, outros N);
  • as baixar_e_salvar_anexos [ ] rodam;
  • a listar_anexos_pendentes da extracao_anexos_dag loga mais de 0 anexos com arquivo baixado;
  • as bronze_planilha_*_run da dbt_cosmos ficam verdes.

Evidências

Logs de homologação, rodada de 2026-10-29 15:54:

  • download_anexos_transferegov_dag → buscar_ids_pendentes: 11378 anexos de planilha no staging, 0 já baixados, 3000 nesta rodada. A task fica vermelha e as baixar_e_salvar_anexos aparecem como "Falha no upstream".
  • extracao_anexos_dag → listar_anexos_pendentes: 0 anexos com arquivo baixado: 0 a processar ... e Nenhum anexo pendente de extração. A baixar_e_extrair é pulada.
  • dbt_cosmos → bronze_planilha_dados_lpg_run: relation "relatorio_gestao.planilha_dados_lpg" does not exist.

A correção ainda não foi executada no Airflow, nem local nem em homologação.

Checklist

  • Título segue Conventional Commits
  • Issue relacionada referenciada acima
  • Rodei make lint localmente — ou justifiquei abaixo por que não
  • Rodei make test localmente — ou justifiquei abaixo por que não
  • Testes dbt adicionados ou atualizados, se aplicável
  • Descrição das colunas atualizada no schema.yml, se criei ou alterei modelo
  • Nenhuma credencial, CPF, CNPJ ou dado pessoal no código, no log ou no print
  • Branch atualizada com origin/main
  • Documentação afetada atualizada

Sobre o lint: o make lint falha no passo do black por causa de 45 arquivos que já estão fora do padrão na main; nenhum deles é o arquivo deste PR. Como a falha interrompe o alvo, rodei black, ruff e mypy só no arquivo alterado. Black e ruff passam. O mypy acusa 4 erros (imports de plugins/ sem stub e um no-any-return), todos já presentes antes da mudança.

Itens desmarcados: este PR não toca modelo dbt, então os itens de teste dbt e de schema.yml não se aplicam. Também não há documentação afetada. make test passa com 8127 testes, já sobre a origin/main atual, mas a DAG de download não tem teste próprio.

Em homologação o max_map_length é o padrão do Airflow (1024) e a
buscar_ids_pendentes devolvia 3000 anexos para mapear um por task: o
Airflow derrubava a task depois do return, nenhum download rodava e a
anunciar_downloads (ALL_DONE) disparava a extracao_anexos_dag mesmo assim.
Sem arquivo no MinIO, a extração terminava verde sem gravar, as tabelas
relatorio_gestao.planilha_* nunca nasciam e as seis bronze_planilha_* da
dbt_cosmos quebravam com "relation does not exist". Local não reproduz
porque o compose sobe o limite para 15000.

A task agora devolve lotes de 50 (60 tasks por rodada), como a
salic_ingestion_trino e a extracao_anexos_dag já fazem. Cada lote baixa em
sequência, então o max_active_tis_per_dag=3 segue limitando a três
requisições simultâneas. Anexo que falha volta como pendente na próxima
rodada; o lote só falha se todos os anexos dele falharem.

LPG e PNAB passam na frente de `outros` antes do teto de 3000, porque só
eles viram tabela na extração. O log da rodada passa a trazer a contagem
por política.

@bottinolucas bottinolucas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm!

@devwallyson
devwallyson merged commit 34301e0 into main Oct 30, 2026
5 checks passed
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.

2 participants