# File lib/new_relic/agent/instrumentation/mongo.rb, line 53
  def hook_instrument_method(target_class)
    target_class.class_eval do
      include NewRelic::Agent::MethodTracer

      # It's key that this method eats all exceptions, as it rests between the
      # Mongo operation the user called and us returning them the data. Be safe!
      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