class NotificationTracer::RailsSql

Attributes

enabled[R]
formatter[R]
lines[R]
logger[R]
matcher[R]
subscriber[R]

Public Class Methods

new(matcher:, logger:, formatter:, lines: nil, silence_rails_code: true) click to toggle source
# File lib/notification_tracer/rails_sql.rb, line 5
def initialize(matcher:, logger:, formatter:,
               lines: nil, silence_rails_code: true)
  @enabled    = false
  @lines      = Integer(lines) if lines
  @matcher    = matcher
  @logger     = logger
  @formatter  = formatter
  @subscriber = make_subscriber(silence_rails_code: silence_rails_code)
end

Public Instance Methods

call(stack:, payload:, duration:, event_id:, event_name:) click to toggle source
# File lib/notification_tracer/rails_sql.rb, line 32
def call(stack:, payload:, duration:, event_id:, event_name:)
  return unless enabled
  return unless matches?(payload)
  stack = stack[0..(lines-1)] if lines
  stack = stack.select{ |l| l && !l.empty? }
  return if stack.empty?
  data = formatter.call(stack: stack, sql: payload[:sql],
                        duration: duration, uuid: event_id)
  logger.call(data) if data
end
pause() click to toggle source
# File lib/notification_tracer/rails_sql.rb, line 21
def pause
  @enabled = false
  self
end
start() click to toggle source
# File lib/notification_tracer/rails_sql.rb, line 15
def start
  @enabled = true
  subscriber.subscribe
  self
end
stop() click to toggle source
# File lib/notification_tracer/rails_sql.rb, line 26
def stop
  @enabled = false
  subscriber.unsubscribe
  self
end

Private Instance Methods

make_cleaner(silence_rails_code:) click to toggle source
# File lib/notification_tracer/rails_sql.rb, line 56
def make_cleaner(silence_rails_code:)
  Rails::BacktraceCleaner.new.tap do |rbc|
    rbc.remove_silencers! unless silence_rails_code
  end
end
make_subscriber(silence_rails_code:) click to toggle source
# File lib/notification_tracer/rails_sql.rb, line 51
def make_subscriber(silence_rails_code:)
  cleaner = make_cleaner(silence_rails_code: silence_rails_code)
  Subscriber.new(pattern: pattern, callback: self, cleaner: cleaner)
end
matches?(payload) click to toggle source
# File lib/notification_tracer/rails_sql.rb, line 62
def matches?(payload)
  return false if payload[:name] == 'SCHEMA'
  return false if payload[:name] == 'CACHE'
  matcher.call(payload[:sql])
end
pattern() click to toggle source
# File lib/notification_tracer/rails_sql.rb, line 47
def pattern
  'sql.active_record'
end