class OneApm::Collector::Commands::ThreadProfilerSession

Public Class Methods

new(backtrace_service) click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 13
def initialize(backtrace_service)
  @backtrace_service = backtrace_service
end

Public Instance Methods

enabled?() click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 57
def enabled?
  OneApm::Manager.config[:'thread_profiler.enabled']
end
handle_start_command(agent_command) click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 17
def handle_start_command(agent_command)
  raise_unsupported_error unless OneApm::Agent::Threading::BacktraceService.is_supported?
  raise_thread_profiler_disabled unless enabled?
  raise_already_started_error if running?
  start(agent_command)
end
handle_stop_command(agent_command) click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 24
def handle_stop_command(agent_command)
  report_data = agent_command.arguments.fetch("report_data", true)
  stop(report_data)
end
harvest() click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 48
def harvest
  OneApm::Manager.logger.debug("Harvesting from Thread Profiler #{@finished_profile.to_log_description unless @finished_profile.nil?}")
  profile = @finished_profile
  @backtrace_service.profile_agent_code = false
  @finished_profile = nil
  @started_at = nil
  profile
end
past_time?() click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 69
def past_time?
  @started_at && (Time.now > @started_at + @duration)
end
ready_to_harvest?() click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 65
def ready_to_harvest?
  past_time? || stopped?
end
running?() click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 61
def running?
  @backtrace_service.subscribed?(OneApm::Agent::Threading::BacktraceService::OA_ALL_TRANSACTIONS)
end
start(agent_command) click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 29
def start(agent_command)
  OneApm::Manager.logger.debug("Starting Thread Profiler.")
  profile = @backtrace_service.subscribe(
    OneApm::Agent::Threading::BacktraceService::OA_ALL_TRANSACTIONS,
    agent_command.arguments
  )

  @started_at = Time.now
  @duration = profile.duration if profile
end
stop(report_data) click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 40
def stop(report_data)
  return unless running?
  OneApm::Manager.logger.debug("Stopping Thread Profiler.")
  @finished_profile = @backtrace_service.harvest(OneApm::Agent::Threading::BacktraceService::OA_ALL_TRANSACTIONS)
  @backtrace_service.unsubscribe(OneApm::Agent::Threading::BacktraceService::OA_ALL_TRANSACTIONS)
  @finished_profile = nil if !report_data
end
stopped?() click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 73
def stopped?
  !!@finished_profile
end

Private Instance Methods

raise_already_started_error() click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 100
def raise_already_started_error
  msg = "Profile already in progress. Ignoring agent command to start another."
  raise_command_error(msg)
end
raise_command_error(msg) click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 79
def raise_command_error(msg)
  raise OneApm::Collector::AgentCommandRouter::AgentCommandError.new(msg)
end
raise_thread_profiler_disabled() click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 95
def raise_thread_profiler_disabled
  msg = "Not starting Thread Profiler because of config 'thread_profiler.enabled' = #{enabled?}"
  raise_command_error(msg)
end
raise_unsupported_error() click to toggle source
# File lib/one_apm/collector/commands/thread_profiler_session.rb, line 83
        def raise_unsupported_error
          msg = <<-EOF
            Thread profiling is only supported on 1.9.2 and greater versions of Ruby.
            We detected running agents capable of profiling, but the profile started with
            an agent running Ruby #{RUBY_VERSION}.

            Profiling again might select an appropriate agent, but we recommend running a
            consistent version of Ruby across your application for better results.
          EOF
          raise_command_error(msg)
        end