Singed, un front-end di profiler per applicazioni Ruby e Rails
Ti sei mai trovato a voler capire perché un blocco di codice Ruby, una particolare richiesta web o una determinata azione del controller funzionava così lentamente? Forse hai utilizzato alcuni strumenti di profilazione come speedscope in passato, ma l'hai trovato ingombrante, o hai provato ma non sei riuscito a capire come usarli.
Presentazione di Singed , un nuovo frontend di profilazione di Gusto scritto da Josh Nichols (alias @technicalpickles) . Singed è stato creato per essere un front-end di coltellino svizzero per diversi strumenti ( stackprof , rbspy e speedscope ), aiutandoti a catturare e visualizzare facilmente i flamegraph, dove prima dovevi scrivere un mucchio di boilerplate o codice temporaneo solo per iniziare .
Perché un altro strumento di profilazione?
Singed aggiunge un nuovo metodo su Kernel, disponibile ovunque:
flamegraph {
# your code here
}
In primo luogo, la maggior parte degli sviluppatori Ruby che vogliono guardare i flamegraph usano rack-mini-profiler , che è un frontend eccellente e facile da usare per stackprof . Basta aggiungere ?pp=flamegraph alla fine di qualsiasi URL e whiz-bang, hai un flamegraph aperto nel tuo browser.
Tuttavia, spesso vogliamo profilare cose che non sono solo l'URL corrente nella barra di navigazione del nostro browser.
Ad esempio, potremmo voler profilare una richiesta GraphQL, che viene effettuata tramite un gateway come Apollo. Potremmo non essere in grado di trovare facilmente l'URL utilizzato da Apollo Gateway per effettuare la richiesta, quindi è difficile replicare e utilizzare rack-mini-profiler per acquisire un flamegraph.
Oppure, potremmo voler solo profilare un blocco di codice Ruby o un lavoro in background, o anche un test. Potresti scrivere il tuo codice per farlo e chiamare tu stesso stackprof, ma sono poche dozzine di righe standard per reindirizzare l'output a un file, e quindi probabilmente dovrai ancora aprirlo manualmente nel tuo browser.
Perché usare Speedscope, Stackprof e rbspy?
Singed è fondamentalmente un involucro attorno a tre diversi strumenti:
- Speedscope , un visualizzatore di flamegraph.
- stackprof , un profiler di campionamento per Ruby.
- rbspy , un altro profiler di campionamento per Ruby, scritto in Rust.
stackprof è un profiler di campionamento per Ruby. È un'estensione C per Ruby VM, il che significa che deve essere "avviata" con il tuo processo Ruby allo stesso tempo. rbspy funziona in modo diverso: in realtà utilizza i privilegi sudo per leggere la memoria del processo Ruby dall'esterno. In quanto tale, può essere collegato in qualsiasi momento a un processo Ruby, motivo per cui Singed lo utilizza per profilare i processi Ruby dalla CLI.
I profiler di campionamento come stackprof e rbspy sono un'ottima scelta perché si adattano abbastanza bene a basi di codice più grandi. I profiler di traccia, come ruby-prof , tendono a fallire su scala Gusto a causa dell'enorme quantità di codice coinvolto nell'esecuzione della nostra applicazione.
Infine, stackprof e rbspy hanno un grande supporto nella comunità. Ad esempio, non dobbiamo aggiornare da soli il profiler per supportare le nuove versioni di Ruby.
Un breve tour delle funzionalità
Diamo una rapida occhiata a cosa può effettivamente fare Singed. Uno dei miei modi preferiti per utilizzare Singed è semplicemente profilare un semplice blocco di codice nella nostra app Rails.
Ad esempio, supponiamo di voler profilare un lavoro in background, MyWorker. Vorrei creare un file chiamato myprofile.rb, inserirlo nella root dell'applicazione Rails e quindi aggiungere:
user = User.first
flamegraph { MyWorker.new.perform(user) }
bin/rails runner myprofile.rb
Un'altra cosa comune che incontro con i profili è che a volte è abbastanza complicato impostare lo stato richiesto per profilare un pezzo di codice. Forse hai solo bisogno di uno stato del database molto specifico o devi prima eseguire molto codice. Spesso questa configurazione esiste già nei nostri test.
Singed rende davvero facile profilare un test. Ciò significa che puoi, ovviamente, profilare e ottimizzare la tua suite di test, ma in realtà lo trovo più utile per la profilazione del codice che richiede molte configurazioni particolari:
require 'singed/rspec'
RSpec.describe YourClass do
it "is slow :(", flamegraph: true do
# your code here
end
end
Un altro caso d'uso per Singed è la profilazione delle richieste. In Gusto, abbiamo un gateway GraphQL (Apollo) che invia richieste al nostro backend Rails. A volte, voglio profilare quelle richieste, ma è abbastanza difficile farlo con rack-mini-profiler perché non conosco l'URL e il corpo della richiesta che il backend Apollo sta inviando a Rails. Invece, con Singed, quello che faccio è:
- Attiva la richiesta di backend GraphQL dal frontend.
- In Chrome DevTools, copio quella richiesta "come recupero". Questo mi consente di incollarlo nella mia console Javascript e attivare questa richiesta GraphQL su richiesta.
- Arresto e riavvio il mio server di backend, questa volta aggiungendo la variabile di ambiente SINGED_MIDDLEWARE_ALWAYS_CAPTURE=1.
- Attivare nuovamente la richiesta nella mia console Javascript.
Puoi anche facilmente profilare l'avvio di un'applicazione Rails:
bundle binstub singed
bin/singed -- bin/rails runner 'true'
Un frontend di profiler con molti usi
Spero di averti convinto a provare Singed. Lo uso quasi quotidianamente qui a Gusto.
Se hai trovato questo interessante, dai un'occhiata su GitHub .