Event formatters zijn helper-klassen om event-metadata voor AppSignal-transacties te formatteren. In de AppSignal gem worden event formatters gebruikt om event-metadata van ActiveSupport::Notifications-instrumentation events naar AppSignal-event-metadata te formatteren.
Wanneer een codeblock wordt geïnstrumenteerd door ActiveSupport::Notifications, registreert AppSignal het event op de transacties, net zoals het zou doen voor de Appsignal.instrument helper. Event formatters maken het mogelijk om de data die aan de ActiveSupport::Notifications.instrument-methodeaanroep wordt doorgegeven, te formatteren voor AppSignal-events.
De metadata voor de events die door de event formatters worden geformatteerd, is zichtbaar op detailpagina’s van performance-incidenten in de event timeline. Beweeg met de muis over een specifiek event en de pop-up bij mouseover toont details zoals de exacte database die wordt opgevraagd of de query die werd uitgevoerd.
Let op: Als er geen andere redenen zijn om
ActiveSupport::Notifications instrumentation te gebruiken dan
AppSignal-instrumentation, raden we aan de Appsignal.instrument
helper te gebruiken voor instrumentation. Het gebruik van
ActiveSupport::Notifications voegt meer overhead toe dan rechtstreeks
AppSignal.instrument aanroepen. Er is dan ook geen event formatter nodig, omdat
AppSignal.instrument de metadata direct accepteert om in te stellen.
Een AppSignal event formatter is een klasse met één instance-methode, format. Deze format-methode ontvangt de event payload Hash en moet een Array met drie waarden retourneren.
Het is mogelijk om een event formatter toe te voegen voor libraries die ActiveSupport::Notifications-instrumentation gebruiken, maar let erop dat er niet al een event formatter voor geregistreerd is.
Het is ook mogelijk om een event formatter te maken voor uw eigen events. Houd bij het toevoegen van uw eigen event-namen rekening met de richtlijnen voor event-naming.
Elke event formatter ontvangt een “payload” Hash met event-metadata waaruit de event formatter de metadata kan formatteren voor het event in AppSignal. Deze AppSignal-event-metadata moet in deze volgorde in een Array worden geretourneerd door de event formatter:
def format(payload)
[
"event title",
"event body",
Appsignal::EventFormatter::DEFAULT
]
end
- Een event title (
String)
- Een meer beschrijvende titel van een event, zoals
"Fetch current user" of "Fetch blog post comments". Deze verschijnt naast de naam van het event in de event tree op de performance-sample-pagina om iets meer context te geven over wat er gebeurt.
- Een event body (
String)
- Meer details, zoals de databasequery die door het event werd gebruikt.
- Een event body-format (
Integer)
- Body format ondersteunt formatters om de gegeven data in het
body-argument te scrubben om eventuele gevoelige data uit de waarde te verwijderen. Momenteel zijn er twee ondersteunde waarden voor het body_format-argument.
Appsignal::EventFormatter::DEFAULT
- Deze standaardwaarde geeft aan AppSignal aan om de waarde intact te laten en geen data te scrubben.
Appsignal::EventFormatter::SQL_BODY_FORMAT
- De waarde
SQL_BODY_FORMAT geeft aan AppSignal aan om uw data door de SQL-sanitizer te halen en eventuele waarden in SQL-queries te scrubben.
-- An event body with the value of:
SELECT * FROM users WHERE email = 'hector@appsignal.com' AND password = 'iamabot'
-- becomes
SELECT * FROM users WHERE email = ? AND password = ?
Waarschuwing: de event formatter heeft geen exception handling omheen.
Als de custom event formatter een error werpt, crasht dit de webrequest
of background job.
# A custom event formatter class
class MyCustomEventFormatter
def format(payload)
[
payload[:title],
payload[:body],
Appsignal::EventFormatter::DEFAULT
]
end
end
# Register the custom event formatter class for a specific event
Appsignal::EventFormatter.register("event.custom", MyCustomEventFormatter)
# Can be registerd multiple times for other event names
Appsignal::EventFormatter.register("other_event.custom", MyCustomEventFormatter)
Wanneer u vervolgens een codeblock instrumenteert, gebruikt u de event-naam die geregistreerd is voor uw custom event formatter.
ActiveSupport::Notifications.instrument(
"event.custom", # Use the registered event name
{ # Pass along event metadata
:title => "some event name",
:body => "some event body"
}
) do
sleep 2
end
Wijzigingen in gem 2.5
In AppSignal voor Ruby gem versie 2.5.2 zijn enkele wijzigingen aangebracht in hoe event formatters worden geregistreerd. De oude methode voor het registreren van event formatters is in deze release verouderd verklaard en wordt verwijderd in versie 3.0 van de Ruby gem.
De nieuwe methode voor het registreren van EventFormatters maakt het mogelijk om custom formatters te registreren nadat AppSignal is geladen. Hierdoor kunnen EventFormatters in Rails-initializers worden geregistreerd.
In gem versie 2.5.1 en ouder is het mogelijk om een event formatter te registreren zoals het volgende voorbeeld, door de register-methode in de klasse zelf aan te roepen.
# Pre 2.5.2 method of registering event formatters
# This method is now deprecated
class MyCustomEventFormatter < Appsignal::EventFormatter
register "event.custom"
def format(payload)
[payload[:title], payload[:body], Appsignal::EventFormatter::DEFAULT]
end
end
Met de nieuwe opzet is de register-aanroep uit de klasse zelf gehaald, zodat deze direct op de EventFormatter-klasse kan worden geregistreerd.
class MyCustomEventFormatter
def format(payload)
[payload[:title], payload[:body], Appsignal::EventFormatter::DEFAULT]
end
end
Appsignal::EventFormatter.register("event.custom", MyCustomEventFormatter)
Dit betekent ook dat uw EventFormatters niet langer een subklasse hoeven te zijn van de klasse Appsignal::EventFormatter.