Skip to content

Melhorias de observabilidade, otimizações Docker e atualização de dependências#121

Merged
diraol merged 13 commits into
mainfrom
feature/relative-file-paths
Apr 12, 2026
Merged

Melhorias de observabilidade, otimizações Docker e atualização de dependências#121
diraol merged 13 commits into
mainfrom
feature/relative-file-paths

Conversation

@diraol
Copy link
Copy Markdown
Contributor

@diraol diraol commented Apr 12, 2026

Resumo

  • Observabilidade: implementa JsonFormatter para logs estruturados em JSON, elimina duplicação de entradas de log e consolida tracebacks em campo único (compatível com Grafana Loki)
  • Docker: otimiza imagens (torch CPU-only, separação de deps de dev, remoção de camadas desnecessárias, multiarch amd64+arm64 com cache remoto)
  • Dependências: atualiza Python para 3.14.4, todos os pacotes para versões estáveis mais recentes
  • CI/CD: adiciona build-args de metadados (BUILD_DATE, VCS_REF, VERSION, TIKA_VERSION), trigger cicd/build via comentário em PR, corrige registry hardcoded no workflow Tika
  • Correções: SyntaxWarning em regex (al_associacao_municipios.py), ruff atualizado para v0.15.10

Mudanças por área

Logs e observabilidade (monitoring/, data_extraction/, tasks/)

  • JsonFormatter: cada entrada de log é uma linha JSON com todos os campos extra={} preservados
  • Tracebacks como campo traceback (string única) em vez de linhas fragmentadas
  • Remove chamadas logging.error() duplicadas que precediam log_tika_error()
  • Substitui logging.exception(e) por exc_info=True no logging.error() existente
  • Suprime logs INFO de opensearchpy e urllib3 (muito verbosos)
  • log_tika_request/log_tika_response rebaixados para DEBUG

Docker (Dockerfile.base, Dockerfile, Dockerfile_apache_tika, Makefile)

  • torch instalado com --index-url .../whl/cpu antes dos demais pacotes (~1.5 GB economizados)
  • black, coverage, ruff movidos para requirements-dev.txt
  • curl removido do builder stage; OCI labels apenas no runtime stage
  • Diretórios tests/ dos pacotes removidos antes do COPY para o runtime
  • TIKA_VERSION parametrizado via ARG no Dockerfile e variável no Makefile
  • REGISTRY derivado automaticamente da URL do remote git
  • Novos targets multiarch no Makefile com cache remoto

CI/CD (.github/workflows/)

  • BUILD_DATE, VCS_REF, VERSION passados como build-args em todos os workflows
  • TIKA_VERSION passado como build-arg com input configurável no workflow_dispatch
  • Trigger issue_comment com cicd/build para disparar builds via comentário em PRs
  • build_container_image.yaml: novo trigger em push no main para mudanças no Dockerfile
  • build_apache_tika.yaml: push restrito à main, registry dinâmico via github.repository_owner

Checklist de testes

  • cicd/build — acionar build via comentário neste PR
  • Verificar que logs aparecem como JSON válido (campo traceback presente em erros)
  • Confirmar tamanho da imagem base com docker image ls após build
  • Testar extração de texto com Tika: make retest-tika
  • Verificar que make help-build exibe REGISTRY correto

🤖 Generated with Claude Code

diraol and others added 10 commits February 17, 2026 10:35
O código Python espera o modelo em $HOME/models/bert-base-portuguese-cased
mas o Dockerfile.base estava salvando em /tmp/bert-model, causando o erro:
ValueError: Path /home/gazette/models/bert-base-portuguese-cased not found

Mudanças:
- Cria diretório /home/gazette/models no builder stage
- Salva modelo no caminho correto durante o build
- Copia modelo para o user home com permissões adequadas
- Remove variável SENTENCE_TRANSFORMERS_HOME (não mais necessária)

Fixes: #produção

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Aumenta tentativas de retry de 3 para 5 com backoff exponencial melhorado
- Adiciona jitter de 10% no backoff para prevenir thundering herd
- Implementa connection pooling com requests.Session para reutilizar conexões
- Adiciona configuração via variáveis de ambiente:
  * TIKA_MAX_RETRIES (padrão: 5)
  * TIKA_RETRY_BASE_DELAY (padrão: 2.0s)
  * TIKA_CONNECTION_POOL_SIZE (padrão: 10)
- Atualiza testes para trabalhar com implementação baseada em Session

Estas mudanças reduzem significativamente erros de conexão durante
inicialização do Tika e melhoram performance com keep-alive HTTP.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…eline

- Carrega modelo com low_cpu_mem_usage=True para reduzir pico de memória
  durante inicialização (evita mmap de ~415 MB de uma só vez)
- Adiciona cache do modelo a nível de módulo para evitar recarregamentos
  desnecessários entre chamadas consecutivas de embedding_rerank_excerpts
- Documenta as etapas do pipeline gazette_texts no README

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Adiciona JsonFormatter que serializa cada entrada como uma única linha
  JSON, preservando todos os campos extra={} e consolidando tracebacks
  num único campo 'traceback' (evita fragmentação no Grafana Loki)
- Silencia loggers de opensearchpy e urllib3 em WARNING para eliminar
  spam de requisições HTTP (ex.: 120+ entradas/s de _analyze)
- Downgrade de log_tika_request e log_tika_response para DEBUG, pois
  são eventos de alta frequência sem valor operacional em produção
- Move log_tika_request para dentro de _make_tika_request para
  correlacionar REQUEST com RESPONSE/ERROR por tentativa de retry
- Remove logging.error() duplicados em _make_tika_request que
  relogavam o mesmo erro já registrado por log_tika_error()
- Remove bloco try/except em extract_text que relogava o erro e
  substituía a exception original por uma genérica sem contexto
- Substitui logging.exception(e) por exc_info=True no logging.error()
  existente, consolidando erro e traceback em uma única entrada JSON

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…entes

- Atualiza .python-version para usar o venv qd-data-processing-3-14-4
- Atualiza Dockerfiles (Dockerfile e Dockerfile.base) de python:3.11-slim
  para python:3.14-slim
- Atualiza todas as dependências para suas versões estáveis mais recentes:
  - black: 24.10.0 → 26.3.1
  - coverage: 7.6.9 → 7.13.5
  - boto3/botocore: 1.35.80 → 1.42.88
  - psycopg2-binary: 2.9.10 → 2.9.11 (wheel nativa para Python 3.14)
  - opensearch-py: 2.7.1 → 3.1.0
  - requests: 2.32.3 → 2.33.1
  - scikit-learn: 1.5.2 → 1.8.0
  - sentence-transformers: 3.3.1 → 5.4.0
  - huggingface-hub: 0.26.5 → 1.10.1
  - numpy: 1.26.4 → 2.4.4

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Instala torch CPU-only antes dos demais pacotes (economia ~1.5 GB)
- Separa dependências de dev em requirements-dev.txt
- Remove curl do builder stage (desnecessário após remoção do git-lfs)
- Move OCI labels exclusivamente para o runtime stage
- Remove diretórios de teste bundled nos pacotes Python
- Parametriza TIKA_VERSION no Dockerfile_apache_tika
- Adiciona suporte a multiarch (amd64+arm64) com cache remoto no Makefile

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Quando REGISTRY não é passado explicitamente, o valor é inferido da
URL do remote `origin`:
  - Extrai owner e host via sed (suporta SSH e HTTPS)
  - Mapeia git host → container registry:
      github.com  → ghcr.io
      gitlab.com  → registry.gitlab.com
      outros      → host original
  - Fallback para ghcr.io/$(IMAGE_NAMESPACE) se origin não existir

Exemplo: git@github.com:okfn-brasil/repo.git → ghcr.io/okfn-brasil
Override manual ainda funciona: make build REGISTRY=my.registry/org

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Adiciona prefixo r"..." em regex com \s em al_associacao_municipios.py
- Atualiza ruff de v0.6.2 para v0.15.10 no .pre-commit-config.yaml

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Passa BUILD_DATE, VCS_REF e VERSION como build-args em todos os workflows
- Passa TIKA_VERSION como build-arg no build_apache_tika.yaml
- Adiciona trigger issue_comment com filtro 'cicd/build' para acionar
  builds manualmente via comentário em PRs
- Adiciona trigger push.branches=main com paths no build_container_image.yaml
- Restringe build_apache_tika.yaml a push na branch main (era qualquer branch)
- Corrige registry hardcoded em build_apache_tika.yaml para usar
  github.repository_owner
- Adiciona input tika_version no workflow_dispatch do build_apache_tika.yaml

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
diraol and others added 3 commits April 11, 2026 23:05
Substitui tags flutuantes (v4, v5, v3) por hashes imutáveis para
evitar execução involuntária de código alterado nas actions.

  actions/checkout          v4   -> v4.3.1  (34e11487)
  actions/setup-python      v5   -> v5.6.0  (a26af69b)
  docker/setup-buildx-action v3  -> v3.12.0 (8d2750c6)
  docker/login-action       v3   -> v3.7.0  (c94ce9fb)
  docker/build-push-action  v5   -> v5.4.0  (ca052bb5)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
O wrapper em extract_text() que envolvia exceptions com
"Could not extract file content" foi removido (evitava double-logging).
O teste agora verifica apenas que uma Exception é lançada quando
o Tika falha, sem depender do texto da mensagem.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@diraol
Copy link
Copy Markdown
Contributor Author

diraol commented Apr 12, 2026

cicd/build

@diraol diraol merged commit 6c2502b into main Apr 12, 2026
3 checks passed
@diraol diraol deleted the feature/relative-file-paths branch April 12, 2026 02:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant