action_reporter
Ruby wrapper for multiple reporting services.
Supported services: Rails logger, gem audited, gem PaperTrail, Sentry, Honeybadger, scoutapm.
Sponsored by Kisko Labs.
Installation
Add to your Gemfile:
gem "action_reporter"
Run bundle install or gem install action_reporter.
Usage
Create config/initializers/action_reporter.rb:
ActionReporter.enabled_reporters = [
(ActionReporter::RailsReporter.new if Rails.env.development?),
# ActionReporter::AuditedReporter.new,
# ActionReporter::PaperTrailReporter.new,
# ActionReporter::SentryReporter.new,
# ActionReporter::HoneybadgerReporter.new,
# ActionReporter::ScoutApmReporter.new
].compact
Set context and report errors:
ActionReporter.current_user = current_user
ActionReporter.current_request_uuid = request.env["action_dispatch.request_id"]
ActionReporter.current_remote_addr = request.remote_ip
ActionReporter.context(entry_id: entry.id)
ActionReporter.notify("Something went wrong", context: { record: record })
ActionReporter.reset_context
Transaction support
ActionReporter supports transaction tracking with automatic context preservation:
# Attribute-style setters
ActionReporter.transaction_id = "txn-123"
ActionReporter.transaction_name = "GET /api/users"
# Block-based (preserves previous values)
ActionReporter.transaction(name: "GET /api/users", id: "txn-123") do
# Your code here
end
Custom Reporters
Create custom reporters by inheriting from ActionReporter::Base:
module ActionReporter
class CustomReporter < Base
def notify(error, context: {})
new_context = transform_context(context)
# Send to your service
end
def context(args)
new_context = transform_context(args)
# Set context in your service
end
end
end
ActionReporter.enabled_reporters = [ActionReporter::CustomReporter.new]
See doc/CUSTOM_REPORTERS.md for detailed documentation.
Advanced Integration
ActionReporter can be extended with custom methods and integrated with ActiveSupport::CurrentAttributes for automatic context propagation:
module ActionReporter
def self.set_transaction_id(transaction_id)
context(transaction_id: transaction_id)
Sentry.(transactionId: transaction_id) if defined?(Sentry)
end
end
class Current < ActiveSupport::CurrentAttributes
attribute :user, :reporter_transaction_id
def user=(user)
super
ActionReporter.current_user = user
end
def reporter_transaction_id=(transaction_id)
super
ActionReporter.transaction_id = transaction_id
end
end
API
ActionReporter.enabled_reporters = [...]- Configure enabled reportersActionReporter.current_user = user- Set current user (thread-safe)ActionReporter.current_request_uuid = uuid- Set request UUIDActionReporter.current_remote_addr = addr- Set remote addressActionReporter.context(**args)- Set context for all reportersActionReporter.notify(error, context: {})- Report errors/messagesActionReporter.reset_context- Reset all contextActionReporter.transaction_id = id- Set transaction IDActionReporter.transaction_name = name- Set transaction nameActionReporter.transaction(name:, id:, **context, &block)- Block-based transaction with context preservationActionReporter.check_in(identifier)- Heartbeat/check-inActionReporter.logger = logger- Configure error loggerActionReporter.error_handler = proc- Configure error handler callback
Development
bundle install
bundle exec appraisal generate
bundle exec rspec
bin/appraisals
bundle exec standardrb --fix
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/amkisko/action_reporter.rb
Contribution policy:
- New features are not necessarily added to the gem
- Pull request should have test coverage for affected parts
- Pull request should have changelog entry
Review policy:
- It might take up to 2 calendar weeks to review and merge critical fixes
- It might take up to 6 calendar months to review and merge pull request
- It might take up to 1 calendar year to review an issue
Publishing
rm action_reporter-*.gem
gem build action_reporter.gemspec
gem push action_reporter-*.gem
License
The gem is available as open source under the terms of the MIT License.