def hook_instrument_method(target_class)
target_class.class_eval do
include NewRelic::Agent::MethodTracer
def new_relic_notice_statement(t0, payload, name)
statement = NewRelic::Agent::Datastores::Mongo::StatementFormatter.format(payload, name)
if statement
NewRelic::Agent.instance.transaction_sampler.notice_nosql_statement(statement, (Time.now - t0).to_f)
end
rescue => e
NewRelic::Agent.logger.debug("Exception during Mongo statement gathering", e)
end
def new_relic_default_payload
{ :collection => self.name, :database => self.db.name }
end
def new_relic_start_segment name, payload
product = NewRelic::Agent::Datastores::Mongo::MetricTranslator::MONGO_PRODUCT_NAME
op_and_col = NewRelic::Agent::Datastores::Mongo::MetricTranslator.operation_and_collection_for name, payload
if op_and_col
NewRelic::Agent::Transaction.start_datastore_segment product, *op_and_col
end
end
def instrument_with_new_relic_trace(name, payload = {}, &block)
segment = new_relic_start_segment name, payload
begin
result = NewRelic::Agent.disable_all_tracing do
instrument_without_new_relic_trace(name, payload, &block)
end
new_relic_notice_statement(segment.start_time, payload, name) if segment
result
ensure
segment.finish if segment
end
end
alias_method :instrument_without_new_relic_trace, :instrument
alias_method :instrument, :instrument_with_new_relic_trace
end
end