class ElasticAPM::Normalizers::ActiveRecord::SqlNormalizer

@api private

Constants

ACTION
SKIP_NAMES
TYPE
UNKNOWN

Public Class Methods

new(*args) click to toggle source
# File lib/elastic_apm/normalizers/rails/active_record.rb, line 34
def initialize(*args)
  super

  @summarizer = Sql::Signature::Summarizer.new

  @adapters = {}
end

Public Instance Methods

normalize(_transaction, _name, payload) click to toggle source
# File lib/elastic_apm/normalizers/rails/active_record.rb, line 42
def normalize(_transaction, _name, payload)
  return :skip if SKIP_NAMES.include?(payload[:name])

  name = summarize(payload[:sql]) || payload[:name]
  subtype = subtype_for(payload)

  context =
    Span::Context.new(
      db: { statement: payload[:sql], type: 'sql' },
      destination: { service: { name: subtype, resource: subtype, type: TYPE } }
    )

  [name, TYPE, subtype, ACTION, context]
end

Private Instance Methods

cached_adapter_name(adapter_name) click to toggle source
# File lib/elastic_apm/normalizers/rails/active_record.rb, line 81
def cached_adapter_name(adapter_name)
  return UNKNOWN if adapter_name.nil? || adapter_name.empty?

  @adapters[adapter_name] ||
    (@adapters[adapter_name] = adapter_name.downcase)
rescue StandardError
  nil
end
can_attempt_connection_id_lookup?(payload) click to toggle source
# File lib/elastic_apm/normalizers/rails/active_record.rb, line 90
def can_attempt_connection_id_lookup?(payload)
  RUBY_ENGINE == "ruby" &&
    payload[:connection_id] &&
    ObjectSpace.respond_to?(:_id2ref)
end
subtype_for(payload) click to toggle source
# File lib/elastic_apm/normalizers/rails/active_record.rb, line 59
def subtype_for(payload)
  if payload[:connection]
    return cached_adapter_name(payload[:connection].adapter_name)
  end

  if can_attempt_connection_id_lookup?(payload)
    begin
      loaded_object = ObjectSpace._id2ref(payload[:connection_id])
      if loaded_object.respond_to?(:adapter_name)
        return cached_adapter_name(loaded_object.adapter_name)
      end
    rescue RangeError # if connection object has somehow been garbage collected
    end
  end

  cached_adapter_name(::ActiveRecord::Base.connection_config[:adapter])
end
summarize(sql) click to toggle source
# File lib/elastic_apm/normalizers/rails/active_record.rb, line 77
def summarize(sql)
  @summarizer.summarize(sql)
end