Quem sou?
Luiz Braga
github.com/luizbraga
Cientista da Computação pela UFRPE
Desenvolvedor na Labcodes
Ex-malabarista
Defensor de Azeroth nas horas vagas
Slide 3
Slide 3 text
Aprendendo com os erros
Slide 4
Slide 4 text
O que veremos?
● Pânico em produção
● Testes falhando
● Falta de monitoramento
● Uns macacos loucos
Slide 5
Slide 5 text
Era uma vez...
Slide 6
Slide 6 text
Primeira semana
Usuários recebendo Erro 500 em ação específica
Planejamento de nova funcionalidade
Não sabemos o que os usuários acessam
Slide 7
Slide 7 text
Segunda semana
O erro 500 continua
Não conseguimos reproduzir o erro
Alguns usuários reclamam que não estão recebendo email
Slide 8
Slide 8 text
Terceira semana
O erro 500 continua
Usuários continuam sem receber email
Tela de detalhes demorando para carregar
Final de sprint, nova funcionalidade foi criada
Slide 9
Slide 9 text
Quarta semana
O erro 500 continua, junto com o erro de email
Tela demorando para carregar
O desenvolvedor mais experiente entrou de férias
De repente, todos os dados da tabela sumiram!
Slide 10
Slide 10 text
No content
Slide 11
Slide 11 text
O que poderia ajudar?
Slide 12
Slide 12 text
Parando o sangramento
Slide 13
Slide 13 text
Primeira semana
Usuários recebendo Erro 500 em ação específica
Planejamento de nova funcionalidade
Não sabemos o que os usuários acessam
Slide 14
Slide 14 text
Parar o sangramento
● Erro 500
○ Error tracking
● Não sabemos o que os usuários acessam
○ Rastreamento de ação
Django Log Request ID
Rastreamento de requests do usuário
Criação de ID por sessão de usuário
github.com/dabapps/django-log-request-id
Slide 17
Slide 17 text
Segunda semana
O erro 500 continua
Não conseguimos reproduzir o erro
Alguns usuários reclamam que não estão recebendo email
Slide 18
Slide 18 text
Parar o sangramento
● Usuários não recebendo email
○ Tarefa atômica
○ Boas práticas de tarefas assíncronas
Slide 19
Slide 19 text
Tarefas atômicas
Slide 20
Slide 20 text
Terceira semana
O erro 500 continua
Usuários continuam sem receber email
Tela de detalhes demorando para carregar
Final de sprint, nova funcionalidade foi criada
Slide 21
Slide 21 text
Parar o sangramento
● Tela demorando para carregar
○ Melhoria nas queries do Django
○ Paginação
○ Indexação?
○ Cache
Slide 22
Slide 22 text
Django select_related
Fetch em um único batch todos os dados de relacionamento
Utilizado para 1-N e 1-1
Não precisa consultar no banco toda vez que precisar de dados do
relacional
https://docs.djangoproject.com/pt-br/2.1/ref/models/querysets/#select-related
Slide 23
Slide 23 text
Django prefetch_related
Similar ao select_related
Utilizado para N-N e N-1
Diminuição da quantidade de consultas feitas no banco
https://docs.djangoproject.com/pt-br/2.1/ref/models/querysets/#prefetch-related
Slide 24
Slide 24 text
Indexação
● Diminuição utilização de recurso
● Melhor tempo de resposta
● Exemplo:
○ Updates no MongoDB sem index
Slide 25
Slide 25 text
Quarta semana
O erro 500 continua, junto com o erro de email
Tela demorando para carregar
O desenvolvedor mais experiente entrou de férias
De repente, todos os dados da tabela sumiram!
Slide 26
Slide 26 text
Parar o sangramento
● Todos os dados da tabela foram deletados
○ Backup!
○ Criação de réplicas
○ EBS
● Sem backup ainda tem esperança
Slide 27
Slide 27 text
Melhorias
● Nova funcionalidade criada
○ Ambiente de QA
● O desenvolvedor mais experiente entrou de férias
○ Compartilhar experiência
Slide 28
Slide 28 text
Compartilhar experiência
● Independência do time
● Revisão de Pull Request é uma ótima prática
● Evolução do processo
Slide 29
Slide 29 text
Melhorias
● Criação de novos logs
● Persistência de Log
○ AWS: CloudWatch
○ NoSQL Database
○ Log file
● Extração de valores do log
Slide 30
Slide 30 text
Deve-se sempre buscar a melhoria
Slide 31
Slide 31 text
E se tudo estiver bem?
Slide 32
Slide 32 text
Teste!
Sistemas são caóticos!
Procure sempre chegar no limite
Há sempre uma melhoria para ser feita
Slide 33
Slide 33 text
Simule!
● Simulação falhas no sistema
● Crazy Monkey
○ E se o banco for deletado?
○ E se o deploy automático não funcionar?
○ E se o github parar?
Slide 34
Slide 34 text
Por que fazer isso?
● Aprendizado a partir dos erros
● Evolução do projeto
○ Melhoria do processo
○ Qualidade!
● O erro humano NUNCA é a causa raiz
Slide 35
Slide 35 text
Como implementar tudo isso?
Slide 36
Slide 36 text
Comece pelo começo
● Mudança de cultura é difícil
● Pequenos passos
○ Entenda sua dor
○ Criação de log mais detalhado já é um início
● Vinta Software Dev Checklist
○ devchecklists.com
Slide 37
Slide 37 text
Boilerplate em Django
github.com/luizbraga/django-monitoring-boilerplate