Class: NewRelic::Agent::Commands::ThreadProfilerSession

Inherits:
Object
  • Object
show all
Defined in:
lib/new_relic/agent/commands/thread_profiler_session.rb

Instance Method Summary collapse

Constructor Details

#initialize(backtrace_service) ⇒ ThreadProfilerSession

Returns a new instance of ThreadProfilerSession.



13
14
15
16
17
18
# 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

Instance Method Details

#enabled?Boolean

Returns:

  • (Boolean)


63
64
65
# 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) ⇒ Object



20
21
22
23
24
25
# 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) ⇒ Object



27
28
29
30
# 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

#harvestObject



52
53
54
55
56
57
58
59
60
61
# 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?Boolean

Returns:

  • (Boolean)


75
76
77
78
79
# 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?Boolean

Returns:

  • (Boolean)


71
72
73
# File 'lib/new_relic/agent/commands/thread_profiler_session.rb', line 71

def ready_to_harvest?
  past_time? || stopped?
end

#running?Boolean

Returns:

  • (Boolean)


67
68
69
# 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) ⇒ Object



32
33
34
35
36
37
38
39
40
41
# 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) ⇒ Object



43
44
45
46
47
48
49
50
# 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?Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/new_relic/agent/commands/thread_profiler_session.rb', line 81

def stopped?
  !!@finished_profile
end