Module: OneApm::Agent::Instrumentation::ActiveRecord

Defined in:
lib/one_apm/inst/orm/active_record.rb

Constant Summary collapse

OA_EXPLAINER =
lambda do |config, query|
  connection = OneApm::Agent::Database.get_connection(config) do
    ::ActiveRecord::Base.send("#{config[:adapter]}_connection", config)
  end
  if connection && connection.respond_to?(:execute)
    connection.execute("EXPLAIN #{query}")
  end
end

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(instrumented_class) ⇒ Object



25
26
27
28
29
30
31
32
33
# File 'lib/one_apm/inst/orm/active_record.rb', line 25

def self.included(instrumented_class)
  instrumented_class.class_eval do
    unless instrumented_class.method_defined?(:log_without_oneapm_instrumentation)
      alias_method :log_without_oneapm_instrumentation, :log
      alias_method :log, :log_with_oneapm_instrumentation
      protected :log
    end
  end
end

.insert_instrumentationObject



19
20
21
22
23
# File 'lib/one_apm/inst/orm/active_record.rb', line 19

def self.insert_instrumentation
  ::ActiveRecord::ConnectionAdapters::AbstractAdapter.module_eval do
    include ::OneApm::Agent::Instrumentation::ActiveRecord
  end
end

Instance Method Details

#generate_metrics(operation, name) ⇒ Object



35
36
37
38
39
# File 'lib/one_apm/inst/orm/active_record.rb', line 35

def generate_metrics(operation, name)
  @product ||= ActiveRecordHelper.database_info(@config)
  model_name = ActiveRecordHelper.model_for_name(name)
  ActiveRecordHelper.metric_for(@product, operation, model_name).compact
end

#log_with_oneapm_instrumentation(*args, &block) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/one_apm/inst/orm/active_record.rb', line 41

def log_with_oneapm_instrumentation(*args, &block)
  state = OneApm::TransactionState.tl_get

  if !state.is_execution_traced?
    return log_without_oneapm_instrumentation(*args, &block)
  end

  sql, name, _ = args
  operation = ActiveRecordHelper.operator_for_name(OneApm::Helper.correctly_encoded(name)) ||
           ActiveRecordHelper.operator_for_sql(OneApm::Helper.correctly_encoded(sql))
           
  if !operation
    log_without_oneapm_instrumentation(*args, &block)
  else
   
    metrics = generate_metrics(operation, name)
    self.class.trace_execution_scoped(metrics) do
      t0 = Time.now
      begin
        log_without_oneapm_instrumentation(*args, &block)
      ensure
        elapsed_time = (Time.now - t0).to_f
        OneApm::Manager.notice_sql(sql, metrics.first, @config, elapsed_time, state, &OA_EXPLAINER)
      end
    end
  end
end

#remote_service_metricObject



69
70
71
72
73
# File 'lib/one_apm/inst/orm/active_record.rb', line 69

def remote_service_metric
  if @config && @config[:adapter]
    ActiveRecordHelper.remote_service_metric(@config[:adapter], @config[:host])
  end
end