Bugs em produção diferem de falhas locais: o formato do tráfego, o volume de dados e a configuração do ambiente escondem problemas que seu laptop nunca vê. Logs estruturados, traces distribuídos e profiling ao vivo seguro fecham essa lacuna sem reinícios arriscados.
# Amostra de pilha ao vivo (sem reinício, precisa de ptrace ou CAP_SYS_PTRACE)py-spy top --pid $(pgrep -f "gunicorn.*api:app")py-spy dump --pid <pid> --lines 50
Quando usar isso:
Taxa de erro aumenta sem correlação óbvia com deploy
Latência cresce, mas CPU parece ociosa (GIL ou espera de I/O)
Problema aparece apenas para um tenant ou região
Reprodução local falha após combinar versão do Python e variáveis de ambiente
# Habilita faulthandler na inicialização para hangs nativosimport faulthandlerfaulthandler.enable()# Debug temporário em apenas um pod (nunca comite)import logginglogging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)
Reiniciar pods antes de capturar logs - Você perde estado em memória e evidências de pilha. Correção: Capture logs, py-spy dump e métricas de heap primeiro.
IDs de correlação ausentes - Milhares de erros idênticos são inoperantes para busca. Correção: Exija request_id/trace_id no middleware antes que os handlers executem.
Depuração com nível DEBUG globalmente - O volume de logs explode e PII vaza. Correção: Aumente o nível em um pod ou use amostragem dinâmica.
Assumir que local == prod - Diferentes PYTHONHASHSEED, locale ou pins de dependência mudam o comportamento. Correção: Combine o digest da imagem e o env em um ambiente de scratch.
Bloquear o event loop em apps async - Chamadas síncronas de ORM travam todas as requisições; a CPU parece baixa. Correção: Verifique as linhas do tempo dos spans por segmentos síncronos longos; mova I/O para fora do loop.
Use plataformas de log, APM e kubectl exec/ecs exec apenas em um único pod canário. Prefira scripts py-spy e env-print commitados no repositório em vez de edições ad hoc.
Devo habilitar Python -X dev em produção?
Não. O modo de desenvolvimento adiciona verificações e avisos caros. Use staging com -X dev e mantenha a produção com logging ajustado e probes de saúde.
Qual é a primeira consulta em um incidente?
Filtre erros por serviço e git_sha nas últimas duas horas, depois pivote em trace_id da requisição bem-sucedida mais lenta para contraste.
Como rastreio uma tarefa Celery?
Passe trace_id nos kwargs da tarefa e vincule os contextvars do structlog na classe base da tarefa. Conecte logs do worker aos logs da API através do mesmo ID.
Quando py-spy não é suficiente?
Quando o processo está bloqueado em código nativo sem frames Python, ou durante a inicialização antes que os workers se vinculem. Combine com eBPF ou profiling nativo APM.
Posso usar pprint em produção?
Apenas atrás de uma feature flag e limite de taxa. Prefira campos estruturados para que os dashboards possam agregar.
Como comparo configurações de staging e produção?
Exporte chaves de env redigidas (apenas nomes) e compare tamanhos de pool, valores de timeout e feature flags. Nunca cole segredos em tickets.
E o Python 3.14 com free-threading?
Paradas relacionadas ao GIL diminuem, mas I/O e contenção de locks permanecem. py-spy ainda ajuda; observe os pontos intensos de threading.Lock nas métricas.
Por quanto tempo devo manter o logging de depuração ativado?
Minutos para um pod. Revertar imediatamente após a captura; documente as descobertas no canal de incidentes.
Quem deve ser o responsável pela depuração em produção?
O engenheiro de plantão conduz a coleta de evidências; o proprietário do serviço interpreta a lógica de domínio. Não depure SEV1 sozinho sem um comandante de incidentes.