CrashReporter
A meta-tool to enable crash info collection from our toolset without manual effort required from users.
CrashReporter will allow you to build out crash report collection and reporting procedures in response to a failure of some kind within a given project. This is made more for cli tools. Included behaviors allow GitHub issues to be created on errors raised. Additional reporters can be built and included in the workflow as required.
Installation
Add this line to your application's Gemfile:
gem 'crash-reporter'
And then execute:
$ bundle
Or install it yourself as:
$ gem install crash-reporter
Usage
# explicitly require desired reporters
require 'crash_reporter/reporters/github_issues'
CrashReporter.setup do |c|
c.engine = CrashReporter::GithubIssues.new('username/repo', 'auth_token')
c.tags = "crashy" # defaults to 'crash report'
end
Note that the repo name can actually be auto-discovered from the local git repo as long as you have a proper origin
remote setup.
class MyCoolClass
include CrashReporter::DSL
def method_that_could_crash
raise StandardError
end
# this has to be _after_ all the methods you wish to capture as we redefine the methods to include error capturing
capture_errors :method_that_could_crash
end
MyCoolClass.new.method_that_could_crash
# Will submit a GitHub issue to your repo and re-raise error!
Alternatively, you can handle the error submission yourself without the class-level error handling capture (possibly a more explicit method):
class MyCoolClass
include CrashReporter::DSL
ARealBadThing = Class.new(StandardError)
def method_that_could_crash
capture_errors do
raise ARealBadThing
end
end
# or
def will_crash
begin
raise StandardError, "Nope!"
rescue StandardError => e
report_crash e # or any raw string message you want
end
end
end
You can additionally define your own reporters. All these reporters require is a run
method that takes a string or an object derived from Ruby's StandardError
. StandardError
is the recommended method as it allows us to collect backtrace information from the crash in a uniform manner.
class SlackReporter
def initialize(hook_url)
@hook_url = hook_url
end
def run(error)
HTTP.post(@hook_url,
json: {
text: "WE GOT PROBLEMS: #{error.message}"
})
end
end
Then register your new reporter:
# Register a new webhook and use the URL here
CrashReporter.configuration.engines << SlackReporter.new('https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX')
Then crashes will push notifications to Slack as well! Note you can stack notifications by <<
them to the engines
array. You can clear these by setting CrashReporter.configuration.engine = SlackReporter.new(...)
which will add the single reporter.
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake test
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/crash-reporter.
License
This software is provided under the the MIT license.