Rails Event Store

Instrumentation

RubyEventStore and RailsEventStore ships with built-in instrumentation on which you can build additional features or benchmark event store performance in your app.

Enabling instrumentation

RailsEventStore

RailsEventStore is integrated with ActiveSupport::Notifications by default. You don't have to do anything else.

RubyEventStore

Instrumentation is provided by InstrumentedRepository and InstrumentedDispatcher decorators. We don't force any particular instrumentation framework, as long as it has the same API as ActiveSupport::Notifications.

That having said, if you want to instrument your event store with ActiveSupport::Notifications, initialize your client with following repository and/or dispatcher:

repository = RailsEventStoreActiveRecord::EventRepository.new # or other repo you use
dispatcher = RubyEventStore::Dispatcher.new # or other dispatcher you use
RubyEventStore::Client.new(
  repository: InstrumentedRepository.new(repository, ActiveSupport::Notifications),
  dispatcher: InstrumentedDispatcher.new(dispatcher, ActiveSupport::Notifications),
)

Usage

Subscribe to the hooks as Rails guides and manual recommend.

Example

name = "append_to_stream.repository.rails_event_store"
ActiveSupport::Notifications.subscribe(name) do |name, start, finish, id, payload|
  metric = ActiveSupport::Notifications::Event.new(name, start, finish, id, payload)
  NewRelic::Agent.record_metric("Custom/RES/append_to_stream", metric.duration)
end

Hooks and their payloads

append_to_stream.repository.rails_event_store

Key Value
:events Array of appended events
:stream Name of stream we append events to
Key Value
:event_ids Array of linked events' ids
:stream Name of stream we link events to

delete_stream.repository.rails_event_store

Key Value
:stream Name of stream deleted

read_event.repository.rails_event_store

Key Value
:event_id Id of the read event

read.repository.rails_event_store

Key Value
:specification Specification of the query to event store

Queries specification is not documented, but you can read the source code of it.

call.dispatcher.rails_event_store

Key Value
:event An event which is being dispatched
:subscriber A subscriber to which event is dispatched to