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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4759f9e2a49b073a72ef050065da0b3169782a50
4
- data.tar.gz: e06c21dc7767a5c5ee0b2371eb367cb3286b1231
3
+ metadata.gz: 2549e99a228ebc5192a1fa035a985afc7bac2ace
4
+ data.tar.gz: d52a272c4e52693f21c973c51f8fa3cdd72081c3
5
5
  SHA512:
6
- metadata.gz: 523b7b03147cb529a70bf76da7bdd1761621460169d4eeb74d972db31134eae5ab7d0430d693cd7e51d4699d66b71615de5b9a42b81ca45c8d7d4a23a3d2ddc1
7
- data.tar.gz: 60387048069ae8167d4f237070131090558fb44104b47af2e5e86597f44eb2dcbef8223da1516fc37c13684e2da1e8a827a86a26765c2ee4ed8c0b9656c39d44
6
+ metadata.gz: 786db6b474c198e117000456a33c46538d7a0cf343082556361b04a2b1db2f442f65e2e5f4cbaa7d88772741ee10989f9193bb90ad5c7e2a4493a01a571c380e
7
+ data.tar.gz: 1d3c27a588fa01c9606cb79ac4120b862b1e453be7e1422eda17fef366fe84362c4f8e92a05312be7e40a9d0cd90bfb05c717303d708c688f89c313ff6653126
data/lib/one_apm/agent.rb CHANGED
@@ -1,245 +1,238 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'one_apm/probe'
3
+ require 'socket'
4
+ require 'net/https'
5
+ require 'net/http'
6
+ require 'logger'
7
+ require 'zlib'
8
+ require 'stringio'
4
9
 
5
- require 'one_apm/support/collection_helper'
6
- require 'one_apm/support/timer_lib'
7
- require 'one_apm/support/json_wrapper'
8
- require 'one_apm/support/chained_call'
9
- require 'one_apm/support/rules_engine'
10
- require 'one_apm/support/http_clients/uri_util'
11
- require 'one_apm/support/system_info'
10
+ require 'one_apm/support/event_buffer/sampled_buffer'
11
+ require 'one_apm/configuration/autostart'
12
+ require 'one_apm/agent/harvester'
12
13
 
13
- require 'one_apm/metrics/metric_spec'
14
- require 'one_apm/metrics/metric_data'
15
- require 'one_apm/metrics/stats'
14
+ require 'one_apm/support/hostname'
15
+ require 'one_apm/support/environment_report'
16
16
 
17
- require 'one_apm/errors/noticed_error'
18
- require 'one_apm/errors/agent_errors'
19
-
20
- require 'one_apm/agent/agent'
21
- require 'one_apm/agent/cross_app/cross_app_monitor'
22
- require 'one_apm/support/method_tracer'
23
- require 'one_apm/agent/event/worker_loop'
24
- require 'one_apm/agent/event/event_loop'
25
- require 'one_apm/transaction/transaction_sample'
17
+ require 'one_apm/configuration'
26
18
 
27
- require 'one_apm/collector/containers/stats_engine'
28
- require 'one_apm/collector/containers/transaction_sampler'
29
- require 'one_apm/collector/containers/sql_sampler'
30
- require 'one_apm/collector/containers/error_collector'
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'
31
24
 
32
- require 'one_apm/agent/busy_calculator'
25
+ require 'one_apm/collector/forked_process_service'
33
26
  require 'one_apm/agent/database'
34
- require 'one_apm/agent/pipe/pipe_channel_manager'
35
-
36
- require 'one_apm/configuration'
37
-
38
- require 'one_apm/agent/sampler'
39
- require 'one_apm/agent/samplers/cpu_sampler'
40
- require 'one_apm/agent/samplers/memory_sampler'
41
- require 'one_apm/agent/samplers/object_sampler'
42
- require 'one_apm/agent/samplers/delayed_job_sampler'
43
- require 'one_apm/agent/samplers/vm_sampler'
27
+ require 'one_apm/support/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'
44
41
 
45
42
  module OneApm
46
43
  module Agent
47
- extend self
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
48
51
 
49
- @agent = nil
52
+ attr_reader :record_sql
53
+ attr_reader :javascript_instrumentor
50
54
 
51
- def instance
52
- return @agent if @agent
53
- OneApm::Agent.logger.warn("Agent unavailable as it hasn't been started.")
54
- OneApm::Agent.logger.warn(caller.join("\n"))
55
- nil
56
- end
55
+ attr_reader :cross_process_id
56
+ attr_reader :cross_app_encoding_bytes
57
+ attr_reader :cross_app_monitor
57
58
 
58
- def instance=(new_instance)
59
- @agent = new_instance
60
- end
59
+ attr_accessor :service
61
60
 
62
- def start(options = {})
63
- raise "Options must be a hash" unless Hash === options
64
- OneApm::Agent::PipeChannelManager.listener.start if options[:start_channel_listener]
65
- OneApm::Probe.init({:agent_enabled => true, :sync_startup => true}.merge(options))
66
- end
61
+ attr_reader :events
67
62
 
68
- alias_method :manual_start, :start
63
+ attr_reader :transaction_rules
69
64
 
70
- def shutdown(options={})
71
- instance.shutdown(options) if instance
72
- end
65
+ attr_reader :harvester
66
+ attr_reader :harvest_samplers
67
+ attr_reader :harvest_lock
73
68
 
74
- def restart
75
- OneApm::Agent.shutdown
76
- OneApm::Agent.instance.harvest_samplers.clear
77
- OneApm::Agent.instance.instance_variable_set(:@connect_state, :pending)
78
- OneApm::Agent.instance.instance_variable_set(:@worker_thread, nil)
79
- OneApm::Agent.instance.harvester.instance_variable_set(:@starting_pid, nil)
80
- OneApm::Probe.init({:agent_enabled => true, :sync_startup => true})
81
- end
82
-
83
- def logger
84
- @logger || StartupLogger.instance
85
- end
69
+ attr_reader :monotonic_gc_profiler
86
70
 
87
- def logger=(log)
88
- @logger = log
89
- end
71
+ def self.instance
72
+ @instance ||= self.new
73
+ end
90
74
 
91
- def config
92
- @config ||= OneApm::Configuration::Manager.new
93
- end
75
+ def self.config
76
+ OneApm::Manager.config
77
+ end
94
78
 
95
- def reset_config
96
- @config.reset_to_defaults
97
- end
79
+ def initialize
80
+ start_service
98
81
 
99
- def revert_to_default_configuration
100
- @config.remove_config_type(:manual)
101
- @config.remove_config_type(:server)
102
- end
82
+ @events = OneApm::Support::EventListener.new
103
83
 
104
- def record_metric(metric_name, value) #THREAD_LOCAL_ACCESS
105
- value_to_store = value
106
- value_to_store = OneApm::Metrics::Stats.create_from_hash(value) if value.is_a?(Hash)
107
- instance.stats_engine.tl_record_unscoped_metrics(metric_name, value_to_store)
108
- end
84
+ init_containers @events
85
+ OneApm::Agent::SyntheticsMonitor.new @events
109
86
 
110
- def increment_metric(metric_name, amount = 1) #THREAD_LOCAL_ACCESS
111
- instance.stats_engine.tl_record_unscoped_metrics(metric_name) do |stats|
112
- stats.increment_count(amount)
113
- end
114
- end
115
-
116
- def drop_buffered_data
117
- instance.drop_buffered_data
118
- end
87
+ @cross_app_monitor = OneApm::Agent::CrossAppMonitor.new(@events)
88
+ @transaction_rules = OneApm::Support::RulesEngine.new
89
+ @harvest_samplers = OneApm::Agent::SamplerCollection.new(@events)
90
+ @monotonic_gc_profiler = OneApm::Support::VM::MonotonicGCProfiler.new
91
+ @javascript_instrumentor = OneApm::Agent::JavascriptInstrumentor.new(@events)
119
92
 
120
- def add_instrumentation(file_pattern)
121
- OneApm::Probe.instance.add_instrumentation file_pattern
122
- end
93
+ @harvester = OneApm::Agent::Harvester.new(@events)
94
+ @after_fork_lock = Mutex.new
123
95
 
124
- def set_sql_obfuscator(type = :replace, &block)
125
- OneApm::Agent::Database.set_sql_obfuscator(type, &block)
126
- end
96
+ @connect_state = :pending
97
+ @connect_attempts = 0
98
+ @environment_report = nil
127
99
 
128
- def disable_sql_recording
129
- state = instance.set_record_sql(false)
130
- begin
131
- yield
132
- ensure
133
- instance.set_record_sql(state)
100
+ @harvest_lock = Mutex.new
134
101
  end
135
- end
136
102
 
137
- def disable_transaction_tracing
138
- state = instance.set_record_tt(false)
139
- begin
140
- yield
141
- ensure
142
- instance.set_record_tt(state)
103
+ def probe
104
+ OneApm::Probe.instance
143
105
  end
144
- end
145
-
146
- def ignore_transaction
147
- txn = OneApm::Transaction.tl_current
148
- txn.ignore! if txn
149
- end
150
106
 
151
- def ignore_apdex
152
- txn = OneApm::Transaction.tl_current
153
- txn.ignore_apdex! if txn
154
- end
107
+ def start_service
108
+ if OneApm::Manager.config[:monitor_mode] && !@service
109
+ @service = OneApm::Collector::CollectorService.new
110
+ end
111
+ end
155
112
 
156
- def ignore_enduser
157
- txn = OneApm::Transaction.tl_current
158
- txn.ignore_enduser! if txn
159
- end
113
+ def start
114
+ return unless agent_should_start?
160
115
 
161
- def disable_all_tracing
162
- instance.push_trace_execution_flag(false)
163
- yield
164
- ensure
165
- instance.pop_trace_execution_flag
166
- end
116
+ log_startup
117
+ check_config_and_start_agent
118
+ log_version_and_pid
167
119
 
168
- def record_custom_event(event_type, event_attrs)
169
- if instance && OneApm::Agent.config[:'custom_insights_events.enabled']
170
- instance.custom_event_aggregator.record(event_type, event_attrs)
120
+ events.subscribe(:finished_configuring) do
121
+ log_ignore_url_regexes
122
+ end
171
123
  end
172
- nil
173
- end
174
124
 
175
- def tl_is_execution_traced?
176
- OneApm::TransactionState.tl_get.is_execution_traced?
177
- end
125
+ def shutdown(options = {})
126
+ return if not started?
127
+ OneApm::Manager.logger.info "Starting Agent shutdown"
178
128
 
179
- def tl_is_transaction_traced?
180
- OneApm::TransactionState.tl_get.is_transaction_traced?
181
- end
129
+ stop_event_loop
130
+ untraced_graceful_disconnect
131
+ OneApm::Manager.revert_to_default_configuration
182
132
 
183
- def tl_is_sql_recorded?
184
- OneApm::TransactionState.tl_get.is_sql_recorded?
185
- end
186
-
187
- def ignore_error_filter(&block)
188
- if block
189
- OneApm::Collector::ErrorCollector.ignore_error_filter = block
190
- else
191
- OneApm::Collector::ErrorCollector.ignore_error_filter
133
+ @started = nil
134
+ OneApm::Probe.reset
192
135
  end
193
- end
194
136
 
195
- def notice_error(exception, options = {})
196
- Transaction.notice_error(exception, options)
197
- nil
198
- end
199
-
200
- def notice_sql(sql, metric, config, elapsed_time, state, &explainer)
201
- instance.transaction_sampler.notice_sql(sql, config, elapsed_time, state, &explainer)
202
- instance.sql_sampler.notice_sql(sql, metric, config, elapsed_time, state, &explainer)
203
- end
137
+ def agent_should_start?
138
+ return false if already_started? || disabled? || defer_for_background_jobs?
204
139
 
205
- def add_custom_parameters(params) #THREAD_LOCAL_ACCESS
206
- if params.is_a? Hash
207
- txn = Transaction.tl_current
208
- txn.add_custom_parameters(params) if txn
209
- else
210
- ::OneApm::Agent.logger.warn("Bad argument passed to #add_custom_parameters. Expected Hash but got #{params.class}")
140
+ unless app_name_configured?
141
+ OneApm::Manager.logger.error "No application name configured in #{probe.env} environment"
142
+ false
143
+ else
144
+ true
145
+ end
211
146
  end
212
- end
213
147
 
214
- def set_transaction_name(name, options={})
215
- Transaction.set_overriding_transaction_name(name, options[:category])
216
- end
148
+ def connect(options={})
149
+ opts = {
150
+ :keep_retrying => OneApm::Manager.config[:keep_retrying],
151
+ :force_reconnect => OneApm::Manager.config[:force_reconnect]
152
+ }.merge(options)
153
+
154
+ return unless should_connect?(opts[:force_reconnect])
155
+
156
+ OneApm::Manager.logger.debug "Connecting Process to OneApm: #$0"
157
+ query_server_for_configuration
158
+ @connected_pid = Process.pid
159
+ @connect_state = :connected
160
+ rescue OneApm::ForceDisconnectException => e
161
+ handle_force_disconnect(e)
162
+ rescue OneApm::LicenseException => e
163
+ handle_license_error(e)
164
+ rescue OneApm::UnrecoverableAgentException => e
165
+ handle_unrecoverable_agent_error(e)
166
+ rescue StandardError, Timeout::Error, OneApm::ServerConnectionException => e
167
+ log_error(e)
168
+ if opts[:keep_retrying]
169
+ note_connect_failure
170
+ OneApm::Manager.logger.info "Will re-attempt in #{connect_retry_period} seconds"
171
+ sleep connect_retry_period
172
+ retry
173
+ else
174
+ disconnect
175
+ end
176
+ rescue Exception => e
177
+ OneApm::Manager.logger.error "Exception of unexpected type during Agent#connect():", e
178
+
179
+ raise
180
+ end
217
181
 
218
- def get_transaction_name #THREAD_LOCAL_ACCESS
219
- txn = Transaction.tl_current
220
- if txn
221
- txn.best_name.sub(Regexp.new("\\A#{Regexp.escape(OneApm::TransactionNamer.prefix_for_category(txn))}"), '')
182
+ def graceful_disconnect
183
+ if connected?
184
+ begin
185
+ @service.request_timeout = 10
186
+
187
+ @events.notify(:before_shutdown)
188
+ transmit_data
189
+ transmit_event_data
190
+ transmit_utilization_data if OneApm::Manager.config[:collect_utilization]
191
+
192
+ if @connected_pid == $$ && !@service.kind_of?(OneApm::Collector::CollectorService)
193
+ OneApm::Manager.logger.debug "Sending OneApm service agent run shutdown message"
194
+ @service.shutdown(Time.now.to_f)
195
+ else
196
+ OneApm::Manager.logger.debug "This agent connected from parent process #{@connected_pid}--not sending shutdown"
197
+ end
198
+ OneApm::Manager.logger.debug "Graceful disconnect complete"
199
+ rescue Timeout::Error, StandardError => e
200
+ OneApm::Manager.logger.debug "Error when disconnecting #{e.class.name}: #{e.message}"
201
+ end
202
+ else
203
+ OneApm::Manager.logger.debug "Bypassing graceful disconnect - agent not connected"
204
+ end
222
205
  end
223
- end
224
206
 
225
- def subscribe(event_type, &handler)
226
- instance.events.subscribe( event_type, &handler )
207
+ def untraced_graceful_disconnect
208
+ OneApm::Manager.disable_all_tracing do
209
+ graceful_disconnect
210
+ end
211
+ rescue => e
212
+ OneApm::Manager.logger.error e
213
+ end
227
214
  end
228
215
 
229
- def notify(event_type, *args)
230
- instance.events.notify( event_type, *args )
231
- rescue
232
- OneApm::Agent.logger.debug "Ignoring exception during %p event notification" % [event_type]
233
- end
216
+ class ShimAgent < OneApm::Agent::Agent
217
+ def self.instance
218
+ @instance ||= self.new
219
+ end
234
220
 
235
- def browser_timing_header
236
- instance.javascript_instrumentor.browser_timing_header
237
- end
221
+ def initialize
222
+ super
223
+ @stats_engine.extend OneApm::Collector::StatsEngine::Shim
224
+ @transaction_sampler.extend OneApm::Collector::TransactionSampler::Shim
225
+ @sql_sampler.extend OneApm::Collector::SqlSampler::Shim
226
+ @error_collector.extend OneApm::Collector::ErrorCollector::Shim
227
+ end
238
228
 
239
- def require_test_helper
240
- path = File.join(__FILE__, '..', '..', '..', 'test', 'agent_helper')
241
- require File.expand_path(path)
229
+ def after_fork *args; end
230
+ def start *args; end
231
+ def shutdown *args; end
232
+ def merge_data_for_endpoint *args; end
233
+ def push_trace_execution_flag *args; end
234
+ def pop_trace_execution_flag *args; end
235
+ def browser_timing_header; "" end
242
236
  end
243
-
244
237
  end
245
238
  end
@@ -46,7 +46,7 @@ module OneApm
46
46
  # to tell the user what happened, since this is not an error
47
47
  # we can handle gracefully.
48
48
  def log_error(error)
49
- ::OneApm::Agent.logger.error "Error establishing connection with OneApm Service at #{@service.server}:", error
49
+ OneApm::Manager.logger.error "Error establishing connection with OneApm Service at #{@service.server}:", error
50
50
  end
51
51
 
52
52
  # When the server sends us an error with the license key, we
@@ -57,14 +57,14 @@ module OneApm
57
57
  # no longer try to connect to the server, saving the
58
58
  # application and the server load
59
59
  def handle_license_error(error)
60
- ::OneApm::Agent.logger.error( \
60
+ OneApm::Manager.logger.error( \
61
61
  error.message, \
62
62
  "Visit oneapm.com to obtain a valid license key, or to upgrade your account.")
63
63
  disconnect
64
64
  end
65
65
 
66
66
  def handle_unrecoverable_agent_error(error)
67
- ::OneApm::Agent.logger.error(error.message)
67
+ OneApm::Manager.logger.error(error.message)
68
68
  disconnect
69
69
  shutdown
70
70
  end
@@ -79,7 +79,7 @@ module OneApm
79
79
  # require calls in Rails environments, so this method should only
80
80
  # be called synchronously from on the main thread.
81
81
  def environment_for_connect
82
- Agent.config[:send_environment_info] ? Array(EnvironmentReport.new) : []
82
+ OneApm::Manager.config[:send_environment_info] ? Array(EnvironmentReport.new) : []
83
83
  end
84
84
 
85
85
  # We've seen objects in the environment report (Rails.env in
@@ -98,20 +98,20 @@ module OneApm
98
98
  {
99
99
  :pid => $$,
100
100
  :host => local_host,
101
- :app_name => Agent.config.app_names,
101
+ :app_name => OneApm::Manager.config.app_names,
102
102
  :language => 'ruby',
103
- :labels => Agent.config.parsed_labels,
103
+ :labels => OneApm::Manager.config.parsed_labels,
104
104
  :agent_version => OneApm::VERSION::STRING,
105
105
  :environment => @environment_report,
106
- :settings => Agent.config.to_collector_hash,
107
- :high_security => Agent.config[:high_security],
106
+ :settings => OneApm::Manager.config.to_collector_hash,
107
+ :high_security => OneApm::Manager.config[:high_security],
108
108
  :identifier => "ruby:#{local_host}"
109
109
  }
110
110
  end
111
111
 
112
112
  # apdex_f is always 4 times the apdex_t
113
113
  def apdex_f
114
- (4 * Agent.config[:apdex_t]).to_f
114
+ (4 * OneApm::Manager.config[:apdex_t]).to_f
115
115
  end
116
116
 
117
117
  # Sets the collector host and connects to the server, then
@@ -137,16 +137,16 @@ module OneApm
137
137
 
138
138
  @service.agent_id = config_data['agent_run_id'] if @service
139
139
 
140
- ::OneApm::Agent.logger.debug "Server provided config: #{config_data.inspect}"
141
- server_config = OneApm::Configuration::ServerSource.new(config_data, Agent.config)
142
- Agent.config.replace_or_add_config(server_config)
140
+ OneApm::Manager.logger.debug "Server provided config: #{config_data.inspect}"
141
+ server_config = OneApm::Configuration::ServerSource.new(config_data, OneApm::Manager.config)
142
+ OneApm::Manager.config.replace_or_add_config(server_config)
143
143
  log_connection!(config_data) if @service
144
144
 
145
145
  @transaction_rules = OneApm::Support::RulesEngine.create_transaction_rules(config_data)
146
146
  @stats_engine.metric_rules = OneApm::Support::RulesEngine.create_metric_rules(config_data)
147
147
 
148
148
  # If you're adding something else here to respond to the server-side config,
149
- # use Agent.instance.events.subscribe(:finished_configuring) callback instead!
149
+ # use OneApm::Manager.agent.events.subscribe(:finished_configuring) callback instead!
150
150
  end
151
151
 
152
152
  def local_host
@@ -156,9 +156,9 @@ module OneApm
156
156
  # Logs when we connect to the server, for debugging purposes
157
157
  # - makes sure we know if an agent has not connected
158
158
  def log_connection!(config_data)
159
- ::OneApm::Agent.logger.debug "Connected to OneApm Service at #{@service.collector.name}"
160
- ::OneApm::Agent.logger.debug "Agent Run = #{@service.agent_id}."
161
- ::OneApm::Agent.logger.debug "Connection data = #{config_data.inspect}"
159
+ OneApm::Manager.logger.debug "Connected to OneApm Service at #{@service.collector.name}"
160
+ OneApm::Manager.logger.debug "Agent Run = #{@service.agent_id}."
161
+ OneApm::Manager.logger.debug "Connection data = #{config_data.inspect}"
162
162
  if config_data['messages'] && config_data['messages'].any?
163
163
  log_collector_messages(config_data['messages'])
164
164
  end
@@ -166,7 +166,7 @@ module OneApm
166
166
 
167
167
  def log_collector_messages(messages)
168
168
  messages.each do |message|
169
- ::OneApm::Agent.logger.send(message['level'].downcase, message['message'])
169
+ OneApm::Manager.logger.send(message['level'].downcase, message['message'])
170
170
  end
171
171
  end
172
172
  end