Class: Appsignal::Aggregator::Middleware::ActiveRecordSanitizer
- Inherits:
-
Object
- Object
- Appsignal::Aggregator::Middleware::ActiveRecordSanitizer
- Defined in:
- lib/appsignal/aggregator/middleware/active_record_sanitizer.rb
Constant Summary collapse
- TARGET_EVENT_NAME =
'sql.active_record'.freeze
- SINGLE_QUOTE =
/\\'/.freeze
- DOUBLE_QUOTE =
/\\"/.freeze
- QUOTED_DATA =
/(?:"[^"]+"|'[^']+')/.freeze
- SINGLE_QUOTED_DATA =
/(?:'[^']+')/.freeze
- IN_ARRAY =
/(IN \()[^\)]+(\))/.freeze
- NUMERIC_DATA =
/\b\d+\b/.freeze
- SANITIZED_VALUE =
'\1?\2'.freeze
Instance Method Summary collapse
- #adapter_uses_double_quoted_table_names? ⇒ Boolean
- #adapter_uses_prepared_statements? ⇒ Boolean
- #call(event) ⇒ Object
- #connection_config ⇒ Object
- #schema_query?(event) ⇒ Boolean
Instance Method Details
#adapter_uses_double_quoted_table_names? ⇒ Boolean
51 52 53 54 |
# File 'lib/appsignal/aggregator/middleware/active_record_sanitizer.rb', line 51 def adapter_uses_double_quoted_table_names? adapter = connection_config[:adapter] adapter =~ /postgres/ || adapter =~ /sqlite/ end |
#adapter_uses_prepared_statements? ⇒ Boolean
56 57 58 59 60 |
# File 'lib/appsignal/aggregator/middleware/active_record_sanitizer.rb', line 56 def adapter_uses_prepared_statements? return false unless adapter_uses_double_quoted_table_names? return true if connection_config[:prepared_statements].nil? connection_config[:prepared_statements] end |
#call(event) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/appsignal/aggregator/middleware/active_record_sanitizer.rb', line 16 def call(event) if event.name == TARGET_EVENT_NAME unless schema_query?(event) || adapter_uses_prepared_statements? query_string = event.payload[:sql] if query_string if adapter_uses_double_quoted_table_names? query_string.gsub!(SINGLE_QUOTE, SANITIZED_VALUE) query_string.gsub!(SINGLE_QUOTED_DATA, SANITIZED_VALUE) else query_string.gsub!(SINGLE_QUOTE, SANITIZED_VALUE) query_string.gsub!(DOUBLE_QUOTE, SANITIZED_VALUE) query_string.gsub!(QUOTED_DATA, SANITIZED_VALUE) end query_string.gsub!(IN_ARRAY, SANITIZED_VALUE) query_string.gsub!(NUMERIC_DATA, SANITIZED_VALUE) end end event.payload.delete(:connection_id) event.payload.delete(:binds) end yield end |
#connection_config ⇒ Object
43 44 45 46 47 48 49 |
# File 'lib/appsignal/aggregator/middleware/active_record_sanitizer.rb', line 43 def connection_config @connection_config ||= if ActiveRecord::Base.respond_to?(:connection_config) ActiveRecord::Base.connection_config else ActiveRecord::Base.connection_pool.spec.config end end |
#schema_query?(event) ⇒ Boolean
39 40 41 |
# File 'lib/appsignal/aggregator/middleware/active_record_sanitizer.rb', line 39 def schema_query?(event) event.payload[:name] == 'SCHEMA' end |