Naar hoofdinhoud gaan
Ruby on Rails wordt direct ondersteund door AppSignal. Om te installeren, volgt u de installatiestappen in AppSignal, te beginnen met het klikken op ‘Add app’ op het accountsscherm. De AppSignal-integratie voor Rails werkt door excepties en prestaties in requests te volgen. Wanneer er een fout optreedt in een controller tijdens een request, rapporteert AppSignal deze. Prestatieproblemen worden gebaseerd op de duur van een request en er wordt een tijdlijn met events aangemaakt waarin wordt aangegeven welke onderdelen van de applicatie het langst hebben geduurd.

Active Job

Zie onze Active Job-pagina voor meer informatie over hoe onze Active Job-instrumentatie werkt.

Action Cable

Zie onze Action Cable-pagina voor meer informatie over hoe onze Action Cable-instrumentatie werkt.

AppSignal configureren in een initializer

We raden aan ons config/appsignal.rb-configuratiebestand of omgevingsvariabelen te gebruiken om AppSignal te configureren. Standaard is het niet mogelijk om AppSignal vanuit een Rails-initializer te configureren, omdat AppSignal wordt geladen vóór de initializers van uw applicatie, om fouten te kunnen rapporteren die tijdens de initialisatie optreden. Om AppSignal in een Rails-initializer te configureren, configureer Rails dan eerst om AppSignal te starten nadat de initializers van de app zijn uitgevoerd.
# config/application.rb

# ...

module MyApp
  class Application < Rails::Application
    # Add this line
    config.appsignal.start_at = :after_initialize

    # Other config
  end
end
Dan, in de initializer:
# config/initializers/appsignal.rb

Appsignal.configure do |config|
  config.ignore_actions = ["My action"]
end
Roep Appsignal.start niet aan in de initializers. De Ruby-gem start AppSignal automatisch wanneer Rails alle initializers heeft uitgevoerd. Wanneer een Rails-app is geconfigureerd om AppSignal te starten nadat de initializers zijn geladen, is het niet langer mogelijk om fouten uit initializers te rapporteren bij het opstarten van de Rails-app.

Foutrapportage vanuit initializers

Standaard rapporteert AppSignal fouten die optreden in controllers, Rake-taken en Active Job-jobs. Het rapporteert geen fouten die optreden wanneer de applicatie opstart, vóór de Rails-initializers. Om op de hoogte te worden gesteld wanneer deze fouten optreden, voegt u het volgende toe aan uw config.ru-bestand, rond de regel die het environment.rb-bestand requireert.
# config.ru
begin
  require ::File.expand_path("../config/environment",  __FILE__)
rescue Exception => error
  Appsignal.send_error(error)
  raise
end
De fouten die hier optreden, worden niet gegroepeerd onder een incident met een actienaam.

Backtrace-cleaner

Met de Rails-integratie zal AppSignal de backtrace van elke exceptie door de Rails backtrace-cleaner halen. Met deze cleaner kunt u ongewenste backtrace-regels wijzigen of uitfilteren, waarmee rommel en ruis uit de backtrace worden verwijderd. U kunt filters en silencers toevoegen aan of verwijderen uit de standaardconfiguratie. Filters wijzigen de gegeven regel. Een voorbeeld hiervan is het verwijderen van het Rails.root-prefix. Silencers verwijderen de regel uit de backtrace, als de gegeven expressie true retourneert. U kunt deze extra backtrace-cleaner-regels toevoegen in een initializer. Bijvoorbeeld:
# config/initializers/backtrace_cleaner.rb
bc = Rails.backtrace_cleaner
bc.add_filter { |line| line.gsub(Rails.root.to_s, '<root>') }
bc.add_silencer { |line| line.index('<root>').nil? and line.index('/') == 0 }
bc.add_silencer { |line| line.index('<root>/vendor/') == 0 }
Zie de Rails BacktraceCleaner-documentatie voor meer informatie over de backtrace-cleaner.

Error reporter

AppSignal rapporteert standaard fouten die via ActiveSupport::ErrorReporter worden gemeld. ActiveSupport::ErrorReporter is geïntroduceerd in Rails 7.0 om aangepaste foutrapportage te standaardiseren. U kunt deze functionaliteit uitschakelen met de configuratieoptie enable_rails_error_reporter. Als er een transactie actief is in de context waarin een fout wordt gerapporteerd via de Rails-error-reporter, bevat deze dezelfde metadata en sample-gegevens als de actieve transactie: namespace, actienaam, tags, aangepaste gegevens, parameters, enz.
# In both scenarios, the error is reported by AppSignal
Rails.error.handle do
  raise "some error"
end

Rails.error.record do
  raise "some error"
end
In AppSignal voor Ruby-gem versie 3 was sommig gedrag anders. Raadpleeg de sectie Ruby-gem 3 legacy-gedrag voor meer informatie over de verschillen.

Namespace en actie uit de huidige transactie

Bij het rapporteren van fouten bepalen we de namespace en actienaam waarin deze plaatsvindt, zoals een controller of background job, op basis van best effort. De incident-namespace en actienaam worden niet altijd ingesteld of zijn niet altijd accuraat. Als een AppSignal-transactie actief is (zoals bij een web request of background job) zal de fout die wordt gerapporteerd met Rails.error.handle/record dezelfde namespace, actienaam, tags, parameters, aangepaste gegevens, enz. hebben als de actieve transactie. Als er geen AppSignal-transactie actief is, worden er standaard geen namespace, actienaam, tags, enz. ingesteld.

Namespace en actie uit de context

Als u de namespace en actienaam van de gerapporteerde fout wilt wijzigen zonder deze op de reeds actieve AppSignal-transactie te wijzigen, kunt u dit aanpassen bij de aanroep van de error-reporter.
# The error reported here will have the "custom_namespace" namespace
# and "CustomizedActionName#index" action name
Rails.error.handle(:context => { :appsignal => { :namespace => "custom_namespace", :action => "CustomizedActionName#index" } }) do
  raise "some error"
end

Tags uit de actieve transactie

Standaard worden de tags van de transactie van het request/de job gekopieerd naar de AppSignal-transactie van de fout van de error-reporter vanuit de transactie van het request/de job.
# Rails controller example using a before_action callback
class ExamplesController < ApplicationController
  before_action do
    Appsignal.add_tags(:tag1 => "value1", :tag2 => "value2")
  end

  def index
    # The error reported here will have the same tags set
    # as in the `before_action` callback
    Rails.error.handle do
      raise "some error"
    end
  end
end

Tags uit context

U kunt tags toevoegen aan een gerapporteerde fout door context te gebruiken in de aanroep van Rails.error.handle/record. Deze tags worden alleen ingesteld op de fout die wordt gerapporteerd met de methoden Rails.error.handle/record.
Rails.error.handle(:context => { :tag1 => "value1", :tag2 => "value2" }) do
  raise "some error"
end
Dezelfde tag-beperkingen gelden als voor het gebruik van Appsignal.add_tags.

Ruby-gem 3 legacy-gedrag

In AppSignal voor Ruby-gem versie 3 is het foutrapportagegedrag anders.
  • Fouten die worden gerapporteerd met de methode Rails.error.handle worden gerapporteerd aan AppSignal.
  • Fouten die worden gerapporteerd met Rails.error.record worden niet gerapporteerd aan AppSignal om te voorkomen dat de fout twee keer wordt gerapporteerd wanneer deze door onze Rails-error-reporting-middleware wordt gerapporteerd.
Alle fouten die met de Rails-error-reporter worden gerapporteerd, worden als afzonderlijke fouten gerapporteerd. Ze bevatten niet altijd dezelfde metadata en sample-gegevens uit een actieve AppSignal-transactie. Zie de sectie over beperkingen van context-overerving voor meer informatie.
# Reported by AppSignal
Rails.error.handle do
  raise "some error"
end

# NOT reported by AppSignal
Rails.error.record do
  raise "some error"
end

Beperkingen van context-overerving

In Ruby-gem 3 is de overerving van context uit de actieve transactie beperkt. De metadata en een deel van de sample-gegevens worden alleen gekopieerd als deze zijn ingesteld op het moment dat Rails.error.handle/record wordt aangeroepen. In de praktijk betekent dit dat Rails-controllers en Active Job-jobs nauwkeurig worden gerapporteerd. Bij andere bibliotheken zoals Sidekiq-jobs wordt er geen actienaam ingesteld bij het rapporteren van fouten met Rails.error.handle. Tags die worden ingesteld nadat Rails.error.handle/record is aangeroepen, worden niet gerapporteerd voor de fout die met deze helper wordt gerapporteerd.

Runners

AppSignal rapporteert automatisch fouten binnen Rails-runners. Er is ook enige handmatige configuratie nodig om de prestaties van een runner te instrumenteren. We raden aan om de code van de runner in een apart bestand te plaatsen en in te pakken in de Appsignal.monitor-helper, zoals in het onderstaande voorbeeld.
Bash
bin/rails runner path_to_file.rb
Appsignal.monitor(:namespace => :runner, :action => "Runner name") do
  # Some code
end
Als uw Rails-runner draait op een container die alleen wordt gestart om deze taak uit te voeren, zorg er dan voor dat de optie enable_at_exit_hook op true staat (wat de standaard zou moeten zijn op containers). Dit zorgt ervoor dat de gegevens worden doorgespoeld naar de AppSignal-agent voordat de runner wordt afgesloten.