Um Rack-Anwendungen zu instrumentieren, stellt AppSignal eine Rack-Instrumentation-Middleware bereit. Wenn Sie eines der unterstützten Rack-Frameworks wie Rails, Sinatra, Hanami, Grape oder Padrino verwenden, empfehlen wir, stattdessen diese Instrumentationen zu verwenden.
Instrumentation-Middleware hinzufügen
Um AppSignal in eine Rack-Anwendung zu integrieren, müssen wir zunächst AppSignal laden, konfigurieren und starten.
Instrumentieren Sie dann die Rack-App, indem Sie unsere Rack-EventMiddleware und InstrumentationMiddleware zum Middleware-Stack hinzufügen.
Diese Dokumentation erklärt, wie Sie dies in der config.ru-Datei Ihrer Anwendung tun.
# config.ru
require "appsignal" # Load AppSignal
Appsignal.start # Start the AppSignal integration
# Add the Rack EventMiddleware first
use Appsignal::Rack::EventMiddleware
# Add the Rack InstrumentationMiddleware
use Appsignal::Rack::InstrumentationMiddleware
# Load your app with a require statement here, like
require_relative "app"
# Add other middleware here if needed
# Finally, run the app
use MyApp.run
Stellen Sie sicher, dass die EventMiddleware und die InstrumentationMiddleware so früh wie möglich im Middleware-Stack der Anwendung registriert werden. Je früher diese Middlewares registriert sind, desto mehr Request-Laufzeit instrumentiert die Middleware. Wenn andere Middlewares zuvor registriert werden, instrumentiert unsere Middleware diese anderen Middlewares nicht.
Nachdem Sie die EventMiddleware und die InstrumentationMiddleware zum Middleware-Stack Ihrer App hinzugefügt haben, muss die Action für jede Route in Ihrer App in AppSignal gesetzt werden. Ohne einen Action-Namen, der Anfragen gruppiert, meldet die Event-Middleware keine Anfrage-Informationen.
Für tiefere Einblicke in den Betrieb Ihrer Rack-Anwendung empfehlen wir, zusätzliche Instrumentation zu den Endpunkten der Anwendung hinzuzufügen.
Die Rack-Event-Middleware
Wir empfehlen, unsere Rack-Event-Middleware zu allen Rack-Anwendungen hinzuzufügen. Diese Middleware stellt sicher, dass wir Folgendes erfassen:
Die AppSignal-Rack-Event-Middleware bietet die folgenden Funktionen:
- Instrumentation des Requests und Aufzeichnung eines
process_request.rack-Events.
- Meldung von Ausnahmen, die in der App und in Middlewares auftreten.
- Erfassung des Response-Statuscodes als Tag
response_status im Sample.
- Erfassung des Response-Statuscodes als Metrik
response_status mit den Tags namespace und status.
Die Rack-Instrumentation-Middleware
Wir empfehlen, zusätzlich zur Appsignal::Rack::EventMiddleware auch die AppSignal::Rack::InstrumentationMiddleware zur App hinzuzufügen. Diese Middleware ergänzt die Instrumentation der Event-Middleware, indem sie Tags für den Request-Pfad und die Request-Methode hinzufügt sowie die Verarbeitung und das Schließen des Response-Bodys verfolgt.
Die Instrumentation-Middleware bietet die folgenden Funktionen:
- Instrumentation des Requests und Aufzeichnung eines
process_request.rack-Events.
- Meldung von Ausnahmen, die in der App auftreten.
- Erfassung des Request-Pfads und der Request-Methode als Tags im Sample.
- Instrumentation der Verarbeitung des Response-Bodys und Aufzeichnung eines
process_response_body.rack-Events für diese Operation.
- Instrumentation des Schließens des Response-Bodys und Aufzeichnung eines
close_response_body.rack-Events für diese Operation.
Verwendung der Legacy-Instrumentation-Middleware
Die GenericInstrumentation-Middleware wurde in Ruby Gem 3.10.0 als veraltet markiert.
Bitte verwenden Sie stattdessen die neue Anleitung.
Um AppSignal in eine Rack-Anwendung zu integrieren, müssen wir zunächst AppSignal laden, konfigurieren und starten.
Instrumentieren Sie dann die Rack-App, indem Sie unsere Rack-GenericInstrumentation-Middleware zum Middleware-Stack hinzufügen.
Diese Dokumentation erklärt, wie Sie dies in der config.ru-Datei Ihrer Anwendung tun.
# config.ru
# Load and configure AppSignal
require "appsignal" # Load AppSignal
Appsignal.config = Appsignal::Config.new(
File.expand_path("../", __FILE__), # Application root path
ENV["RACK_ENV"], # Application environment
)
Appsignal.start # Start the AppSignal integration
Appsignal.start_logger # Start logger
# Load your app with a require statement here, like
require_relative "app"
# Add the GenericInstrumentation middleware
use Appsignal::Rack::GenericInstrumentation
# Add other middleware here if needed
# Finally, run the app
use MyApp.run
Stellen Sie sicher, dass die EventMiddleware und die InstrumentationMiddleware so früh wie möglich im Middleware-Stack der Anwendung registriert werden. Je früher diese Middlewares registriert sind, desto mehr Request-Laufzeit instrumentiert die Middleware. Wenn andere Middlewares zuvor registriert werden, instrumentiert unsere Middleware diese anderen Middlewares nicht.
Nachdem Sie die EventMiddleware und die InstrumentationMiddleware zum Middleware-Stack Ihrer App hinzugefügt haben, muss die Action für jede Route in Ihrer App in AppSignal gesetzt werden. Ohne einen Action-Namen, der Anfragen gruppiert, meldet die Event-Middleware keine Anfrage-Informationen.
Für tiefere Einblicke in den Betrieb Ihrer Rack-Anwendung empfehlen wir, zusätzliche Instrumentation zu den Endpunkten der Anwendung hinzuzufügen.
Action-Name setzen
Setzen Sie einen Action-Namen auf die AppSignal-Transaktion für eine Anfrage, damit wir Endpunkte in unseren Issues und Metriken gruppieren können. Wir empfehlen, pro Endpunkt einen statischen Action-Namen zu verwenden, wie GET /blog, POST /users, PUT /users/:id usw.
Um einen Action-Namen für eine Anfrage zu setzen, rufen Sie den Helper Appsignal.set_action aus der App auf.
Verwenden Sie nicht den Request-Pfad der Route als Action-Namen, wenn der Pfad
dynamische Segmente enthält. Die Verwendung echter Request-Pfade als Action-Namen
bricht unsere Gruppierung der Anfragen, indem für jeden möglichen Request-Pfad
einzigartige Issues erzeugt werden.
# app.rb
require "rack"
# Example pure-Rack app
class MyApp
def call(env)
case [env["REQUEST_METHOD"], env["PATH_INFO"]]
when ["GET", "/"]
Appsignal.set_action("GET /") # Action name set here
body = <<~BODY
<h1>Rack example app</h1>
<ul>
<li><a href="/slow">Slow request</a></li>
<li><a href="/error">Error request</a></li>
</ul>
BODY
[200, {"Content-Type" => "text/html"}, [body]]
when ["GET", "/slow"]
Appsignal.set_action("GET /slow") # Action name set here
sleep 1
[200, {"Content-Type" => "text/plain"}, ["Slow response"]]
when ["GET", "/error"]
Appsignal.set_action("GET /error") # Action name set here
raise "uh oh"
else
Appsignal.set_action("NotFound") # Action name set here
[404, {"Content-Type" => "text/plain"}, ["Page not found"]]
end
end
end