Visualisieren Sie die Verarbeitungszeit des Rails-Servers mithilfe des Server-Timings

Einführung

Um die Verarbeitungszeit des Rails-Servers in der Entwicklungsumgebung auf einfache Weise zu visualisieren, werden wir eine Methode einführen, mit der die Verarbeitungsgeschwindigkeit des Servers mithilfe von ActiveSupport :: Notifications gemessen und mithilfe des Server-Timings visualisiert werden kann.

Zielgruppe

Das fertige Produkt

Wählen Sie die Zielkommunikation aus dem Überprüfungstool von Chrome aus und wählen Sie die Registerkarte "Timing", um das Server-Timing anzuzeigen (siehe Abbildung unten).

Screen Shot 2020-10-18 at 17.42.33.png Dies bedeutet, dass die Verarbeitung der Datenbankabfrage 4,26 ms, die Erstellung der Ansicht 22,63 ms und der UserController # -Index insgesamt 35,22 ms dauerte.

Was ist ActiveSupport :: Notifications?

Eine Bibliothek, die eine Mess-API für Ruby bereitstellt. Es gibt einen Mechanismus zum Messen von Ereignissen und zum Abonnieren von Messergebnissen, den Sie problemlos so verwenden können.

#Abonnieren
ActiveSupport::Notifications.subscribe("my.event") do |name, start, finish, id, payload|
  name    # =>Veranstaltungsname: "my.event"
  start   # =>Startzeit der Messung: 2020-10-18 12:34:56 +0900
  finish  # =>Messendzeit: 2020-10-18 12:34:56 +0900
  id      # =>Eindeutige Ereignis-ID: "xxxxxxxxxxxxx"
  payload # =>Nutzlast / zusätzliche Informationen(Hash): {data: :hoge}
end

#Messung
ActiveSupport::Notifications.instrument("my.event", data: :hoge) do
  #Ereignis ausführen
end

Was ist Server-Timing?

Es ist ein Mechanismus, um die Verarbeitungszeit auf der Serverseite über den HTTP-Header zu kommunizieren. Durch Hinzufügen von Informationen wie Messzeit zum Server-Timing-Headerfeld des Antwortheaders wird diese vom Verifizierungstool automatisch angezeigt.

Notation

kombinieren

Zunächst müssen wir die Verarbeitungszeit des Servers messen, aber tatsächlich führt Rails diese Messung bereits unter dem Namen "process_action.action_controller" durch. Daher können Sie es aus dem Teil erstellen, den Sie abonnieren.

Erstellen Sie die folgende Datei in config / initializer.

config/initializers/server_timing.rb


ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
  # ActiveSupport::Notifications::Wenn Sie das Argument so übergeben, wie es ist, verarbeitet Event die Daten ordnungsgemäß.
  event = ActiveSupport::Notifications::Event.new(*args)

  duration = event.duration   #Verarbeitungszeit
  payload = event.payload     #Nutzlast

  controller_name = payload.controller #Controller-Name
  action_name = payload.action         #Aktionsname
  db_runtime = payload.db_runtime      #Zeitaufwand für die Abfrage der Datenbank
  view_runtime = payload.view_runtime  #Gesamtzeit für die Ansicht
  server_timing = "total;desc=\"#{controller_name}\##{action_name}\";dur=#{duration}, " \
           "db;dur=#{db_runtime}" \
           "view;dur=#{view_runtime}"
end

Der Inhalt der Nutzdaten von "process_action.action_controller" wird unten beschrieben. https://railsguides.jp/active_support_instrumentation.html#process-action-action-controller

Damit ist die Erfassung der Verarbeitungszeit auf dem Server abgeschlossen. Jetzt müssen Sie nur noch "server_timing" im Server-Timing-Header registrieren.

Ich verwende globale Variablen in Rails nicht sehr oft, kenne aber keinen anderen guten Weg, daher werde ich dieses Mal globale Variablen verwenden. Speichern Sie das Antwortobjekt, das vom Controller abgerufen werden kann, in einer globalen Variablen und fügen Sie dem Antwortobjekt während des Abonnementprozesses den "Server-Timing-Header" hinzu.

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|
  # ...
  #Kürzung
  # ...
  response = $response
  response.headers["Server-Timing"] = server_timing
end

Das ist alles für die Implementierung.

Dadurch erhält das Server-Timing-Headerfeld einen ähnlichen Wert wie der folgende, wodurch die Validierungstools von Chrome eine schöne Visualisierung erhalten.

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

Schließlich

Ich habe zum ersten Mal sowohl ActiveSupport :: Notifications als auch Server Timing verwendet und fand es nützlich, weil ich mir leicht vorstellen konnte, wo sich die Zeit auf dem Server befand. ActiveSupport :: Notifications zeigt auch die Anzahl der von ActiveRecord erstellten Instanzen an und ob der Cache von SQL verwendet wurde, sodass Sie abhängig von Ihrem Einfallsreichtum detailliertere Informationen erhalten können. Wenn ich die Möglichkeit habe, möchte ich auch detaillierte Informationen visualisieren.

Referenz

Recommended Posts

Visualisieren Sie die Verarbeitungszeit des Rails-Servers mithilfe des Server-Timings
Rails API-Serverumgebungskonstruktion mit Docker-Compose
[Ruby on Rails] Gemeinsame Verarbeitung zwischen Controllern (unter Verwendung von Konkaven)
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
Achten Sie bei der Verwendung von MessageEncryptor mit Rails 5.2 / 6.0 auf den Zeitpunkt der Initialisierung