Liste des gemmes de base pour le profilage de l'application Ruby on Rails

Même la plupart des développeurs Ruby on Rails expérimentés ont parfois oublié les erreurs gênantes qu'ils produisent dans les longs processus de développement, comme les requêtes n + 1 ou perdent beaucoup de temps avec des requêtes inattendues de nulle part.

Toutes ces erreurs ne peuvent pas être évitées avant la production, mais au moins vous pouvez essayer :)

Oui, c'est une autre liste de joyaux oubliés ou pas si populaires pour les meilleurs processus de développement.
Commençons.

1. Bullet


Bullet - l'une des solutions les plus populaires et les plus simples pour lutter contre les requêtes n + 1 .

Ce joyau propose différentes façons de vous montrer que certaines requêtes ne sont pas efficaces. Navigateur (journal de la console), journal de développement, fichier de sortie. Mon choix est simplement d'utiliser un journal de développement car ce n'est pas si ennuyeux (certains problèmes ne se présentent pas à temps ou ne peuvent pas être résolus facilement avec l'architecture actuelle).

Comment ça marche : vous avez, par exemple, une demande d' indexation pour un modèle ( services ). Et ce modèle a de nombreuses relations différentes ( services has_many groups ), ils ont aussi des relations .. ( groups has_many users , users has_many logos , etc). Et cela peut entraîner un chargement inefficace répété des données ( n + 1 ). Vous voulez montrer logo_url et il commence juste à créer des requêtes inutiles pour chaque utilisateur (parfois vous le voyez immédiatement, parfois ce n'est pas si clair). Dans la plupart des cas, la puce lancera les lignes suivantes dans vos journaux de développement:

GET /api/services USE eager loading detected Service => [:groups] Add to your finder: :includes => [:groups] Call stack /home/projects/test_app_name/app/services/index.rb:18:in `perform' /home/projects/test_app_name/app/controllers/services_controller.rb:7:in `index' 

Comme vous pouvez le voir, il affiche la demande, ce qui a été trouvé (chargement rapide), le modèle et ce qui a été chargé plusieurs fois exactement. Et la pile d'appels, bien sûr.

Bon début!



Bullet peut trouver des caches de chargement et de comptage impatients inutilisés. Et vous permet de désactiver l'un de ses détecteurs.

 # Each of these settings defaults to true # Detect N+1 queries Bullet.n_plus_one_query_enable = false # Detect eager-loaded associations which are not used Bullet.unused_eager_loading_enable = false # Detect unnecessary COUNT queries which could be avoided # with a counter_cache Bullet.counter_cache_enable = false 



Dans mes projets, je préfère désactiver les requêtes de chargement désirées inutilisées, car il s'agit d'une situation courante lorsqu'un service de modèle de chargement est utilisé à de nombreux endroits et à différents endroits, vous n'avez pas besoin de précharger certaines relations, ce qui est clairement nécessaire dans d'autres endroits. Et cette situation est très ennuyeuse au final. Vous feriez mieux de précharger certaines informations, puis oubliez de les charger correctement quelque part.

Ma config (dans development.rb ):

 config.after_initialize do Bullet.enable = true Bullet.rails_logger = true Bullet.unused_eager_loading_enable = false end 

Plus d'infos :


2. ActiveRecordQueryTrace (active_record_query_trace)


active_record_query_trace - un joyau qui enregistre / affiche une trace de toutes les requêtes SQL exécutées par Active Record

(Je viens de copier la partie de la description de leur page Github car ils ont tout ce que vous devez savoir)

Affiche une trace arrière pour chaque requête dans la console de développement et le journal de Rails. Vous permet de localiser où les requêtes sont exécutées dans votre application. Utile pour l'optimisation des performances et pour savoir par où commencer lorsque vous apportez des modifications à une grande application.

Lorsqu'elle est activée, chaque requête sera enregistrée comme:

 Started GET "/" for 172.19.0.1 at 2019-09-29 07:08:04 +0000 Processing by HomeController#index as HTML Users::User Load (1.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 10014 LIMIT 1 Query Trace: app/controllers/concerns/user_stack.rb:44:in `peek' Clubs::Club Load (1.7ms) SELECT `clubs`.* FROM `clubs` WHERE `clubs`.`id` = 15 LIMIT 1 Query Trace: app/controllers/concerns/user_aware.rb:38:in `current_club' 

De mon côté, je veux dire que ce joyau est très utile lorsque vous commencez à travailler sur le projet, pas depuis le début et que vous ne pouvez pas savoir comment tout fonctionne (ou simplement avec les fonctionnalités de collègues), et certains appels de requête ne sont pas facilement compréhensibles. Cela pourrait vraiment faire gagner beaucoup de temps.

Aussi une petite note:
Pour chaque requête ActiveRecord, il y aura une trace supplémentaire dans le fichier journal. Par défaut, c'est 5, ce qui est assez grand pour rendre vos journaux totalement illisibles.
Mais il peut être contrôlé:

 ActiveRecordQueryTrace.lines = 1 # or 2, something not big 

Plus d'infos:


3.rails_panel


RailsPanel est une extension Chrome pour le développement de Rails qui mettra fin à votre queue de development.log . Ayez toutes les informations sur vos demandes d'application Rails dans le navigateur - dans le panneau Outils de développeur. Fournit un aperçu de la base de données / rendu / temps total, la liste des paramètres, les vues rendues et plus encore.

Pour utiliser cette extension, vous devez ajouter la gemme meta_request au Gemfile de votre application:

 group :development do gem 'meta_request' end 

Installez l'extension RailsPanel à partir du Chrome WebStore . C'est la façon recommandée d'installer l'extension, car elle se mettra automatiquement à jour sur chaque nouvelle version.

Voici l'exemple de gem / extension rails_panel activé:

image

Plus d'infos:


4. rack-mini-profiler


Après avoir installé le bijou et ouvert votre projet, vous verrez le popup dans le coin supérieur gauche (peut être reconfiguré) sur la page:



Après avoir cliqué dessus, vous verrez des informations plus détaillées:



Comme vous pouvez le voir, voici beaucoup d'informations utiles pour un travail plus efficace. En outre, il fonctionne avec les applications SPA.

Plus d'infos:


5. newrelic / datadog


New Relic est un système de gestion des performances développé par New Relic, Inc. Il vous fournit des informations détaillées sur les performances de votre application Rails ou Ruby lorsqu'elle s'exécute en production et les transmet à newrelic.com où vous pouvez les surveiller en temps réel . (AUSSI ILS ONT UN COMPTE NON PAYÉ)

Datadog comme alternative est également un très bon choix. Ils offrent les mêmes fonctionnalités que New Relic. Vérifiez simplement leurs possibilités, l'interface utilisateur, les prix et choisissez ce que vous préférez.

Plus d'infos:


Merci d'avoir lu!

Source: https://habr.com/ru/post/fr482330/


All Articles