Om Rack-applicaties te instrumenteren, biedt AppSignal een Rack-instrumentatie-middleware. Als u een van de ondersteunde Rack-frameworks gebruikt, zoals Rails, Sinatra, Hanami, Grape, of Padrino, raden we aan om in plaats daarvan die instrumentaties te gebruiken.
De instrumentatie-middleware toevoegen
Om AppSignal te integreren in een Rack-applicatie, moeten we eerst AppSignal laden, configureren en starten.
Vervolgens instrumenteert u de Rack-app door onze Rack EventMiddleware en InstrumentationMiddleware aan de middleware-stack toe te voegen.
In deze documentatie wordt uitgelegd hoe u dit doet in het config.ru-bestand van uw applicatie.
# 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
Zorg ervoor dat de EventMiddleware en InstrumentationMiddleware zo vroeg mogelijk in de middleware-stack van de applicatie worden geregistreerd. Hoe eerder deze middleware wordt geregistreerd, hoe meer request-runtime de middleware zal instrumenteren. Als er eerder andere middleware wordt geregistreerd, instrumenteert onze middleware deze andere middleware niet.
Nadat u de EventMiddleware en InstrumentationMiddleware aan de middleware-stack van uw app heeft toegevoegd, moet de actie voor elke route in uw app worden ingesteld in AppSignal. Zonder actienaam om requests te groeperen, rapporteert de event-middleware geen request-informatie.
Voor meer inzicht in de werking van uw Rack-applicatie raden we aan aanvullende instrumentatie toe te voegen aan de endpoints van de applicatie.
De Rack-event-middleware
We raden aan om onze Rack-event-middleware aan alle Rack-applicaties toe te voegen. Deze middleware zorgt ervoor dat we het volgende bijhouden:
De AppSignal Rack-event-middleware heeft de volgende functies:
- Instrumentatie van de request en het registreren van een
process_request.rack-event.
- Rapporteren van excepties die in de app en middleware optreden.
- Bijhouden van de response-statuscode als de
response_status-tag op het sample.
- Bijhouden van de response-statuscode als de
response_status-metriek, met de tags namespace en status.
De Rack-instrumentatie-middleware
We raden aan om naast de Appsignal::Rack::EventMiddleware ook de AppSignal::Rack::InstrumentationMiddleware aan de app toe te voegen. Deze middleware vult de instrumentatie van de event-middleware aan door tags toe te voegen voor het request-pad en de request-methode, en door responsbody-afhandeling en het sluiten van de responsbody bij te houden.
De instrumentatie-middleware heeft de volgende functies:
- Instrumentatie van de request en het registreren van een
process_request.rack-event.
- Rapporteren van excepties die in de app optreden.
- Bijhouden van het request-pad en de request-methode als tags op het sample.
- Instrumentatie van de responsbody-afhandeling en het registreren van een
process_response_body.rack-event voor deze operatie.
- Instrumentatie van het sluiten van de responsbody en het registreren van een
close_response_body.rack-event voor deze operatie.
De legacy instrumentatie-middleware gebruiken
De GenericInstrumentation-middleware is verouderd verklaard in Ruby-gem
3.10.0. Gebruik in plaats daarvan de nieuwe handleiding.
Om AppSignal te integreren in een Rack-applicatie, moeten we eerst AppSignal laden, configureren en starten.
Vervolgens instrumenteert u de Rack-app door onze Rack GenericInstrumentation-middleware aan de middleware-stack toe te voegen.
In deze documentatie wordt uitgelegd hoe u dit doet in het config.ru-bestand van uw applicatie.
# 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
Zorg ervoor dat de EventMiddleware en InstrumentationMiddleware zo vroeg mogelijk in de middleware-stack van de applicatie worden geregistreerd. Hoe eerder deze middleware wordt geregistreerd, hoe meer request-runtime de middleware zal instrumenteren. Als er eerder andere middleware wordt geregistreerd, instrumenteert onze middleware deze andere middleware niet.
Nadat u de EventMiddleware en InstrumentationMiddleware aan de middleware-stack van uw app heeft toegevoegd, moet de actie voor elke route in uw app worden ingesteld in AppSignal. Zonder actienaam om requests te groeperen, rapporteert de event-middleware geen request-informatie.
Voor meer inzicht in de werking van uw Rack-applicatie raden we aan aanvullende instrumentatie toe te voegen aan de endpoints van de applicatie.
De actienaam instellen
Stel een actienaam in op de AppSignal-transactie voor een request, zodat we endpoints kunnen groeperen in onze issues en metrieken. We raden aan om per endpoint een statische actienaam te gebruiken, zoals GET /blog, POST /users, PUT /users/:id, etc.
Om een actienaam voor een request in te stellen, roept u de Appsignal.set_action-helper aan vanuit de app.
Gebruik het request-pad van de route niet als actienaam als het pad
dynamische segmenten bevat. Het gebruik van echte request-paden voor
actienamen verstoort onze request-groepering door unieke issues voor elk
mogelijk request-pad aan te maken.
# 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