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
@@ -0,0 +1,63 @@
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
+ # frozen_string_literal: true
5
+
6
+ require_relative 'instrumentation'
7
+
8
+ module NewRelic
9
+ module Agent
10
+ module Instrumentation
11
+ module Curb
12
+ module Easy
13
+ module Prepend
14
+ include NewRelic::Agent::Instrumentation::Curb::Easy
15
+
16
+ def http_head(*args, &blk)
17
+ http_head_with_tracing { super }
18
+ end
19
+
20
+ def http_post(*args, &blk)
21
+ http_post_with_tracing { super }
22
+ end
23
+
24
+ def http_put(*args, &blk)
25
+ http_put_with_tracing { super }
26
+ end
27
+
28
+ def http verb
29
+ http_with_tracing(verb) { super }
30
+ end
31
+
32
+ def perform
33
+ perform_with_tracing { super }
34
+ end
35
+
36
+ def method verb
37
+ method_with_tracing { super }
38
+ end
39
+
40
+ def header_str
41
+ header_str_with_tracing { super }
42
+ end
43
+ end
44
+ end
45
+
46
+ module Multi
47
+ module Prepend
48
+ include NewRelic::Agent::Instrumentation::Curb::Multi
49
+
50
+ def add(curl)
51
+ add_with_tracing(curl) { super }
52
+ end
53
+
54
+ def perform(&blk)
55
+ perform_with_tracing { super }
56
+ end
57
+
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,38 @@
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
+ # frozen_string_literal: true
5
+ require_relative 'instrumentation'
6
+
7
+ module NewRelic::Agent::Instrumentation
8
+ module DelayedJob
9
+ module Chain
10
+ def self.instrument!
11
+ Delayed::Worker.class_eval do
12
+ include NewRelic::Agent::Instrumentation::DelayedJob
13
+
14
+ def initialize_with_new_relic(*args)
15
+ initialize_with_tracing { initialize_without_new_relic(*args) }
16
+ end
17
+
18
+ alias initialize_without_new_relic initialize
19
+ alias initialize initialize_with_new_relic
20
+
21
+
22
+ def install_newrelic_job_tracer
23
+ Delayed::Job.class_eval do
24
+ include NewRelic::Agent::Instrumentation::DelayedJobTracer
25
+
26
+ alias_method :invoke_job_without_new_relic, :invoke_job
27
+
28
+ def invoke_job(*args, &block)
29
+ invoke_job_with_tracing { invoke_job_without_new_relic(*args, &block) }
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,53 @@
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
+ # frozen_string_literal: true
5
+
6
+
7
+ module NewRelic
8
+ module Agent
9
+ module Instrumentation
10
+ module DelayedJob
11
+
12
+ def initialize_with_tracing
13
+ yield
14
+ worker_name = case
15
+ when self.respond_to?(:name) then self.name
16
+ when self.class.respond_to?(:default_name) then self.class.default_name
17
+ end
18
+ NewRelic::DelayedJobInjection.worker_name = worker_name
19
+
20
+ if defined?(::Delayed::Job) && ::Delayed::Job.method_defined?(:invoke_job) &&
21
+ !(::Delayed::Job.method_defined?(:invoke_job_without_new_relic) )
22
+
23
+ ::NewRelic::Agent.logger.info 'Installing DelayedJob instrumentation [part 2/2]'
24
+ install_newrelic_job_tracer
25
+ NewRelic::Control.instance.init_plugin :dispatcher => :delayed_job
26
+ else
27
+ NewRelic::Agent.logger.warn("Did not find a Delayed::Job class responding to invoke_job, aborting DJ instrumentation")
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ module DelayedJobTracer
34
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
35
+
36
+ NR_TRANSACTION_CATEGORY = 'OtherTransaction/DelayedJob'.freeze
37
+
38
+ def invoke_job_with_tracing
39
+ options = {
40
+ :category => NR_TRANSACTION_CATEGORY,
41
+ :path => ::NewRelic::Agent::Instrumentation::DelayedJob::Naming.name_from_payload(payload_object)
42
+ }
43
+
44
+ perform_action_with_newrelic_trace(options) do
45
+ yield
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end
53
+
@@ -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
+ # frozen_string_literal: true
5
+
6
+ require_relative 'instrumentation'
7
+
8
+ module NewRelic
9
+ module Agent
10
+ module Instrumentation
11
+ module DelayedJob
12
+ module Prepend
13
+ include NewRelic::Agent::Instrumentation::DelayedJob
14
+
15
+ def initialize(*args)
16
+ initialize_with_tracing { super }
17
+ end
18
+
19
+ def install_newrelic_job_tracer
20
+ Delayed::Job.send :prepend, ::NewRelic::Agent::Instrumentation::DelayedJobTracerPrepend
21
+ end
22
+ end
23
+ end
24
+
25
+ module DelayedJobTracerPrepend
26
+ include NewRelic::Agent::Instrumentation::DelayedJobTracer
27
+
28
+ def invoke_job(*args, &block)
29
+ invoke_job_with_tracing { super }
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -2,6 +2,9 @@
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_relative 'delayed_job/chain'
6
+ require_relative 'delayed_job/prepend'
7
+
5
8
  require 'new_relic/agent/instrumentation/controller_instrumentation'
6
9
 
7
10
  module NewRelic
@@ -76,11 +79,7 @@ DependencyDetection.defer do
76
79
  @name = :delayed_job
77
80
 
78
81
  depends_on do
79
- !NewRelic::Agent.config[:disable_dj]
80
- end
81
-
82
- depends_on do
83
- defined?(::Delayed) && defined?(::Delayed::Worker) && !NewRelic::Agent.config[:disable_dj]
82
+ defined?(::Delayed) && defined?(::Delayed::Worker)
84
83
  end
85
84
 
86
85
  executes do
@@ -88,51 +87,10 @@ DependencyDetection.defer do
88
87
  end
89
88
 
90
89
  executes do
91
- Delayed::Worker.class_eval do
92
-
93
- def initialize_with_new_relic(*args)
94
- initialize_without_new_relic(*args)
95
- worker_name = case
96
- when self.respond_to?(:name) then self.name
97
- when self.class.respond_to?(:default_name) then self.class.default_name
98
- end
99
- NewRelic::DelayedJobInjection.worker_name = worker_name
100
-
101
- if defined?(::Delayed::Job) && ::Delayed::Job.method_defined?(:invoke_job) &&
102
- !(::Delayed::Job.method_defined?(:invoke_job_without_new_relic) )
103
-
104
- ::NewRelic::Agent.logger.info 'Installing DelayedJob instrumentation [part 2/2]'
105
- install_newrelic_job_tracer
106
- NewRelic::Control.instance.init_plugin :dispatcher => :delayed_job
107
- else
108
- NewRelic::Agent.logger.warn("Did not find a Delayed::Job class responding to invoke_job, aborting DJ instrumentation")
109
- end
110
- end
111
-
112
- alias initialize_without_new_relic initialize
113
- alias initialize initialize_with_new_relic
114
-
115
- NR_TRANSACTION_CATEGORY = 'OtherTransaction/DelayedJob'.freeze
116
-
117
- def install_newrelic_job_tracer
118
- Delayed::Job.class_eval do
119
- include NewRelic::Agent::Instrumentation::ControllerInstrumentation
120
-
121
- alias_method :invoke_job_without_new_relic, :invoke_job
122
-
123
- def invoke_job(*args, &block)
124
- options = {
125
- :category => NR_TRANSACTION_CATEGORY,
126
- :path => ::NewRelic::Agent::Instrumentation::DelayedJob::Naming.name_from_payload(payload_object)
127
- }
128
-
129
- perform_action_with_newrelic_trace(options) do
130
- invoke_job_without_new_relic(*args, &block)
131
- end
132
- end
133
-
134
- end
135
- end
90
+ if use_prepend?
91
+ prepend_instrument ::Delayed::Worker, ::NewRelic::Agent::Instrumentation::DelayedJob::Prepend
92
+ else
93
+ chain_instrument ::NewRelic::Agent::Instrumentation::DelayedJob::Chain
136
94
  end
137
95
  end
138
96
  end
@@ -65,7 +65,8 @@ DependencyDetection.defer do
65
65
  end
66
66
 
67
67
  def install_legacy_excon_instrumentation
68
- ::NewRelic::Agent.logger.info 'Installing legacy Excon instrumentation'
68
+ ::NewRelic::Agent::Deprecator.deprecate :install_legacy_excon_instrumentation, :install_middleware_excon_instrumentation, "8.0.0"
69
+ ::NewRelic::Agent.logger.warn 'Installing deprecated legacy Excon instrumentation. This instrumentation will be removed in a future release. Update Excon version to > 0.19.0 for updated instrumentation'
69
70
  require 'new_relic/agent/instrumentation/excon/connection'
70
71
  ::Excon::Connection.install_newrelic_instrumentation
71
72
  end
@@ -2,90 +2,19 @@
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/parameter_filtering'
6
-
7
- module NewRelic
8
- module Agent
9
- module Instrumentation
10
- module GrapeInstrumentation
11
- extend self
12
-
13
- API_ENDPOINT = 'api.endpoint'.freeze
14
- API_VERSION = 'api.version'.freeze
15
- FORMAT_REGEX = /\(\/?\.[\:\w]*\)/.freeze # either :format (< 0.12.0) or .ext (>= 0.12.0)
16
- VERSION_REGEX = /:version(\/|$)/.freeze
17
- MIN_VERSION = Gem::Version.new("0.2.0")
18
- PIPE_STRING = '|'.freeze
19
-
20
- def handle_transaction(endpoint, class_name, version)
21
- return unless endpoint && route = endpoint.route
22
- name_transaction(route, class_name, version)
23
- capture_params(endpoint)
24
- end
25
-
26
- def name_transaction(route, class_name, version)
27
- txn_name = name_for_transaction(route, class_name, version)
28
- segment_name = "Middleware/Grape/#{class_name}/call"
29
- Transaction.set_default_transaction_name(txn_name, :grape)
30
- txn = NewRelic::Agent::Transaction.tl_current
31
- txn.segments.last.name = segment_name
32
- end
33
-
34
- def name_for_transaction(route, class_name, version)
35
- action_name = route.path.sub(FORMAT_REGEX, NewRelic::EMPTY_STR)
36
- method_name = route.request_method
37
- version ||= route.version
38
-
39
- # defaulting does not set rack.env['api.version'] and route.version may return Array
40
- #
41
- version = version.join(PIPE_STRING) if Array === version
42
-
43
- if version
44
- action_name = action_name.sub(VERSION_REGEX, NewRelic::EMPTY_STR)
45
- "#{class_name}-#{version}#{action_name} (#{method_name})"
46
- else
47
- "#{class_name}#{action_name} (#{method_name})"
48
- end
49
- end
50
-
51
- def name_for_transaction_deprecated(route, class_name, version)
52
- action_name = route.route_path.sub(FORMAT_REGEX, NewRelic::EMPTY_STR)
53
- method_name = route.route_method
54
- version ||= route.route_version
55
-
56
- if version
57
- action_name = action_name.sub(VERSION_REGEX, NewRelic::EMPTY_STR)
58
- "#{class_name}-#{version}#{action_name} (#{method_name})"
59
- else
60
- "#{class_name}#{action_name} (#{method_name})"
61
- end
62
- end
63
-
64
- def capture_params(endpoint)
65
- txn = Transaction.tl_current
66
- env = endpoint.request.env
67
- params = ParameterFiltering::apply_filters(env, endpoint.params)
68
- params.delete("route_info")
69
- txn.filtered_params = params
70
- txn.merge_request_parameters(params)
71
- end
72
- end
73
- end
74
- end
75
- end
5
+ require_relative 'grape/instrumentation'
6
+ require_relative 'grape/chain'
7
+ require_relative 'grape/prepend'
76
8
 
77
9
  DependencyDetection.defer do
78
10
  # Why not just :grape? newrelic-grape used that name already, and while we're
79
11
  # not shipping yet, overloading the name interferes with the plugin.
80
12
  named :grape_instrumentation
81
-
82
- depends_on do
83
- ::NewRelic::Agent.config[:disable_grape] == false
84
- end
85
-
13
+ configure_with :grape
14
+
86
15
  depends_on do
87
16
  defined?(::Grape::VERSION) &&
88
- Gem::Version.new(::Grape::VERSION) >= ::NewRelic::Agent::Instrumentation::GrapeInstrumentation::MIN_VERSION
17
+ Gem::Version.new(::Grape::VERSION) >= ::NewRelic::Agent::Instrumentation::Grape::Instrumentation::MIN_VERSION
89
18
  end
90
19
 
91
20
  depends_on do
@@ -103,43 +32,14 @@ DependencyDetection.defer do
103
32
  end
104
33
 
105
34
  executes do
106
- NewRelic::Agent.logger.info 'Installing New Relic supported Grape instrumentation'
107
- instrument_call
108
- end
35
+ ::NewRelic::Agent::Instrumentation::Grape::Instrumentation.prepare!
109
36
 
110
- def instrument_call
111
- if defined?(Grape::VERSION) && Gem::Version.new(::Grape::VERSION) >= Gem::Version.new("0.16.0")
112
- ::NewRelic::Agent::Instrumentation::GrapeInstrumentation.send :remove_method, :name_for_transaction_deprecated
113
- else
114
- ::NewRelic::Agent::Instrumentation::GrapeInstrumentation.send :remove_method, :name_for_transaction
115
- ::NewRelic::Agent::Instrumentation::GrapeInstrumentation.send :alias_method, :name_for_transaction, :name_for_transaction_deprecated
116
- end
117
-
118
- # Since 1.2.0, the class `Grape::API` no longer refers to an API instance, rather, what used to be `Grape::API` is `Grape::API::Instance`
119
- # https://github.com/ruby-grape/grape/blob/c20a73ac1e3f3ba1082005ed61bf69452373ba87/UPGRADING.md#upgrading-to--120
120
- grape_api_class = defined?(Grape::API::Instance) ? ::Grape::API::Instance : ::Grape::API
121
-
122
- grape_api_class.class_eval do
123
- def call_with_new_relic(env)
124
- begin
125
- response = call_without_new_relic(env)
126
- ensure
127
- begin
128
- endpoint = env[::NewRelic::Agent::Instrumentation::GrapeInstrumentation::API_ENDPOINT]
129
- version = env[::NewRelic::Agent::Instrumentation::GrapeInstrumentation::API_VERSION]
130
-
131
- api_class = (self.class.respond_to?(:base) && self.class.base) || self.class
132
- ::NewRelic::Agent::Instrumentation::GrapeInstrumentation.handle_transaction(endpoint, api_class.name, version)
133
- rescue => e
134
- ::NewRelic::Agent.logger.warn("Error in Grape instrumentation", e)
135
- end
136
- end
137
-
138
- response
139
- end
140
-
141
- alias_method :call_without_new_relic, :call
142
- alias_method :call, :call_with_new_relic
37
+ if use_prepend?
38
+ instrumented_class = ::NewRelic::Agent::Instrumentation::Grape::Instrumentation.instrumented_class
39
+ prepend_instrument instrumented_class, ::NewRelic::Agent::Instrumentation::Grape::Prepend
40
+ else
41
+ chain_instrument ::NewRelic::Agent::Instrumentation::Grape::Chain
143
42
  end
144
43
  end
44
+
145
45
  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
+ module NewRelic::Agent::Instrumentation
6
+ module Grape
7
+ module Chain
8
+ def self.instrument!
9
+ Grape::Instrumentation.instrumented_class.class_eval do
10
+ def call_with_new_relic env
11
+ begin
12
+ call_without_new_relic env
13
+ ensure
14
+ Grape::Instrumentation.capture_transaction env, self
15
+ end
16
+ end
17
+
18
+ alias_method :call_without_new_relic, :call
19
+ alias_method :call, :call_with_new_relic
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+