lib/elastic_apm/normalizers/active_record.rb



# frozen_string_literal: true

require 'elastic_apm/sql_summarizer'

module ElasticAPM
  module Normalizers
    module ActiveRecord
      # @api private
      class SqlNormalizer < Normalizer
        register 'sql.active_record'

        def initialize(*args)
          super

          @type = format('db.%s.sql', lookup_adapter || 'unknown').freeze
          @summarizer = SqlSummarizer.new
        end

        def normalize(_transaction, _name, payload)
          return :skip if %w[SCHEMA CACHE].include?(payload[:name])

          name = summarize(payload[:sql]) || payload[:name]
          context =
            Span::Context.new(db: { statement: payload[:sql], type: 'sql' })
          [name, @type, context]
        end

        private

        def summarize(sql)
          @summarizer.summarize(sql)
        end

        def lookup_adapter
          ::ActiveRecord::Base.connection.adapter_name.downcase
        rescue StandardError
          nil
        end
      end
    end
  end
end