getsentry/raven-ruby

View on GitHub
EXTENSION.md

Summary

Maintainability
Test Coverage
## What's an extension?

An extension is a gem built on top of the core Ruby SDK (`sentry-ruby`) that provides additional functionality or integration support to the users. For example, `sentry-rails` and `sentry-sidekiq` are SDK extensions that offer integration support with specific libraries. 

## Sentry::Integrable

You can write extensions for `sentry-ruby` any way you want to. But if you're going to build an extension for integration support, `sentry-ruby` provides a module called `Sentry::Integrable` that will save you some work.

### Usage

Let me use `sentry-rails` as our example.

#### Register the extension

```ruby
require "sentry-ruby"

# the integrable module needs to be required separately
require "sentry/integrable" 

module Sentry
  # the module/class of the extension should be defined under the Sentry namespace
  module Rails 
    
    # extend the module
    extend Integrable 
    
    # use the register_integration method to register your extension to the SDK core
    register_integration name: "rails", version: Sentry::Rails::VERSION
  end
end
```

Once the extension is registered, it will do 2 things for you:

1. It'll generate `.capture_exception` and `.capture_message` methods for your extension. In our example, they'll be `Sentry::Rails.capture_exception` and `Sentry::Rails.capture_message`.
2. It'll also generate the SDK meta for the extension, which is `{name: "sentry.ruby.rails", version: Sentry::Rails::VERSION}` in this case.

#### Use the generated helpers

All the integration-level exception/message should be captured via the newly generated helpers in the extension gem. This is because:

- Those helpers will inject `{ integration: "integration_name" }` to the event hints. So you or the users can later identify each event's source in the `before_send` callback.
- Events created from those helpers will have the integration meta as their SDK information.
- In the future, we might also introduce more advanced integration-based features. And those features will rely on these helpers.

### Future plan

- Methods like `configure_integration` for generating integration-level config options, like `config.integration_name.option_name`.
- Support integration-specific excluded exceptions list.