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.
- checksums.yaml +7 -0
- data/.gitignore +30 -0
- data/.rubocop.yml +725 -0
- data/Gemfile +3 -0
- data/Guardfile +7 -0
- data/LICENSE +1 -0
- data/README.md +3 -0
- data/config/cert/cacert.pem +1177 -0
- data/config/database.yml +5 -0
- data/lib/initializers/goliath.rb +11 -0
- data/lib/initializers/other.rb +1 -0
- data/lib/initializers/rails.rb +15 -0
- data/lib/one_apm/agent.rb +253 -0
- data/lib/one_apm/agent/agent.rb +283 -0
- data/lib/one_apm/agent/agent/connect.rb +175 -0
- data/lib/one_apm/agent/agent/container_data_manager.rb +218 -0
- data/lib/one_apm/agent/agent/forkable_dispatcher_functions.rb +96 -0
- data/lib/one_apm/agent/agent/helpers.rb +45 -0
- data/lib/one_apm/agent/agent/start.rb +226 -0
- data/lib/one_apm/agent/agent/start_worker_thread.rb +148 -0
- data/lib/one_apm/agent/busy_calculator.rb +115 -0
- data/lib/one_apm/agent/cross_app/cross_app_monitor.rb +181 -0
- data/lib/one_apm/agent/cross_app/cross_app_tracing.rb +336 -0
- data/lib/one_apm/agent/database.rb +308 -0
- data/lib/one_apm/agent/database/active_record_helper.rb +80 -0
- data/lib/one_apm/agent/database/obfuscation_helpers.rb +76 -0
- data/lib/one_apm/agent/database/obfuscator.rb +78 -0
- data/lib/one_apm/agent/database/postgres_explain_obfuscator.rb +45 -0
- data/lib/one_apm/agent/datastores.rb +175 -0
- data/lib/one_apm/agent/datastores/metric_helper.rb +83 -0
- data/lib/one_apm/agent/datastores/mongo.rb +27 -0
- data/lib/one_apm/agent/datastores/mongo/metric_translator.rb +189 -0
- data/lib/one_apm/agent/datastores/mongo/obfuscator.rb +37 -0
- data/lib/one_apm/agent/datastores/mongo/statement_formatter.rb +51 -0
- data/lib/one_apm/agent/event/event_listener.rb +40 -0
- data/lib/one_apm/agent/event/event_loop.rb +191 -0
- data/lib/one_apm/agent/event/worker_loop.rb +97 -0
- data/lib/one_apm/agent/harvester.rb +48 -0
- data/lib/one_apm/agent/inbound_request_monitor.rb +30 -0
- data/lib/one_apm/agent/javascript_instrumentor.rb +186 -0
- data/lib/one_apm/agent/pipe/pipe_channel_manager.rb +275 -0
- data/lib/one_apm/agent/pipe/pipe_service.rb +81 -0
- data/lib/one_apm/agent/sampler.rb +55 -0
- data/lib/one_apm/agent/sampler_collection.rb +65 -0
- data/lib/one_apm/agent/samplers/cpu_sampler.rb +49 -0
- data/lib/one_apm/agent/samplers/delayed_job_sampler.rb +109 -0
- data/lib/one_apm/agent/samplers/memory_sampler.rb +144 -0
- data/lib/one_apm/agent/samplers/object_sampler.rb +22 -0
- data/lib/one_apm/agent/samplers/vm_sampler.rb +124 -0
- data/lib/one_apm/agent/synthetics_monitor.rb +48 -0
- data/lib/one_apm/agent/threading/agent_thread.rb +74 -0
- data/lib/one_apm/agent/threading/backtrace_node.rb +133 -0
- data/lib/one_apm/agent/threading/backtrace_service.rb +259 -0
- data/lib/one_apm/agent/threading/thread_profile.rb +155 -0
- data/lib/one_apm/collector/collector/helper.rb +139 -0
- data/lib/one_apm/collector/collector/http_connection.rb +254 -0
- data/lib/one_apm/collector/collector/server_methods.rb +71 -0
- data/lib/one_apm/collector/collector_service.rb +123 -0
- data/lib/one_apm/collector/commands/agent_command.rb +17 -0
- data/lib/one_apm/collector/commands/thread_profiler_session.rb +108 -0
- data/lib/one_apm/collector/commands/xray_session.rb +53 -0
- data/lib/one_apm/collector/commands/xray_session_collection.rb +156 -0
- data/lib/one_apm/collector/containers/agent_command_router.rb +153 -0
- data/lib/one_apm/collector/containers/custom_event_aggregator.rb +94 -0
- data/lib/one_apm/collector/containers/error_collector.rb +349 -0
- data/lib/one_apm/collector/containers/sql_sampler.rb +331 -0
- data/lib/one_apm/collector/containers/stats_engine.rb +34 -0
- data/lib/one_apm/collector/containers/transaction_event_aggregator.rb +249 -0
- data/lib/one_apm/collector/containers/transaction_sampler.rb +352 -0
- data/lib/one_apm/collector/containers/utilization_data.rb +36 -0
- data/lib/one_apm/collector/stats_engine/gc_profiler.rb +106 -0
- data/lib/one_apm/collector/stats_engine/metric_stats.rb +243 -0
- data/lib/one_apm/collector/stats_engine/stats_hash.rb +105 -0
- data/lib/one_apm/configuration.rb +429 -0
- data/lib/one_apm/configuration/autostart.rb +41 -0
- data/lib/one_apm/configuration/default_source.rb +1026 -0
- data/lib/one_apm/configuration/environment_source.rb +113 -0
- data/lib/one_apm/configuration/high_security_source.rb +56 -0
- data/lib/one_apm/configuration/manual_source.rb +13 -0
- data/lib/one_apm/configuration/server_source.rb +60 -0
- data/lib/one_apm/configuration/yaml_source.rb +134 -0
- data/lib/one_apm/errors/agent_errors.rb +26 -0
- data/lib/one_apm/errors/internal_agent_error.rb +16 -0
- data/lib/one_apm/errors/noticed_error.rb +79 -0
- data/lib/one_apm/frameworks/external.rb +15 -0
- data/lib/one_apm/frameworks/rails.rb +103 -0
- data/lib/one_apm/frameworks/rails3.rb +37 -0
- data/lib/one_apm/frameworks/rails4.rb +21 -0
- data/lib/one_apm/frameworks/ruby.rb +21 -0
- data/lib/one_apm/frameworks/sinatra.rb +12 -0
- data/lib/one_apm/inst/3rd/active_merchant.rb +35 -0
- data/lib/one_apm/inst/3rd/acts_as_solr.rb +70 -0
- data/lib/one_apm/inst/3rd/authlogic.rb +23 -0
- data/lib/one_apm/inst/3rd/sunspot.rb +31 -0
- data/lib/one_apm/inst/background_job/active_job.rb +88 -0
- data/lib/one_apm/inst/background_job/delayed_job.rb +52 -0
- data/lib/one_apm/inst/background_job/delayed_job_injection.rb +8 -0
- data/lib/one_apm/inst/background_job/resque.rb +107 -0
- data/lib/one_apm/inst/background_job/sidekiq.rb +64 -0
- data/lib/one_apm/inst/dispatcher/passenger.rb +25 -0
- data/lib/one_apm/inst/dispatcher/rainbows.rb +23 -0
- data/lib/one_apm/inst/framework/grape.rb +94 -0
- data/lib/one_apm/inst/framework/padrino.rb +30 -0
- data/lib/one_apm/inst/framework/sinatra.rb +185 -0
- data/lib/one_apm/inst/framework/sinatra/ignorer.rb +50 -0
- data/lib/one_apm/inst/framework/sinatra/transaction_namer.rb +54 -0
- data/lib/one_apm/inst/http_clients/curb.rb +189 -0
- data/lib/one_apm/inst/http_clients/excon.rb +70 -0
- data/lib/one_apm/inst/http_clients/excon/connection.rb +31 -0
- data/lib/one_apm/inst/http_clients/excon/middleware.rb +55 -0
- data/lib/one_apm/inst/http_clients/httpclient.rb +44 -0
- data/lib/one_apm/inst/http_clients/net.rb +34 -0
- data/lib/one_apm/inst/http_clients/typhoeus.rb +76 -0
- data/lib/one_apm/inst/nosql/memcache.rb +134 -0
- data/lib/one_apm/inst/nosql/mongo.rb +126 -0
- data/lib/one_apm/inst/nosql/mongo_moped.rb +85 -0
- data/lib/one_apm/inst/nosql/redis.rb +83 -0
- data/lib/one_apm/inst/orm/active_record.rb +99 -0
- data/lib/one_apm/inst/orm/active_record_4.rb +28 -0
- data/lib/one_apm/inst/orm/data_mapper.rb +180 -0
- data/lib/one_apm/inst/orm/sequel.rb +47 -0
- data/lib/one_apm/inst/rack.rb +38 -0
- data/lib/one_apm/inst/rack/rack.rb +44 -0
- data/lib/one_apm/inst/rack/rack_builder.rb +51 -0
- data/lib/one_apm/inst/rails/action_controller.rb +118 -0
- data/lib/one_apm/inst/rails/action_web_service.rb +44 -0
- data/lib/one_apm/inst/rails/errors.rb +43 -0
- data/lib/one_apm/inst/rails3/action_controller.rb +172 -0
- data/lib/one_apm/inst/rails3/errors.rb +43 -0
- data/lib/one_apm/inst/rails4/action_controller.rb +27 -0
- data/lib/one_apm/inst/rails4/action_controller_subscriber.rb +121 -0
- data/lib/one_apm/inst/rails4/action_view.rb +23 -0
- data/lib/one_apm/inst/rails4/action_view_subscriber.rb +93 -0
- data/lib/one_apm/inst/rails4/active_record_subscriber.rb +96 -0
- data/lib/one_apm/inst/rails4/errors.rb +42 -0
- data/lib/one_apm/inst/rails_middleware.rb +40 -0
- data/lib/one_apm/inst/support/evented_subscriber.rb +98 -0
- data/lib/one_apm/inst/support/ignore_actions.rb +39 -0
- data/lib/one_apm/inst/support/queue_time.rb +76 -0
- data/lib/one_apm/inst/transaction_base.rb +405 -0
- data/lib/one_apm/logger/agent_logger.rb +206 -0
- data/lib/one_apm/logger/audit_logger.rb +78 -0
- data/lib/one_apm/logger/memory_logger.rb +50 -0
- data/lib/one_apm/logger/null_logger.rb +19 -0
- data/lib/one_apm/metrics/metric_data.rb +72 -0
- data/lib/one_apm/metrics/metric_spec.rb +82 -0
- data/lib/one_apm/metrics/stats.rb +173 -0
- data/lib/one_apm/probe.rb +16 -0
- data/lib/one_apm/probe/framework_loader.rb +53 -0
- data/lib/one_apm/probe/instance_methods.rb +105 -0
- data/lib/one_apm/probe/instrumentation.rb +60 -0
- data/lib/one_apm/rack/browser_monitoring.rb +144 -0
- data/lib/one_apm/rack/middleware_base.rb +27 -0
- data/lib/one_apm/rack/middleware_hooks.rb +17 -0
- data/lib/one_apm/rack/middleware_tracing.rb +81 -0
- data/lib/one_apm/rack/middleware_wrapper.rb +86 -0
- data/lib/one_apm/support/chained_call.rb +15 -0
- data/lib/one_apm/support/coerce.rb +81 -0
- data/lib/one_apm/support/collection_helper.rb +79 -0
- data/lib/one_apm/support/dotted_hash.rb +45 -0
- data/lib/one_apm/support/encoders.rb +34 -0
- data/lib/one_apm/support/environment_report.rb +127 -0
- data/lib/one_apm/support/event_buffer.rb +82 -0
- data/lib/one_apm/support/event_buffer/sampled_buffer.rb +45 -0
- data/lib/one_apm/support/event_buffer/sized_buffer.rb +21 -0
- data/lib/one_apm/support/event_buffer/synthetics_event_buffer.rb +40 -0
- data/lib/one_apm/support/helper.rb +49 -0
- data/lib/one_apm/support/hostname.rb +13 -0
- data/lib/one_apm/support/http_clients/curb_wrappers.rb +65 -0
- data/lib/one_apm/support/http_clients/excon_wrappers.rb +63 -0
- data/lib/one_apm/support/http_clients/httpclient_wrappers.rb +61 -0
- data/lib/one_apm/support/http_clients/net_http_wrappers.rb +48 -0
- data/lib/one_apm/support/http_clients/typhoeus_wrappers.rb +73 -0
- data/lib/one_apm/support/http_clients/uri_util.rb +39 -0
- data/lib/one_apm/support/json_marshaller.rb +68 -0
- data/lib/one_apm/support/json_wrapper.rb +130 -0
- data/lib/one_apm/support/language_support.rb +142 -0
- data/lib/one_apm/support/library_detection.rb +119 -0
- data/lib/one_apm/support/local_environment.rb +196 -0
- data/lib/one_apm/support/marshaller.rb +62 -0
- data/lib/one_apm/support/method_tracer.rb +334 -0
- data/lib/one_apm/support/method_tracer/helpers.rb +92 -0
- data/lib/one_apm/support/method_tracer/traced_method_stack.rb +103 -0
- data/lib/one_apm/support/obfuscator.rb +47 -0
- data/lib/one_apm/support/okjson.rb +601 -0
- data/lib/one_apm/support/parameter_filtering.rb +35 -0
- data/lib/one_apm/support/rules_engine.rb +56 -0
- data/lib/one_apm/support/rules_engine/replacement_rule.rb +80 -0
- data/lib/one_apm/support/rules_engine/segment_terms_rule.rb +46 -0
- data/lib/one_apm/support/server.rb +11 -0
- data/lib/one_apm/support/supported_versions.rb +257 -0
- data/lib/one_apm/support/system_info.rb +211 -0
- data/lib/one_apm/support/timer_lib.rb +29 -0
- data/lib/one_apm/support/version_number.rb +51 -0
- data/lib/one_apm/support/vm.rb +30 -0
- data/lib/one_apm/support/vm/jruby_vm.rb +38 -0
- data/lib/one_apm/support/vm/monotonic_gc_profiler.rb +43 -0
- data/lib/one_apm/support/vm/mri_vm.rb +85 -0
- data/lib/one_apm/support/vm/rubinius_vm.rb +129 -0
- data/lib/one_apm/support/vm/snapshot.rb +18 -0
- data/lib/one_apm/transaction.rb +336 -0
- data/lib/one_apm/transaction/class_methods.rb +132 -0
- data/lib/one_apm/transaction/instance_helpers.rb +82 -0
- data/lib/one_apm/transaction/metric_constants.rb +42 -0
- data/lib/one_apm/transaction/sample_buffer/force_persist_sample_buffer.rb +21 -0
- data/lib/one_apm/transaction/sample_buffer/slowest_sample_buffer.rb +21 -0
- data/lib/one_apm/transaction/sample_buffer/synthetics_sample_buffer.rb +21 -0
- data/lib/one_apm/transaction/sample_buffer/transaction_sample_buffer.rb +101 -0
- data/lib/one_apm/transaction/sample_buffer/xray_sample_buffer.rb +60 -0
- data/lib/one_apm/transaction/segment.rb +193 -0
- data/lib/one_apm/transaction/segment_summary.rb +51 -0
- data/lib/one_apm/transaction/thread_local_access.rb +73 -0
- data/lib/one_apm/transaction/transaction_analysis.rb +78 -0
- data/lib/one_apm/transaction/transaction_apdex.rb +20 -0
- data/lib/one_apm/transaction/transaction_cpu.rb +22 -0
- data/lib/one_apm/transaction/transaction_finish_append.rb +67 -0
- data/lib/one_apm/transaction/transaction_ignore.rb +33 -0
- data/lib/one_apm/transaction/transaction_jruby_functions.rb +40 -0
- data/lib/one_apm/transaction/transaction_metrics.rb +53 -0
- data/lib/one_apm/transaction/transaction_name.rb +90 -0
- data/lib/one_apm/transaction/transaction_namer.rb +49 -0
- data/lib/one_apm/transaction/transaction_sample.rb +204 -0
- data/lib/one_apm/transaction/transaction_sample_builder.rb +168 -0
- data/lib/one_apm/transaction/transaction_state.rb +149 -0
- data/lib/one_apm/transaction/transaction_summary.rb +28 -0
- data/lib/one_apm/transaction/transaction_synthetics.rb +40 -0
- data/lib/one_apm/transaction/transaction_timings.rb +54 -0
- data/lib/one_apm/version.rb +13 -0
- data/lib/oneapm_rpm.rb +16 -0
- data/lib/sequel/extensions/oneapm_instrumentation.rb +84 -0
- data/lib/sequel/plugins/oneapm_instrumentation.rb +66 -0
- data/oneapm.yml +135 -0
- data/oneapm_rpm.gemspec +58 -0
- 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,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
|