Module: Sentry::Rails::Tracing

Defined in:
lib/sentry/rails/tracing.rb,
lib/sentry/rails/tracing/abstract_subscriber.rb,
lib/sentry/rails/tracing/action_view_subscriber.rb,
lib/sentry/rails/tracing/active_record_subscriber.rb,
lib/sentry/rails/tracing/active_storage_subscriber.rb,
lib/sentry/rails/tracing/action_controller_subscriber.rb

Defined Under Namespace

Modules: SentryNotificationExtension Classes: AbstractSubscriber, ActionControllerSubscriber, ActionViewSubscriber, ActiveRecordSubscriber, ActiveStorageSubscriber

Constant Summary collapse

START_TIMESTAMP_NAME =
:sentry_start_timestamp

Class Method Summary collapse

Class Method Details

.get_current_transactionObject



71
72
73
# File 'lib/sentry/rails/tracing.rb', line 71

def self.get_current_transaction
  Sentry.get_current_scope.get_transaction if Sentry.initialized?
end

.patch_active_support_notificationsObject

this is necessary because instrumentation events don’t record absolute start/finish time so we need to retrieve the correct time this way



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/sentry/rails/tracing.rb', line 44

def self.patch_active_support_notifications
  unless ::ActiveSupport::Notifications::Instrumenter.ancestors.include?(SentryNotificationExtension)
    ::ActiveSupport::Notifications::Instrumenter.send(:prepend, SentryNotificationExtension)
  end

  SentryNotificationExtension.module_eval do
    def instrument(name, payload = {}, &block)
      # only inject timestamp to the events the SDK subscribes to
      if Tracing.subscribed_tracing_events.include?(name)
        payload[START_TIMESTAMP_NAME] = Time.now.utc.to_f if name[0] != "!" && payload.is_a?(Hash)
      end

      super(name, payload, &block)
    end
  end
end

.register_subscribers(subscribers) ⇒ Object



8
9
10
# File 'lib/sentry/rails/tracing.rb', line 8

def self.register_subscribers(subscribers)
  @subscribers = subscribers
end

.remove_active_support_notifications_patchObject



61
62
63
64
65
66
67
68
69
# File 'lib/sentry/rails/tracing.rb', line 61

def self.remove_active_support_notifications_patch
  if ::ActiveSupport::Notifications::Instrumenter.ancestors.include?(SentryNotificationExtension)
    SentryNotificationExtension.module_eval do
      def instrument(name, payload = {}, &block)
        super
      end
    end
  end
end

.subscribe_tracing_eventsObject



20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/sentry/rails/tracing.rb', line 20

def self.subscribe_tracing_events
  # need to avoid duplicated subscription
  return if @subscribed

  subscribers.each do |subscriber|
    subscriber.subscribe!
    @subscribed_tracing_events ||= []
    @subscribed_tracing_events += subscriber::EVENT_NAMES
  end

  @subscribed = true
end

.subscribed_tracing_eventsObject



16
17
18
# File 'lib/sentry/rails/tracing.rb', line 16

def self.subscribed_tracing_events
  @subscribed_tracing_events ||= []
end

.subscribersObject



12
13
14
# File 'lib/sentry/rails/tracing.rb', line 12

def self.subscribers
  @subscribers
end

.unsubscribe_tracing_eventsObject



33
34
35
36
37
38
39
40
# File 'lib/sentry/rails/tracing.rb', line 33

def self.unsubscribe_tracing_events
  return unless @subscribed

  subscribers.each(&:unsubscribe!)
  subscribed_tracing_events.clear

  @subscribed = false
end