Portaria Nº 3, DE 24 DE abril DE 2025.
Obrigado por compartilhar a implementação da sua classe CustomSchemaGenerator. Isso nos dá um contexto mais claro.
Como podemos ver, a sua classe herda de OpenAPISchemaGenerator do drf-yasg e sobrescreve o método get_operation. A lógica customizada adiciona os parâmetros obtidos de self.get_path_parameters(path, view) aos parâmetros padrão gerados pelo método get_operation da classe pai (super().get_operation(...)).
Dado que você identificou que as chamadas a CustomSchemaGenerator.get_operation estão consumindo tempo considerável, e olhando para o seu código, os principais pontos onde o tempo pode estar sendo gasto dentro deste método são:
Na chamada a self.get_path_parameters(path, view): Esta é a sua lógica customizada para obter parâmetros de path compartilhados. Este é o local mais provável para introduzir ineficiências na sua implementação customizada. Se dentro deste método você estiver realizando operações custosas (como consultas a banco de dados, iterações complexas sobre dados, chamadas a APIs externas, etc.), isso impactará diretamente o tempo total gasto na execução de CustomSchemaGenerator.get_operation.
Na chamada a super().get_operation(view, path, prefix, method, components, request): Esta chamada executa a lógica padrão do drf-yasg para gerar a operação OpenAPI. A performance deste método depende da complexidade da sua view e dos serializers associados (número de campos, relacionamentos aninhados, lógica de SerializerMethodField, etc.). Se a sua API for muito complexa, a introspecção padrão do drf-yasg pode levar tempo.
Na concatenação das listas de parâmetros: operation.parameters = path_params + operation.parameters. Embora esta operação tenha um custo, é improvável que seja a causa primária de um gargalo significativo de performance, a menos que a lista de parâmetros seja extremamente grande.
Próximos Passos para Investigação e Otimização:
Analise a Implementação de self.get_path_parameters: Este é o passo mais importante. Vá para o código da sua classe CustomSchemaGenerator e examine o que o método get_path_parameters faz.
Ele realiza consultas a banco de dados?
Ele processa grandes volumes de dados?
Há loops ou operações computacionalmente caras dentro dele?
Pode haver alguma forma de otimizar essa lógica ou cachear o resultado, especialmente se os "parâmetros compartilhados" não mudarem com frequência?
Perfilhe Especificamente self.get_path_parameters: Se possível, utilize ferramentas de profiling mais granulares (além do Sentry, ou mergulhando mais fundo nos detalhes da trace do Sentry) para ver o tempo gasto especificamente dentro do método get_path_parameters. Isso confirmará se ele é o culpado.
Considere a Complexidade das Views Associadas: Se get_path_parameters for eficiente, o gargalo pode estar na lógica padrão do drf-yasg ao processar views particularmente complexas através da chamada super().get_operation. Identifique quais views estão associadas às operações que aparecem com maior frequência ou maior tempo no profiling.
Revisite a Estratégia de Geração do Schema: Independentemente de quão rápida seja a execução de get_operation individualmente, 4.600 chamadas em 4 horas ainda somam um tempo total considerável. A recomendação de gerar o schema de forma estática em produção e servi-lo como um arquivo (em vez de dinamicamente via view) continua sendo a maneira mais eficaz de eliminar completamente esse tempo de processamento das requisições normais da API.
Ao focar na otimização da sua lógica customizada em get_path_parameters e, idealmente, mudando para uma estratégia de schema estático, você deverá conseguir reduzir significativamente o tempo gasto com a geração do schema no seu ambiente de produção.
PUBLIQUE-SE. REGISTRE-SE. CUMPRA-SE.
| Documento assinado digitalmente por Alvaro Mateus Santana, Coordenador de Sistemas e Desenvolvimento, em 24/04/2025, às 16:28, conforme art. 1º, III, "b", da Lei 11.419/2006. |
| A autenticidade do documento pode ser conferida no site https://sei.defensoria.pr.def.br/sei/controlador_externo.php?acao=documento_conferir&id_orgao_acesso_externo=0 informando o código verificador 0000472 e o código CRC 4CC164C1. |
Digite aqui o conteúdo do(s) anexo(s) ....