module NewRelic::Agent::Instrumentation::ActiveRecordHelper

Constants

ACTIVE_RECORD
ACTIVE_RECORD_DEFAULT_PRODUCT_NAME
EMPTY
OPERATION_NAMES

These are used primarily to optimize and avoid allocation on well known operations coming in. Anything not matching the list is fine, it just needs to get downcased directly for use.

OTHER
PRODUCT_NAMES
SPACE

Public Instance Methods

calculate(*args, &blk) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 67
def calculate(*args, &blk)
  ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
    calculate_without_newrelic(*args, &blk)
  end
end
delete_all(*args, &blk) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 51
def delete_all(*args, &blk)
  ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
    delete_all_without_newrelic(*args, &blk)
  end
end
destroy_all(*args, &blk) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 59
def destroy_all(*args, &blk)
  ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
    destroy_all_without_newrelic(*args, &blk)
  end
end
instrument_additional_methods() click to toggle source

Used by both the AR 3.x and 4.x instrumentation

# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 14
def instrument_additional_methods
  instrument_save_methods
  instrument_relation_methods
end
instrument_relation_methods() click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 39
def instrument_relation_methods
  ::ActiveRecord::Relation.class_eval do
    alias_method :update_all_without_newrelic, :update_all

    def update_all(*args, &blk)
      ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
        update_all_without_newrelic(*args, &blk)
      end
    end

    alias_method :delete_all_without_newrelic, :delete_all

    def delete_all(*args, &blk)
      ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
        delete_all_without_newrelic(*args, &blk)
      end
    end

    alias_method :destroy_all_without_newrelic, :destroy_all

    def destroy_all(*args, &blk)
      ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
        destroy_all_without_newrelic(*args, &blk)
      end
    end

    alias_method :calculate_without_newrelic, :calculate

    def calculate(*args, &blk)
      ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
        calculate_without_newrelic(*args, &blk)
      end
    end

    if method_defined?(:pluck)
      alias_method :pluck_without_newrelic, :pluck

      def pluck(*args, &blk)
        ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
          pluck_without_newrelic(*args, &blk)
        end
      end
    end
  end
end
instrument_save_methods() click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 19
def instrument_save_methods
  ::ActiveRecord::Base.class_eval do
    alias_method :save_without_newrelic, :save

    def save(*args, &blk)
      ::NewRelic::Agent.with_database_metric_name(self.class.name, nil, ACTIVE_RECORD) do
        save_without_newrelic(*args, &blk)
      end
    end

    alias_method :save_without_newrelic!, :save!

    def save!(*args, &blk)
      ::NewRelic::Agent.with_database_metric_name(self.class.name, nil, ACTIVE_RECORD) do
        save_without_newrelic!(*args, &blk)
      end
    end
  end
end
map_operation(raw_operation) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 158
def map_operation(raw_operation)
  direct_op = OPERATION_NAMES[raw_operation]
  return direct_op if direct_op

  raw_operation.downcase
end
map_product(adapter_name) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 205
def map_product(adapter_name)
  PRODUCT_NAMES.fetch(adapter_name,
                      ACTIVE_RECORD_DEFAULT_PRODUCT_NAME)
end
metrics_for(name, sql, adapter_name) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 88
def metrics_for(name, sql, adapter_name)
  product   = map_product(adapter_name)
  splits    = split_name(name)
  model     = model_from_splits(splits)
  operation = operation_from_splits(splits, sql)

  NewRelic::Agent::Datastores::MetricHelper.metrics_for(product,
                                                        operation,
                                                        model,
                                                        ACTIVE_RECORD)
end
model_from_splits(splits) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 126
def model_from_splits(splits)
  if splits.length == 2
    splits.first
  else
    nil
  end
end
operation_from_splits(splits, sql) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 134
def operation_from_splits(splits, sql)
  if splits.length == 2
    map_operation(splits[1])
  else
    NewRelic::Agent::Database.parse_operation_from_query(sql) || OTHER
  end
end
pluck(*args, &blk) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 76
def pluck(*args, &blk)
  ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
    pluck_without_newrelic(*args, &blk)
  end
end
rollup_metrics_for(*_) click to toggle source

@deprecated

# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 101
def rollup_metrics_for(*_)
  NewRelic::Agent::Deprecator.deprecate("ActiveRecordHelper.rollup_metrics_for",
                                        "NewRelic::Agent::Datastores::MetricHelper.metrics_for")

  rollup_metric = if NewRelic::Agent::Transaction.recording_web_transaction?
    NewRelic::Agent::Datastores::MetricHelper::WEB_ROLLUP_METRIC
  else
    NewRelic::Agent::Datastores::MetricHelper::OTHER_ROLLUP_METRIC
  end

  [rollup_metric,
   NewRelic::Agent::Datastores::MetricHelper::ROLLUP_METRIC]
end
save(*args, &blk) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 23
def save(*args, &blk)
  ::NewRelic::Agent.with_database_metric_name(self.class.name, nil, ACTIVE_RECORD) do
    save_without_newrelic(*args, &blk)
  end
end
save!(*args, &blk) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 31
def save!(*args, &blk)
  ::NewRelic::Agent.with_database_metric_name(self.class.name, nil, ACTIVE_RECORD) do
    save_without_newrelic!(*args, &blk)
  end
end
split_name(name) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 118
def split_name(name)
  if name && name.respond_to?(:split)
    name.split(SPACE)
  else
    EMPTY
  end
end
update_all(*args, &blk) click to toggle source
# File lib/new_relic/agent/instrumentation/active_record_helper.rb, line 43
def update_all(*args, &blk)
  ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
    update_all_without_newrelic(*args, &blk)
  end
end