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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +96 -22
  3. data/README.md +2 -2
  4. data/lib/new_relic/agent.rb +0 -6
  5. data/lib/new_relic/agent/autostart.rb +1 -2
  6. data/lib/new_relic/agent/configuration/default_source.rb +270 -104
  7. data/lib/new_relic/agent/configuration/manager.rb +2 -2
  8. data/lib/new_relic/agent/datastores/redis.rb +0 -4
  9. data/lib/new_relic/agent/distributed_tracing.rb +0 -66
  10. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +0 -16
  11. data/lib/new_relic/agent/instrumentation/bunny.rb +10 -152
  12. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
  13. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +152 -0
  14. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
  15. data/lib/new_relic/agent/instrumentation/curb.rb +9 -241
  16. data/lib/new_relic/agent/instrumentation/curb/chain.rb +93 -0
  17. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +222 -0
  18. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +63 -0
  19. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +38 -0
  20. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +53 -0
  21. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +34 -0
  22. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +8 -50
  23. data/lib/new_relic/agent/instrumentation/excon.rb +2 -1
  24. data/lib/new_relic/agent/instrumentation/grape.rb +13 -113
  25. data/lib/new_relic/agent/instrumentation/grape/chain.rb +25 -0
  26. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
  27. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
  28. data/lib/new_relic/agent/instrumentation/httpclient.rb +8 -30
  29. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +25 -0
  30. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +38 -0
  31. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +17 -0
  32. data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
  33. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
  34. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
  35. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
  36. data/lib/new_relic/agent/instrumentation/memcache.rb +54 -69
  37. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +16 -0
  38. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +38 -121
  39. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +56 -0
  40. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +88 -0
  41. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +88 -0
  42. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +2 -0
  43. data/lib/new_relic/agent/instrumentation/mongo.rb +7 -0
  44. data/lib/new_relic/agent/instrumentation/net_http.rb +39 -0
  45. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +25 -0
  46. data/lib/new_relic/agent/instrumentation/{net_prepend.rb → net_http/instrumentation.rb} +3 -3
  47. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
  48. data/lib/new_relic/agent/instrumentation/padrino.rb +18 -53
  49. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +34 -0
  50. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +27 -0
  51. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
  52. data/lib/new_relic/agent/instrumentation/rack.rb +29 -139
  53. data/lib/new_relic/agent/instrumentation/rack/chain.rb +57 -0
  54. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +32 -0
  55. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +73 -0
  56. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +36 -0
  57. data/lib/new_relic/agent/instrumentation/rake.rb +13 -154
  58. data/lib/new_relic/agent/instrumentation/rake/chain.rb +25 -0
  59. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +144 -0
  60. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
  61. data/lib/new_relic/agent/instrumentation/redis.rb +10 -109
  62. data/lib/new_relic/agent/instrumentation/redis/chain.rb +34 -0
  63. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +65 -0
  64. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +24 -0
  65. data/lib/new_relic/agent/instrumentation/resque.rb +8 -28
  66. data/lib/new_relic/agent/instrumentation/resque/chain.rb +22 -0
  67. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +33 -0
  68. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +16 -0
  69. data/lib/new_relic/agent/instrumentation/sinatra.rb +20 -158
  70. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
  71. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +29 -34
  72. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +118 -0
  73. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
  74. data/lib/new_relic/agent/instrumentation/typhoeus.rb +10 -89
  75. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
  76. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +82 -0
  77. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
  78. data/lib/new_relic/agent/new_relic_service.rb +3 -12
  79. data/lib/new_relic/agent/sql_sampler.rb +1 -1
  80. data/lib/new_relic/agent/transaction.rb +1 -4
  81. data/lib/new_relic/control/frameworks/rails.rb +11 -9
  82. data/lib/new_relic/control/instance_methods.rb +1 -0
  83. data/lib/new_relic/dependency_detection.rb +116 -10
  84. data/lib/new_relic/noticed_error.rb +1 -5
  85. data/lib/new_relic/supportability_helper.rb +1 -2
  86. data/lib/new_relic/version.rb +2 -2
  87. data/newrelic_rpm.gemspec +1 -1
  88. metadata +53 -8
  89. data/cert/cacert.pem +0 -1177
  90. data/lib/new_relic/agent/instrumentation/http.rb +0 -49
  91. data/lib/new_relic/agent/instrumentation/net.rb +0 -70
@@ -31,6 +31,8 @@ module NewRelic
31
31
  middleware_instance = @middleware_class.new(*args, &blk)
32
32
  MiddlewareProxy.wrap(middleware_instance)
33
33
  end
34
+
35
+ ruby2_keywords(:new) if respond_to?(:ruby2_keywords, true)
34
36
  end
35
37
 
36
38
  def self.is_sinatra_app?(target)
@@ -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 NetPrepend
9
- def request(request, *args, &block)
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
- super
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
- require 'new_relic/agent/instrumentation/sinatra'
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 do
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
- # Our Padrino instrumentation relies heavily on the fact that Padrino is
19
- # built on Sinatra. Although it wires up a lot of its own routing logic,
20
- # we only need to patch into Padrino's dispatch to get things started.
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
- module NewRelic
8
- module Agent
9
- module Instrumentation
10
- module RackHelpers
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
- ::NewRelic::Agent::Instrumentation::RackHelpers.instrument_builder ::Rack::Builder
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) && !NewRelic::Agent.config[:disable_puma_rack]
32
+ defined?(::Puma::Rack::Builder)
154
33
  end
155
34
 
156
35
  executes do
157
- ::NewRelic::Agent::Instrumentation::RackHelpers.instrument_builder ::Puma::Rack::Builder
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
- ::NewRelic::Agent::Instrumentation::RackHelpers.instrument_url_map ::Rack::URLMap
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? Puma::Rack::URLMap
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
- ::NewRelic::Agent::Instrumentation::RackHelpers.instrument_url_map ::Puma::Rack::URLMap
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