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.
--Utilisation de rails --Utilisation d'un outil de vérification tel que Chrome
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.
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 #.
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
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.
--Forme de base: nom; desc = description; dur = temps de mesure
total
pour représenter le temps de mesure totalTout 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
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.
Recommended Posts