class NewRelic::Agent::Commands::ThreadProfilerSession

Public Class Methods

new(backtrace_service) click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 13
def initialize(backtrace_service)
  @backtrace_service = backtrace_service
  @started_at = nil
  @finished_profile = nil
  @profile = nil
end

Public Instance Methods

enabled?() click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 63
def enabled?
  NewRelic::Agent.config[:'thread_profiler.enabled']
end
handle_start_command(agent_command) click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 20
def handle_start_command(agent_command)
  raise_unsupported_error unless NewRelic::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/new_relic/agent/commands/thread_profiler_session.rb, line 27
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/new_relic/agent/commands/thread_profiler_session.rb, line 52
def harvest
  NewRelic::Agent.logger.debug(
    "Harvesting from Thread Profiler #{@finished_profile&.to_log_description}"
  )
  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/new_relic/agent/commands/thread_profiler_session.rb, line 75
def past_time?
  @started_at && (
    Process.clock_gettime(Process::CLOCK_REALTIME) > @started_at + @duration
  )
end
ready_to_harvest?() click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 71
def ready_to_harvest?
  past_time? || stopped?
end
running?() click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 67
def running?
  @backtrace_service.subscribed?(NewRelic::Agent::Threading::BacktraceService::ALL_TRANSACTIONS)
end
start(agent_command) click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 32
def start(agent_command)
  NewRelic::Agent.logger.debug('Starting Thread Profiler.')
  profile = @backtrace_service.subscribe(
    NewRelic::Agent::Threading::BacktraceService::ALL_TRANSACTIONS,
    agent_command.arguments
  )

  @started_at = Process.clock_gettime(Process::CLOCK_REALTIME)
  @duration = profile.duration if profile
end
stop(report_data) click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 43
def stop(report_data)
  return unless running?

  NewRelic::Agent.logger.debug('Stopping Thread Profiler.')
  @finished_profile = @backtrace_service.harvest(NewRelic::Agent::Threading::BacktraceService::ALL_TRANSACTIONS)
  @backtrace_service.unsubscribe(NewRelic::Agent::Threading::BacktraceService::ALL_TRANSACTIONS)
  @finished_profile = nil if !report_data
end
stopped?() click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 81
def stopped?
  !!@finished_profile
end

Private Instance Methods

raise_already_started_error() click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 104
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/new_relic/agent/commands/thread_profiler_session.rb, line 87
def raise_command_error(msg)
  raise NewRelic::Agent::Commands::AgentCommandRouter::AgentCommandError.new(msg)
end
raise_thread_profiler_disabled() click to toggle source
# File lib/new_relic/agent/commands/thread_profiler_session.rb, line 99
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/new_relic/agent/commands/thread_profiler_session.rb, line 91
        def raise_unsupported_error
          msg = <<~EOF
            Thread profiling is not supported for Resque processes. If you did not intend to
            profile a Resque process, profiling again might select an appropriate agent.
          EOF
          raise_command_error(msg)
        end