Sha256: a7742381f86fd08dfef7580a3149afa1c2550bb7395a08ede193454796677be8

Contents?: true

Size: 1.43 KB

Versions: 31

Compression:

Stored size: 1.43 KB

Contents

# (c) Copyright IBM Corp. 2021
# (c) Copyright Instana Inc. 2021

module Instana
  module Instrumentation
    module ActiveRecord
      IGNORED_NAMES = %w[SCHEMA EXPLAIN CACHE].freeze
      IGNORED_SQL = %w[BEGIN COMMIT SET].freeze
      SANITIZE_REGEXP = /('[\s\S][^']*'|\d*\.\d+|\d+|NULL)/i.freeze

      def log(sql, name = 'SQL', binds = [], *args)
        call_payload = {
          activerecord: {
            adapter: @config[:adapter],
            host: @config[:host],
            username: @config[:username],
            db: @config[:database],
            sql: maybe_sanitize(sql)
          }
        }

        if binds.all? { |b| b.respond_to?(:value_before_type_cast) }
          mapped = binds.map(&:value_before_type_cast)
          call_payload[:activerecord][:binds] = mapped
        end

        maybe_trace(call_payload, name) { super(sql, name, binds, *args) }
      end

      private

      def maybe_sanitize(sql)
        ::Instana.config[:sanitize_sql] ? sql.gsub(SANITIZE_REGEXP, '?') : sql
      end

      def maybe_trace(call_payload, name, &blk)
        if ::Instana.tracer.tracing? && !ignored?(call_payload, name)
          ::Instana.tracer.trace(:activerecord, call_payload, &blk)
        else
          yield
        end
      end

      def ignored?(call_payload, name)
        IGNORED_NAMES.include?(name) ||
          IGNORED_SQL.any? { |s| call_payload[:activerecord][:sql].upcase.start_with?(s) }
      end
    end
  end
end

Version data entries

31 entries across 31 versions & 1 rubygems

Version Path
instana-1.204.0 lib/instana/instrumentation/active_record.rb
instana-1.204.0.pre3 lib/instana/instrumentation/active_record.rb
instana-1.204.0.pre2 lib/instana/instrumentation/active_record.rb
instana-1.204.0.pre1 lib/instana/instrumentation/active_record.rb
instana-1.203.2 lib/instana/instrumentation/active_record.rb
instana-1.203.1 lib/instana/instrumentation/active_record.rb
instana-1.203.0 lib/instana/instrumentation/active_record.rb
instana-1.202.0 lib/instana/instrumentation/active_record.rb
instana-1.201.0 lib/instana/instrumentation/active_record.rb
instana-1.201.0.pre1 lib/instana/instrumentation/active_record.rb
instana-1.200.0 lib/instana/instrumentation/active_record.rb
instana-1.200.0.pre1 lib/instana/instrumentation/active_record.rb
instana-1.199.6 lib/instana/instrumentation/active_record.rb
instana-1.199.5 lib/instana/instrumentation/active_record.rb
instana-1.199.4 lib/instana/instrumentation/active_record.rb
instana-1.199.3 lib/instana/instrumentation/active_record.rb
instana-1.199.2 lib/instana/instrumentation/active_record.rb
instana-1.199.1 lib/instana/instrumentation/active_record.rb
instana-1.199.0 lib/instana/instrumentation/active_record.rb
instana-1.198.0 lib/instana/instrumentation/active_record.rb