Visualisez le temps de traitement du serveur Rails à l'aide de la synchronisation du serveur

introduction

Pour visualiser facilement le temps de traitement du serveur Rails dans l'environnement de développement, nous allons introduire une méthode de mesure de la vitesse de traitement du serveur à l'aide d'ActiveSupport :: Notifications et de la visualiser à l'aide de Server Timing.

Public cible

--Utilisation de rails --Utilisation d'un outil de vérification tel que Chrome

Le produit fini

Sélectionnez la communication cible à partir de l'outil de vérification de Chrome et sélectionnez l'onglet Minutage pour afficher la synchronisation du serveur comme indiqué dans la figure ci-dessous.

Screen Shot 2020-10-18 at 17.42.33.png Cela signifie qu'il a fallu 4,26 ms pour traiter la requête de base de données, 22,63 ms pour créer la vue et 35,22 ms au total pour l'index UserController #.

Qu'est-ce qu'ActiveSupport :: Notifications?

Une bibliothèque qui fournit une API de mesure pour Ruby. Il existe un mécanisme pour mesurer les événements et s'abonner aux résultats de mesure, et vous pouvez facilement l'utiliser comme ça.

#Souscrire
ActiveSupport::Notifications.subscribe("my.event") do |name, start, finish, id, payload|
  name    # =>Nom de l'événement: "my.event"
  start   # =>Heure de début de la mesure: 2020-10-18 12:34:56 +0900
  finish  # =>Heure de fin de la mesure: 2020-10-18 12:34:56 +0900
  id      # =>ID d'événement unique: "xxxxxxxxxxxxx"
  payload # =>Charge utile / informations supplémentaires(hacher): {data: :hoge}
end

#la mesure
ActiveSupport::Notifications.instrument("my.event", data: :hoge) do
  #Événement de course
end

Qu'est-ce que la synchronisation du serveur?

C'est un mécanisme pour communiquer le temps de traitement côté serveur via l'en-tête HTTP. En ajoutant des informations telles que le temps de mesure dans le champ d'en-tête Server-Timing de l'en-tête de réponse, l'outil de vérification le visualisera automatiquement.

notation

--Forme de base: nom; desc = description; dur = temps de mesure

combiner

Tout d'abord, nous devons mesurer le temps de traitement du serveur, mais en fait, Rails fait déjà cette mesure sous le nom process_action.action_controller. Par conséquent, vous pouvez le créer à partir de l'article auquel vous êtes abonné.

Créez le fichier suivant dans config / initializer.

config/initializers/server_timing.rb


ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
  # ActiveSupport::Notifications::Si vous passez l'argument tel quel, Event traitera les données correctement.
  event = ActiveSupport::Notifications::Event.new(*args)

  duration = event.duration   #temps de traitement
  payload = event.payload     #charge utile

  controller_name = payload.controller #Nom du contrôleur
  action_name = payload.action         #Nom de l'action
  db_runtime = payload.db_runtime      #Temps nécessaire pour interroger la base de données
  view_runtime = payload.view_runtime  #Temps total de visualisation
  server_timing = "total;desc=\"#{controller_name}\##{action_name}\";dur=#{duration}, " \
           "db;dur=#{db_runtime}" \
           "view;dur=#{view_runtime}"
end

Le contenu de la charge utile de "process_action.action_controller" est décrit ci-dessous. https://railsguides.jp/active_support_instrumentation.html#process-action-action-controller

Ceci termine l'acquisition du temps de traitement sur le serveur. Il ne vous reste plus qu'à enregistrer server_timing dans l'en-tête Server-Timing.

Je n'utilise pas beaucoup les variables globales dans Rails, mais je ne connais pas d'autre bon moyen, donc j'utiliserai des variables globales cette fois. Stockez l'objet de réponse qui peut être obtenu du contrôleur dans une variable globale, et ajoutez l'en-tête «Server-Timing» à l'objet de réponse pendant le processus d'abonnement.

app/controllers/application_controller.rb


class ApplicationController < ActionController::Base
  prepend_before_action { $response = response }
end

config/initializers/server_timing.rb


ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
  # ...
  #réduction
  # ...
  response = $response
  response.headers["Server-Timing"] = server_timing
end

C'est tout pour la mise en œuvre.

Cela donnera au champ d'en-tête Server-Timing une valeur similaire à la suivante, ce qui donnera aux outils de validation de Chrome une belle visualisation.

Server-Timing: total;desc="UsersController#index";dur=17.167, db;dur=0.5440000677481294, view;dur=15.272999997250736

finalement

J'ai utilisé à la fois ActiveSupport :: Notifications et Server Timing pour la première fois, et je l'ai trouvé utile car je pouvais facilement visualiser où était l'heure sur le serveur. ActiveSupport :: Notifications indique également le nombre d'instances créées par ActiveRecord et si le cache a été utilisé par SQL, afin que vous puissiez obtenir des informations plus détaillées en fonction de votre ingéniosité. Aussi, si j'en ai l'occasion, j'aimerais visualiser des informations détaillées.

référence

Recommended Posts

Visualisez le temps de traitement du serveur Rails à l'aide de la synchronisation du serveur
Construction de l'environnement du serveur API Rails à l'aide de docker-compose
[Ruby on Rails] Traitement commun entre les contrôleurs (à l'aide de concerts)
[Rails] J'ai essayé d'utiliser la méthode button_to pour la première fois
Faites attention au moment d'initialisation lors de l'utilisation de MessageEncryptor avec Rails 5.2 / 6.0