Sentry SDK for Ruby
Make additional job context available to traces_sampler for determining sample rate (sentry-delayed_job) #2148
Add new config.rails.active_support_logger_subscription_items
to allow customization breadcrumb data of active support logger #2139
config.rails.active_support_logger_subscription_items["sql.active_record"] << :type_casted_binds
config.rails.active_support_logger_subscription_items.delete("sql.active_record")
config.rails.active_support_logger_subscription_items["foo"] = :bar
Enable opting out of patches #2151
Add Sentry.capture_check_in
API for Cron Monitoring #2117
You can now track progress of long running scheduled jobs.
check_in_id = Sentry.capture_check_in('job_name', :in_progress)
# do job stuff
Sentry.capture_check_in('job_name', :ok, check_in_id: check_in_id)
Add Sentry::Cron::MonitorCheckIns
module for automatic monitoring of jobs #2130
Standard job frameworks such as ActiveJob
and Sidekiq
can now use this module to automatically capture check ins.
class ExampleJob < ApplicationJob
include Sentry::Cron::MonitorCheckIns
sentry_monitor_check_ins
def perform(*args)
# do stuff
end
end
class SidekiqJob
include Sidekiq::Job
include Sentry::Cron::MonitorCheckIns
sentry_monitor_check_ins
def perform(*args)
# do stuff
end
end
You can pass in optional attributes to sentry_monitor_check_ins
as follows.
# slug defaults to the job class name
sentry_monitor_check_ins slug: 'custom_slug'
# define the monitor config with an interval
sentry_monitor_check_ins monitor_config: Sentry::Cron::MonitorConfig.from_interval(1, :minute)
# define the monitor config with a crontab
sentry_monitor_check_ins monitor_config: Sentry::Cron::MonitorConfig.from_crontab('5 * * * *')
http.method
to http.request.method
in Span::DataConventions
#2106
Envelope::Item::MAX_SERIALIZED_PAYLOAD_SIZE
to 1MB #2108
db_config
begin nil
in ActiveRecordSubscriber
#2111
TestHelper
's setup/teardown helpers (#2116)
Make :value
in SingleExceptionInterface
writable, so that it can be modified in before_send
under event.exception.values[n].value
#2072
Add sampled
field to dynamic_sampling_context
#2092
Consolidate HTTP span data conventions with OpenTelemetry with Sentry::Span::DataConventions
#2093
Consolidate database span data conventions with OpenTelemetry for ActiveRecord and Redis #2100
Add new config.trace_propagation_targets
option to set targets for which headers are propagated in outgoing HTTP requests #2079
# takes an array of strings or regexps
config.trace_propagation_targets = [/.*/] # default is to all targets
config.trace_propagation_targets = [/example.com/, 'foobar.org/api/v2']
Tracing without Performance
PropagationContext
on Scope
and add Sentry.get_trace_propagation_headers
API #2084
Sentry.continue_trace
API #2089
The SDK now supports connecting arbitrary events (Errors / Transactions / Replays) across distributed services and not just Transactions.
To continue an incoming trace starting with this version of the SDK, use Sentry.continue_trace
as follows.
# rack application
def call(env)
transaction = Sentry.continue_trace(env, name: 'transaction', op: 'op')
Sentry.start_transaction(transaction: transaction)
end
To inject headers into outgoing requests, use Sentry.get_trace_propagation_headers
to get a hash of headers to add to your request.
Rails.logger
before assigning it to the SDK (#2086)Add new boolean option config.enable_tracing
to simplify enabling performance tracing #2005
config.enable_tracing = true
will set traces_sample_rate
to 1.0
if not set alreadyconfig.enable_tracing = false
will turn off tracing even if traces_sample_rate/traces_sampler
is setconfig.enable_tracing = nil
(default) will keep the current behaviourAllow ignoring excluded_exceptions
when manually capturing exceptions #2007
Users can now ignore the SDK's excluded_exceptions
by passing ignore_exclusions
hint when using Sentry.capture_exception
.
# assume ignored_exception.class is included in config.excluded_exception
Sentry.capture_exception(ignored_exception) # won't be sent to Sentry
Sentry.capture_exception(ignored_exception, hint: { ignore_exclusions: true }) # will be sent to Sentry
Support capturing low-level errors propagated to Puma #2026
Add spec
to Backtrace::APP_DIRS_PATTERN
#2029
Forward all baggage
header items that are prefixed with sentry-
#2025
Add stackprof
based profiler #2024
The SDK now supports sending profiles taken by the stackprof
gem and viewing them in the Profiling section.
To use it, first add stackprof
to your Gemfile
and make sure it is loaded before sentry-ruby
.
# Gemfile
gem 'stackprof'
gem 'sentry-ruby'
Then, make sure both traces_sample_rate
and profiles_sample_rate
are set and non-zero in your sentry initializer.
# config/initializers/sentry.rb
Sentry.init do |config|
config.dsn = "<dsn>"
config.traces_sample_rate = 1.0
config.profiles_sample_rate = 1.0
end
Some implementation caveats:
puma
might not capture frames correctly when async I/O is happening. This is a stackprof
limitation.Warning Profiling is currently in beta. Beta features are still in-progress and may have bugs. We recognize the irony. If you have any questions or feedback, please email us at [email protected], reach out via Discord (#profiling), or open an issue.
Allow tags to be passed via the context hash when reporting errors using ActiveSupport::ErrorReporter and Sentry::Rails::ErrorSubscriber in sentry-rails
#1932
Pass a cached: true
tag for SQL query spans that utilized the ActiveRecord QueryCache when using ActiveRecordSubscriber in sentry-rails
#1968
Add Sentry.add_global_event_processor
API #1976
Users can now configure global event processors without configuring scope as well.
Sentry.add_global_event_processor do |event, hint|
event.tags = { foo: 42 }
event
end
Add global event processor in OpenTelemetry SpanProcessor
to link errors with transactions #1983
Fix some inconsistencies in setting name/op/status in OpenTelemetry SpanProcessor
#1987
Add config.before_send_transaction
hook #1989
Users can now configure a before_send_transaction
callback that runs similar to before_send
but for transaction events.
config.before_send_transaction = lambda do |event, hint|
# skip unimportant transactions or strip sensitive data
if event.transaction == "/healthcheck/route"
nil
else
event
end
end
Support Sentry::Transaction#set_measurement
#1838
Usage:
transaction = Sentry.get_current_scope.get_transaction
transaction.set_measurement("metrics.foo", 0.5, "millisecond")
perform_action
in ActionCable::Channel instances when initialized #1966
Span#with_child_span
should finish the span even with exception raised #1982
exit 0
#1988
capture_exception_frame_locals
in favor of include_local_variables
#1993
span_id
in Span
constructor #1945
end_timestamp
in Span#finish
and Transaction#finish
#1946
Transaction#set_context
api #1947
sentry-opentelemetry
gem
Add config.instrumenter
to switch between :sentry
and :otel
instrumentation #1944
The new sentry-opentelemetry
gem adds support to automatically integrate OpenTelemetry performance tracing with Sentry. Give it a try and let us know if you have any feedback or problems with using it.
Allow users to configure their asset-skipping pattern #1915
Users can now configure their own pattern to skip asset requests' transactions
Sentry.init do |config|
config.rails.assets_regexp = /my_regexp/
end
Use Sentry.with_child_span
in redis and net/http instead of span.start_child
#1920
Use Exception#detailed_message
when generating exception message if applicable #1924
Make sentry-sidekiq
compatible with Sidekiq 7 #1930
Sentry::BackgroundWorker
will release ActiveRecord
connection pool only when the ActiveRecord
connection is established
Remove bad encoding arguments in redis span descriptions #1914
Add missing initialized?
checks to sentry-rails
#1919
Update Tracing Span's op names #1923
Currently, Ruby integrations' Span op names aren't aligned with the core specification's convention, so we decided to update them altogether in this PR.
If you rely on Span op names for fine-grained event filtering, this may affect the data your app sends to Sentry.
Also make sure to update your traces_sampler
if you rely on the op
for filtering some requests.
Support rack 3 #1884
HTTP_VERSION
check for ignoring the headerAdd Dynamic Sampling support The SDK now supports Sentry's Dynamic Sampling product.
Note that this is not supported for users still using the config.async
option.