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
].compactSet 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_contextTransaction 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
endCustom 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.set_tags(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
endAPI
-
ActionReporter.enabled_reporters = [...]- Configure enabled reporters -
ActionReporter.current_user = user- Set current user (thread-safe) -
ActionReporter.current_request_uuid = uuid- Set request UUID -
ActionReporter.current_remote_addr = addr- Set remote address -
ActionReporter.context(**args)- Set context for all reporters -
ActionReporter.notify(error, context: {})- Report errors/messages -
ActionReporter.reset_context- Reset all context -
ActionReporter.transaction_id = id- Set transaction ID -
ActionReporter.transaction_name = name- Set transaction name -
ActionReporter.transaction(name:, id:, **context, &block)- Block-based transaction with context preservation -
ActionReporter.check_in(identifier)- Heartbeat/check-in -
ActionReporter.logger = logger- Configure error logger -
ActionReporter.error_handler = proc- Configure error handler callback
Development
bundle install
bundle exec appraisal generate
bundle exec rspec
bin/appraisals
bundle exec standardrb --fixContributing
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-*.gemLicense
The gem is available as open source under the terms of the MIT License.