Class: Appsignal::EventFormatter::ActiveRecord::SqlFormatter

Inherits:
Appsignal::EventFormatter show all
Defined in:
lib/appsignal/event_formatter/active_record/sql_formatter.rb

Constant Summary collapse

SINGLE_QUOTED_STRING =
/'(.?|[^']).*'/.freeze
DOUBLE_QUOTED_STRING =
/"(.?|[^"]).*"/.freeze
IN_OPERATOR_CONTENT =
/(IN \()[^SELECT][^\)]+(\))/.freeze
NUMERIC =
/\d*\.?\d+/.freeze
REPLACEMENT =
'?'.freeze
IN_REPLACEMENT =
'\1?\2'.freeze
SCHEMA =
'SCHEMA'.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Appsignal::EventFormatter

format, formatter_classes, formatters, initialize_formatters, register, registered?, unregister

Constructor Details

#initializeSqlFormatter

Returns a new instance of SqlFormatter.



17
18
19
20
21
22
23
# File 'lib/appsignal/event_formatter/active_record/sql_formatter.rb', line 17

def initialize
  @connection_config = connection_config
  @adapter_uses_double_quoted_table_names = adapter_uses_double_quoted_table_names?
rescue ::ActiveRecord::ConnectionNotEstablished
  Appsignal::EventFormatter.unregister('sql.active_record', self.class)
  Appsignal.logger.error('Error while getting ActiveRecord connection info, unregistering sql.active_record event formatter')
end

Instance Attribute Details

#adapter_uses_double_quoted_table_namesObject (readonly)

Returns the value of attribute adapter_uses_double_quoted_table_names.



15
16
17
# File 'lib/appsignal/event_formatter/active_record/sql_formatter.rb', line 15

def adapter_uses_double_quoted_table_names
  @adapter_uses_double_quoted_table_names
end

Instance Method Details

#format(payload) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
# File 'lib/appsignal/event_formatter/active_record/sql_formatter.rb', line 25

def format(payload)
  return nil if schema_query?(payload) || !payload[:sql]
  sql_string = payload[:sql].dup
  unless adapter_uses_double_quoted_table_names
    sql_string.gsub!(DOUBLE_QUOTED_STRING, REPLACEMENT)
  end
  sql_string.gsub!(SINGLE_QUOTED_STRING, REPLACEMENT)
  sql_string.gsub!(IN_OPERATOR_CONTENT, IN_REPLACEMENT)
  sql_string.gsub!(NUMERIC, REPLACEMENT)
  [payload[:name], sql_string]
end