Skip to content

Update sentry gems

Aleksei Lipniagov requested to merge alipniagov-update-sentry-gem into master

What does this MR do and why?

Updates Sentry gems to the latest version.

Why doing that? Aside from obvious "staying fresh", we, ~"group::application performance" are quite interested about 5.2.0 envelope sizes limitation (https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md#520) because we tried to enable performance monitoring in Sentry - MR which ended up in making Sentry instance unavailable - issue.

The change in 5.2.0 would not fix the issue of oversaturating Redis, but it seems that maintainers work on improving performance tracing in general. Having a fresh gem would be great for future work in that direction 👍

📋 Changelog: https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md

🔎 Click to expand - Changelog diff ## 5.8.0

Features

  • 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")

Bug Fixes

  • Support redis-rb 5.0+ #1963
  • Skip private _config context in Sidekiq 7+ #1967
  • Return value from perform_action in ActionCable::Channel instances when initialized #1966
  • Span#with_child_span should finish the span even with exception raised #1982
  • Fix sentry-rails' controller span nesting #1973
  • Do not report exceptions when a Rails runner exits with exit 0 #1988
  • Ignore redis key if not UTF8 #1997

Miscellaneous

  • Deprecate capture_exception_frame_locals in favor of include_local_variables #1993

5.7.0

Features

  • Expose span_id in Span constructor #1945
  • Expose end_timestamp in Span#finish and Transaction#finish #1946
  • Add Transaction#set_context api #1947
  • Add OpenTelemetry support with new 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.

5.6.0

Features

  • 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

    • This might change the nesting of some spans and make it more accurate
    • Followup fix to set the sentry-trace header in the correct place #1922
  • Use Exception#detailed_message when generating exception message if applicable #1924

  • Make sentry-sidekiq compatible with Sidekiq 7 #1930

Bug Fixes

  • 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.

Refactoring

  • Make transaction a required argument of Span #1921

5.5.0

Features

  • Support rack 3 #1884

    • We no longer need the HTTP_VERSION check for ignoring the header
  • Add 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.

    • Parse incoming W3C Baggage Headers and propagate them to continue traces #1869
    • Create new Baggage entries as Head SDK (originator of trace) #1898
    • Add Transaction source annotations to classify low quality (high cardinality) transaction names #1902

Bug Fixes

  • Memoize session.aggregation_key #1892
  • Execute with_scope's block even when SDK is not initialized #1897
  • Make sure test helper clears the current scope before/after a test #1900

5.4.2

Bug Fixes

  • Fix sentry_logger when SDK is closed from another thread #1860

5.4.1

Bug Fixes

  • Fix missing spec.files in sentry-ruby.gemspec

5.4.0

Features

  • Expose :values in ExceptionInterface, so that it can be accessed in before_send under event.exception.values #1843

  • Add top level Sentry.close API #1844

    • Cleans up SDK state and sets it to uninitialized
    • No-ops all SDK APIs and also disables the transport layer, so nothing will be sent to Sentry after closing the SDK
  • Handle exception with large stacktrace without dropping entire item #1807

  • Capture Rails runner's exceptions before exiting #1820

  • Add Sentry.with_exception_captured helper #1814

    Usage:

    Sentry.with_exception_captured do
     1/1 #=> 1 will be returned
    end
    
    Sentry.with_exception_captured do
     1/0 #=> ZeroDivisionError will be reported and re-raised
    end
  • Prepare for Rails 7.1's error reporter API change #1834

  • Set sentry.error_event_id in request env if the middleware captures errors #1849

    If the SDK's Rack middleware captures an error, the reported event's id will be stored in the request env. For example:

    env["sentry.error_event_id"] #=> "507bd4c1a07e4355bb70bcd7afe8ab17"

    Users can display this information on the error page via a middleware as proposed in #1846

Bug Fixes

  • Respect report_rescued_exceptions config #1847
  • Rescue event's to JSON conversion error #1853
  • Rescue ThreadError in SessionFlusher and stop creating threads if flusher is killed #1851

Refactoring

  • Move envelope item processing/trimming logic to the Item class #1824
  • Replace sentry-ruby-core with sentry-ruby as integration dependency #1825

Test Helpers

The SDK now provides a set of test helpers to help users setup and teardown Sentry related tests.

To get started:

require "sentry/test_helper"

# in minitest
class MyTest < Minitest::Test
  include Sentry::TestHelper
  # ...
end

# in RSpec
RSpec.configure do |config|
  config.include Sentry::TestHelper
  # ...
end

It's still an early attempt so please give us feedback in #1680.

5.3.1

Bug Fixes

  • Don't require a DB connection, but release one if it is acquired #1812
  • Sentry.with_child_span should check SDK's initialization state #1819

Miscellaneous

  • Warn users about config.async's deprecation #1803

5.3.0

Features

  • Add Sentry.with_child_span for easier span recording #1783
operation_result = Sentry.with_child_span(op: "my op") do |child_span|
  my_operation
end

# the "my op" span will be attached to the result of Sentry.get_current_scope.get_span
# which could be either the top-level transaction, or a span set by the user or other integrations

Bug Fixes

  • Set last_event_id only for error events #1767
  • Add config.rails.register_error_subscriber to control error reporter integration #1771
  • Check if ActiveRecord connection exists before calling AR connection pool #1769
  • Fix sentry-rails's tracing spans not nesting issue - #1784
  • Update config.transport.proxy to allow String and URI values as previously supported by sentry-ruby versions <= 4.8 using Faraday
  • Register SentryContextClientMiddleware on sidekiq workers #1774
  • Add request env to sampling context when using sentry-rails #1792
  • Fix net-http tracing's span nesting issue #1796

Refactoring

  • Correct inaccurate event model relationships #1777

Miscellaneous

  • Log message when shutting down/killing SDK managed components #1779

5.2.1

Bug Fixes

  • Also check stringified breadcrumbs key when reducing payload size #1758
  • Ignore internal Sidekiq::JobRetry::Skip exception #1763

Miscellaneous

  • Warn user if any integration is required after SDK initialization #1759

5.2.0

Features

  • Log Redis command arguments when sending PII is enabled #1726

  • Add request env to sampling context #1749

    Example

    Sentry.init do |config|
      config.traces_sampler = lambda do |sampling_context|
        env = sampling_context[:env]
    
        if env["REQUEST_METHOD"] == "GET"
          0.01
        else
          0.1
        end
      end
    end
  • Check envelope size before sending it #1747

    The SDK will now check if the envelope's event items are oversized before sending the envelope. It goes like this:

    1. If an event is oversized (200kb), the SDK will remove its breadcrumbs (which in our experience is the most common cause).
    2. If the event size now falls within the limit, it'll be sent.
    3. Otherwise, the event will be thrown away. The SDK will also log a debug message about the event's attributes size (in bytes) breakdown. For example,
    {event_id: 34, level: 7, timestamp: 22, environment: 13, server_name: 14, modules: 935, message: 5, user: 2, tags: 2, contexts: 820791, extra: 2, fingerprint: 2, platform: 6, sdk: 40, threads: 51690}

    This will help users report size-related issues in the future.

  • Automatic session tracking #1715

    Example:

    The SDK now supports automatic session tracking / release health by default in Rack based applications. Aggregate statistics on successful / errored requests are collected and sent to the server every minute. To use this feature, make sure the SDK can detect your app's release. Or you have set it with:

    Sentry.init do |config|
      config.release = 'release-foo-v1'
    end

    To disable this feature, set config.auto_session_tracking to false.

Bug Fixes

️ Diff: https://my.diffend.io/gems/sentry-ruby/5.1.1/5.8.0

💡 There are quite a lot of changes, but nothing breaking, according to the Changelog.

🔍 Context: gitlab-com/gl-infra/production#8515 (closed)

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Aleksei Lipniagov

Merge request reports