newrelic_rpm 6.15.0 → 7.0.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 +4 -4
- data/CHANGELOG.md +96 -22
- data/README.md +2 -2
- data/lib/new_relic/agent.rb +0 -6
- data/lib/new_relic/agent/autostart.rb +1 -2
- data/lib/new_relic/agent/configuration/default_source.rb +270 -104
- data/lib/new_relic/agent/configuration/manager.rb +2 -2
- data/lib/new_relic/agent/datastores/redis.rb +0 -4
- data/lib/new_relic/agent/distributed_tracing.rb +0 -66
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +0 -16
- data/lib/new_relic/agent/instrumentation/bunny.rb +10 -152
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +152 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +9 -241
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +93 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +222 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +63 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +53 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +34 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +8 -50
- data/lib/new_relic/agent/instrumentation/excon.rb +2 -1
- data/lib/new_relic/agent/instrumentation/grape.rb +13 -113
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +8 -30
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +25 -0
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +38 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +54 -69
- data/lib/new_relic/agent/instrumentation/memcache/chain.rb +16 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +38 -121
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +56 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +88 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +88 -0
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +2 -0
- data/lib/new_relic/agent/instrumentation/mongo.rb +7 -0
- data/lib/new_relic/agent/instrumentation/net_http.rb +39 -0
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +25 -0
- data/lib/new_relic/agent/instrumentation/{net_prepend.rb → net_http/instrumentation.rb} +3 -3
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +18 -53
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +34 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +27 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +29 -139
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +57 -0
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +32 -0
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +73 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +36 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +13 -154
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +25 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +144 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +10 -109
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +34 -0
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +65 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +24 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +8 -28
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +33 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +16 -0
- data/lib/new_relic/agent/instrumentation/sinatra.rb +20 -158
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +29 -34
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +118 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +10 -89
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +82 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/new_relic_service.rb +3 -12
- data/lib/new_relic/agent/sql_sampler.rb +1 -1
- data/lib/new_relic/agent/transaction.rb +1 -4
- data/lib/new_relic/control/frameworks/rails.rb +11 -9
- data/lib/new_relic/control/instance_methods.rb +1 -0
- data/lib/new_relic/dependency_detection.rb +116 -10
- data/lib/new_relic/noticed_error.rb +1 -5
- data/lib/new_relic/supportability_helper.rb +1 -2
- data/lib/new_relic/version.rb +2 -2
- data/newrelic_rpm.gemspec +1 -1
- metadata +53 -8
- data/cert/cacert.pem +0 -1177
- data/lib/new_relic/agent/instrumentation/http.rb +0 -49
- data/lib/new_relic/agent/instrumentation/net.rb +0 -70
@@ -34,7 +34,14 @@ DependencyDetection.defer do
|
|
34
34
|
)
|
35
35
|
end
|
36
36
|
|
37
|
+
# TODO: Remove in 8.0.0 release
|
37
38
|
def install_mongo_instrumentation
|
39
|
+
::NewRelic::Agent::Deprecator.deprecate "install_mongo_instrumentation", "install_mongo_command_subscriber", "8.0.0"
|
40
|
+
::NewRelic::Agent.logger.warn("Installing deprecated Mongo instrumentation. " \
|
41
|
+
"This instrumentation will be removed in a future release. " \
|
42
|
+
"Update Mongo version to >= 2.1.0 for updated instrumentation"
|
43
|
+
)
|
44
|
+
|
38
45
|
require 'new_relic/agent/datastores/mongo/metric_translator'
|
39
46
|
require 'new_relic/agent/datastores/mongo/statement_formatter'
|
40
47
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative 'net_http/chain'
|
6
|
+
require_relative 'net_http/prepend'
|
7
|
+
|
8
|
+
DependencyDetection.defer do
|
9
|
+
named :net_http
|
10
|
+
|
11
|
+
depends_on do
|
12
|
+
defined?(Net) && defined?(Net::HTTP)
|
13
|
+
end
|
14
|
+
|
15
|
+
executes do
|
16
|
+
::NewRelic::Agent.logger.info 'Installing Net:HTTP Wrappers'
|
17
|
+
require 'new_relic/agent/http_clients/net_http_wrappers'
|
18
|
+
end
|
19
|
+
|
20
|
+
conflicts_with_prepend do
|
21
|
+
defined?(::Airbrake)
|
22
|
+
end
|
23
|
+
|
24
|
+
conflicts_with_prepend do
|
25
|
+
defined?(::Rack::MiniProfiler)
|
26
|
+
end
|
27
|
+
|
28
|
+
conflicts_with_prepend do
|
29
|
+
source_location_for(Net::HTTP, "request") =~ /airbrake|profiler/i
|
30
|
+
end
|
31
|
+
|
32
|
+
executes do
|
33
|
+
if use_prepend?
|
34
|
+
prepend_instrument ::Net::HTTP, ::NewRelic::Agent::Instrumentation::NetHTTP::Prepend
|
35
|
+
else
|
36
|
+
chain_instrument ::NewRelic::Agent::Instrumentation::NetHTTP::Chain
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
|
8
|
+
module NewRelic::Agent::Instrumentation
|
9
|
+
module NetHTTP
|
10
|
+
module Chain
|
11
|
+
def self.instrument!
|
12
|
+
Net::HTTP.class_eval do
|
13
|
+
include NewRelic::Agent::Instrumentation::NetHTTP
|
14
|
+
|
15
|
+
def request_with_newrelic_trace(request, *args, &block)
|
16
|
+
request_with_tracing(request) { request_without_newrelic_trace(request, *args, &block) }
|
17
|
+
end
|
18
|
+
|
19
|
+
alias request_without_newrelic_trace request
|
20
|
+
alias request request_with_newrelic_trace
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -5,8 +5,8 @@
|
|
5
5
|
module NewRelic
|
6
6
|
module Agent
|
7
7
|
module Instrumentation
|
8
|
-
module
|
9
|
-
def
|
8
|
+
module NetHTTP
|
9
|
+
def request_with_tracing(request)
|
10
10
|
wrapped_request = NewRelic::Agent::HTTPClients::NetHTTPRequest.new(self, request)
|
11
11
|
|
12
12
|
segment = NewRelic::Agent::Tracer.start_external_request_segment(
|
@@ -23,7 +23,7 @@ module NewRelic
|
|
23
23
|
# counting if connection wasn't started (which calls request again).
|
24
24
|
NewRelic::Agent.disable_all_tracing do
|
25
25
|
response = NewRelic::Agent::Tracer.capture_segment_error segment do
|
26
|
-
|
26
|
+
yield
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic
|
8
|
+
module Agent
|
9
|
+
module Instrumentation
|
10
|
+
module NetHTTP
|
11
|
+
module Prepend
|
12
|
+
include NewRelic::Agent::Instrumentation::NetHTTP
|
13
|
+
|
14
|
+
def request(request, *args, &block)
|
15
|
+
request_with_tracing(request) { super }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -2,69 +2,34 @@
|
|
2
2
|
# This file is distributed under New Relic's license terms.
|
3
3
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
4
|
|
5
|
-
|
5
|
+
# Our Padrino instrumentation relies heavily on the fact that Padrino is
|
6
|
+
# built on Sinatra. Although it wires up a lot of its own routing logic,
|
7
|
+
# we only need to patch into Padrino's dispatch to get things started.
|
8
|
+
#
|
9
|
+
# Parts of the Sinatra instrumentation (such as the TransactionNamer) are
|
10
|
+
# aware of Padrino as a potential target in areas where both Sinatra and
|
11
|
+
# Padrino run through the same code.
|
12
|
+
|
13
|
+
require_relative 'sinatra'
|
14
|
+
require_relative 'padrino/chain'
|
15
|
+
require_relative 'padrino/instrumentation'
|
16
|
+
require_relative 'padrino/prepend'
|
6
17
|
|
7
18
|
DependencyDetection.defer do
|
8
19
|
@name = :padrino
|
20
|
+
configure_with :sinatra
|
9
21
|
|
10
|
-
depends_on
|
11
|
-
!NewRelic::Agent.config[:disable_sinatra] &&
|
12
|
-
defined?(::Padrino) && defined?(::Padrino::Routing::InstanceMethods)
|
13
|
-
end
|
22
|
+
depends_on { defined?(::Padrino) && defined?(::Padrino::Routing::InstanceMethods) }
|
14
23
|
|
15
24
|
executes do
|
16
25
|
::NewRelic::Agent.logger.info 'Installing Padrino instrumentation'
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
#
|
22
|
-
# Parts of the Sinatra instrumentation (such as the TransactionNamer) are
|
23
|
-
# aware of Padrino as a potential target in areas where both Sinatra and
|
24
|
-
# Padrino run through the same code.
|
25
|
-
module ::Padrino::Routing::InstanceMethods
|
26
|
-
include NewRelic::Agent::Instrumentation::Sinatra
|
27
|
-
|
28
|
-
alias dispatch_without_newrelic dispatch!
|
29
|
-
alias dispatch! dispatch_with_newrelic
|
30
|
-
|
31
|
-
# Padrino 0.13 mustermann routing
|
32
|
-
if private_method_defined?(:invoke_route)
|
33
|
-
include NewRelic::Agent::Instrumentation::Padrino
|
34
|
-
|
35
|
-
alias invoke_route_without_newrelic invoke_route
|
36
|
-
alias invoke_route invoke_route_with_newrelic
|
37
|
-
end
|
26
|
+
if use_prepend?
|
27
|
+
prepend_instrument ::Padrino::Routing::InstanceMethods, NewRelic::Agent::Instrumentation::Padrino::Prepend
|
28
|
+
else
|
29
|
+
chain_instrument NewRelic::Agent::Instrumentation::Padrino::Chain
|
38
30
|
end
|
39
31
|
end
|
40
32
|
end
|
41
33
|
|
42
|
-
module NewRelic
|
43
|
-
module Agent
|
44
|
-
module Instrumentation
|
45
|
-
module Padrino
|
46
34
|
|
47
|
-
def invoke_route_with_newrelic(*args, &block)
|
48
|
-
begin
|
49
|
-
env["newrelic.last_route"] = args[0].original_path
|
50
|
-
rescue => e
|
51
|
-
::NewRelic::Agent.logger.debug("Failed determining last route in Padrino", e)
|
52
|
-
end
|
53
35
|
|
54
|
-
begin
|
55
|
-
txn_name = ::NewRelic::Agent::Instrumentation::Sinatra::TransactionNamer.transaction_name_for_route(env, request)
|
56
|
-
unless txn_name.nil?
|
57
|
-
::NewRelic::Agent::Transaction.set_default_transaction_name(
|
58
|
-
"#{self.class.name}/#{txn_name}", :sinatra)
|
59
|
-
end
|
60
|
-
rescue => e
|
61
|
-
::NewRelic::Agent.logger.debug("Failed during invoke_route to set transaction name", e)
|
62
|
-
end
|
63
|
-
|
64
|
-
invoke_route_without_newrelic(*args, &block)
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module Padrino
|
7
|
+
module Chain
|
8
|
+
def self.instrument!
|
9
|
+
::Padrino::Routing::InstanceMethods.module_eval do
|
10
|
+
include NewRelic::Agent::Instrumentation::Sinatra
|
11
|
+
|
12
|
+
def dispatch_with_newrelic
|
13
|
+
dispatch_with_tracing { dispatch_without_newrelic }
|
14
|
+
end
|
15
|
+
|
16
|
+
alias dispatch_without_newrelic dispatch!
|
17
|
+
alias dispatch! dispatch_with_newrelic
|
18
|
+
|
19
|
+
# Padrino 0.13 mustermann routing
|
20
|
+
if private_method_defined?(:invoke_route)
|
21
|
+
include NewRelic::Agent::Instrumentation::Padrino
|
22
|
+
|
23
|
+
def invoke_route_with_newrelic(*args, &block)
|
24
|
+
invoke_route_with_tracing(*args) { invoke_route_without_newrelic(*args, &block) }
|
25
|
+
end
|
26
|
+
|
27
|
+
alias invoke_route_without_newrelic invoke_route
|
28
|
+
alias invoke_route invoke_route_with_newrelic
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module Padrino
|
7
|
+
def invoke_route_with_tracing(*args)
|
8
|
+
begin
|
9
|
+
env["newrelic.last_route"] = args[0].original_path
|
10
|
+
rescue => e
|
11
|
+
::NewRelic::Agent.logger.debug("Failed determining last route in Padrino", e)
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
txn_name = ::NewRelic::Agent::Instrumentation::Sinatra::TransactionNamer.transaction_name_for_route(env, request)
|
16
|
+
unless txn_name.nil?
|
17
|
+
::NewRelic::Agent::Transaction.set_default_transaction_name(
|
18
|
+
"#{self.class.name}/#{txn_name}", :sinatra)
|
19
|
+
end
|
20
|
+
rescue => e
|
21
|
+
::NewRelic::Agent.logger.debug("Failed during invoke_route to set transaction name", e)
|
22
|
+
end
|
23
|
+
|
24
|
+
yield
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module Padrino
|
7
|
+
module Prepend
|
8
|
+
include NewRelic::Agent::Instrumentation::Sinatra
|
9
|
+
include NewRelic::Agent::Instrumentation::Padrino
|
10
|
+
|
11
|
+
def dispatch
|
12
|
+
dispatch_with_tracing { super }
|
13
|
+
end
|
14
|
+
|
15
|
+
def invoke_route(*args, &block)
|
16
|
+
invoke_route_with_tracing(*args) { super }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -4,134 +4,10 @@
|
|
4
4
|
|
5
5
|
require 'new_relic/agent/instrumentation/controller_instrumentation'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def self.version_supported?
|
12
|
-
rack_version_supported? || puma_rack_version_supported?
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.rack_version_supported?
|
16
|
-
return false unless defined? ::Rack
|
17
|
-
|
18
|
-
version = Gem::Version.new(::Rack.release)
|
19
|
-
min_version = Gem::Version.new('1.1.0')
|
20
|
-
version >= min_version
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.puma_rack_version_supported?
|
24
|
-
return false unless defined? ::Puma::Const::PUMA_VERSION
|
25
|
-
|
26
|
-
version = Gem::Version.new(::Puma::Const::PUMA_VERSION)
|
27
|
-
min_version = Gem::Version.new('2.12.0')
|
28
|
-
version >= min_version
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.middleware_instrumentation_enabled?
|
32
|
-
version_supported? && !::NewRelic::Agent.config[:disable_middleware_instrumentation]
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.check_for_late_instrumentation(app)
|
36
|
-
return if defined?(@checked_for_late_instrumentation) && @checked_for_late_instrumentation
|
37
|
-
@checked_for_late_instrumentation = true
|
38
|
-
if middleware_instrumentation_enabled?
|
39
|
-
if ::NewRelic::Agent::Instrumentation::MiddlewareProxy.needs_wrapping?(app)
|
40
|
-
::NewRelic::Agent.logger.info("We weren't able to instrument all of your Rack middlewares.",
|
41
|
-
"To correct this, ensure you 'require \"newrelic_rpm\"' before setting up your middleware stack.")
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.instrument_builder builder_class
|
47
|
-
::NewRelic::Agent.logger.info "Installing deferred #{builder_class} instrumentation"
|
48
|
-
|
49
|
-
builder_class.class_eval do
|
50
|
-
class << self
|
51
|
-
attr_accessor :_nr_deferred_detection_ran
|
52
|
-
end
|
53
|
-
self._nr_deferred_detection_ran = false
|
54
|
-
|
55
|
-
include ::NewRelic::Agent::Instrumentation::RackBuilder
|
56
|
-
|
57
|
-
alias_method :to_app_without_newrelic, :to_app
|
58
|
-
alias_method :to_app, :to_app_with_newrelic_deferred_dependency_detection
|
59
|
-
|
60
|
-
if ::NewRelic::Agent::Instrumentation::RackHelpers.middleware_instrumentation_enabled?
|
61
|
-
::NewRelic::Agent.logger.info "Installing #{builder_class} middleware instrumentation"
|
62
|
-
alias_method :run_without_newrelic, :run
|
63
|
-
alias_method :run, :run_with_newrelic
|
64
|
-
|
65
|
-
alias_method :use_without_newrelic, :use
|
66
|
-
alias_method :use, :use_with_newrelic
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def self.instrument_url_map url_map_class
|
71
|
-
url_map_class.class_eval do
|
72
|
-
alias_method :initialize_without_newrelic, :initialize
|
73
|
-
|
74
|
-
def initialize(map = {})
|
75
|
-
traced_map = ::NewRelic::Agent::Instrumentation::RackURLMap.generate_traced_map(map)
|
76
|
-
initialize_without_newrelic(traced_map)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
module RackBuilder
|
84
|
-
|
85
|
-
def run_with_newrelic(app, *args)
|
86
|
-
if ::NewRelic::Agent::Instrumentation::RackHelpers.middleware_instrumentation_enabled?
|
87
|
-
wrapped_app = ::NewRelic::Agent::Instrumentation::MiddlewareProxy.wrap(app, true)
|
88
|
-
run_without_newrelic(wrapped_app, *args)
|
89
|
-
else
|
90
|
-
run_without_newrelic(app, *args)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def use_with_newrelic(middleware_class, *args, &blk)
|
95
|
-
return if middleware_class.nil?
|
96
|
-
if ::NewRelic::Agent::Instrumentation::RackHelpers.middleware_instrumentation_enabled?
|
97
|
-
wrapped_middleware_class = ::NewRelic::Agent::Instrumentation::MiddlewareProxy.for_class(middleware_class)
|
98
|
-
use_without_newrelic(wrapped_middleware_class, *args, &blk)
|
99
|
-
else
|
100
|
-
use_without_newrelic(middleware_class, *args, &blk)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
# We patch this method for a reason that actually has nothing to do with
|
105
|
-
# instrumenting rack itself. It happens to be a convenient and
|
106
|
-
# easy-to-hook point that happens late in the startup sequence of almost
|
107
|
-
# every application, making it a good place to do a final call to
|
108
|
-
# DependencyDetection.detect!, since all libraries are likely loaded at
|
109
|
-
# this point.
|
110
|
-
def to_app_with_newrelic_deferred_dependency_detection
|
111
|
-
unless self.class._nr_deferred_detection_ran
|
112
|
-
NewRelic::Agent.logger.info "Doing deferred dependency-detection before Rack startup"
|
113
|
-
DependencyDetection.detect!
|
114
|
-
self.class._nr_deferred_detection_ran = true
|
115
|
-
end
|
116
|
-
|
117
|
-
result = to_app_without_newrelic
|
118
|
-
::NewRelic::Agent::Instrumentation::RackHelpers.check_for_late_instrumentation(result)
|
119
|
-
|
120
|
-
result
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
module RackURLMap
|
125
|
-
def self.generate_traced_map(map)
|
126
|
-
map.inject({}) do |traced_map, (url, handler)|
|
127
|
-
traced_map[url] = NewRelic::Agent::Instrumentation::MiddlewareProxy.wrap(handler, true)
|
128
|
-
traced_map
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
7
|
+
require_relative 'rack/helpers'
|
8
|
+
require_relative 'rack/instrumentation'
|
9
|
+
require_relative 'rack/chain'
|
10
|
+
require_relative 'rack/prepend'
|
135
11
|
|
136
12
|
DependencyDetection.defer do
|
137
13
|
named :rack
|
@@ -141,20 +17,27 @@ DependencyDetection.defer do
|
|
141
17
|
end
|
142
18
|
|
143
19
|
executes do
|
144
|
-
|
20
|
+
if use_prepend?
|
21
|
+
prepend_instrument ::Rack::Builder, NewRelic::Agent::Instrumentation::Rack::Prepend
|
22
|
+
else
|
23
|
+
chain_instrument_target ::Rack::Builder, NewRelic::Agent::Instrumentation::Rack::Chain
|
24
|
+
end
|
145
25
|
end
|
146
26
|
end
|
147
27
|
|
148
|
-
|
149
28
|
DependencyDetection.defer do
|
150
29
|
named :puma_rack
|
151
30
|
|
152
31
|
depends_on do
|
153
|
-
defined?(::Puma::Rack::Builder)
|
32
|
+
defined?(::Puma::Rack::Builder)
|
154
33
|
end
|
155
34
|
|
156
35
|
executes do
|
157
|
-
|
36
|
+
if use_prepend?
|
37
|
+
prepend_instrument ::Puma::Rack::Builder, NewRelic::Agent::Instrumentation::Rack::Prepend
|
38
|
+
else
|
39
|
+
chain_instrument_target ::Puma::Rack::Builder, NewRelic::Agent::Instrumentation::Rack::Chain
|
40
|
+
end
|
158
41
|
end
|
159
42
|
end
|
160
43
|
|
@@ -166,12 +49,16 @@ DependencyDetection.defer do
|
|
166
49
|
end
|
167
50
|
|
168
51
|
depends_on do
|
169
|
-
::NewRelic::Agent::Instrumentation::RackHelpers.middleware_instrumentation_enabled?
|
170
|
-
!::NewRelic::Agent.config[:disable_rack]
|
52
|
+
::NewRelic::Agent::Instrumentation::RackHelpers.middleware_instrumentation_enabled?
|
171
53
|
end
|
172
54
|
|
173
55
|
executes do
|
174
|
-
|
56
|
+
if use_prepend?
|
57
|
+
prepend_instrument ::Rack::URLMap, NewRelic::Agent::Instrumentation::Rack::URLMap::Prepend
|
58
|
+
else
|
59
|
+
chain_instrument_target ::Rack::URLMap, NewRelic::Agent::Instrumentation::Rack::URLMap::Chain
|
60
|
+
::NewRelic::Agent::Instrumentation::RackHelpers.instrument_url_map
|
61
|
+
end
|
175
62
|
end
|
176
63
|
end
|
177
64
|
|
@@ -179,15 +66,18 @@ DependencyDetection.defer do
|
|
179
66
|
named :puma_rack_urlmap
|
180
67
|
|
181
68
|
depends_on do
|
182
|
-
defined?
|
69
|
+
defined?(Puma::Rack::URLMap)
|
183
70
|
end
|
184
71
|
|
185
72
|
depends_on do
|
186
|
-
::NewRelic::Agent::Instrumentation::RackHelpers.middleware_instrumentation_enabled?
|
187
|
-
!::NewRelic::Agent.config[:disable_puma_rack]
|
73
|
+
::NewRelic::Agent::Instrumentation::RackHelpers.middleware_instrumentation_enabled?
|
188
74
|
end
|
189
75
|
|
190
76
|
executes do
|
191
|
-
|
77
|
+
if use_prepend?
|
78
|
+
prepend_instrument ::Puma::Rack::URLMap, NewRelic::Agent::Instrumentation::Rack::URLMap::Prepend
|
79
|
+
else
|
80
|
+
chain_instrument_target ::Puma::Rack::URLMap, NewRelic::Agent::Instrumentation::Rack::URLMap::Chain
|
81
|
+
end
|
192
82
|
end
|
193
83
|
end
|