def self.method_body(clazz, method_name, operation_only)
use_model_name = NewRelic::Helper.instance_methods_include?(clazz, :model)
metric_operation = method_name.to_s.gsub(/[!?]/, "")
Proc.new do |*args, &blk|
begin
if operation_only
name = nil
elsif use_model_name
name = self.model.name
elsif self.is_a?(Class)
name = self.name
else
name = self.class.name
end
segment = NewRelic::Agent::Transaction.start_datastore_segment DATA_MAPPER, metric_operation, name
begin
self.send("#{method_name}_without_newrelic", *args, &blk)
rescue ::DataObjects::ConnectionError => e
raise
rescue ::DataObjects::SQLError => e
e.uri.gsub!(PASSWORD_REGEX, AMPERSAND) if e.uri.include?(PASSWORD_PARAM)
strategy = NewRelic::Agent::Database.record_sql_method(:slow_sql)
case strategy
when :obfuscated
adapter_name = if self.respond_to?(:options)
self.options[:adapter]
else
if self.repository.adapter.respond_to?(:options)
self.repository.adapter.options[:adapter]
else
self.repository.adapter.uri.scheme
end
end
statement = NewRelic::Agent::Database::Statement.new(e.query, :adapter => adapter_name)
obfuscated_sql = NewRelic::Agent::Database.obfuscate_sql(statement)
e.instance_variable_set(:@query, obfuscated_sql)
when :off
e.instance_variable_set(:@query, nil)
end
raise
ensure
segment.finish
end
end
end
end