This blog is part of our Rails 7 series.
The Active Support instrumentation API provides us with hooks which allows us to choose to be notified when certain events occur inside our application. Rails provides a set of built-in events that we can subscribe to. Here is the list of framework hooks.
One of the recent additions to this is the transaction.active_record event that is triggered when Active Record managed transactions occur. This is particularly useful if you want to build a monitoring system like NewRelic where you need to track and analyze database transactions for performance monitoring and optimization purposes.
The event payload contains the connection, outcome and the timing details. The connection helps us identify the database where the transaction occurred which is particularly valuable in a multi-database environment. The outcome, which may be one of the following: :commit, :rollback, :restart, or :incomplete signifies the transaction's result.
To make use of this, we can subscribe to the event in an initializer config/initializers/events.rb like this.
1ActiveSupport::Notifications.subscribe( 2 "transaction.active_record" 3) do |event| 4 MetricsLogger.record_transaction(event.payload) 5end
In the above example, MetricLogger is responsible for recording the transaction details. It then analyzes and reports slow transactions so that proper action can be taken. You can modify this to suit your instrumentation needs.
Please check out these pull requests - 1, 2 for more details.