module OneApm::Agent::Instrumentation::TransactionBase::ClassMethods

Public Instance Methods

add_transaction_tracer(method, options = {}) click to toggle source

Add transaction tracing to the given method. This will treat the given method as a main entrypoint for instrumentation, just like controller actions are treated by default. Useful especially for background tasks.

Example for background job:

class Job
  include OneApm::Agent::Instrumentation::TransactionBase
  def run(task)
     ...
  end

  # Instrument run so tasks show up under task.name.
  # Note single quoting to defer eval to runtime.
  add_transaction_tracer :run, :name => '#{args[0].name}'
end

Here's an example of a controller that uses a dispatcher action to invoke operations which you want treated as top level actions, so they aren't all lumped into the invoker action.

MyController < ActionController::Base
  include OneApm::Agent::Instrumentation::TransactionBase
  # dispatch the given op to the method given by the service parameter.
  def invoke_operation
    op = params['operation']
    send op
  end
  # Ignore the invoker to avoid double counting
  oneapm_ignore :only => 'invoke_operation'
  # Instrument the operations:
  add_transaction_tracer :print
  add_transaction_tracer :show
  add_transaction_tracer :forward
end

Here's an example of how to pass contextual information into the transaction so it will appear in transaction traces:

class Job
  include OneApm::Agent::Instrumentation::TransactionBase
  def process(account)
     ...
  end
  # Include the account name in the transaction details.  Note the single
  # quotes to defer eval until call time.
  add_transaction_tracer :process, :params => '{ :account_name => args[0].name }'
end

See OneApm::Agent::Instrumentation::TransactionBase#perform_action_with_oneapm_trace for the full list of available options.

@api public

# File lib/one_apm/inst/transaction_base.rb, line 151
          def add_transaction_tracer(method, options = {})
            options[:name] ||= method.to_s

            argument_list = generate_argument_list(options)
            traced_method, punctuation = parse_punctuation(method)
            with_method_name, without_method_name = build_method_names(traced_method, punctuation)

            if already_added_transaction_tracer?(self, with_method_name)
              OneApm::Manager.logger.warn("Transaction tracer already in place for class = #{self.name}, method = #{method.to_s}, skipping")
              return
            end

            class_eval <<-EOC
              def #{with_method_name}(*args, &block)
                perform_action_with_oneapm_trace(#{argument_list.join(',')}) do
                  #{without_method_name}(*args, &block)
                end
              end
            EOC

            visibility = OneApm::Helper.instance_method_visibility self, method

            alias_method without_method_name, method.to_s
            alias_method method.to_s, with_method_name

            send visibility, method
            send visibility, with_method_name

            OneApm::Manager.logger.debug("Traced transaction: class = #{self.name}, method = #{method.to_s}, options = #{options.inspect}")
          end
already_added_transaction_tracer?(target, with_method_name) click to toggle source
# File lib/one_apm/inst/transaction_base.rb, line 207
def already_added_transaction_tracer?(target, with_method_name)
  if OneApm::Helper.instance_methods_include?(target, with_method_name)
    true
  else
    false
  end
end
build_method_names(traced_method, punctuation) click to toggle source
# File lib/one_apm/inst/transaction_base.rb, line 200
def build_method_names(traced_method, punctuation)
  [
    "#{traced_method.to_s}_with_oneapm_transaction_trace#{punctuation}",
    "#{traced_method.to_s}_without_oneapm_transaction_trace#{punctuation}"
    ]
end
generate_argument_list(options) click to toggle source
# File lib/one_apm/inst/transaction_base.rb, line 186
def generate_argument_list(options)
  options.map do |key, value|
    value = if value.is_a?(Symbol)
      value.inspect
    elsif key == :params
      value.to_s
    else
      %Q["#{value.to_s}"]
    end

    %Q[:#{key} => #{value}]
  end
end
oneapm_ignore(options = {}) click to toggle source

Have OneApm ignore actions in this controller. Specify the actions as hash options using :except and :only. If no actions are specified, all actions are ignored.

@api public

# File lib/one_apm/inst/transaction_base.rb, line 56
def oneapm_ignore(options = {})
  oneapm_ignore_aspect(OA_DO_NOT_TRACE_KEY, options)
end
oneapm_ignore_apdex(options = {}) click to toggle source

Have OneApm omit apdex measurements on the given actions. Typically used for actions that are not user facing or that skew your overall apdex measurement. Accepts :except and :only options.

@api public

# File lib/one_apm/inst/transaction_base.rb, line 66
def oneapm_ignore_apdex(options = {})
  oneapm_ignore_aspect(OA_IGNORE_APDEX_KEY, options)
end
oneapm_ignore_aspect(property, options = {}) click to toggle source
# File lib/one_apm/inst/transaction_base.rb, line 78
def oneapm_ignore_aspect(property, options = {})
  if options.empty?
    oneapm_write_attr property, true
  elsif !options.is_a?(Hash)
    OneApm::Manager.logger.error "oneapm_#{property} takes an optional hash with :only and :except lists of actions (illegal argument type '#{options.class}')"
  else
    oneapm_write_attr property, options
  end
end
oneapm_ignore_enduser(options = {}) click to toggle source

Have OneApm skip install javascript_instrumentation

@api public

# File lib/one_apm/inst/transaction_base.rb, line 74
def oneapm_ignore_enduser(options = {})
  oneapm_ignore_aspect(OA_IGNORE_ENDUSER_KEY, options)
end
oneapm_read_attr(attr_name) click to toggle source
# File lib/one_apm/inst/transaction_base.rb, line 92
def oneapm_read_attr(attr_name)
  instance_variable_get(attr_name)
end
oneapm_write_attr(attr_name, value) click to toggle source
# File lib/one_apm/inst/transaction_base.rb, line 88
def oneapm_write_attr(attr_name, value)
  instance_variable_set(attr_name, value)
end
parse_punctuation(method) click to toggle source
# File lib/one_apm/inst/transaction_base.rb, line 182
def parse_punctuation(method)
  [method.to_s.sub(/([?!=])$/, ''), $1]
end