Singed, um Profiler Front-End para aplicações Ruby e Rails
Você já se pegou querendo entender por que um bloco de código Ruby, uma determinada solicitação da Web ou uma determinada ação do controlador estava sendo executada tão lentamente? Talvez você tenha usado algumas ferramentas de perfil como o speedscope no passado, mas achou complicado, ou tentou, mas não conseguiu descobrir como usá-las.
Apresentando Singed , um novo frontend de criação de perfis da Gusto escrito por Josh Nichols (também conhecido como @technicalpickles) . Singed foi construído para ser um front-end de canivete suíço para várias ferramentas ( stackprof , rbspy e speedscope ), ajudando você a capturar e visualizar facilmente flamegraphs, onde antes você tinha que escrever um monte de clichê ou código temporário apenas para começar .
Por que outra ferramenta de criação de perfil?
Singed adiciona um novo método no Kernel, disponível em qualquer lugar:
flamegraph {
# your code here
}
Principalmente, a maioria dos desenvolvedores Ruby que desejam ver os flamegraphs usam o rack-mini-profiler , que é um frontend excelente e fácil de usar para o stackprof . Basta adicionar ?pp=flamegraph ao final de qualquer URL e pronto, você terá um flamegraph aberto em seu navegador.
No entanto, geralmente queremos criar perfis que não são apenas o URL atual na barra de navegação do navegador.
Por exemplo, podemos querer traçar o perfil de uma solicitação GraphQL, que é feita por meio de um gateway como o Apollo. Podemos não conseguir encontrar facilmente o URL que o Apollo Gateway está usando para fazer sua solicitação, por isso é difícil replicar e usar o rack-mini-profiler para capturar um flamegraph.
Ou podemos querer apenas criar o perfil de um bloco de código Ruby ou um trabalho em segundo plano, ou até mesmo um teste. Você pode escrever seu próprio código para fazer isso e chamar stackprof, mas são algumas dezenas de linhas padrão para redirecionar a saída para um arquivo e, provavelmente, você ainda terá que abri-lo manualmente em seu navegador.
Por que usar Speedscope, Stackprof e rbspy?
Singed é basicamente um wrapper em torno de três ferramentas diferentes:
- Speedscope , um visualizador de flamagrafia.
- stackprof , um criador de perfil de amostragem para Ruby.
- rbspy , outro criador de perfil de amostragem para Ruby, escrito em Rust.
stackprof é um criador de perfil de amostragem para Ruby. É uma extensão C para a VM Ruby, o que significa que ela deve ser “iniciada” com seu processo Ruby ao mesmo tempo. O rbspy funciona de maneira diferente - na verdade, ele usa privilégios sudo para ler a memória do processo Ruby de fora. Como tal, ele pode ser anexado a qualquer momento a um processo Ruby, e é por isso que Singed o usa para criar perfis de processos Ruby a partir da CLI.
Os criadores de perfil de amostragem, como stackprof e rbspy, são uma ótima opção porque eles se adaptam muito bem a bases de código maiores. Os criadores de perfil de rastreamento, como ruby-prof , tendem a falhar na escala Gusto devido à grande quantidade de código envolvida na execução de nosso aplicativo.
Finalmente, stackprof e rbspy têm muito suporte na comunidade. Não precisamos fazer nossa própria atualização do criador de perfil para oferecer suporte a novas versões do Ruby, por exemplo.
Um tour rápido pelos recursos
Vamos dar uma olhada rápida no que Singed pode realmente fazer. Uma das minhas maneiras favoritas de usar o Singed é criar o perfil de um simples bloco de código em nosso aplicativo Rails.
Por exemplo, digamos que eu queira criar o perfil de um trabalho em segundo plano, MyWorker. Eu criaria um arquivo chamado myprofile.rb, colocaria na raiz do nosso aplicativo Rails e adicionaria:
user = User.first
flamegraph { MyWorker.new.perform(user) }
bin/rails runner myprofile.rb
Outra coisa comum que encontro com os perfis é que às vezes é bastante complicado configurar o estado necessário para criar o perfil de um trecho de código. Talvez você só precise de um estado de banco de dados muito específico ou muito código precise ser executado primeiro. Muitas vezes, essa configuração já existe em nossos testes.
Singed torna muito fácil traçar o perfil de um teste. Isso significa que você pode, é claro, criar um perfil e otimizar seu conjunto de testes, mas, na verdade, acho mais útil para o código de perfil que precisa de muitas configurações específicas:
require 'singed/rspec'
RSpec.describe YourClass do
it "is slow :(", flamegraph: true do
# your code here
end
end
Outro caso de uso para Singed são as solicitações de criação de perfil. Na Gusto, temos um gateway GraphQL (Apollo) que faz requisições ao nosso backend Rails. Às vezes, quero criar o perfil dessas solicitações, mas é muito difícil fazer isso com o rack-mini-profiler porque não conheço a URL e o corpo da solicitação que o back-end do Apollo está enviando para o Rails. Em vez disso, com Singed, o que faço é:
- Acione a solicitação de back-end do GraphQL no front-end.
- No Chrome DevTools, copio essa solicitação “as fetch”. Isso me permite colá-lo em meu console Javascript e acionar essa solicitação GraphQL sob demanda.
- Eu paro e reinicio meu servidor de back-end, desta vez adicionando a variável de ambiente SINGED_MIDDLEWARE_ALWAYS_CAPTURE=1.
- Eu aciono a solicitação novamente no meu console Javascript.
Você também pode criar facilmente o perfil de inicialização de um aplicativo Rails:
bundle binstub singed
bin/singed -- bin/rails runner 'true'
Um front-end do Profiler com muitos usos
Espero ter convencido você a experimentar Singed. Uso quase diariamente aqui na Gusto.
Se você achou isso interessante, confira no GitHub .