oneapm_rpm 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/lib/one_apm/agent.rb +185 -192
  3. data/lib/one_apm/agent/agent/connect.rb +17 -17
  4. data/lib/one_apm/agent/agent/container_data_manager.rb +14 -14
  5. data/lib/one_apm/agent/agent/forkable_dispatcher_functions.rb +6 -35
  6. data/lib/one_apm/agent/agent/helpers.rb +6 -17
  7. data/lib/one_apm/agent/agent/start.rb +27 -27
  8. data/lib/one_apm/agent/agent/start_worker_thread.rb +19 -51
  9. data/lib/one_apm/agent/busy_calculator.rb +8 -34
  10. data/lib/one_apm/agent/cross_app/cross_app_monitor.rb +10 -10
  11. data/lib/one_apm/agent/cross_app/cross_app_tracing.rb +14 -14
  12. data/lib/one_apm/agent/database.rb +8 -35
  13. data/lib/one_apm/agent/database/active_record_helper.rb +1 -1
  14. data/lib/one_apm/agent/datastores.rb +2 -109
  15. data/lib/one_apm/agent/datastores/metric_helper.rb +1 -1
  16. data/lib/one_apm/agent/datastores/mongo/metric_translator.rb +3 -3
  17. data/lib/one_apm/agent/datastores/mongo/statement_formatter.rb +2 -2
  18. data/lib/one_apm/agent/harvester.rb +3 -6
  19. data/lib/one_apm/agent/inbound_request_monitor.rb +2 -2
  20. data/lib/one_apm/agent/javascript_instrumentor.rb +28 -28
  21. data/lib/one_apm/agent/sampler.rb +1 -1
  22. data/lib/one_apm/agent/sampler_collection.rb +6 -9
  23. data/lib/one_apm/agent/samplers/cpu_sampler.rb +4 -4
  24. data/lib/one_apm/agent/samplers/delayed_job_sampler.rb +5 -5
  25. data/lib/one_apm/agent/samplers/memory_sampler.rb +5 -5
  26. data/lib/one_apm/agent/samplers/object_sampler.rb +1 -1
  27. data/lib/one_apm/agent/samplers/vm_sampler.rb +6 -6
  28. data/lib/one_apm/agent/synthetics_monitor.rb +2 -2
  29. data/lib/one_apm/agent/threading/agent_thread.rb +6 -6
  30. data/lib/one_apm/agent/threading/backtrace_service.rb +9 -9
  31. data/lib/one_apm/agent/threading/thread_profile.rb +3 -3
  32. data/lib/one_apm/collector/collector/helper.rb +10 -10
  33. data/lib/one_apm/collector/collector/http_connection.rb +14 -14
  34. data/lib/one_apm/collector/collector/server_methods.rb +12 -12
  35. data/lib/one_apm/collector/collector_service.rb +8 -8
  36. data/lib/one_apm/collector/commands/thread_profiler_session.rb +4 -4
  37. data/lib/one_apm/collector/commands/xray_session.rb +1 -1
  38. data/lib/one_apm/collector/commands/xray_session_collection.rb +10 -10
  39. data/lib/one_apm/collector/containers/agent_command_router.rb +7 -7
  40. data/lib/one_apm/collector/containers/custom_event_aggregator.rb +6 -6
  41. data/lib/one_apm/collector/containers/error_collector.rb +16 -16
  42. data/lib/one_apm/collector/containers/sql_sampler.rb +8 -11
  43. data/lib/one_apm/collector/containers/transaction_event_aggregator.rb +15 -15
  44. data/lib/one_apm/collector/containers/transaction_sampler.rb +14 -16
  45. data/lib/one_apm/{agent/pipe/pipe_service.rb → collector/forked_process_service.rb} +3 -3
  46. data/lib/one_apm/collector/stats_engine/gc_profiler.rb +3 -3
  47. data/lib/one_apm/collector/stats_engine/metric_stats.rb +4 -4
  48. data/lib/one_apm/collector/stats_engine/stats_hash.rb +2 -2
  49. data/lib/one_apm/configuration.rb +16 -16
  50. data/lib/one_apm/configuration/autostart.rb +4 -4
  51. data/lib/one_apm/configuration/default_source.rb +9 -9
  52. data/lib/one_apm/configuration/environment_source.rb +1 -1
  53. data/lib/one_apm/configuration/high_security_source.rb +1 -1
  54. data/lib/one_apm/configuration/yaml_source.rb +7 -7
  55. data/lib/one_apm/errors/noticed_error.rb +2 -2
  56. data/lib/one_apm/frameworks/external.rb +2 -0
  57. data/lib/one_apm/frameworks/rails.rb +8 -18
  58. data/lib/one_apm/frameworks/rails3.rb +1 -0
  59. data/lib/one_apm/frameworks/rails4.rb +2 -6
  60. data/lib/one_apm/frameworks/ruby.rb +7 -2
  61. data/lib/one_apm/frameworks/sinatra.rb +1 -2
  62. data/lib/one_apm/inst/3rd/active_merchant.rb +1 -1
  63. data/lib/one_apm/inst/3rd/acts_as_solr.rb +2 -2
  64. data/lib/one_apm/inst/3rd/authlogic.rb +1 -1
  65. data/lib/one_apm/inst/3rd/sunspot.rb +1 -1
  66. data/lib/one_apm/inst/background_job/active_job.rb +1 -1
  67. data/lib/one_apm/inst/background_job/delayed_job.rb +4 -4
  68. data/lib/one_apm/inst/background_job/event_machine_standalone.rb +2 -2
  69. data/lib/one_apm/inst/background_job/resque.rb +11 -11
  70. data/lib/one_apm/inst/background_job/sidekiq.rb +5 -5
  71. data/lib/one_apm/inst/dispatcher/passenger.rb +4 -4
  72. data/lib/one_apm/inst/dispatcher/puma.rb +23 -0
  73. data/lib/one_apm/inst/dispatcher/rainbows.rb +2 -2
  74. data/lib/one_apm/inst/framework/grape.rb +4 -4
  75. data/lib/one_apm/inst/framework/padrino.rb +2 -2
  76. data/lib/one_apm/inst/framework/sinatra.rb +9 -9
  77. data/lib/one_apm/inst/framework/sinatra/transaction_namer.rb +1 -1
  78. data/lib/one_apm/inst/http_clients/curb.rb +6 -6
  79. data/lib/one_apm/inst/http_clients/excon.rb +4 -4
  80. data/lib/one_apm/inst/http_clients/excon/middleware.rb +3 -3
  81. data/lib/one_apm/inst/http_clients/httpclient.rb +1 -1
  82. data/lib/one_apm/inst/http_clients/net.rb +2 -2
  83. data/lib/one_apm/inst/http_clients/typhoeus.rb +2 -2
  84. data/lib/one_apm/inst/nosql/memcache.rb +7 -7
  85. data/lib/one_apm/inst/nosql/mongo.rb +6 -6
  86. data/lib/one_apm/inst/nosql/mongo_moped.rb +2 -2
  87. data/lib/one_apm/inst/nosql/redis.rb +3 -3
  88. data/lib/one_apm/inst/orm/active_record.rb +4 -4
  89. data/lib/one_apm/inst/orm/active_record_4.rb +2 -2
  90. data/lib/one_apm/inst/orm/sequel.rb +4 -4
  91. data/lib/one_apm/inst/rack.rb +3 -3
  92. data/lib/one_apm/inst/rack/rack_builder.rb +4 -4
  93. data/lib/one_apm/inst/rails/action_controller.rb +7 -7
  94. data/lib/one_apm/inst/rails/action_web_service.rb +1 -1
  95. data/lib/one_apm/inst/rails/errors.rb +1 -1
  96. data/lib/one_apm/inst/rails3/action_controller.rb +6 -6
  97. data/lib/one_apm/inst/rails3/errors.rb +1 -1
  98. data/lib/one_apm/inst/rails4/action_controller.rb +1 -1
  99. data/lib/one_apm/inst/rails4/action_controller_subscriber.rb +4 -4
  100. data/lib/one_apm/inst/rails4/action_view.rb +2 -2
  101. data/lib/one_apm/inst/rails4/action_view_subscriber.rb +4 -4
  102. data/lib/one_apm/inst/rails4/active_record_subscriber.rb +7 -7
  103. data/lib/one_apm/inst/rails4/errors.rb +1 -1
  104. data/lib/one_apm/inst/rails_middleware.rb +2 -2
  105. data/lib/one_apm/inst/support/evented_subscriber.rb +2 -2
  106. data/lib/one_apm/inst/support/queue_time.rb +1 -1
  107. data/lib/one_apm/inst/transaction_base.rb +6 -6
  108. data/lib/one_apm/logger/agent_logger.rb +8 -8
  109. data/lib/one_apm/logger/audit_logger.rb +8 -8
  110. data/lib/one_apm/logger/memory_logger.rb +1 -1
  111. data/lib/one_apm/logger/null_logger.rb +1 -3
  112. data/lib/one_apm/manager.rb +249 -0
  113. data/lib/one_apm/metrics/metric_spec.rb +1 -1
  114. data/lib/one_apm/metrics/stats.rb +1 -1
  115. data/lib/one_apm/probe.rb +1 -1
  116. data/lib/one_apm/probe/framework_loader.rb +2 -2
  117. data/lib/one_apm/probe/instance_methods.rb +19 -19
  118. data/lib/one_apm/probe/instrumentation.rb +5 -5
  119. data/lib/one_apm/rack/browser_monitoring.rb +6 -6
  120. data/lib/one_apm/rack/middleware_hooks.rb +1 -1
  121. data/lib/one_apm/rack/middleware_tracing.rb +2 -2
  122. data/lib/one_apm/support/chained_call.rb +1 -1
  123. data/lib/one_apm/support/coerce.rb +1 -1
  124. data/lib/one_apm/support/collection_helper.rb +1 -1
  125. data/lib/one_apm/support/encoders.rb +1 -1
  126. data/lib/one_apm/support/environment_report.rb +10 -10
  127. data/lib/one_apm/{agent → support}/event/event_listener.rb +3 -3
  128. data/lib/one_apm/{agent → support}/event/event_loop.rb +8 -8
  129. data/lib/one_apm/{agent → support}/event/timer.rb +1 -1
  130. data/lib/one_apm/{agent → support}/event/worker_loop.rb +5 -19
  131. data/lib/one_apm/{agent/pipe/pipe_channel_manager.rb → support/forked_process_channel.rb} +13 -51
  132. data/lib/one_apm/support/json_marshaller.rb +6 -6
  133. data/lib/one_apm/support/json_wrapper.rb +2 -2
  134. data/lib/one_apm/support/language_support.rb +1 -1
  135. data/lib/one_apm/support/library_detection.rb +5 -5
  136. data/lib/one_apm/support/marshaller.rb +1 -1
  137. data/lib/one_apm/support/method_tracer.rb +12 -12
  138. data/lib/one_apm/support/method_tracer/helpers.rb +6 -6
  139. data/lib/one_apm/support/system_info.rb +2 -2
  140. data/lib/one_apm/support/traced_method_stack.rb +4 -4
  141. data/lib/one_apm/support/vm/monotonic_gc_profiler.rb +1 -1
  142. data/lib/one_apm/support/vm/mri_vm.rb +1 -1
  143. data/lib/one_apm/transaction.rb +3 -3
  144. data/lib/one_apm/transaction/class_methods.rb +3 -3
  145. data/lib/one_apm/transaction/instance_helpers.rb +3 -3
  146. data/lib/one_apm/transaction/sample_buffer/synthetics_sample_buffer.rb +1 -1
  147. data/lib/one_apm/transaction/sample_buffer/xray_sample_buffer.rb +5 -5
  148. data/lib/one_apm/transaction/thread_local_access.rb +2 -2
  149. data/lib/one_apm/transaction/transaction_apdex.rb +2 -2
  150. data/lib/one_apm/transaction/transaction_finish_append.rb +1 -1
  151. data/lib/one_apm/transaction/transaction_jruby_functions.rb +2 -2
  152. data/lib/one_apm/transaction/transaction_name.rb +2 -2
  153. data/lib/one_apm/transaction/transaction_sample.rb +1 -1
  154. data/lib/one_apm/transaction/transaction_sample_builder.rb +7 -7
  155. data/lib/one_apm/transaction/transaction_state.rb +1 -1
  156. data/lib/one_apm/version.rb +1 -1
  157. data/lib/sequel/extensions/oneapm_instrumentation.rb +7 -7
  158. data/oneapm.yml +6 -7
  159. metadata +10 -9
  160. data/lib/one_apm/agent/agent.rb +0 -283
@@ -6,7 +6,7 @@ module OneApm::Rack
6
6
  class MiddlewareHooks < MiddlewareBase
7
7
 
8
8
  def self.needed?
9
- !OneApm::Agent.config[:disable_rack_middleware]
9
+ !OneApm::Manager.config[:disable_rack_middleware]
10
10
  end
11
11
 
12
12
  def traced_call(env)
@@ -67,7 +67,7 @@ module OneApm::Rack
67
67
 
68
68
  result
69
69
  rescue Exception => e
70
- OneApm::Agent.notice_error(e)
70
+ OneApm::Manager.notice_error(e)
71
71
  raise e
72
72
  ensure
73
73
  OneApm::Transaction.stop(state)
@@ -75,7 +75,7 @@ module OneApm::Rack
75
75
  end
76
76
 
77
77
  def events
78
- OneApm::Agent.instance.events
78
+ OneApm::Manager.agent.events
79
79
  end
80
80
  end
81
81
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- # This class is used by OneApm::Agent.set_sql_obfuscator to chain multiple
3
+ # This class is used by OneApm::Manager.set_sql_obfuscator to chain multiple
4
4
  # obfuscation blocks when not using the default :replace action
5
5
  class OneApm::ChainedCall
6
6
  def initialize(block1, block2)
@@ -75,7 +75,7 @@ module OneApm
75
75
  def log_failure(value, type, context, error)
76
76
  msg = "Unable to convert '#{value}' to #{type}"
77
77
  msg += " in context '#{context}'" if context
78
- OneApm::Agent.logger.warn(msg, error)
78
+ OneApm::Manager.logger.warn(msg, error)
79
79
  end
80
80
  end
81
81
  end
@@ -35,7 +35,7 @@ module OneApm
35
35
  # Return nil if there is no backtrace
36
36
 
37
37
  def strip_oa_from_backtrace(backtrace)
38
- if backtrace && !Agent.config[:disable_backtrace_cleanup]
38
+ if backtrace && !Manager.config[:disable_backtrace_cleanup]
39
39
  # this is for 1.9.1, where strings no longer have Enumerable
40
40
  backtrace = backtrace.split("\n") if String === backtrace
41
41
  backtrace = backtrace.map(&:to_s)
@@ -23,7 +23,7 @@ module OneApm
23
23
  normalize_encodings = if opts[:skip_normalization]
24
24
  false
25
25
  else
26
- Agent.config[:normalize_json_string_encodings]
26
+ OneApm::Manager.config[:normalize_json_string_encodings]
27
27
  end
28
28
  json = ::OneApm::JSONWrapper.dump(data, :normalize => normalize_encodings)
29
29
  Base64.encode64(Compressed.encode(json))
@@ -69,8 +69,8 @@ module OneApm
69
69
  report_on('Database adapter' ) do
70
70
  ActiveRecord::Base.configurations[OneApm::Probe.instance.env]['adapter']
71
71
  end
72
- report_on('Framework' ) { Agent.config[:framework].to_s }
73
- report_on('Dispatcher' ) { Agent.config[:dispatcher].to_s }
72
+ report_on('Framework' ) { OneApm::Manager.config[:framework].to_s }
73
+ report_on('Dispatcher' ) { OneApm::Manager.config[:dispatcher].to_s }
74
74
  report_on('Environment' ) { OneApm::Probe.instance.env }
75
75
  report_on('Rails version' ) { ::Rails::VERSION::STRING }
76
76
  report_on('Rails threadsafe') do
@@ -96,17 +96,17 @@ module OneApm
96
96
  if value
97
97
  data[key] = value
98
98
 
99
- Agent.record_metric("Supportability/EnvironmentReport/success", 0.0)
100
- Agent.record_metric("Supportability/EnvironmentReport/success/#{key}", 0.0)
99
+ OneApm::Manager.record_metric("Supportability/EnvironmentReport/success", 0.0)
100
+ OneApm::Manager.record_metric("Supportability/EnvironmentReport/success/#{key}", 0.0)
101
101
  else
102
- Agent.logger.debug("EnvironmentReport ignoring value for #{key.inspect} which came back falsey: #{value.inspect}")
103
- Agent.record_metric("Supportability/EnvironmentReport/empty", 0.0)
104
- Agent.record_metric("Supportability/EnvironmentReport/empty/#{key}", 0.0)
102
+ OneApm::Manager.logger.debug("EnvironmentReport ignoring value for #{key.inspect} which came back falsey: #{value.inspect}")
103
+ OneApm::Manager.record_metric("Supportability/EnvironmentReport/empty", 0.0)
104
+ OneApm::Manager.record_metric("Supportability/EnvironmentReport/empty/#{key}", 0.0)
105
105
  end
106
106
  rescue => e
107
- Agent.logger.debug("EnvironmentReport failed to retrieve value for #{key.inspect}: #{e}")
108
- Agent.record_metric("Supportability/EnvironmentReport/error", 0.0)
109
- Agent.record_metric("Supportability/EnvironmentReport/error/#{key}", 0.0)
107
+ OneApm::Manager.logger.debug("EnvironmentReport failed to retrieve value for #{key.inspect}: #{e}")
108
+ OneApm::Manager.record_metric("Supportability/EnvironmentReport/error", 0.0)
109
+ OneApm::Manager.record_metric("Supportability/EnvironmentReport/error/#{key}", 0.0)
110
110
  end
111
111
  data
112
112
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- module OneApm::Agent
3
+ module OneApm::Support
4
4
  class EventListener
5
5
 
6
6
  attr_accessor :runaway_threshold
@@ -18,7 +18,7 @@ module OneApm::Agent
18
18
 
19
19
  def check_for_runaway_subscriptions(event)
20
20
  count = @events[event].size
21
- OneApm::Agent.logger.debug("Run-away event subscription on #{event}? Subscribed #{count}") if count > @runaway_threshold
21
+ OneApm::Manager.logger.debug("Run-away event subscription on #{event}? Subscribed #{count}") if count > @runaway_threshold
22
22
  end
23
23
 
24
24
  def clear
@@ -32,7 +32,7 @@ module OneApm::Agent
32
32
  begin
33
33
  handler.call(*args)
34
34
  rescue => err
35
- OneApm::Agent.logger.debug("Failure during notify for #{event}", err)
35
+ OneApm::Manager.logger.debug("Failure during notify for #{event}", err)
36
36
  end
37
37
  end
38
38
  end
@@ -1,10 +1,10 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'thread'
4
- require 'one_apm/agent/event/timer'
4
+ require 'one_apm/support/event/timer'
5
5
 
6
6
  module OneApm
7
- module Agent
7
+ module Support
8
8
  class EventLoop
9
9
 
10
10
  def initialize
@@ -47,7 +47,7 @@ module OneApm
47
47
  end
48
48
 
49
49
  def run
50
- OneApm::Agent.logger.debug "Running event loop"
50
+ OneApm::Manager.logger.debug "Running event loop"
51
51
  while !stopped?
52
52
  run_once
53
53
  end
@@ -93,7 +93,7 @@ module OneApm
93
93
  end
94
94
 
95
95
  def dispatch_event(event, args)
96
- OneApm::Agent.logger.debug("EventLoop: Dispatching event '#{event}' with #{@subscriptions[event].size} callback(s).")
96
+ OneApm::Manager.logger.debug("EventLoop: Dispatching event '#{event}' with #{@subscriptions[event].size} callback(s).")
97
97
 
98
98
  errors = []
99
99
  @subscriptions[event].each do |s|
@@ -107,7 +107,7 @@ module OneApm
107
107
  end
108
108
 
109
109
  if !errors.empty?
110
- OneApm::Agent.logger.error "#{errors.size} error(s) running task for event '#{event}' in Agent Event Loop:", *errors
110
+ OneApm::Manager.logger.error "#{errors.size} error(s) running task for event '#{event}' in Agent Event Loop:", *errors
111
111
  end
112
112
  end
113
113
 
@@ -125,19 +125,19 @@ module OneApm
125
125
  end
126
126
 
127
127
  def fire_every(interval, event)
128
- OneApm::Agent.logger.debug "Firing event #{event} every #{interval} seconds."
128
+ OneApm::Manager.logger.debug "Firing event #{event} every #{interval} seconds."
129
129
  fire(:__add_timer, Timer.new(interval, event, true))
130
130
  end
131
131
 
132
132
  def fire_after(interval, event)
133
- OneApm::Agent.logger.debug "Firing event #{event} after #{interval} seconds."
133
+ OneApm::Manager.logger.debug "Firing event #{event} after #{interval} seconds."
134
134
  fire(:__add_timer, Timer.new(interval, event, false))
135
135
  end
136
136
 
137
137
  def wakeup
138
138
  @self_pipe_wr.write_nonblock '.'
139
139
  rescue Errno::EAGAIN
140
- OneApm::Agent.logger.debug "Failed to wakeup event loop"
140
+ OneApm::Manager.logger.debug "Failed to wakeup event loop"
141
141
  end
142
142
  end
143
143
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module OneApm
4
- module Agent
4
+ module Support
5
5
  class EventLoop
6
6
  class Timer
7
7
 
@@ -1,19 +1,16 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'thread'
4
+
4
5
  module OneApm
5
- module Agent
6
+ module Support
6
7
 
7
- # A worker loop executes a set of registered tasks on a single thread.
8
- # A task is a proc or block with a specified call period in seconds.
9
8
  class WorkerLoop
10
9
 
11
10
  attr_accessor :period, :propagate_errors
12
11
  attr_reader :iterations
13
12
 
14
- # Optional argument :duration (in seconds) for how long the worker loop runs
15
- # or :limit (integer) for max number of iterations
16
- def initialize(opts={})
13
+ def initialize(opts = {})
17
14
  @should_run = true
18
15
  @next_invocation_time = Time.now
19
16
  @period = 60.0
@@ -23,7 +20,6 @@ module OneApm
23
20
  @propagate_errors = opts.fetch(:propagate_errors, false)
24
21
  end
25
22
 
26
- # Reset state that is changed by running the worker loop
27
23
  def setup(period, task)
28
24
  @task = task
29
25
  @period = period if period
@@ -35,10 +31,7 @@ module OneApm
35
31
  @next_invocation_time = (now + @period)
36
32
  end
37
33
 
38
- # Run infinitely, calling the registered tasks at their specified
39
- # call periods. The caller is responsible for creating the thread
40
- # that runs this worker loop. This will run the task immediately.
41
- def run(period=nil, &block)
34
+ def run(period = nil, &block)
42
35
  setup(period, block)
43
36
  while keep_running? do
44
37
  sleep_time = schedule_next_invocation
@@ -56,7 +49,6 @@ module OneApm
56
49
  @next_invocation_time - Time.now
57
50
  end
58
51
 
59
- # a simple accessor for @should_run
60
52
  def keep_running?
61
53
  @should_run && under_duration? && under_limit?
62
54
  end
@@ -69,14 +61,10 @@ module OneApm
69
61
  @limit.nil? || @iterations < @limit
70
62
  end
71
63
 
72
- # Sets @should_run to false. Returns false
73
64
  def stop
74
65
  @should_run = false
75
66
  end
76
67
 
77
- # Executes the block given to the worker loop, and handles many
78
- # possible errors. Also updates the execution time so that the
79
- # next run occurs on schedule, even if we execute at some odd time
80
68
  def run_task
81
69
  if @propagate_errors
82
70
  @task.call
@@ -84,11 +72,9 @@ module OneApm
84
72
  begin
85
73
  @task.call
86
74
  rescue OneApm::ForceRestartException, OneApm::ForceDisconnectException
87
- # blow out the loop
88
75
  raise
89
76
  rescue => e
90
- # Don't blow out the stack for anything that hasn't already propagated
91
- ::OneApm::Agent.logger.error "Error running task in Agent Worker Loop:", e
77
+ OneApm::Manager.logger.error "Error running task in Agent Worker Loop:", e
92
78
  end
93
79
  end
94
80
  end
@@ -3,13 +3,8 @@
3
3
  require 'base64'
4
4
 
5
5
  module OneApm
6
- module Agent
7
-
8
- #--
9
- # Manages the registering and servicing of pipes used by child
10
- # processes to report data to their parent, rather than directly
11
- # to the collector.
12
- module PipeChannelManager
6
+ module Support
7
+ module ForkedProcessChannel
13
8
  extend self
14
9
 
15
10
  def register_report_channel(id)
@@ -24,36 +19,8 @@ module OneApm
24
19
  @listener ||= Listener.new
25
20
  end
26
21
 
27
- # Expected initial sequence of events for Pipe usage:
28
- #
29
- # 1. Pipe is created in parent process (read and write ends open)
30
- # 2. Parent process forks
31
- # 3. An after_fork hook is invoked in the child
32
- # 4. From after_fork hook, child closes read end of pipe, and
33
- # writes a ready marker on the pipe (after_fork_in_child).
34
- # 5. The parent receives the ready marker, and closes the write end of the
35
- # pipe in response (after_fork_in_parent).
36
- #
37
- # After this sequence of steps, an exit (whether clean or not) of the
38
- # child will result in the pipe being marked readable again, and giving an
39
- # EOF marker (nil) when read. Note that closing of the unused ends of the
40
- # pipe in the parent and child processes is essential in order for the EOF
41
- # to be correctly triggered. The ready marker mechanism is used because
42
- # there's no easy hook for after_fork in the parent process.
43
- #
44
- # This class provides message framing (separation of individual messages),
45
- # but not serialization. Serialization / deserialization is the
46
- # responsibility of clients.
47
- #
48
- # Message framing works like this:
49
- #
50
- # Each message sent across the pipe is preceded by a length tag that
51
- # specifies the length of the message that immediately follows, in bytes.
52
- # The length tags are serialized as unsigned big-endian long values, (4
53
- # bytes each). This means that the maximum theoretical message size is
54
- # 4 GB - much larger than we'd ever need or want for this application.
55
- #
56
22
  class Pipe
23
+
57
24
  READY_MARKER = "READY"
58
25
  NUM_LENGTH_BYTES = 4
59
26
 
@@ -98,11 +65,11 @@ module OneApm
98
65
  @out.read(message_length)
99
66
  else
100
67
  length_hex = length_bytes.bytes.map { |b| b.to_s(16) }.join(' ')
101
- OneApm::Agent.logger.error("Failed to deserialize message length from pipe. Bytes: [#{length_hex}]")
68
+ OneApm::Manager.logger.error("Failed to deserialize message length from pipe. Bytes: [#{length_hex}]")
102
69
  nil
103
70
  end
104
71
  else
105
- OneApm::Agent.logger.error("Failed to read bytes for length from pipe.")
72
+ OneApm::Manager.logger.error("Failed to read bytes for length from pipe.")
106
73
  nil
107
74
  end
108
75
  end
@@ -123,17 +90,12 @@ module OneApm
123
90
  def closed?
124
91
  @out.closed? && @in.closed?
125
92
  end
93
+
126
94
  end
127
95
 
128
96
  class Listener
129
- attr_reader :thread
130
97
 
131
- # This attr_accessor intentionally provides unsynchronized access to the
132
- # @pipes hash. It is used to look up the write end of the pipe from
133
- # within the Resque child process, and must be unsynchronized in order
134
- # to avoid a potential deadlock in which the PipeChannelManager::Listener
135
- # thread in the parent process is holding the @pipes_lock at the time of
136
- # the fork.
98
+ attr_reader :thread
137
99
  attr_accessor :pipes, :timeout, :select_timeout
138
100
 
139
101
  def initialize
@@ -168,8 +130,7 @@ module OneApm
168
130
  @pipes.values.map{|pipe| pipe.out} + [wake.out]
169
131
  end
170
132
 
171
- OneApm::Agent.record_metric('Supportability/Listeners',
172
- (Time.now - now).to_f) if now
133
+ OneApm::Manager.record_metric('Supportability/Listeners', (Time.now - now).to_f) if now
173
134
 
174
135
  if ready = IO.select(pipes_to_listen_to, [], [], @select_timeout)
175
136
  now = Time.now
@@ -185,7 +146,7 @@ module OneApm
185
146
  break unless should_keep_listening?
186
147
  end
187
148
  end
188
- sleep 0.001 # give time for the thread to spawn
149
+ sleep 0.001
189
150
  end
190
151
 
191
152
  def stop_listener_thread
@@ -231,7 +192,7 @@ module OneApm
231
192
  payload = unmarshal(raw_payload)
232
193
  if payload
233
194
  endpoint, items = payload
234
- OneApm::Agent.instance.merge_data_for_endpoint(endpoint, items)
195
+ OneApm::Manager.agent.merge_data_for_endpoint(endpoint, items)
235
196
  end
236
197
  end
237
198
  end
@@ -244,8 +205,8 @@ module OneApm
244
205
  Marshal.load(data)
245
206
  end
246
207
  rescue StandardError => e
247
- ::OneApm::Agent.logger.error "Failure unmarshalling message from Resque child process", e
248
- ::OneApm::Agent.logger.debug Base64.encode64(data)
208
+ OneApm::Manager.logger.error "Failure unmarshalling message from Resque child process", e
209
+ OneApm::Manager.logger.debug Base64.encode64(data)
249
210
  nil
250
211
  end
251
212
 
@@ -269,6 +230,7 @@ module OneApm
269
230
  @pipes.values.find{|pipe| pipe.out == out_handle }
270
231
  end
271
232
  end
233
+
272
234
  end
273
235
  end
274
236
  end
@@ -9,7 +9,7 @@ module OneApm
9
9
  OK_YAJL_VERSION = OneApm::VersionNumber.new("1.2.1")
10
10
 
11
11
  def initialize
12
- ::OneApm::Agent.logger.info "Using JSON marshaller (#{OneApm::JSONWrapper.backend_name})"
12
+ OneApm::Manager.logger.info "Using JSON marshaller (#{OneApm::JSONWrapper.backend_name})"
13
13
  warn_for_yajl
14
14
  end
15
15
 
@@ -17,11 +17,11 @@ module OneApm
17
17
  if defined?(::Yajl)
18
18
  require 'yajl/version'
19
19
  if OneApm::VersionNumber.new(::Yajl::VERSION) < OK_YAJL_VERSION
20
- ::OneApm::Agent.logger.warn "Detected yajl-ruby version #{::Yajl::VERSION} which can cause segfaults with oneapm_rpm's thread profiling features. We strongly recommend you upgrade to the latest yajl-ruby version available."
20
+ OneApm::Manager.logger.warn "Detected yajl-ruby version #{::Yajl::VERSION} which can cause segfaults with oneapm_rpm's thread profiling features. We strongly recommend you upgrade to the latest yajl-ruby version available."
21
21
  end
22
22
  end
23
23
  rescue => err
24
- ::OneApm::Agent.logger.warn "Failed trying to watch for problematic yajl-ruby version.", err
24
+ OneApm::Manager.logger.warn "Failed trying to watch for problematic yajl-ruby version.", err
25
25
  end
26
26
 
27
27
  def dump(ruby, opts={})
@@ -30,7 +30,7 @@ module OneApm
30
30
  if opts[:skip_normalization]
31
31
  normalize_encodings = false
32
32
  else
33
- normalize_encodings = Agent.config[:normalize_json_string_encodings]
33
+ normalize_encodings = OneApm::Manager.config[:normalize_json_string_encodings]
34
34
  end
35
35
 
36
36
  OneApm::JSONWrapper.dump prepared, :normalize => normalize_encodings
@@ -38,13 +38,13 @@ module OneApm
38
38
 
39
39
  def load(data)
40
40
  if data.nil? || data.empty?
41
- ::OneApm::Agent.logger.error "Empty JSON response from collector: '#{data.inspect}'"
41
+ OneApm::Manager.logger.error "Empty JSON response from collector: '#{data.inspect}'"
42
42
  return nil
43
43
  end
44
44
 
45
45
  return_value OneApm::JSONWrapper.load(data)
46
46
  rescue => e
47
- ::OneApm::Agent.logger.debug "#{e.class.name} : #{e.message} encountered loading collector response: #{data}"
47
+ OneApm::Manager.logger.debug "#{e.class.name} : #{e.message} encountered loading collector response: #{data}"
48
48
  raise
49
49
  end
50
50