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
@@ -179,7 +179,7 @@ module OneApm
179
179
 
180
180
  def collect_explain_plans!
181
181
  return unless Agent::Database.should_collect_explain_plans?
182
- threshold = Agent.config[:'transaction_tracer.explain_threshold']
182
+ threshold = OneApm::Manager.config[:'transaction_tracer.explain_threshold']
183
183
  each_segment do |segment|
184
184
  if segment[:sql] && segment.duration > threshold
185
185
  segment[:explain_plan] = segment.explain_sql
@@ -62,7 +62,7 @@ module OneApm
62
62
  end
63
63
 
64
64
  def segment_limit
65
- Agent.config[:'transaction_tracer.limit_segments']
65
+ OneApm::Manager.config[:'transaction_tracer.limit_segments']
66
66
  end
67
67
 
68
68
  def trace_entry(time)
@@ -71,7 +71,7 @@ module OneApm
71
71
  @current_segment.add_called_segment(segment)
72
72
  @current_segment = segment
73
73
  if @sample.count_segments == segment_limit()
74
- ::OneApm::Agent.logger.debug("Segment limit of #{segment_limit} reached, ceasing collection.")
74
+ OneApm::Manager.logger.debug("Segment limit of #{segment_limit} reached, ceasing collection.")
75
75
  end
76
76
  else
77
77
  if @current_segment.is_a?(PlaceholderSegment)
@@ -100,7 +100,7 @@ module OneApm
100
100
  # Should never get called twice, but in a rare case that we can't
101
101
  # reproduce in house it does. log forensics and return gracefully
102
102
  if @sample.finished
103
- ::OneApm::Agent.logger.error "Unexpected double-finish_trace of Transaction Trace Object: \n#{@sample.to_s}"
103
+ OneApm::Manager.logger.error "Unexpected double-finish_trace of Transaction Trace Object: \n#{@sample.to_s}"
104
104
  return
105
105
  end
106
106
  @sample.root_segment.end_trace(time.to_f - @sample_start)
@@ -117,13 +117,13 @@ module OneApm
117
117
 
118
118
  TT_THRESHOLD_KEY = :'transaction_tracer.transaction_threshold'
119
119
 
120
- def transaction_trace_threshold #THREAD_LOCAL_ACCESS
120
+ def transaction_trace_threshold
121
121
  state = TransactionState.tl_get
122
- source_class = Agent.config.source(TT_THRESHOLD_KEY).class
122
+ source_class = OneApm::Manager.config.source(TT_THRESHOLD_KEY).class
123
123
  if source_class == Configuration::DefaultSource && state.current_transaction
124
124
  state.current_transaction.apdex_t * 4
125
125
  else
126
- Agent.config[TT_THRESHOLD_KEY]
126
+ OneApm::Manager.config[TT_THRESHOLD_KEY]
127
127
  end
128
128
  end
129
129
 
@@ -144,7 +144,7 @@ module OneApm
144
144
  end
145
145
 
146
146
  def set_request_params(params)
147
- if Agent.config[:capture_params]
147
+ if OneApm::Manager.config[:capture_params]
148
148
  params = normalize_params(params)
149
149
  @sample.params[:request_params].merge!(params)
150
150
  @sample.params[:request_params].delete :controller
@@ -39,7 +39,7 @@ module OneApm
39
39
  # This starts the timer for the transaction.
40
40
  def reset(transaction=nil)
41
41
  # We purposefully don't reset @untraced, @record_tt and @record_sql
42
- # since those are managed by OneApm::Agent.disable_* calls explicitly
42
+ # since those are managed by OneApm::Manager.disable_* calls explicitly
43
43
  # and (more importantly) outside the scope of a transaction
44
44
 
45
45
  @timings = nil
@@ -5,7 +5,7 @@ module OneApm
5
5
 
6
6
  MAJOR = 1
7
7
  MINOR = 1
8
- TINY = 2
8
+ TINY = 3
9
9
 
10
10
  STRING = [MAJOR, MINOR, TINY].compact.join('.')
11
11
 
@@ -10,7 +10,7 @@ module Sequel
10
10
  OneApm::Agent::Instrumentation::ActiveRecordHelper
11
11
 
12
12
  # Instrument all queries that go through #execute_query.
13
- def log_yield(sql, args=nil) #THREAD_LOCAL_ACCESS
13
+ def log_yield(sql, args=nil)
14
14
  state = OneApm::TransactionState.tl_get
15
15
  return super unless state.is_execution_traced?
16
16
 
@@ -23,7 +23,7 @@ module Sequel
23
23
  record_metrics(sql, args, duration)
24
24
  notice_sql(state, sql, args, t0, t1)
25
25
  rescue => err
26
- OneApm::Agent.logger.debug "while recording metrics for Sequel", err
26
+ OneApm::Manager.logger.debug "while recording metrics for Sequel", err
27
27
  end
28
28
 
29
29
  return rval
@@ -31,9 +31,9 @@ module Sequel
31
31
 
32
32
  # Record metrics for the specified +sql+ and +args+ using the specified
33
33
  # +duration+.
34
- def record_metrics(sql, args, duration) #THREAD_LOCAL_ACCESS
34
+ def record_metrics(sql, args, duration)
35
35
  primary_metric = primary_metric_for(sql, args)
36
- engine = OneApm::Agent.instance.stats_engine
36
+ engine = OneApm::Manager.agent.stats_engine
37
37
 
38
38
  metrics = rollup_metrics_for(primary_metric)
39
39
  metrics << remote_service_metric(*self.opts.values_at(:adapter, :host)) if self.opts.key?(:adapter)
@@ -49,7 +49,7 @@ module Sequel
49
49
  # +finish+ times.
50
50
  def notice_sql(state, sql, args, start, finish)
51
51
  metric = primary_metric_for(sql, args)
52
- agent = OneApm::Agent.instance
52
+ agent = OneApm::Manager.agent
53
53
  duration = finish - start
54
54
  stack = state.traced_method_stack
55
55
 
@@ -59,7 +59,7 @@ module Sequel
59
59
  if THREAD_SAFE_CONNECTION_POOL_CLASSES.include?(self.pool.class)
60
60
  self[ sql ].explain
61
61
  else
62
- OneApm::Agent.logger.log_once(:info, :sequel_explain_skipped, "Not running SQL explains because Sequel is not in recognized multi-threaded mode")
62
+ OneApm::Manager.logger.log_once(:info, :sequel_explain_skipped, "Not running SQL explains because Sequel is not in recognized multi-threaded mode")
63
63
  nil
64
64
  end
65
65
  end
@@ -78,7 +78,7 @@ module Sequel
78
78
 
79
79
  end # module OneApmInstrumentation
80
80
 
81
- OneApm::Agent.logger.debug "Registering the :oneapm_instrumentation extension."
81
+ OneApm::Manager.logger.debug "Registering the :oneapm_instrumentation extension."
82
82
  Database.register_extension(:oneapm_instrumentation, OneApmInstrumentation)
83
83
 
84
84
  end # module Sequel
data/oneapm.yml CHANGED
@@ -1,20 +1,20 @@
1
1
  #
2
- # OneApm RubyAgent Configuration
2
+ # OneApm Ruby探针配置
3
3
  #
4
4
 
5
5
  common: &default_settings
6
6
 
7
7
  license_key: 'please-paste-your-license-key-here'
8
8
 
9
- # This app_name will be the application name in oneapm.com in your account.
9
+ # 您在这里填写的app_name会显示在OneAPM的管理后台界面中。
10
10
  #
11
- # If you change this name, a new application will appear in your account with
12
- # the new name. and data will stop reporting to the app with the old name.
11
+ # 如果您修改了此处的app_name,一个新的应用会出现在后台,
12
+ # 数据会上传到这个新应用,并停止向旧的应用上传数据。
13
13
  #
14
14
  app_name: My Application
15
15
 
16
16
  #
17
- # Environment-specific settings
17
+ # 环境相关配置
18
18
  #
19
19
 
20
20
  production:
@@ -23,7 +23,7 @@ production:
23
23
 
24
24
  development:
25
25
  <<: *default_settings
26
- # Turn on communication to OneApm service in development mode
26
+ # development模式下,探针开启并上传性能数据
27
27
  monitor_mode: true
28
28
  app_name: My Application (Development)
29
29
 
@@ -31,7 +31,6 @@ test:
31
31
  <<: *default_settings
32
32
  monitor_mode: false
33
33
 
34
- # Staging environment which behaves identically to production.
35
34
  staging:
36
35
  <<: *default_settings
37
36
  monitor_mode: true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oneapm_rpm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - oneapm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-08 00:00:00.000000000 Z
11
+ date: 2015-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -224,7 +224,6 @@ files:
224
224
  - lib/initializers/other.rb
225
225
  - lib/initializers/rails.rb
226
226
  - lib/one_apm/agent.rb
227
- - lib/one_apm/agent/agent.rb
228
227
  - lib/one_apm/agent/agent/connect.rb
229
228
  - lib/one_apm/agent/agent/container_data_manager.rb
230
229
  - lib/one_apm/agent/agent/forkable_dispatcher_functions.rb
@@ -245,15 +244,9 @@ files:
245
244
  - lib/one_apm/agent/datastores/mongo/metric_translator.rb
246
245
  - lib/one_apm/agent/datastores/mongo/obfuscator.rb
247
246
  - lib/one_apm/agent/datastores/mongo/statement_formatter.rb
248
- - lib/one_apm/agent/event/event_listener.rb
249
- - lib/one_apm/agent/event/event_loop.rb
250
- - lib/one_apm/agent/event/timer.rb
251
- - lib/one_apm/agent/event/worker_loop.rb
252
247
  - lib/one_apm/agent/harvester.rb
253
248
  - lib/one_apm/agent/inbound_request_monitor.rb
254
249
  - lib/one_apm/agent/javascript_instrumentor.rb
255
- - lib/one_apm/agent/pipe/pipe_channel_manager.rb
256
- - lib/one_apm/agent/pipe/pipe_service.rb
257
250
  - lib/one_apm/agent/sampler.rb
258
251
  - lib/one_apm/agent/sampler_collection.rb
259
252
  - lib/one_apm/agent/samplers/cpu_sampler.rb
@@ -282,6 +275,7 @@ files:
282
275
  - lib/one_apm/collector/containers/transaction_event_aggregator.rb
283
276
  - lib/one_apm/collector/containers/transaction_sampler.rb
284
277
  - lib/one_apm/collector/containers/utilization_data.rb
278
+ - lib/one_apm/collector/forked_process_service.rb
285
279
  - lib/one_apm/collector/stats_engine/gc_profiler.rb
286
280
  - lib/one_apm/collector/stats_engine/metric_stats.rb
287
281
  - lib/one_apm/collector/stats_engine/stats_hash.rb
@@ -313,6 +307,7 @@ files:
313
307
  - lib/one_apm/inst/background_job/resque.rb
314
308
  - lib/one_apm/inst/background_job/sidekiq.rb
315
309
  - lib/one_apm/inst/dispatcher/passenger.rb
310
+ - lib/one_apm/inst/dispatcher/puma.rb
316
311
  - lib/one_apm/inst/dispatcher/rainbows.rb
317
312
  - lib/one_apm/inst/framework/grape.rb
318
313
  - lib/one_apm/inst/framework/padrino.rb
@@ -356,6 +351,7 @@ files:
356
351
  - lib/one_apm/logger/audit_logger.rb
357
352
  - lib/one_apm/logger/memory_logger.rb
358
353
  - lib/one_apm/logger/null_logger.rb
354
+ - lib/one_apm/manager.rb
359
355
  - lib/one_apm/metrics/metric_data.rb
360
356
  - lib/one_apm/metrics/metric_spec.rb
361
357
  - lib/one_apm/metrics/stats.rb
@@ -374,10 +370,15 @@ files:
374
370
  - lib/one_apm/support/dotted_hash.rb
375
371
  - lib/one_apm/support/encoders.rb
376
372
  - lib/one_apm/support/environment_report.rb
373
+ - lib/one_apm/support/event/event_listener.rb
374
+ - lib/one_apm/support/event/event_loop.rb
375
+ - lib/one_apm/support/event/timer.rb
376
+ - lib/one_apm/support/event/worker_loop.rb
377
377
  - lib/one_apm/support/event_buffer.rb
378
378
  - lib/one_apm/support/event_buffer/sampled_buffer.rb
379
379
  - lib/one_apm/support/event_buffer/sized_buffer.rb
380
380
  - lib/one_apm/support/event_buffer/synthetics_event_buffer.rb
381
+ - lib/one_apm/support/forked_process_channel.rb
381
382
  - lib/one_apm/support/helper.rb
382
383
  - lib/one_apm/support/hostname.rb
383
384
  - lib/one_apm/support/http_clients/curb_wrappers.rb
@@ -1,283 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'socket'
4
- require 'net/https'
5
- require 'net/http'
6
- require 'logger'
7
- require 'zlib'
8
- require 'stringio'
9
-
10
- require 'one_apm/support/event_buffer/sampled_buffer'
11
- require 'one_apm/configuration/autostart'
12
- require 'one_apm/agent/harvester'
13
-
14
- require 'one_apm/support/hostname'
15
- require 'one_apm/support/environment_report'
16
-
17
- require 'one_apm/configuration'
18
-
19
- require 'one_apm/collector/collector_service'
20
- require 'one_apm/collector/containers/agent_command_router'
21
- require 'one_apm/collector/containers/transaction_event_aggregator'
22
- require 'one_apm/collector/containers/custom_event_aggregator'
23
- require 'one_apm/collector/containers/utilization_data'
24
-
25
- require 'one_apm/agent/pipe/pipe_service'
26
- require 'one_apm/agent/database'
27
- require 'one_apm/agent/event/event_listener'
28
- require 'one_apm/agent/cross_app/cross_app_monitor'
29
- require 'one_apm/agent/synthetics_monitor'
30
- require 'one_apm/support/event_buffer/synthetics_event_buffer'
31
- require 'one_apm/agent/sampler_collection'
32
- require 'one_apm/agent/javascript_instrumentor'
33
- require 'one_apm/support/vm/monotonic_gc_profiler'
34
-
35
- require 'one_apm/agent/agent/start'
36
- require 'one_apm/agent/agent/start_worker_thread'
37
- require 'one_apm/agent/agent/connect'
38
- require 'one_apm/agent/agent/helpers'
39
- require 'one_apm/agent/agent/container_data_manager'
40
- require 'one_apm/agent/agent/forkable_dispatcher_functions'
41
-
42
- module OneApm
43
- module Agent
44
- class Agent
45
- include OneApm::Agent::Agent::Start
46
- include OneApm::Agent::Agent::StartWorkerThread
47
- include OneApm::Agent::Agent::Connect
48
- include OneApm::Agent::Agent::Helpers
49
- include OneApm::Agent::Agent::ContainerDataManager
50
- include OneApm::Agent::Agent::ForkableDispatcherFunctions
51
-
52
- # whether we should record raw, obfuscated, or no sql
53
- attr_reader :record_sql
54
- # builder for JS agent scripts to inject
55
- attr_reader :javascript_instrumentor
56
- # cross application tracing ids and encoding
57
- attr_reader :cross_process_id
58
- attr_reader :cross_app_encoding_bytes
59
- attr_reader :cross_app_monitor
60
- # service for communicating with collector
61
- attr_accessor :service
62
- # Global events dispatcher. This will provides our primary mechanism
63
- # for agent-wide events, such as finishing configuration, error notification
64
- # and request before/after from Rack.
65
- attr_reader :events
66
- # Transaction and metric renaming rules as provided by the
67
- # collector on connect. The former are applied during txns,
68
- # the latter during harvest.
69
- attr_reader :transaction_rules
70
- # Responsbile for restarting the harvest thread
71
- attr_reader :harvester
72
- attr_reader :harvest_samplers
73
- attr_reader :harvest_lock
74
- # GC::Profiler.total_time is not monotonic so we wrap it.
75
- attr_reader :monotonic_gc_profiler
76
-
77
- def self.instance
78
- @instance ||= self.new
79
- end
80
-
81
- def self.config
82
- OneApm::Agent.config
83
- end
84
-
85
- def initialize
86
- # This should be handled with a configuration callback
87
- start_service_if_needed
88
-
89
- @events = OneApm::Agent::EventListener.new
90
-
91
- init_containers @events
92
- OneApm::Agent::SyntheticsMonitor.new @events
93
-
94
- @cross_app_monitor = OneApm::Agent::CrossAppMonitor.new(@events)
95
- @transaction_rules = OneApm::Support::RulesEngine.new
96
- @harvest_samplers = OneApm::Agent::SamplerCollection.new(@events)
97
- @monotonic_gc_profiler = OneApm::Support::VM::MonotonicGCProfiler.new
98
- @javascript_instrumentor = OneApm::Agent::JavascriptInstrumentor.new(@events)
99
-
100
- @harvester = OneApm::Agent::Harvester.new(@events)
101
- @after_fork_lock = Mutex.new
102
-
103
- @connect_state = :pending
104
- @connect_attempts = 0
105
- @environment_report = nil
106
-
107
- @harvest_lock = Mutex.new
108
- end
109
-
110
- def probe
111
- OneApm::Probe.instance
112
- end
113
-
114
- def start_service_if_needed
115
- if Agent.config[:monitor_mode] && !@service
116
- @service = OneApm::Collector::CollectorService.new
117
- end
118
- end
119
-
120
- def start
121
- return unless agent_should_start?
122
-
123
- log_startup
124
- check_config_and_start_agent
125
- log_version_and_pid
126
-
127
- events.subscribe(:finished_configuring) do
128
- log_ignore_url_regexes
129
- end
130
- end
131
-
132
- # Attempt a graceful shutdown of the agent, running the worker
133
- # loop if it exists and is running.
134
- #
135
- # Options:
136
- # :force_send => (true/false) # force the agent to send data
137
- def shutdown(options={})
138
- return if not started?
139
- ::OneApm::Agent.logger.info "Starting Agent shutdown"
140
-
141
- stop_event_loop
142
- untraced_graceful_disconnect
143
- OneApm::Agent.revert_to_default_configuration
144
-
145
- @started = nil
146
- OneApm::Probe.reset
147
- end
148
-
149
- # Check to see if the agent should start, returning +true+ if it should.
150
- def agent_should_start?
151
- return false if already_started? || disabled? || defer_for_background_jobs?
152
-
153
- unless app_name_configured?
154
- OneApm::Agent.logger.error "No application name configured.",
155
- "The Agent cannot start without at least one. Please check your ",
156
- "oneapm.yml and ensure that it is valid and has at least one ",
157
- "value set for app_name in the #{probe.env} ",
158
- "environment."
159
- return false
160
- end
161
-
162
- true
163
- end
164
-
165
- # Connect to the server and validate the license. If successful,
166
- # connected? returns true when finished. If not successful, you can
167
- # keep calling this. Return false if we could not establish a
168
- # connection with the server and we should not retry, such as if
169
- # there's a bad license key.
170
- #
171
- # Set keep_retrying=false to disable retrying and return asap, such as when
172
- # invoked in the foreground. Otherwise this runs until a successful
173
- # connection is made, or the server rejects us.
174
- #
175
- # * <tt>:keep_retrying => false</tt> to only try to connect once, and
176
- # return with the connection set to nil. This ensures we may try again
177
- # later (default true).
178
- # * <tt>force_reconnect => true</tt> if you want to establish a new connection
179
- # to the server before running the worker loop. This means you get a separate
180
- # agent run and OneApm sees it as a separate instance (default is false).
181
- def connect(options={})
182
- begin
183
- defaults = {
184
- :keep_retrying => Agent.config[:keep_retrying],
185
- :force_reconnect => Agent.config[:force_reconnect]
186
- }
187
- opts = defaults.merge(options)
188
-
189
- return unless should_connect?(opts[:force_reconnect])
190
-
191
- ::OneApm::Agent.logger.debug "Connecting Process to OneApm: #$0"
192
- query_server_for_configuration
193
- @connected_pid = Process.pid
194
- @connect_state = :connected
195
- rescue OneApm::ForceDisconnectException => e
196
- handle_force_disconnect(e)
197
- rescue OneApm::LicenseException => e
198
- handle_license_error(e)
199
- rescue OneApm::UnrecoverableAgentException => e
200
- handle_unrecoverable_agent_error(e)
201
- rescue StandardError, Timeout::Error, OneApm::ServerConnectionException => e
202
- log_error(e)
203
- if opts[:keep_retrying]
204
- note_connect_failure
205
- ::OneApm::Agent.logger.info "Will re-attempt in #{connect_retry_period} seconds"
206
- sleep connect_retry_period
207
- retry
208
- else
209
- disconnect
210
- end
211
- rescue Exception => e
212
- ::OneApm::Agent.logger.error "Exception of unexpected type during Agent#connect():", e
213
-
214
- raise
215
- end
216
- end
217
-
218
- # This method contacts the server to send remaining data and
219
- # let the server know that the agent is shutting down - this
220
- # allows us to do things like accurately set the end of the
221
- # lifetime of the process
222
- #
223
- # If this process comes from a parent process, it will not
224
- # disconnect, so that the parent process can continue to send data
225
- def graceful_disconnect
226
- if connected?
227
- begin
228
- @service.request_timeout = 10
229
-
230
- @events.notify(:before_shutdown)
231
- transmit_data
232
- transmit_event_data
233
- transmit_utilization_data if OneApm::Agent.config[:collect_utilization]
234
-
235
- if @connected_pid == $$ && !@service.kind_of?(OneApm::Collector::CollectorService)
236
- ::OneApm::Agent.logger.debug "Sending OneApm service agent run shutdown message"
237
- @service.shutdown(Time.now.to_f)
238
- else
239
- ::OneApm::Agent.logger.debug "This agent connected from parent process #{@connected_pid}--not sending shutdown"
240
- end
241
- ::OneApm::Agent.logger.debug "Graceful disconnect complete"
242
- rescue Timeout::Error, StandardError => e
243
- ::OneApm::Agent.logger.debug "Error when disconnecting #{e.class.name}: #{e.message}"
244
- end
245
- else
246
- ::OneApm::Agent.logger.debug "Bypassing graceful disconnect - agent not connected"
247
- end
248
- end
249
-
250
- def untraced_graceful_disconnect
251
- begin
252
- OneApm::Agent.disable_all_tracing do
253
- graceful_disconnect
254
- end
255
- rescue => e
256
- ::OneApm::Agent.logger.error e
257
- end
258
- end
259
- end
260
-
261
- class ShimAgent < OneApm::Agent::Agent
262
- def self.instance
263
- @instance ||= self.new
264
- end
265
-
266
- def initialize
267
- super
268
- @stats_engine.extend OneApm::Collector::StatsEngine::Shim
269
- @transaction_sampler.extend OneApm::Collector::TransactionSampler::Shim
270
- @sql_sampler.extend OneApm::Collector::SqlSampler::Shim
271
- @error_collector.extend OneApm::Collector::ErrorCollector::Shim
272
- end
273
-
274
- def after_fork *args; end
275
- def start *args; end
276
- def shutdown *args; end
277
- def merge_data_for_endpoint *args; end
278
- def push_trace_execution_flag *args; end
279
- def pop_trace_execution_flag *args; end
280
- def browser_timing_header; "" end
281
- end
282
- end
283
- end