oneapm_rpm 1.1.0

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 (234) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +30 -0
  3. data/.rubocop.yml +725 -0
  4. data/Gemfile +3 -0
  5. data/Guardfile +7 -0
  6. data/LICENSE +1 -0
  7. data/README.md +3 -0
  8. data/config/cert/cacert.pem +1177 -0
  9. data/config/database.yml +5 -0
  10. data/lib/initializers/goliath.rb +11 -0
  11. data/lib/initializers/other.rb +1 -0
  12. data/lib/initializers/rails.rb +15 -0
  13. data/lib/one_apm/agent.rb +253 -0
  14. data/lib/one_apm/agent/agent.rb +283 -0
  15. data/lib/one_apm/agent/agent/connect.rb +175 -0
  16. data/lib/one_apm/agent/agent/container_data_manager.rb +218 -0
  17. data/lib/one_apm/agent/agent/forkable_dispatcher_functions.rb +96 -0
  18. data/lib/one_apm/agent/agent/helpers.rb +45 -0
  19. data/lib/one_apm/agent/agent/start.rb +226 -0
  20. data/lib/one_apm/agent/agent/start_worker_thread.rb +148 -0
  21. data/lib/one_apm/agent/busy_calculator.rb +115 -0
  22. data/lib/one_apm/agent/cross_app/cross_app_monitor.rb +181 -0
  23. data/lib/one_apm/agent/cross_app/cross_app_tracing.rb +336 -0
  24. data/lib/one_apm/agent/database.rb +308 -0
  25. data/lib/one_apm/agent/database/active_record_helper.rb +80 -0
  26. data/lib/one_apm/agent/database/obfuscation_helpers.rb +76 -0
  27. data/lib/one_apm/agent/database/obfuscator.rb +78 -0
  28. data/lib/one_apm/agent/database/postgres_explain_obfuscator.rb +45 -0
  29. data/lib/one_apm/agent/datastores.rb +175 -0
  30. data/lib/one_apm/agent/datastores/metric_helper.rb +83 -0
  31. data/lib/one_apm/agent/datastores/mongo.rb +27 -0
  32. data/lib/one_apm/agent/datastores/mongo/metric_translator.rb +189 -0
  33. data/lib/one_apm/agent/datastores/mongo/obfuscator.rb +37 -0
  34. data/lib/one_apm/agent/datastores/mongo/statement_formatter.rb +51 -0
  35. data/lib/one_apm/agent/event/event_listener.rb +40 -0
  36. data/lib/one_apm/agent/event/event_loop.rb +191 -0
  37. data/lib/one_apm/agent/event/worker_loop.rb +97 -0
  38. data/lib/one_apm/agent/harvester.rb +48 -0
  39. data/lib/one_apm/agent/inbound_request_monitor.rb +30 -0
  40. data/lib/one_apm/agent/javascript_instrumentor.rb +186 -0
  41. data/lib/one_apm/agent/pipe/pipe_channel_manager.rb +275 -0
  42. data/lib/one_apm/agent/pipe/pipe_service.rb +81 -0
  43. data/lib/one_apm/agent/sampler.rb +55 -0
  44. data/lib/one_apm/agent/sampler_collection.rb +65 -0
  45. data/lib/one_apm/agent/samplers/cpu_sampler.rb +49 -0
  46. data/lib/one_apm/agent/samplers/delayed_job_sampler.rb +109 -0
  47. data/lib/one_apm/agent/samplers/memory_sampler.rb +144 -0
  48. data/lib/one_apm/agent/samplers/object_sampler.rb +22 -0
  49. data/lib/one_apm/agent/samplers/vm_sampler.rb +124 -0
  50. data/lib/one_apm/agent/synthetics_monitor.rb +48 -0
  51. data/lib/one_apm/agent/threading/agent_thread.rb +74 -0
  52. data/lib/one_apm/agent/threading/backtrace_node.rb +133 -0
  53. data/lib/one_apm/agent/threading/backtrace_service.rb +259 -0
  54. data/lib/one_apm/agent/threading/thread_profile.rb +155 -0
  55. data/lib/one_apm/collector/collector/helper.rb +139 -0
  56. data/lib/one_apm/collector/collector/http_connection.rb +254 -0
  57. data/lib/one_apm/collector/collector/server_methods.rb +71 -0
  58. data/lib/one_apm/collector/collector_service.rb +123 -0
  59. data/lib/one_apm/collector/commands/agent_command.rb +17 -0
  60. data/lib/one_apm/collector/commands/thread_profiler_session.rb +108 -0
  61. data/lib/one_apm/collector/commands/xray_session.rb +53 -0
  62. data/lib/one_apm/collector/commands/xray_session_collection.rb +156 -0
  63. data/lib/one_apm/collector/containers/agent_command_router.rb +153 -0
  64. data/lib/one_apm/collector/containers/custom_event_aggregator.rb +94 -0
  65. data/lib/one_apm/collector/containers/error_collector.rb +349 -0
  66. data/lib/one_apm/collector/containers/sql_sampler.rb +331 -0
  67. data/lib/one_apm/collector/containers/stats_engine.rb +34 -0
  68. data/lib/one_apm/collector/containers/transaction_event_aggregator.rb +249 -0
  69. data/lib/one_apm/collector/containers/transaction_sampler.rb +352 -0
  70. data/lib/one_apm/collector/containers/utilization_data.rb +36 -0
  71. data/lib/one_apm/collector/stats_engine/gc_profiler.rb +106 -0
  72. data/lib/one_apm/collector/stats_engine/metric_stats.rb +243 -0
  73. data/lib/one_apm/collector/stats_engine/stats_hash.rb +105 -0
  74. data/lib/one_apm/configuration.rb +429 -0
  75. data/lib/one_apm/configuration/autostart.rb +41 -0
  76. data/lib/one_apm/configuration/default_source.rb +1026 -0
  77. data/lib/one_apm/configuration/environment_source.rb +113 -0
  78. data/lib/one_apm/configuration/high_security_source.rb +56 -0
  79. data/lib/one_apm/configuration/manual_source.rb +13 -0
  80. data/lib/one_apm/configuration/server_source.rb +60 -0
  81. data/lib/one_apm/configuration/yaml_source.rb +134 -0
  82. data/lib/one_apm/errors/agent_errors.rb +26 -0
  83. data/lib/one_apm/errors/internal_agent_error.rb +16 -0
  84. data/lib/one_apm/errors/noticed_error.rb +79 -0
  85. data/lib/one_apm/frameworks/external.rb +15 -0
  86. data/lib/one_apm/frameworks/rails.rb +103 -0
  87. data/lib/one_apm/frameworks/rails3.rb +37 -0
  88. data/lib/one_apm/frameworks/rails4.rb +21 -0
  89. data/lib/one_apm/frameworks/ruby.rb +21 -0
  90. data/lib/one_apm/frameworks/sinatra.rb +12 -0
  91. data/lib/one_apm/inst/3rd/active_merchant.rb +35 -0
  92. data/lib/one_apm/inst/3rd/acts_as_solr.rb +70 -0
  93. data/lib/one_apm/inst/3rd/authlogic.rb +23 -0
  94. data/lib/one_apm/inst/3rd/sunspot.rb +31 -0
  95. data/lib/one_apm/inst/background_job/active_job.rb +88 -0
  96. data/lib/one_apm/inst/background_job/delayed_job.rb +52 -0
  97. data/lib/one_apm/inst/background_job/delayed_job_injection.rb +8 -0
  98. data/lib/one_apm/inst/background_job/resque.rb +107 -0
  99. data/lib/one_apm/inst/background_job/sidekiq.rb +64 -0
  100. data/lib/one_apm/inst/dispatcher/passenger.rb +25 -0
  101. data/lib/one_apm/inst/dispatcher/rainbows.rb +23 -0
  102. data/lib/one_apm/inst/framework/grape.rb +94 -0
  103. data/lib/one_apm/inst/framework/padrino.rb +30 -0
  104. data/lib/one_apm/inst/framework/sinatra.rb +185 -0
  105. data/lib/one_apm/inst/framework/sinatra/ignorer.rb +50 -0
  106. data/lib/one_apm/inst/framework/sinatra/transaction_namer.rb +54 -0
  107. data/lib/one_apm/inst/http_clients/curb.rb +189 -0
  108. data/lib/one_apm/inst/http_clients/excon.rb +70 -0
  109. data/lib/one_apm/inst/http_clients/excon/connection.rb +31 -0
  110. data/lib/one_apm/inst/http_clients/excon/middleware.rb +55 -0
  111. data/lib/one_apm/inst/http_clients/httpclient.rb +44 -0
  112. data/lib/one_apm/inst/http_clients/net.rb +34 -0
  113. data/lib/one_apm/inst/http_clients/typhoeus.rb +76 -0
  114. data/lib/one_apm/inst/nosql/memcache.rb +134 -0
  115. data/lib/one_apm/inst/nosql/mongo.rb +126 -0
  116. data/lib/one_apm/inst/nosql/mongo_moped.rb +85 -0
  117. data/lib/one_apm/inst/nosql/redis.rb +83 -0
  118. data/lib/one_apm/inst/orm/active_record.rb +99 -0
  119. data/lib/one_apm/inst/orm/active_record_4.rb +28 -0
  120. data/lib/one_apm/inst/orm/data_mapper.rb +180 -0
  121. data/lib/one_apm/inst/orm/sequel.rb +47 -0
  122. data/lib/one_apm/inst/rack.rb +38 -0
  123. data/lib/one_apm/inst/rack/rack.rb +44 -0
  124. data/lib/one_apm/inst/rack/rack_builder.rb +51 -0
  125. data/lib/one_apm/inst/rails/action_controller.rb +118 -0
  126. data/lib/one_apm/inst/rails/action_web_service.rb +44 -0
  127. data/lib/one_apm/inst/rails/errors.rb +43 -0
  128. data/lib/one_apm/inst/rails3/action_controller.rb +172 -0
  129. data/lib/one_apm/inst/rails3/errors.rb +43 -0
  130. data/lib/one_apm/inst/rails4/action_controller.rb +27 -0
  131. data/lib/one_apm/inst/rails4/action_controller_subscriber.rb +121 -0
  132. data/lib/one_apm/inst/rails4/action_view.rb +23 -0
  133. data/lib/one_apm/inst/rails4/action_view_subscriber.rb +93 -0
  134. data/lib/one_apm/inst/rails4/active_record_subscriber.rb +96 -0
  135. data/lib/one_apm/inst/rails4/errors.rb +42 -0
  136. data/lib/one_apm/inst/rails_middleware.rb +40 -0
  137. data/lib/one_apm/inst/support/evented_subscriber.rb +98 -0
  138. data/lib/one_apm/inst/support/ignore_actions.rb +39 -0
  139. data/lib/one_apm/inst/support/queue_time.rb +76 -0
  140. data/lib/one_apm/inst/transaction_base.rb +405 -0
  141. data/lib/one_apm/logger/agent_logger.rb +206 -0
  142. data/lib/one_apm/logger/audit_logger.rb +78 -0
  143. data/lib/one_apm/logger/memory_logger.rb +50 -0
  144. data/lib/one_apm/logger/null_logger.rb +19 -0
  145. data/lib/one_apm/metrics/metric_data.rb +72 -0
  146. data/lib/one_apm/metrics/metric_spec.rb +82 -0
  147. data/lib/one_apm/metrics/stats.rb +173 -0
  148. data/lib/one_apm/probe.rb +16 -0
  149. data/lib/one_apm/probe/framework_loader.rb +53 -0
  150. data/lib/one_apm/probe/instance_methods.rb +105 -0
  151. data/lib/one_apm/probe/instrumentation.rb +60 -0
  152. data/lib/one_apm/rack/browser_monitoring.rb +144 -0
  153. data/lib/one_apm/rack/middleware_base.rb +27 -0
  154. data/lib/one_apm/rack/middleware_hooks.rb +17 -0
  155. data/lib/one_apm/rack/middleware_tracing.rb +81 -0
  156. data/lib/one_apm/rack/middleware_wrapper.rb +86 -0
  157. data/lib/one_apm/support/chained_call.rb +15 -0
  158. data/lib/one_apm/support/coerce.rb +81 -0
  159. data/lib/one_apm/support/collection_helper.rb +79 -0
  160. data/lib/one_apm/support/dotted_hash.rb +45 -0
  161. data/lib/one_apm/support/encoders.rb +34 -0
  162. data/lib/one_apm/support/environment_report.rb +127 -0
  163. data/lib/one_apm/support/event_buffer.rb +82 -0
  164. data/lib/one_apm/support/event_buffer/sampled_buffer.rb +45 -0
  165. data/lib/one_apm/support/event_buffer/sized_buffer.rb +21 -0
  166. data/lib/one_apm/support/event_buffer/synthetics_event_buffer.rb +40 -0
  167. data/lib/one_apm/support/helper.rb +49 -0
  168. data/lib/one_apm/support/hostname.rb +13 -0
  169. data/lib/one_apm/support/http_clients/curb_wrappers.rb +65 -0
  170. data/lib/one_apm/support/http_clients/excon_wrappers.rb +63 -0
  171. data/lib/one_apm/support/http_clients/httpclient_wrappers.rb +61 -0
  172. data/lib/one_apm/support/http_clients/net_http_wrappers.rb +48 -0
  173. data/lib/one_apm/support/http_clients/typhoeus_wrappers.rb +73 -0
  174. data/lib/one_apm/support/http_clients/uri_util.rb +39 -0
  175. data/lib/one_apm/support/json_marshaller.rb +68 -0
  176. data/lib/one_apm/support/json_wrapper.rb +130 -0
  177. data/lib/one_apm/support/language_support.rb +142 -0
  178. data/lib/one_apm/support/library_detection.rb +119 -0
  179. data/lib/one_apm/support/local_environment.rb +196 -0
  180. data/lib/one_apm/support/marshaller.rb +62 -0
  181. data/lib/one_apm/support/method_tracer.rb +334 -0
  182. data/lib/one_apm/support/method_tracer/helpers.rb +92 -0
  183. data/lib/one_apm/support/method_tracer/traced_method_stack.rb +103 -0
  184. data/lib/one_apm/support/obfuscator.rb +47 -0
  185. data/lib/one_apm/support/okjson.rb +601 -0
  186. data/lib/one_apm/support/parameter_filtering.rb +35 -0
  187. data/lib/one_apm/support/rules_engine.rb +56 -0
  188. data/lib/one_apm/support/rules_engine/replacement_rule.rb +80 -0
  189. data/lib/one_apm/support/rules_engine/segment_terms_rule.rb +46 -0
  190. data/lib/one_apm/support/server.rb +11 -0
  191. data/lib/one_apm/support/supported_versions.rb +257 -0
  192. data/lib/one_apm/support/system_info.rb +211 -0
  193. data/lib/one_apm/support/timer_lib.rb +29 -0
  194. data/lib/one_apm/support/version_number.rb +51 -0
  195. data/lib/one_apm/support/vm.rb +30 -0
  196. data/lib/one_apm/support/vm/jruby_vm.rb +38 -0
  197. data/lib/one_apm/support/vm/monotonic_gc_profiler.rb +43 -0
  198. data/lib/one_apm/support/vm/mri_vm.rb +85 -0
  199. data/lib/one_apm/support/vm/rubinius_vm.rb +129 -0
  200. data/lib/one_apm/support/vm/snapshot.rb +18 -0
  201. data/lib/one_apm/transaction.rb +336 -0
  202. data/lib/one_apm/transaction/class_methods.rb +132 -0
  203. data/lib/one_apm/transaction/instance_helpers.rb +82 -0
  204. data/lib/one_apm/transaction/metric_constants.rb +42 -0
  205. data/lib/one_apm/transaction/sample_buffer/force_persist_sample_buffer.rb +21 -0
  206. data/lib/one_apm/transaction/sample_buffer/slowest_sample_buffer.rb +21 -0
  207. data/lib/one_apm/transaction/sample_buffer/synthetics_sample_buffer.rb +21 -0
  208. data/lib/one_apm/transaction/sample_buffer/transaction_sample_buffer.rb +101 -0
  209. data/lib/one_apm/transaction/sample_buffer/xray_sample_buffer.rb +60 -0
  210. data/lib/one_apm/transaction/segment.rb +193 -0
  211. data/lib/one_apm/transaction/segment_summary.rb +51 -0
  212. data/lib/one_apm/transaction/thread_local_access.rb +73 -0
  213. data/lib/one_apm/transaction/transaction_analysis.rb +78 -0
  214. data/lib/one_apm/transaction/transaction_apdex.rb +20 -0
  215. data/lib/one_apm/transaction/transaction_cpu.rb +22 -0
  216. data/lib/one_apm/transaction/transaction_finish_append.rb +67 -0
  217. data/lib/one_apm/transaction/transaction_ignore.rb +33 -0
  218. data/lib/one_apm/transaction/transaction_jruby_functions.rb +40 -0
  219. data/lib/one_apm/transaction/transaction_metrics.rb +53 -0
  220. data/lib/one_apm/transaction/transaction_name.rb +90 -0
  221. data/lib/one_apm/transaction/transaction_namer.rb +49 -0
  222. data/lib/one_apm/transaction/transaction_sample.rb +204 -0
  223. data/lib/one_apm/transaction/transaction_sample_builder.rb +168 -0
  224. data/lib/one_apm/transaction/transaction_state.rb +149 -0
  225. data/lib/one_apm/transaction/transaction_summary.rb +28 -0
  226. data/lib/one_apm/transaction/transaction_synthetics.rb +40 -0
  227. data/lib/one_apm/transaction/transaction_timings.rb +54 -0
  228. data/lib/one_apm/version.rb +13 -0
  229. data/lib/oneapm_rpm.rb +16 -0
  230. data/lib/sequel/extensions/oneapm_instrumentation.rb +84 -0
  231. data/lib/sequel/plugins/oneapm_instrumentation.rb +66 -0
  232. data/oneapm.yml +135 -0
  233. data/oneapm_rpm.gemspec +58 -0
  234. metadata +474 -0
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ LibraryDetection.defer do
4
+ @name = :delayed_job
5
+
6
+ depends_on do
7
+ !OneApm::Agent.config[:disable_dj]
8
+ end
9
+
10
+ depends_on do
11
+ defined?(::Delayed) && defined?(::Delayed::Worker) && !OneApm::Agent.config[:disable_dj]
12
+ end
13
+
14
+ executes do
15
+ ::OneApm::Agent.logger.info 'Installing DelayedJob instrumentation [part 1/2]'
16
+ end
17
+
18
+ executes do
19
+ Delayed::Worker.class_eval do
20
+ def initialize_with_one_apm(*args)
21
+ initialize_without_one_apm(*args)
22
+ worker_name = case
23
+ when self.respond_to?(:name) then self.name
24
+ when self.class.respond_to?(:default_name) then self.class.default_name
25
+ end
26
+ OneApm::DelayedJobInjection.worker_name = worker_name
27
+
28
+ if defined?(::Delayed::Job) && ::Delayed::Job.method_defined?(:invoke_job)
29
+ ::OneApm::Agent.logger.info 'Installing DelayedJob instrumentation [part 2/2]'
30
+ install_oneapm_job_tracer
31
+ OneApm::Probe.instance.init_plugin :dispatcher => :delayed_job
32
+ else
33
+ OneApm::Agent.logger.warn("Did not find a Delayed::Job class responding to invoke_job, aborting DJ instrumentation")
34
+ end
35
+ end
36
+
37
+ alias initialize_without_one_apm initialize
38
+ alias initialize initialize_with_one_apm
39
+
40
+ def install_oneapm_job_tracer
41
+ Delayed::Job.class_eval do
42
+ include OneApm::Agent::Instrumentation::TransactionBase
43
+ if self.instance_methods.include?('name') || self.instance_methods.include?(:name)
44
+ add_transaction_tracer "invoke_job", :category => 'OtherTransaction/DelayedJob', :path => '#{self.name}'
45
+ else
46
+ add_transaction_tracer "invoke_job", :category => 'OtherTransaction/DelayedJob'
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+
3
+ module OneApm
4
+ module DelayedJobInjection
5
+ extend self
6
+ attr_accessor :worker_name
7
+ end
8
+ end
@@ -0,0 +1,107 @@
1
+ # encoding: utf-8
2
+
3
+ LibraryDetection.defer do
4
+ @name = :resque
5
+
6
+ depends_on do
7
+ defined?(::Resque::Job) && !OneApm::Agent.config[:disable_resque] &&
8
+ !OneApm::LanguageSupport.using_version?('1.9.1')
9
+ end
10
+
11
+ executes do
12
+ ::OneApm::Agent.logger.info 'Installing Resque instrumentation'
13
+ end
14
+
15
+ executes do
16
+ module Resque
17
+ module Plugins
18
+ module OneApmInstrumentation
19
+ include OneApm::Agent::Instrumentation::TransactionBase
20
+
21
+ def around_perform_with_monitoring(*args)
22
+ begin
23
+ perform_action_with_oneapm_trace(
24
+ :name => 'perform',
25
+ :class_name => self.name,
26
+ :category => 'OtherTransaction/ResqueJob') do
27
+
28
+ if OneApm::Agent.config[:'resque.capture_params']
29
+ OneApm::Agent.add_custom_parameters(:job_arguments => args)
30
+ end
31
+
32
+ yield(*args)
33
+ end
34
+ ensure
35
+ OneApm::Agent.instance.flush_pipe_data
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ module OneApm
43
+ module Agent
44
+ module Instrumentation
45
+ module ResqueInstrumentationInstaller
46
+ def payload_class
47
+ klass = super
48
+ klass.instance_eval do
49
+ extend ::Resque::Plugins::OneApmInstrumentation
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ ::Resque::Job.class_eval do
58
+ def self.new(*args)
59
+ super(*args).extend OneApm::Agent::Instrumentation::ResqueInstrumentationInstaller
60
+ end
61
+ end
62
+
63
+ if OneApm::LanguageSupport.can_fork?
64
+ # Resque::Worker#fork isn't around in Resque 2.x
65
+ if OneApm::VersionNumber.new(::Resque::VERSION) < OneApm::VersionNumber.new("2.0.0")
66
+ ::Resque::Worker.class_eval do
67
+ if OneApm::Agent.config[:'resque.use_harvest_lock']
68
+ ::OneApm::Agent.logger.info 'Installing Resque harvest/fork synchronization'
69
+ def fork_with_oneapm(*args, &block)
70
+ OneApm::Agent.instance.synchronize_with_harvest do
71
+ fork_without_oneapm(*args, &block)
72
+
73
+ # Reached in parent, not expected in the child since Resque
74
+ # uses the block form of fork
75
+ end
76
+ end
77
+
78
+ alias_method :fork_without_oneapm, :fork
79
+ alias_method :fork, :fork_with_oneapm
80
+ end
81
+ end
82
+ end
83
+
84
+ ::Resque.before_first_fork do
85
+ OneApm::Agent.start(:dispatcher => :resque,
86
+ :sync_startup => true,
87
+ :start_channel_listener => true)
88
+ end
89
+
90
+ ::Resque.before_fork do |job|
91
+ if ENV['FORK_PER_JOB'] != 'false'
92
+ OneApm::Agent::PipeChannelManager.register_report_channel(job.object_id)
93
+ end
94
+ end
95
+
96
+ ::Resque.after_fork do |job|
97
+ # Only suppress reporting Instance/Busy for forked children
98
+ # Traced errors UI relies on having the parent process report that metric
99
+ OneApm::Agent.instance.after_fork(:report_to_channel => job.object_id,
100
+ :report_instance_busy => false)
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ # call this now so it is memoized before potentially forking worker processes
107
+ OneApm::LanguageSupport.can_fork?
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+
3
+ LibraryDetection.defer do
4
+ @name = :sidekiq
5
+
6
+ depends_on do
7
+ defined?(::Sidekiq) && !OneApm::Agent.config[:disable_sidekiq]
8
+ end
9
+
10
+ executes do
11
+ ::OneApm::Agent.logger.info 'Installing Sidekiq instrumentation'
12
+ end
13
+
14
+ executes do
15
+ class OneApm::SidekiqInstrumentation
16
+ include OneApm::Agent::Instrumentation::TransactionBase
17
+
18
+ # Client middleware has additional parameters, and our tests use the
19
+ # middleware client-side to work inline.
20
+ def call(worker, msg, queue, *_)
21
+ trace_args = if worker.respond_to?(:oneapm_trace_args)
22
+ worker.oneapm_trace_args(msg, queue)
23
+ else
24
+ self.class.default_trace_args(msg)
25
+ end
26
+
27
+ perform_action_with_oneapm_trace(trace_args) do
28
+ if OneApm::Agent.config[:'sidekiq.capture_params']
29
+ OneApm::Agent.add_custom_parameters(:job_arguments => msg['args'])
30
+ end
31
+ yield
32
+ end
33
+ end
34
+
35
+ def self.default_trace_args(msg)
36
+ {
37
+ :name => 'perform',
38
+ :class_name => msg['class'],
39
+ :category => 'OtherTransaction/SidekiqJob'
40
+ }
41
+ end
42
+ end
43
+
44
+ class Sidekiq::Extensions::DelayedClass
45
+ def oneapm_trace_args(msg, queue)
46
+ (target, method_name, _args) = YAML.load(msg['args'][0])
47
+ {
48
+ :name => method_name,
49
+ :class_name => target.name,
50
+ :category => 'OtherTransaction/SidekiqJob'
51
+ }
52
+ rescue => e
53
+ OneApm::Agent.logger.error("Failure during deserializing YAML for Sidekiq::Extensions::DelayedClass", e)
54
+ OneApm::SidekiqInstrumentation.default_trace_args(msg)
55
+ end
56
+ end
57
+
58
+ Sidekiq.configure_server do |config|
59
+ config.server_middleware do |chain|
60
+ chain.add OneApm::SidekiqInstrumentation
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ LibraryDetection.defer do
4
+ @name = :passenger
5
+
6
+ depends_on do
7
+ defined?(::PhusionPassenger)
8
+ end
9
+
10
+ executes do
11
+ ::OneApm::Agent.logger.debug "Installing Passenger event hooks."
12
+
13
+ ::PhusionPassenger.on_event(:stopping_worker_process) do
14
+ ::OneApm::Agent.logger.debug "Passenger stopping this process, shutdown the agent."
15
+ OneApm::Agent.instance.shutdown
16
+ end
17
+
18
+ ::PhusionPassenger.on_event(:starting_worker_process) do |forked|
19
+ # We want to reset the stats from the stats engine in case any carried
20
+ # over into the spawned process. Don't clear them in case any were
21
+ # cached. We do this even in conservative spawning.
22
+ OneApm::Agent.instance.after_fork(:force_reconnect => true)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ LibraryDetection.defer do
4
+ @name = :rainbows
5
+
6
+ depends_on do
7
+ defined?(::Rainbows) && defined?(::Rainbows::HttpServer)
8
+ end
9
+
10
+ executes do
11
+ OneApm::Agent.logger.info 'Installing Rainbows instrumentation'
12
+ end
13
+
14
+ executes do
15
+ Rainbows::HttpServer.class_eval do
16
+ old_worker_loop = instance_method(:worker_loop)
17
+ define_method(:worker_loop) do |worker|
18
+ OneApm::Agent.instance.after_fork(:force_reconnect => true)
19
+ old_worker_loop.bind(self).call(worker)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,94 @@
1
+ # encoding: utf-8
2
+
3
+ require 'one_apm/support/parameter_filtering'
4
+
5
+ module OneApm
6
+ module Agent
7
+ module Instrumentation
8
+ module Grape
9
+ extend self
10
+
11
+ API_ENDPOINT = 'api.endpoint'.freeze
12
+ FORMAT_REGEX = /\(\/?\.:format\)/.freeze
13
+ VERSION_REGEX = /:version(\/|$)/.freeze
14
+ EMPTY_STRING = ''.freeze
15
+ MIN_VERSION = VersionNumber.new("0.2.0")
16
+
17
+ def handle_transaction(endpoint, class_name)
18
+ return unless endpoint && route = endpoint.route
19
+ name_transaction(route, class_name)
20
+ capture_params(endpoint) if Agent.config[:capture_params]
21
+ end
22
+
23
+ def name_transaction(route, class_name)
24
+ txn_name = name_for_transaction(route, class_name)
25
+ segment_name = "Middleware/Grape/#{class_name}/call"
26
+ Transaction.set_default_transaction_name(txn_name, :grape, segment_name)
27
+ end
28
+
29
+ def name_for_transaction(route, class_name)
30
+ action_name = route.route_path.sub(FORMAT_REGEX, EMPTY_STRING)
31
+ method_name = route.route_method
32
+
33
+ if route.route_version
34
+ action_name = action_name.sub(VERSION_REGEX, EMPTY_STRING)
35
+ "#{class_name}-#{route.route_version}#{action_name} (#{method_name})"
36
+ else
37
+ "#{class_name}#{action_name} (#{method_name})"
38
+ end
39
+ end
40
+
41
+ def capture_params(endpoint)
42
+ txn = Transaction.tl_current
43
+ env = endpoint.request.env
44
+ params = OneApm::Support::ParameterFiltering::apply_filters(env, endpoint.params)
45
+ params.delete("route_info")
46
+ txn.filtered_params = params
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ LibraryDetection.defer do
54
+ # Why not just :grape? oneapm-grape used that name already, and while we're
55
+ # not shipping yet, overloading the name interferes with the plugin.
56
+ named :grape
57
+
58
+ depends_on do
59
+ ::OneApm::Agent.config[:disable_grape] == false
60
+ end
61
+
62
+ depends_on do
63
+ defined?(::Grape::VERSION) &&
64
+ ::OneApm::VersionNumber.new(::Grape::VERSION) >= ::OneApm::Agent::Instrumentation::Grape::MIN_VERSION
65
+ end
66
+
67
+ executes do
68
+ OneApm::Agent.logger.info 'Installing Grape instrumentation'
69
+ instrument_call
70
+ end
71
+
72
+ def instrument_call
73
+ ::Grape::API.class_eval do
74
+ def call_with_one_apm(env)
75
+ begin
76
+ response = call_without_one_apm(env)
77
+ ensure
78
+ begin
79
+ endpoint = env[::OneApm::Agent::Instrumentation::Grape::API_ENDPOINT]
80
+ ::OneApm::Agent::Instrumentation::Grape.handle_transaction(endpoint, self.class.name)
81
+ rescue => e
82
+ ::OneApm::Agent.logger.warn("Error in Grape instrumentation", e)
83
+ end
84
+ end
85
+
86
+ response
87
+ end
88
+
89
+ alias_method :call_without_one_apm, :call
90
+ alias_method :call, :call_with_one_apm
91
+ end
92
+ end
93
+
94
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+
3
+ require 'one_apm/inst/framework/sinatra'
4
+
5
+ LibraryDetection.defer do
6
+ @name = :padrino
7
+
8
+ depends_on do
9
+ !OneApm::Agent.config[:disable_sinatra] &&
10
+ defined?(::Padrino) && defined?(::Padrino::Routing::InstanceMethods)
11
+ end
12
+
13
+ executes do
14
+ ::OneApm::Agent.logger.info 'Installing Padrino instrumentation'
15
+
16
+ # Our Padrino instrumentation relies heavily on the fact that Padrino is
17
+ # built on Sinatra. Although it wires up a lot of its own routing logic,
18
+ # we only need to patch into Padrino's dispatch to get things started.
19
+ #
20
+ # Parts of the Sinatra instrumentation (such as the TransactionNamer) are
21
+ # aware of Padrino as a potential target in areas where both Sinatra and
22
+ # Padrino run through the same code.
23
+ module ::Padrino::Routing::InstanceMethods
24
+ include OneApm::Agent::Instrumentation::Sinatra
25
+
26
+ alias dispatch_without_oneapm dispatch!
27
+ alias dispatch! dispatch_with_oneapm
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,185 @@
1
+ # encoding: utf-8
2
+
3
+ require 'one_apm/inst/transaction_base'
4
+ require 'one_apm/inst/framework/sinatra/transaction_namer'
5
+ require 'one_apm/inst/framework/sinatra/ignorer'
6
+
7
+ LibraryDetection.defer do
8
+ @name = :sinatra
9
+
10
+ depends_on do
11
+ !OneApm::Agent.config[:disable_sinatra] &&
12
+ defined?(::Sinatra) && defined?(::Sinatra::Base) &&
13
+ Sinatra::Base.private_method_defined?(:dispatch!) &&
14
+ Sinatra::Base.private_method_defined?(:process_route) &&
15
+ Sinatra::Base.private_method_defined?(:route_eval)
16
+ end
17
+
18
+ executes do
19
+ ::OneApm::Agent.logger.info 'Installing Sinatra instrumentation'
20
+ end
21
+
22
+ executes do
23
+ ::Sinatra::Base.class_eval do
24
+ include OneApm::Agent::Instrumentation::Sinatra
25
+
26
+ alias dispatch_without_oneapm dispatch!
27
+ alias dispatch! dispatch_with_oneapm
28
+
29
+ alias process_route_without_oneapm process_route
30
+ alias process_route process_route_with_oneapm
31
+
32
+ alias route_eval_without_oneapm route_eval
33
+ alias route_eval route_eval_with_oneapm
34
+
35
+ register OneApm::Agent::Instrumentation::Sinatra::Ignorer
36
+ end
37
+
38
+ module ::Sinatra
39
+ register OneApm::Agent::Instrumentation::Sinatra::Ignorer
40
+ end
41
+ end
42
+
43
+ executes do
44
+ if Sinatra::Base.respond_to?(:build)
45
+ # These requires are inside an executes block because they require rack, and
46
+ # we can't be sure that rack is available when this file is first required.
47
+ require 'one_apm/rack/middleware_hooks'
48
+ require 'one_apm/rack/browser_monitoring'
49
+
50
+ ::Sinatra::Base.class_eval do
51
+ class << self
52
+ alias build_without_oneapm build
53
+ alias build build_with_oneapm
54
+ end
55
+ end
56
+ else
57
+ ::OneApm::Agent.logger.info("Skipping auto-injection of middleware for Sinatra - requires Sinatra 1.2.1+")
58
+ end
59
+ end
60
+ end
61
+
62
+ module OneApm
63
+ module Agent
64
+ module Instrumentation
65
+ # OneApm instrumentation for Sinatra applications. Sinatra actions will
66
+ # appear in the UI similar to controller actions, and have breakdown charts
67
+ # and transaction traces.
68
+ #
69
+ # The actions in the UI will correspond to the pattern expression used
70
+ # to match them, not directly to full URL's.
71
+ module Sinatra
72
+ include ::OneApm::Agent::Instrumentation::TransactionBase
73
+
74
+ # Expected method for supporting TransactionBase
75
+ def oneapm_request_headers(_)
76
+ request.env
77
+ end
78
+
79
+ def self.included(clazz)
80
+ clazz.extend(ClassMethods)
81
+ end
82
+
83
+ module ClassMethods
84
+ def oneapm_middlewares
85
+ middlewares = [OneApm::Rack::BrowserMonitoring]
86
+ if OneApm::Rack::MiddlewareHooks.needed?
87
+ middlewares << OneApm::Rack::MiddlewareHooks
88
+ end
89
+ middlewares
90
+ end
91
+
92
+ def build_with_oneapm(*args, &block)
93
+ unless OneApm::Agent.config[:disable_sinatra_auto_middleware]
94
+ oneapm_middlewares.each do |middleware_class|
95
+ try_to_use(self, middleware_class)
96
+ end
97
+ end
98
+ build_without_oneapm(*args, &block)
99
+ end
100
+
101
+ def try_to_use(app, clazz)
102
+ has_middleware = app.middleware.any? { |info| info[0] == clazz }
103
+ app.use(clazz) unless has_middleware
104
+ end
105
+ end
106
+
107
+ # Capture last route we've seen. Will set for transaction on route_eval
108
+ def process_route_with_oneapm(*args, &block)
109
+ begin
110
+ env["oneapm.last_route"] = args[0]
111
+ rescue => e
112
+ ::OneApm::Agent.logger.debug("Failed determining last route in Sinatra", e)
113
+ end
114
+
115
+ process_route_without_oneapm(*args, &block)
116
+ end
117
+
118
+ # If a transaction name is already set, this call will tromple over it.
119
+ # This is intentional, as typically passing to a separate route is like
120
+ # an entirely separate transaction, so we pick up the new name.
121
+ #
122
+ # If we're ignored, this remains safe, since set_transaction_name
123
+ # care for the gating on the transaction's existence for us.
124
+ def route_eval_with_oneapm(*args, &block)
125
+ begin
126
+ txn_name = TransactionNamer.transaction_name_for_route(env, request)
127
+ unless txn_name.nil?
128
+ ::OneApm::Transaction.set_default_transaction_name(
129
+ "#{self.class.name}/#{txn_name}", :sinatra)
130
+ end
131
+ rescue => e
132
+ ::OneApm::Agent.logger.debug("Failed during route_eval to set transaction name", e)
133
+ end
134
+
135
+ route_eval_without_oneapm(*args, &block)
136
+ end
137
+
138
+ def dispatch_with_oneapm #THREAD_LOCAL_ACCESS
139
+ request_params = get_request_params
140
+ filtered_params = OneApm::Support::ParameterFiltering::apply_filters(request.env, request_params || {})
141
+
142
+ name = TransactionNamer.initial_transaction_name(request)
143
+ perform_action_with_oneapm_trace(:category => :sinatra,
144
+ :name => name,
145
+ :params => filtered_params) do
146
+ dispatch_and_notice_errors_with_oneapm
147
+ end
148
+ end
149
+
150
+ def get_request_params
151
+ begin
152
+ @request.params
153
+ rescue => e
154
+ OneApm::Agent.logger.debug("Failed to get params from Rack request.", e)
155
+ nil
156
+ end
157
+ end
158
+
159
+ def dispatch_and_notice_errors_with_oneapm
160
+ dispatch_without_oneapm
161
+ ensure
162
+ # Will only see an error raised if :show_exceptions is true, but
163
+ # will always see them in the env hash if they occur
164
+ had_error = env.has_key?('sinatra.error')
165
+ ::OneApm::Agent.notice_error(env['sinatra.error']) if had_error
166
+ end
167
+
168
+ def do_not_trace?
169
+ Ignorer.should_ignore?(self, :routes)
170
+ end
171
+
172
+ # Overrides TransactionBase implementation
173
+ def ignore_apdex?
174
+ Ignorer.should_ignore?(self, :apdex)
175
+ end
176
+
177
+ # Overrides TransactionBase implementation
178
+ def ignore_enduser?
179
+ Ignorer.should_ignore?(self, :enduser)
180
+ end
181
+
182
+ end
183
+ end
184
+ end
185
+ end