Reduz o pico de memória na conversão e exportação de métricas diárias - #139
Merged
pitangainnovare merged 14 commits intoSep 4, 2026
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que esse PR faz?
Reduz o pico de memória da geração de métricas diárias ao converter os documentos mensais e anuais em 64 partições determinísticas, sem materializar milhões de documentos simultaneamente.
O processamento passa a:
A versão da aplicação é atualizada para
2.3.4. Não há migrations nem alterações de mappings.As novas configurações são:
Os valores acima são também os padrões, preservando o comportamento atual quando as variáveis não forem definidas.
Onde a revisão poderia começar?
A revisão pode começar em
metrics/counter/indexing/converter.py, onde está a conversão particionada. Em seguida:metrics/counter/access/daily_accumulator.py: exposição e consumo dos registros compactos;metrics/counter/indexing/engines/base.pyebook.py: definição das chaves de partição;metrics/services/parsing/job_payloads.py: integração da conversão ao job diário e liberação do cache;metrics/services/daily_payloads.py: escrita incremental dos documentos;metrics/services/memory.py: telemetria de memória;metrics/opensearch/client.py: lote Bulk e compressão HTTP configuráveis.Como este poderia ser testado manualmente?
2.3.3.parse_xlarge, com concorrência 1.OPENSEARCH_HTTP_COMPRESS=False, alterando apenas essa variável.Validações locais realizadas:
black,isort,flake8,git diff --checkegitleaksaprovados;python manage.py makemigrations --check --dry-run: nenhuma alteração detectada.Algum cenário de contexto que queira dar?
Um log SCL grande chegou a produzir aproximadamente 5,5 milhões de documentos anuais. A implementação anterior mantinha o acumulador, o dicionário mensal, o dicionário anual e partes do payload simultaneamente na memória, alcançando picos próximos do limite do worker em HML.
O particionamento limita o estado temporário da conversão sem alterar identificadores ou métricas. A ordem dos documentos no JSON passa a ser determinada pelas partições e pelos identificadores; por isso, o SHA bruto pode mudar em relação à versão anterior, embora o conteúdo aplicado ao OpenSearch seja semanticamente equivalente.
Durante a análise em HML, uma exportação com lotes de 500 documentos realizou mais de 12 mil requisições Bulk. As variáveis adicionadas permitem testar lotes maiores e compressão ligada ou desligada sem nova alteração de código.
Screenshots
Não aplicável.
Quais são os tickets relevantes?
Relacionado a #128.
Referências
Segurança da informação (NSI.04)
Este PR manipula dados sensíveis ou pessoais (LGPD)?
Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?
Este PR introduz, atualiza ou remove dependências de terceiros?
Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?
Este PR concatena, monta ou executa comandos SQL, HTML ou JavaScript a partir de entrada externa?
Este PR expõe novos endpoints, telas ou serviços?
Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?