module TingYun::Instrumentation::Mongo

Public Instance Methods

ensure_index_with_tingyun(spec, opts = {}, &block) click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 71
def ensure_index_with_tingyun(spec, opts = {}, &block)
  klass_name, *metrics = tingyun_generate_metrics(:ensureIndex)
  TingYun::Agent::MethodTracerHelpers.trace_execution_scoped(metrics, opts, method(:record_mongo_duration), klass_name) do
    ensure_index_without_tingyun(spec, opts, &block)
  end
end
hook_instrument_method(target_class) click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 24
def hook_instrument_method(target_class)
  target_class.class_eval do
    require 'ting_yun/agent/method_tracer_helpers'

    def record_mongo_duration(duration)
      state = TingYun::Agent::TransactionState.tl_get
      if state
        state.timings.mon_duration = state.timings.mon_duration +  duration * 1000
      end
    end

    def tingyun_host_port
     return @db.connection.host_port if self.instance_variable_defined? :@db
     return @host_to_try if self.instance_variable_defined? :@host_to_try
     return ['Unknown', 'Unknown']
    end

    def tingyun_generate_metrics(operation, payload = nil)
      payload ||= { :collection => self.name, :database => self.db.name }
      TingYun::Instrumentation::Support::MetricTranslator.metrics_for(operation, payload, tingyun_host_port)
    end

    def instrument_with_tingyun(name, payload = {}, &block)
      klass_name, *metrics = tingyun_generate_metrics(name, payload)

      TingYun::Agent::MethodTracerHelpers.trace_execution_scoped(metrics, payload, method(:record_mongo_duration), klass_name) do
        instrument_without_tingyun(name, payload, &block)
      end
    end

    alias_method :instrument_without_tingyun, :instrument
    alias_method :instrument, :instrument_with_tingyun
  end
end
hook_instrument_methods() click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 16
def hook_instrument_methods
  hook_instrument_method(::Mongo::Collection)
  hook_instrument_method(::Mongo::Connection)
  hook_instrument_method(::Mongo::Cursor)
  hook_instrument_method(::Mongo::CollectionWriter) if defined?(::Mongo::CollectionWriter)
end
install_mongo_instrumentation() click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 11
def install_mongo_instrumentation
  hook_instrument_methods
  instrument
end
instrument() click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 59
def instrument
  ::Mongo::Collection.class_eval do
    def save_with_tingyun(doc, opts = {}, &block) y
      klass_name, *metrics = tingyun_generate_metrics(:save)
      TingYun::Agent::MethodTracerHelpers.trace_execution_scoped(metrics, opts, method(:record_mongo_duration), klass_name) do
        save_without_tingyun(doc, opts, &block)
      end
    end

    alias_method :save_without_tingyun, :save
    alias_method :save, :save_with_tingyun

    def ensure_index_with_tingyun(spec, opts = {}, &block)
      klass_name, *metrics = tingyun_generate_metrics(:ensureIndex)
      TingYun::Agent::MethodTracerHelpers.trace_execution_scoped(metrics, opts, method(:record_mongo_duration), klass_name) do
        ensure_index_without_tingyun(spec, opts, &block)
      end
    end

    alias_method :ensure_index_without_tingyun, :ensure_index
    alias_method :ensure_index, :ensure_index_with_tingyun
  end
end
instrument_with_tingyun(name, payload = {}, &block) click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 46
def instrument_with_tingyun(name, payload = {}, &block)
  klass_name, *metrics = tingyun_generate_metrics(name, payload)

  TingYun::Agent::MethodTracerHelpers.trace_execution_scoped(metrics, payload, method(:record_mongo_duration), klass_name) do
    instrument_without_tingyun(name, payload, &block)
  end
end
record_mongo_duration(duration) click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 28
def record_mongo_duration(duration)
  state = TingYun::Agent::TransactionState.tl_get
  if state
    state.timings.mon_duration = state.timings.mon_duration +  duration * 1000
  end
end
save_with_tingyun(doc, opts = {}, &block) click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 61
def save_with_tingyun(doc, opts = {}, &block) y
  klass_name, *metrics = tingyun_generate_metrics(:save)
  TingYun::Agent::MethodTracerHelpers.trace_execution_scoped(metrics, opts, method(:record_mongo_duration), klass_name) do
    save_without_tingyun(doc, opts, &block)
  end
end
tingyun_generate_metrics(operation, payload = nil) click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 41
def tingyun_generate_metrics(operation, payload = nil)
  payload ||= { :collection => self.name, :database => self.db.name }
  TingYun::Instrumentation::Support::MetricTranslator.metrics_for(operation, payload, tingyun_host_port)
end
tingyun_host_port() click to toggle source
# File lib/ting_yun/instrumentation/mongo.rb, line 35
def tingyun_host_port
 return @db.connection.host_port if self.instance_variable_defined? :@db
 return @host_to_try if self.instance_variable_defined? :@host_to_try
 return ['Unknown', 'Unknown']
end