class AppDynamics::BusinessTransactions::AutoTransaction

Public Class Methods

new(full: false, segments: nil, dynamic: nil) click to toggle source
# File lib/app_dynamics/business_transactions.rb, line 88
def initialize(full: false, segments: nil, dynamic: nil)
  if full && (segments || dynamic)
    raise ArgumentError, "can't specify other options with full"
  end
  @full = full

  unless full
    segments ||= { first: 2 }
    symbolize_keys!(segments)
    if !segments[:first].is_a?(Integer) && !segments[:last].is_a?(Integer)
      raise ArgumentError, "segments must include :first or :last"
    end
    @segment_opts = segments

    dynamic ||= {}
    unless dynamic.empty?
      if dynamic.is_a?(Symbol)
        h = {}
        h[dynamic] = true
        dynamic = h
      end

      symbolize_keys!(dynamic)

      if dynamic.keys.length > 1
        raise ArgumentError, "can only specific one dynamic option"
      end

      unless %i(param header method host origin).include?(dynamic.keys.first)
        raise ArgumentError, "invalid dynamic type: #{dynamic.keys.first}"
      end
    end
    @dynamic_opts = dynamic
  end
end

Public Instance Methods

==(other) click to toggle source

For testing

# File lib/app_dynamics/business_transactions.rb, line 169
def ==(other)
  @full == other.instance_variable_get(:@full) &&
    @segment_opts == other.instance_variable_get(:@segment_opts) &&
    @dynamic_opts == other.instance_variable_get(:@dynamic_opts)
end
matches?(*) click to toggle source
# File lib/app_dynamics/business_transactions.rb, line 164
def matches?(*)
  true
end
name_for(env) click to toggle source
# File lib/app_dynamics/business_transactions.rb, line 124
def name_for(env)
  return env['PATH_INFO'] if @full

  segments = env['PATH_INFO'].split('/')
  segments.shift() if segments[0] && segments[0].empty?

  if (specific = @dynamic_opts[:segments])
    return segments.values_at(*specific.map{|i| i - 1 }).join
  end

  segments = if (first = @segment_opts[:first])
    segments[0...first]
  elsif (last = @segment_opts[:last])
    last = segments.length if last > segments.length
    segments[-last..-1]
  end

  name = '/' + segments.join('/')

  extra_val = if (param = @dynamic_opts[:param])
    req = Rack::Request.new(env)
    req.params[param.to_s]
  elsif (header = @dynamic_opts[:header])
    header = header.tr('-', '_').upcase
    env[header] || env["HTTP_#{header}"]
  elsif (method = @dynamic_opts[:method])
    env['REQUEST_METHOD']
  elsif (host = @dynamic_opts[:host])
    env['HTTP_HOST'] || env['SERVER_NAME']
  elsif (origin = @dynamic_opts[:origin])
    env['HTTP_ORIGIN']
  end

  unless extra_val.blank?
    name << '.' << extra_val
  end

  name
end

Private Instance Methods

symbolize_keys!(hash) click to toggle source
# File lib/app_dynamics/business_transactions.rb, line 177
def symbolize_keys!(hash)
  hash.keys.each do |key|
    hash[key.to_sym] = hash.delete(key)
  end
end