oneapm_rpm 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -4,25 +4,13 @@ require 'one_apm/transaction/transaction_state'
4
4
 
5
5
  module OneApm
6
6
  module Agent
7
- # This module supports calculation of actual time spent processing requests over the course of
8
- # one harvest period. It's similar to what you would get if you just added up all the
9
- # execution times of controller calls, however that will be inaccurate when requests
10
- # span the minute boundaries. This module manages accounting of requests not yet
11
- # completed.
12
- #
13
- # Calls are re-entrant. All start calls must be paired with finish
14
- # calls, or a reset call.
15
7
  module BusyCalculator
16
8
 
17
9
  extend self
18
10
 
19
- # For testability, add accessors:
20
11
  attr_reader :harvest_start, :accumulator
21
12
 
22
- # sets up busy calculations based on the start and end of
23
- # transactions - used for a rough estimate of what percentage of
24
- # wall clock time is spent processing requests
25
- def dispatcher_start(time) #THREAD_LOCAL_ACCESS
13
+ def dispatcher_start(time)
26
14
  state = TransactionState.tl_get
27
15
  state.busy_entries ||= 0
28
16
  callers = state.busy_entries += 1
@@ -32,38 +20,29 @@ module OneApm
32
20
  end
33
21
  end
34
22
 
35
- # called when a transaction finishes, to add time to the
36
- # instance variable accumulator. this is harvested when we send
37
- # data to the server
38
- def dispatcher_finish(end_time = nil) #THREAD_LOCAL_ACCESS
23
+ def dispatcher_finish(end_time = nil)
39
24
  state = TransactionState.tl_get
40
- # If #dispatcher_start hasn't been called at least once, abort early
41
25
  return unless state.busy_entries
42
26
 
43
27
  end_time ||= time_now
44
28
  callers = state.busy_entries -= 1
45
29
 
46
- # Ignore nested calls
47
30
  return if callers > 0
48
31
 
49
32
  @lock.synchronize do
50
33
  if @entrypoint_stack.empty?
51
- ::OneApm::Agent.logger.warn("Stack underflow tracking dispatcher entry and exit!\n #{caller.join(" \n")}")
34
+ OneApm::Manager.logger.warn("Stack underflow tracking dispatcher entry and exit!\n #{caller.join(" \n")}")
52
35
  else
53
36
  @accumulator += (end_time - @entrypoint_stack.pop).to_f
54
37
  end
55
38
  end
56
39
  end
57
40
 
58
- # this returns the size of the entry point stack, which
59
- # determines how many transactions are running
60
41
  def busy_count
61
42
  @entrypoint_stack.size
62
43
  end
63
44
 
64
- # Reset the state of the information accumulated by all threads,
65
- # but only reset the recursion counter for this thread.
66
- def reset #THREAD_LOCAL_ACCESS
45
+ def reset
67
46
  @entrypoint_stack = []
68
47
  TransactionState.tl_get.busy_entries = 0
69
48
  @lock ||= Mutex.new
@@ -71,8 +50,6 @@ module OneApm
71
50
  @harvest_start = time_now
72
51
  end
73
52
 
74
-
75
- # Called before uploading to to the server to collect current busy stats.
76
53
  def harvest_busy
77
54
  busy = 0
78
55
  t0 = time_now
@@ -80,8 +57,6 @@ module OneApm
80
57
  busy = accumulator
81
58
  @accumulator = 0
82
59
 
83
- # Walk through the stack and capture all times up to
84
- # now for entrypoints
85
60
  @entrypoint_stack.size.times do |frame|
86
61
  busy += (t0 - @entrypoint_stack[frame]).to_f
87
62
  @entrypoint_stack[frame] = t0
@@ -89,22 +64,21 @@ module OneApm
89
64
 
90
65
  end
91
66
 
92
- busy = 0.0 if busy < 0.0 # don't go below 0%
67
+ busy = 0.0 if busy < 0.0
93
68
 
94
69
  time_window = (t0 - harvest_start).to_f
95
- time_window = 1.0 if time_window == 0.0 # protect against divide by zero
70
+ time_window = 1.0 if time_window == 0.0
96
71
 
97
72
  busy = busy / time_window
98
73
 
99
- if Agent.config[:report_instance_busy]
100
- OneApm::Agent.record_metric('Instance/Busy', busy)
74
+ if OneApm::Manager.config[:report_instance_busy]
75
+ OneApm::Manager.record_metric('Instance/Busy', busy)
101
76
  end
102
77
  @harvest_start = t0
103
78
  end
104
79
 
105
80
  private
106
81
 
107
- # so we can stub Time.now only for the BusyCalculator in tests
108
82
  def time_now
109
83
  Time.now
110
84
  end
@@ -26,10 +26,10 @@ module OneApm
26
26
  # :before_call will save our cross application request id to the thread
27
27
  # :after_call will write our response headers/metrics and clean up the thread
28
28
  def register_event_listeners(events)
29
- OneApm::Agent.logger.
29
+ OneApm::Manager.logger.
30
30
  debug("Wiring up Cross Application Tracing to events after finished configuring")
31
31
 
32
- events.subscribe(:before_call) do |env| #THREAD_LOCAL_ACCESS
32
+ events.subscribe(:before_call) do |env|
33
33
  if should_process_request(env)
34
34
  state = OneApm::TransactionState.tl_get
35
35
 
@@ -39,13 +39,13 @@ module OneApm
39
39
  end
40
40
  end
41
41
 
42
- events.subscribe(:after_call) do |env, (_status_code, headers, _body)| #THREAD_LOCAL_ACCESS
42
+ events.subscribe(:after_call) do |env, (_status_code, headers, _body)|
43
43
  state = OneApm::TransactionState.tl_get
44
44
 
45
45
  insert_response_header(state, env, headers)
46
46
  end
47
47
 
48
- events.subscribe(:notice_error) do |_, options| #THREAD_LOCAL_ACCESS
48
+ events.subscribe(:notice_error) do |_, options|
49
49
  state = OneApm::TransactionState.tl_get
50
50
 
51
51
  set_error_custom_parameters(state, options)
@@ -116,7 +116,7 @@ module OneApm
116
116
  split_id = id.match(/(\d+)#\d+/)
117
117
  return false if split_id.nil?
118
118
 
119
- OneApm::Agent.config[:trusted_account_ids].include?(split_id.captures.first.to_i)
119
+ OneApm::Manager.config[:trusted_account_ids].include?(split_id.captures.first.to_i)
120
120
  end
121
121
 
122
122
  def set_response_headers(state, response_headers, timings, content_length)
@@ -125,7 +125,7 @@ module OneApm
125
125
 
126
126
  def build_payload(state, timings, content_length)
127
127
  payload = [
128
- OneApm::Agent.config[:cross_process_id],
128
+ OneApm::Manager.config[:cross_process_id],
129
129
  timings.transaction_name,
130
130
  timings.queue_time_in_seconds.to_f,
131
131
  timings.app_time_in_seconds.to_f,
@@ -138,11 +138,11 @@ module OneApm
138
138
  def set_transaction_custom_parameters(state)
139
139
  # We expect to get the before call to set the id (if we have it) before
140
140
  # this, and then write our custom parameter when the transaction starts
141
- OneApm::Agent.add_custom_parameters(:client_cross_process_id => state.client_cross_app_id) if state.client_cross_app_id
141
+ OneApm::Manager.add_custom_parameters(:client_cross_process_id => state.client_cross_app_id) if state.client_cross_app_id
142
142
 
143
143
  referring_guid = client_referring_transaction_guid(state)
144
144
  if referring_guid
145
- OneApm::Agent.add_custom_parameters(:referring_transaction_guid => referring_guid)
145
+ OneApm::Manager.add_custom_parameters(:referring_transaction_guid => referring_guid)
146
146
  end
147
147
  end
148
148
 
@@ -152,7 +152,7 @@ module OneApm
152
152
 
153
153
  def set_metrics(id, timings)
154
154
  metric_name = "ClientApplication/#{id}/all"
155
- OneApm::Agent.record_metric(metric_name, timings.app_time_in_seconds)
155
+ OneApm::Manager.record_metric(metric_name, timings.app_time_in_seconds)
156
156
  end
157
157
 
158
158
  def decoded_id(request)
@@ -172,7 +172,7 @@ module OneApm
172
172
 
173
173
  def path_hash(txn_name, seed)
174
174
  rotated = ((seed << 1) | (seed >> 31)) & 0xffffffff
175
- app_name = OneApm::Agent.config.app_names.first
175
+ app_name = OneApm::Manager.config.app_names.first
176
176
  identifier = "#{app_name};#{txn_name}"
177
177
  sprintf("%08x", rotated ^ hash_transaction_name(identifier))
178
178
  end
@@ -72,10 +72,10 @@ module OneApm
72
72
 
73
73
  return segment
74
74
  rescue => err
75
- OneApm::Agent.logger.error "Uncaught exception while tracing HTTP request", err
75
+ OneApm::Manager.logger.error "Uncaught exception while tracing HTTP request", err
76
76
  return nil
77
77
  rescue Exception => e
78
- OneApm::Agent.logger.debug "Unexpected exception raised while tracing HTTP request", e
78
+ OneApm::Manager.logger.debug "Unexpected exception raised while tracing HTTP request", e
79
79
 
80
80
  raise e
81
81
  end
@@ -94,7 +94,7 @@ module OneApm
94
94
  #
95
95
  def finish_trace(state, t0, segment, request, response)
96
96
  unless t0
97
- OneApm::Agent.logger.error("HTTP request trace finished without start time. This is probably an agent bug.")
97
+ OneApm::Manager.logger.error("HTTP request trace finished without start time. This is probably an agent bug.")
98
98
  return
99
99
  end
100
100
 
@@ -127,9 +127,9 @@ module OneApm
127
127
  end
128
128
  end
129
129
  rescue OneApm::Agent::CrossAppTracing::Error => err
130
- OneApm::Agent.logger.debug "while cross app tracing", err
130
+ OneApm::Manager.logger.debug "while cross app tracing", err
131
131
  rescue => err
132
- OneApm::Agent.logger.error "Uncaught exception while finishing an HTTP request trace", err
132
+ OneApm::Manager.logger.error "Uncaught exception while finishing an HTTP request trace", err
133
133
  end
134
134
 
135
135
  # Return +true+ if cross app tracing is enabled in the config.
@@ -140,21 +140,21 @@ module OneApm
140
140
  end
141
141
 
142
142
  def valid_cross_process_id?
143
- OneApm::Agent.config[:cross_process_id] && OneApm::Agent.config[:cross_process_id].length > 0
143
+ OneApm::Manager.config[:cross_process_id] && OneApm::Manager.config[:cross_process_id].length > 0
144
144
  end
145
145
 
146
146
  def valid_encoding_key?
147
- OneApm::Agent.config[:encoding_key] && OneApm::Agent.config[:encoding_key].length > 0
147
+ OneApm::Manager.config[:encoding_key] && OneApm::Manager.config[:encoding_key].length > 0
148
148
  end
149
149
 
150
150
  def cross_application_tracer_enabled?
151
- OneApm::Agent.config[:"cross_application_tracer.enabled"]
151
+ OneApm::Manager.config[:"cross_application_tracer.enabled"]
152
152
  end
153
153
 
154
154
  # Fetcher for the cross app encoding key. Raises a
155
155
  # OneApm::Agent::CrossAppTracing::Error if the key isn't configured.
156
156
  def cross_app_encoding_key
157
- OneApm::Agent.config[:encoding_key] or
157
+ OneApm::Manager.config[:encoding_key] or
158
158
  raise OneApm::Agent::CrossAppTracing::Error, "No encoding_key set."
159
159
  end
160
160
 
@@ -164,7 +164,7 @@ module OneApm
164
164
 
165
165
  # Inject the X-Process header into the outgoing +request+.
166
166
  def inject_request_headers(state, request)
167
- cross_app_id = OneApm::Agent.config[:cross_process_id] or
167
+ cross_app_id = OneApm::Manager.config[:cross_process_id] or
168
168
  raise OneApm::Agent::CrossAppTracing::Error, "no cross app ID configured"
169
169
 
170
170
  state.is_cross_app_caller = true
@@ -184,7 +184,7 @@ module OneApm
184
184
  request[OA_TXN_HEADER] = obfuscator.obfuscate(txn_data)
185
185
 
186
186
  rescue OneApm::Agent::CrossAppTracing::Error => err
187
- OneApm::Agent.logger.debug "Not injecting x-process header", err
187
+ OneApm::Manager.logger.debug "Not injecting x-process header", err
188
188
  end
189
189
 
190
190
  def add_transaction_trace_parameters(request, response)
@@ -217,7 +217,7 @@ module OneApm
217
217
  metrics.concat metrics_for_crossapp_response( request, response )
218
218
  rescue => err
219
219
  # Fall back to regular metrics if there's a problem with x-process metrics
220
- OneApm::Agent.logger.debug "%p while fetching x-process metrics: %s" %
220
+ OneApm::Manager.logger.debug "%p while fetching x-process metrics: %s" %
221
221
  [ err.class, err.message ]
222
222
  metrics.concat metrics_for_regular_request( request )
223
223
  end
@@ -308,11 +308,11 @@ module OneApm
308
308
 
309
309
  # Fetch a reference to the stats engine.
310
310
  def stats_engine
311
- OneApm::Agent.instance.stats_engine
311
+ OneApm::Manager.agent.stats_engine
312
312
  end
313
313
 
314
314
  def transaction_sampler
315
- OneApm::Agent.instance.transaction_sampler
315
+ OneApm::Manager.agent.transaction_sampler
316
316
  end
317
317
 
318
318
  # Check the given +id+ to ensure it conforms to the format of a cross-application
@@ -6,7 +6,6 @@ require 'one_apm/agent/database/obfuscator'
6
6
  require 'one_apm/agent/database/postgres_explain_obfuscator'
7
7
 
8
8
  module OneApm
9
- # columns for a mysql explain plan
10
9
  MYSQL_EXPLAIN_COLUMNS = [
11
10
  "Id",
12
11
  "Select Type",
@@ -47,7 +46,7 @@ module OneApm
47
46
  end
48
47
 
49
48
  def record_sql_method(config_section=:transaction_tracer)
50
- case Agent.config["#{config_section}.record_sql".to_sym].to_s
49
+ case OneApm::Manager.config["#{config_section}.record_sql".to_sym].to_s
51
50
  when 'off'
52
51
  :off
53
52
  when 'none'
@@ -69,7 +68,7 @@ module OneApm
69
68
 
70
69
  def should_collect_explain_plans?(config_section=:transaction_tracer)
71
70
  should_record_sql?(config_section) &&
72
- Agent.config["#{config_section}.explain_enabled".to_sym]
71
+ OneApm::Manager.config["#{config_section}.explain_enabled".to_sym]
73
72
  end
74
73
 
75
74
  def get_connection(config, &connector)
@@ -80,26 +79,14 @@ module OneApm
80
79
  ConnectionManager.instance.close_connections
81
80
  end
82
81
 
83
- # This takes a connection config hash from ActiveRecord or Sequel and
84
- # returns a string describing the associated database adapter
85
82
  def adapter_from_config(config)
86
83
  if config[:adapter]
87
84
  return config[:adapter].to_s
88
85
  elsif config[:uri] && config[:uri].to_s =~ /^jdbc:([^:]+):/
89
- # This case is for Sequel with the jdbc-mysql, jdbc-postgres, or
90
- # jdbc-sqlite3 gems.
91
86
  return $1
92
87
  end
93
88
  end
94
89
 
95
- # Perform this in the runtime environment of a managed
96
- # application, to explain the sql statement executed within a
97
- # segment of a transaction sample. Returns an array of
98
- # explanations (which is an array rows consisting of an array of
99
- # strings for each column returned by the the explain query)
100
- # Note this happens only for statements whose execution time
101
- # exceeds a threshold (e.g. 500ms) and only within the slowest
102
- # transaction in a report period, selected for shipment to OneApm
103
90
  def explain_sql(sql, connection_config, &explainer)
104
91
  return nil unless sql && connection_config
105
92
  statement = sql.split(";\n")[0] # only explain the first
@@ -113,25 +100,25 @@ module OneApm
113
100
  return unless is_select?(statement)
114
101
 
115
102
  if statement[-3,3] == '...'
116
- OneApm::Agent.logger.debug('Unable to collect explain plan for truncated query.')
103
+ OneApm::Manager.logger.debug('Unable to collect explain plan for truncated query.')
117
104
  return
118
105
  end
119
106
 
120
107
  if parameterized?(statement)
121
- OneApm::Agent.logger.debug('Unable to collect explain plan for parameterized query.')
108
+ OneApm::Manager.logger.debug('Unable to collect explain plan for parameterized query.')
122
109
  return
123
110
  end
124
111
 
125
112
  adapter = adapter_from_config(config)
126
113
  if !SUPPORTED_ADAPTERS_FOR_EXPLAIN.include?(adapter)
127
- OneApm::Agent.logger.debug("Not collecting explain plan because an unknown connection adapter ('#{adapter}') was used.")
114
+ OneApm::Manager.logger.debug("Not collecting explain plan because an unknown connection adapter ('#{adapter}') was used.")
128
115
  return
129
116
  end
130
117
 
131
118
  handle_exception_in_explain do
132
119
  start = Time.now
133
120
  plan = explainer.call(config, statement)
134
- ::OneApm::Agent.record_metric("Supportability/Database/execute_explain_plan", Time.now - start)
121
+ OneApm::Manager.record_metric("Supportability/Database/execute_explain_plan", Time.now - start)
135
122
  return process_resultset(plan, adapter) if plan
136
123
  end
137
124
  end
@@ -168,11 +155,6 @@ module OneApm
168
155
  [[QUERY_PLAN], values]
169
156
  end
170
157
 
171
- # Sequel returns explain plans as just one big pre-formatted String
172
- # In that case, we send a nil headers array, and the single string
173
- # wrapped in an array for the values.
174
- # Note that we don't use this method for Postgres explain plans, since
175
- # they need to be passed through the explain plan obfuscator first.
176
158
  def string_explain_plan_results(results)
177
159
  [nil, [results]]
178
160
  end
@@ -182,15 +164,11 @@ module OneApm
182
164
  headers = []
183
165
  values = []
184
166
  if results.is_a?(Array)
185
- # We're probably using the jdbc-mysql gem for JRuby, which will give
186
- # us an array of hashes.
187
167
  headers = results.first.keys
188
168
  results.each do |row|
189
169
  values << headers.map { |h| row[h] }
190
170
  end
191
171
  else
192
- # We're probably using the native mysql driver gem, which will give us
193
- # a Mysql::Result object that responds to each_hash
194
172
  results.each_hash do |row|
195
173
  headers = row.keys
196
174
  values << headers.map { |h| row[h] }
@@ -224,7 +202,7 @@ module OneApm
224
202
  rescue => e
225
203
  begin
226
204
  # guarantees no throw from explain_sql
227
- ::OneApm::Agent.logger.error("Error getting query plan:", e)
205
+ OneApm::Manager.logger.error("Error getting query plan:", e)
228
206
  nil
229
207
  rescue
230
208
  # double exception. throw up your hands
@@ -267,10 +245,6 @@ module OneApm
267
245
  class ConnectionManager
268
246
  include Singleton
269
247
 
270
- # Returns a cached connection for a given ActiveRecord
271
- # configuration - these are stored or reopened as needed, and if
272
- # we cannot get one, we ignore it and move on without explaining
273
- # the sql
274
248
  def get_connection(config, &connector)
275
249
  @connections ||= {}
276
250
 
@@ -281,12 +255,11 @@ module OneApm
281
255
  begin
282
256
  @connections[config] = connector.call(config)
283
257
  rescue => e
284
- ::OneApm::Agent.logger.error("Caught exception trying to get connection to DB for explain.", e)
258
+ OneApm::Manager.logger.error("Caught exception trying to get connection to DB for explain.", e)
285
259
  nil
286
260
  end
287
261
  end
288
262
 
289
- # Closes all the connections in the internal connection cache
290
263
  def close_connections
291
264
  @connections ||= {}
292
265
  @connections.values.each do |connection|
@@ -27,7 +27,7 @@ module OneApm
27
27
  end
28
28
  end
29
29
 
30
- def metric_for_sql(sql) #THREAD_LOCAL_ACCESS
30
+ def metric_for_sql(sql)
31
31
  txn = OneApm::Transaction.tl_current
32
32
  metric = txn && txn.database_metric_name
33
33
  if metric.nil?
@@ -6,23 +6,6 @@ module OneApm
6
6
  module Agent
7
7
  module Datastores
8
8
 
9
- # Add Datastore tracing to a method. This properly generates the metrics
10
- # for OneApm's Datastore features. It does not capture the actual
11
- # query content into Transaction Traces. Use wrap if you want to provide
12
- # that functionality.
13
- #
14
- # @param [Class] clazz the class to instrument
15
- #
16
- # @param [String, Symbol] method_name the name of instance method to
17
- # instrument
18
- #
19
- # @param [String] product name of your datastore for use in metric naming, e.g. "Redis"
20
- #
21
- # @param [optional,String] operation the name of operation if different
22
- # than the instrumented method name
23
- #
24
- # @api public
25
- #
26
9
  def self.trace(clazz, method_name, product, operation = method_name)
27
10
  clazz.class_eval do
28
11
  method_name_without_oneapm = "#{method_name}_without_oneapm"
@@ -47,49 +30,6 @@ module OneApm
47
30
  end
48
31
  end
49
32
 
50
- # Wrap a call to a datastore and record OneApm Datastore metrics. This
51
- # method can be used when a collection (i.e. table or model name) is
52
- # known at runtime to be included in the metric naming. It is intended
53
- # for situations that the simpler OneApm::Agent::Datastores.trace can't
54
- # properly handle.
55
- #
56
- # To use this, wrap the datastore operation in the block passed to wrap.
57
- #
58
- # OneApm::Agent::Datastores.wrap("FauxDB", "find", "items") do
59
- # FauxDB.find(query)
60
- # end
61
- #
62
- # @param [String] product the datastore name for use in metric naming,
63
- # e.g. "FauxDB"
64
- #
65
- # @param [String,Symbol] operation the name of operation (e.g. "select"),
66
- # often named after the method that's being instrumented.
67
- #
68
- # @param [optional, String] collection the collection name for use in
69
- # statement-level metrics (i.e. table or model name)
70
- #
71
- # @param [Proc,#call] callback proc or other callable to invoke after
72
- # running the datastore block. Receives three arguments: result of the
73
- # yield, the most specific (scoped) metric name, and elapsed time of the
74
- # call. An example use is attaching SQL to Transaction Traces at the end
75
- # of a wrapped datastore call.
76
- #
77
- # callback = Proc.new do |result, metrics, elapsed|
78
- # OneApm::Agent::Datastores.notice_sql(query, metrics, elapsed)
79
- # end
80
- #
81
- # OneApm::Agent::Datastores.wrap("FauxDB", "find", "items", callback) do
82
- # FauxDB.find(query)
83
- # end
84
- #
85
- # **NOTE: THERE ARE SECURITY CONCERNS WHEN CAPTURING SQL!**
86
- # OneApm's Transaction Tracing and Slow SQL features will
87
- # attempt to apply obfuscation to the passed queries, but it is possible
88
- # for a query format to be unsupported and result in exposing user
89
- # information embedded within captured queries.
90
- #
91
- # @api public
92
- #
93
33
  def self.wrap(product, operation, collection = nil, callback = nil)
94
34
  return yield unless operation
95
35
 
@@ -108,64 +48,17 @@ module OneApm
108
48
  end
109
49
  end
110
50
 
111
- # Wrapper for simplifying attaching SQL queries during a transaction.
112
- #
113
- # If you are recording non-SQL data, please use the notice_statement
114
- # method instead.
115
- #
116
- # OneApm::Agent::Datastores.notice_sql(query, metrics, elapsed)
117
- #
118
- # @param [String] query the SQL text to be captured. Note that depending
119
- # on user settings, this string will be run through obfuscation, but
120
- # some dialects of SQL (or non-SQL queries) are not guaranteed to be
121
- # properly obfuscated by these routines!
122
- #
123
- # @param [String] scoped_metric The most specific metric relating to this
124
- # query. Typically the result of
125
- # OneApm::Agent::Datastores::MetricHelper#metrics_for
126
- #
127
- # @param [Float] elapsed the elapsed time during query execution
128
- #
129
- # **NOTE: THERE ARE SECURITY CONCERNS WHEN CAPTURING SQL!**
130
- # OneApm's Transaction Tracing and Slow SQL features will
131
- # attempt to apply obfuscation to the passed queries, but it is possible
132
- # for a query format to be unsupported and result in exposing user
133
- # information embedded within captured queries.
134
- #
135
51
  def self.notice_sql(query, scoped_metric, elapsed)
136
- agent = OneApm::Agent.instance
52
+ agent = OneApm::Manager.agent
137
53
  agent.transaction_sampler.notice_sql(query, nil, elapsed)
138
54
  agent.sql_sampler.notice_sql(query, scoped_metric, nil, elapsed)
139
55
  nil
140
56
  end
141
57
 
142
- # Wrapper for simplifying attaching non-SQL data statements to a
143
- # transaction. For instance, Mongo or CQL queries, Memcached or Redis
144
- # keys would all be appropriate data to attach as statements.
145
- #
146
- # Data passed to this method is NOT obfuscated by OneApm, so please
147
- # ensure that user information is obfuscated if the agent setting
148
- # `transaction_tracer.record_sql` is set to `obfuscated`
149
- #
150
- # OneApm::Agent::Datastores.notice_statement("key", elapsed)
151
- #
152
- # @param [String] statement text of the statement to capture.
153
- #
154
- # @param [Float] elapsed the elapsed time during query execution
155
- #
156
- # **NOTE: THERE ARE SECURITY CONCERNS WHEN CAPTURING STATEMENTS!**
157
- # This method will properly ignore statements when the user has turned
158
- # off capturing queries, but it is not able to obfuscate arbitrary data!
159
- # To prevent exposing user information embedded in captured queries,
160
- # please ensure all data passed to this method is safe to transmit to
161
- # OneApm.
162
- #
163
58
  def self.notice_statement(statement, elapsed)
164
- # Settings may change eventually, but for now we follow the same
165
- # capture rules as SQL for non-SQL statements.
166
59
  return unless OneApm::Agent::Database.should_record_sql?
167
60
 
168
- agent = OneApm::Agent.instance
61
+ agent = OneApm::Manager.agent
169
62
  agent.transaction_sampler.notice_nosql_statement(statement, elapsed)
170
63
  nil
171
64
  end