newrelic_rpm 3.17.2.327 → 3.18.0.329

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +32 -10
  3. data/CHANGELOG.md +43 -3
  4. data/Rakefile +0 -21
  5. data/lib/new_relic/agent/cross_app_tracing.rb +34 -269
  6. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +10 -2
  7. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +18 -9
  8. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +12 -6
  9. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +13 -6
  10. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +13 -6
  11. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +14 -3
  12. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +10 -15
  13. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +4 -7
  14. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +4 -19
  15. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +0 -1
  16. data/lib/new_relic/agent/instrumentation/curb.rb +9 -7
  17. data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +4 -0
  18. data/lib/new_relic/agent/instrumentation/excon/connection.rb +15 -5
  19. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +17 -12
  20. data/lib/new_relic/agent/instrumentation/http.rb +12 -5
  21. data/lib/new_relic/agent/instrumentation/httpclient.rb +13 -4
  22. data/lib/new_relic/agent/instrumentation/net.rb +13 -2
  23. data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +2 -10
  24. data/lib/new_relic/agent/instrumentation/typhoeus.rb +8 -3
  25. data/lib/new_relic/agent/method_tracer_helpers.rb +3 -1
  26. data/lib/new_relic/agent/parameter_filtering.rb +1 -1
  27. data/lib/new_relic/agent/stats_engine/metric_stats.rb +0 -18
  28. data/lib/new_relic/agent/supported_versions.rb +1 -0
  29. data/lib/new_relic/agent/transaction/abstract_segment.rb +7 -9
  30. data/lib/new_relic/agent/transaction/external_request_segment.rb +139 -0
  31. data/lib/new_relic/agent/transaction/segment.rb +1 -1
  32. data/lib/new_relic/agent/transaction/tracing.rb +10 -1
  33. data/lib/new_relic/recipes/capistrano3.rb +3 -1
  34. data/lib/new_relic/version.rb +2 -2
  35. data/lib/tasks/multiverse.rb +27 -7
  36. data/test/environments/rails42/Gemfile +1 -0
  37. data/test/multiverse/lib/multiverse.rb +32 -0
  38. data/test/multiverse/lib/multiverse/runner.rb +2 -2
  39. data/test/multiverse/lib/multiverse/suite.rb +43 -22
  40. data/test/multiverse/suites/active_record/Envfile +3 -1
  41. data/test/multiverse/suites/activemerchant/Envfile +5 -1
  42. data/test/multiverse/suites/agent_only/Envfile +1 -0
  43. data/test/multiverse/suites/capistrano/deployment_test.rb +6 -9
  44. data/test/multiverse/suites/capistrano2/deployment_test.rb +6 -6
  45. data/test/multiverse/suites/curb/curb_test.rb +2 -3
  46. data/test/multiverse/suites/datamapper/Envfile +4 -0
  47. data/test/multiverse/suites/datamapper/datamapper_test.rb +106 -36
  48. data/test/multiverse/suites/delayed_job/Envfile +3 -3
  49. data/test/multiverse/suites/excon/excon_test.rb +1 -1
  50. data/test/multiverse/suites/grape/grape_test.rb +1 -1
  51. data/test/multiverse/suites/grape/grape_test_api.rb +1 -1
  52. data/test/multiverse/suites/grape/grape_versioning_test.rb +1 -1
  53. data/test/multiverse/suites/grape/grape_versioning_test_api.rb +1 -1
  54. data/test/multiverse/suites/grape/unsupported_version_test.rb +1 -1
  55. data/test/multiverse/suites/httpclient/Envfile +2 -0
  56. data/test/multiverse/suites/httpclient/httpclient_test.rb +1 -1
  57. data/test/multiverse/suites/httprb/Envfile +2 -0
  58. data/test/multiverse/suites/httprb/httprb_test.rb +1 -1
  59. data/test/multiverse/suites/json/Envfile +7 -2
  60. data/test/multiverse/suites/memcached/Envfile +2 -0
  61. data/test/multiverse/suites/mongo/Envfile +2 -0
  62. data/test/multiverse/suites/mongo/helpers/mongo_operation_tests.rb +95 -33
  63. data/test/multiverse/suites/mongo/mongo2_instrumentation_test.rb +62 -23
  64. data/test/multiverse/suites/net_http/Envfile +2 -0
  65. data/test/multiverse/suites/net_http/net_http_test.rb +7 -3
  66. data/test/multiverse/suites/padrino/Envfile +2 -0
  67. data/test/multiverse/suites/rack/Envfile +2 -0
  68. data/test/multiverse/suites/rack/url_map_test.rb +4 -0
  69. data/test/multiverse/suites/rails/Envfile +34 -29
  70. data/test/multiverse/suites/rake/Envfile +11 -6
  71. data/test/multiverse/suites/redis/Envfile +2 -0
  72. data/test/multiverse/suites/redis/redis_instrumentation_test.rb +31 -12
  73. data/test/multiverse/suites/sidekiq/Envfile +6 -2
  74. data/test/multiverse/suites/sinatra/Envfile +2 -0
  75. data/test/multiverse/suites/typhoeus/Envfile +31 -27
  76. data/test/multiverse/suites/typhoeus/typhoeus_test.rb +4 -3
  77. data/test/multiverse/suites/yajl/Envfile +4 -2
  78. data/test/new_relic/agent/datastores_test.rb +0 -10
  79. data/test/new_relic/agent/instrumentation/action_cable_subscriber_test.rb +2 -2
  80. data/test/new_relic/agent/instrumentation/action_view_subscriber_test.rb +64 -65
  81. data/test/new_relic/agent/instrumentation/active_record_subscriber_test.rb +11 -9
  82. data/test/new_relic/agent/instrumentation/instance_identification_test.rb +9 -8
  83. data/test/new_relic/agent/instrumentation/mongodb_command_subscriber_test.rb +7 -11
  84. data/test/new_relic/agent/instrumentation/net_instrumentation_test.rb +4 -0
  85. data/test/new_relic/agent/method_tracer/instance_methods/trace_execution_scoped_test.rb +0 -9
  86. data/test/new_relic/agent/method_tracer_test.rb +24 -8
  87. data/test/new_relic/agent/parameter_filtering_test.rb +2 -2
  88. data/test/new_relic/agent/stats_engine/metric_stats_test.rb +1 -0
  89. data/test/new_relic/agent/transaction/abstract_segment_test.rb +25 -16
  90. data/test/new_relic/agent/transaction/datastore_segment_test.rb +55 -38
  91. data/test/new_relic/agent/transaction/external_request_segment_test.rb +330 -0
  92. data/test/new_relic/agent/transaction/segment_test.rb +28 -4
  93. data/test/new_relic/agent/transaction/tracing_test.rb +60 -22
  94. data/test/new_relic/agent_test.rb +2 -1
  95. data/test/new_relic/collection_helper_test.rb +1 -0
  96. data/test/new_relic/dispatcher_test.rb +1 -0
  97. data/test/new_relic/fake_external_server.rb +1 -1
  98. data/test/new_relic/filtering_test_app.rb +1 -1
  99. data/test/new_relic/http_client_test_cases.rb +38 -20
  100. data/test/new_relic/rack/error_collector_test.rb +1 -0
  101. data/test/performance/suites/external_segment.rb +82 -0
  102. data/test/script/before_install/update_bundler.sh +12 -0
  103. data/test/script/external_server.rb +31 -0
  104. metadata +8 -5
  105. data/test/multiverse/lib/multiverse/environment.rb +0 -19
  106. data/test/new_relic/agent/cross_app_tracing_test.rb +0 -71
  107. data/test/script/before_install/jruby_bundler.sh +0 -22
@@ -7,16 +7,24 @@ module NewRelic
7
7
  module HTTPClients
8
8
 
9
9
  class CurbRequest
10
+ CURB = 'Curb'.freeze
11
+ LHOST = 'host'.freeze
12
+ UHOST = 'Host'.freeze
13
+
10
14
  def initialize( curlobj )
11
15
  @curlobj = curlobj
12
16
  end
13
17
 
14
18
  def type
15
- 'Curb'
19
+ CURB
20
+ end
21
+
22
+ def host_from_header
23
+ self[LHOST] || self[UHOST]
16
24
  end
17
25
 
18
26
  def host
19
- self["host"] || self["Host"] || self.uri.host
27
+ host_from_header || self.uri.host
20
28
  end
21
29
 
22
30
  def method
@@ -27,6 +27,13 @@ module NewRelic
27
27
  end
28
28
 
29
29
  class ExconHTTPRequest
30
+ attr_reader :method
31
+
32
+ EXCON = "Excon".freeze
33
+ LHOST = 'host'.freeze
34
+ UHOST = 'Host'.freeze
35
+ COLON = ':'.freeze
36
+
30
37
  def initialize(datum)
31
38
  @datum = datum
32
39
 
@@ -34,19 +41,21 @@ module NewRelic
34
41
  @scheme = @datum[:scheme]
35
42
  @port = @datum[:port]
36
43
  @path = @datum[:path]
44
+ end
45
+
46
+ def type
47
+ EXCON
48
+ end
37
49
 
50
+ def host_from_header
38
51
  headers = @datum[:headers]
39
- if hostname = (headers['host'] || headers['Host'])
40
- @host = hostname.split(':').first
41
- else
42
- @host = @datum[:host]
52
+ if hostname = (headers[LHOST] || headers[UHOST])
53
+ hostname.split(COLON).first
43
54
  end
44
55
  end
45
56
 
46
- attr_reader :host, :method
47
-
48
- def type
49
- "Excon"
57
+ def host
58
+ host_from_header || @datum[:host]
50
59
  end
51
60
 
52
61
  def [](key)
@@ -59,7 +68,7 @@ module NewRelic
59
68
  end
60
69
 
61
70
  def uri
62
- URI.parse("#{@scheme}://#{@host}:#{@port}#{@path}")
71
+ URI.parse("#{@scheme}://#{host}:#{@port}#{@path}")
63
72
  end
64
73
  end
65
74
  end
@@ -23,6 +23,10 @@ module NewRelic
23
23
  end
24
24
 
25
25
  class HTTPRequest
26
+ HTTP_RB = 'http.rb'.freeze
27
+ HOST = 'host'.freeze
28
+ COLON = ':'.freeze
29
+
26
30
  attr_reader :request, :uri
27
31
 
28
32
  def initialize(request)
@@ -31,17 +35,19 @@ module NewRelic
31
35
  end
32
36
 
33
37
  def type
34
- "http.rb"
38
+ HTTP_RB
35
39
  end
36
40
 
37
- def host
38
- if hostname = self['host']
39
- hostname.split(':').first
40
- else
41
- request.host
41
+ def host_from_header
42
+ if hostname = self[HOST]
43
+ hostname.split(COLON).first
42
44
  end
43
45
  end
44
46
 
47
+ def host
48
+ host_from_header || request.host
49
+ end
50
+
45
51
  def method
46
52
  request.verb.upcase
47
53
  end
@@ -29,27 +29,34 @@ module NewRelic
29
29
  class HTTPClientRequest
30
30
  attr_reader :request, :uri
31
31
 
32
+ HTTP_CLIENT = "HTTPClient".freeze
33
+ LHOST = 'host'.freeze
34
+ UHOST = 'Host'.freeze
35
+ COLON = ':'.freeze
36
+
32
37
  def initialize(request)
33
38
  @request = request
34
39
  @uri = request.header.request_uri
35
40
  end
36
41
 
37
42
  def type
38
- "HTTPClient"
43
+ HTTP_CLIENT
39
44
  end
40
45
 
41
46
  def method
42
47
  request.header.request_method
43
48
  end
44
49
 
45
- def host
46
- if hostname = (self['host'] || self['Host'])
47
- hostname.split(':').first
48
- else
49
- uri.host.to_s
50
+ def host_from_header
51
+ if hostname = (self[LHOST] || self[UHOST])
52
+ hostname.split(COLON).first
50
53
  end
51
54
  end
52
55
 
56
+ def host
57
+ host_from_header || uri.host.to_s
58
+ end
59
+
53
60
  def [](key)
54
61
  request.headers[key]
55
62
  end
@@ -11,18 +11,25 @@ module NewRelic
11
11
  @request = request
12
12
  end
13
13
 
14
+ NET_HTTP = 'Net::HTTP'.freeze
15
+
14
16
  def type
15
- 'Net::HTTP'
17
+ NET_HTTP
16
18
  end
17
19
 
18
- def host
19
- if hostname = self['host']
20
- hostname.split(':').first
21
- else
22
- @connection.address
20
+ HOST = 'host'.freeze
21
+ COLON = ':'.freeze
22
+
23
+ def host_from_header
24
+ if hostname = self[HOST]
25
+ hostname.split(COLON).first
23
26
  end
24
27
  end
25
28
 
29
+ def host
30
+ host_from_header || @connection.address
31
+ end
32
+
26
33
  def method
27
34
  @request.method
28
35
  end
@@ -44,16 +44,27 @@ module NewRelic
44
44
  end
45
45
  end
46
46
 
47
+ TYPHOEUS = "Typhoeus".freeze
48
+
47
49
  def type
48
- "Typhoeus"
50
+ TYPHOEUS
51
+ end
52
+
53
+ LHOST = 'host'.freeze
54
+ UHOST = 'Host'.freeze
55
+
56
+ def host_from_header
57
+ self[LHOST] || self[UHOST]
49
58
  end
50
59
 
51
60
  def host
52
- self['host'] || self['Host'] || @uri.host
61
+ host_from_header || @uri.host
53
62
  end
54
63
 
64
+ GET = 'GET'.freeze
65
+
55
66
  def method
56
- (@request.options[:method] || 'GET').to_s.upcase
67
+ (@request.options[:method] || GET).to_s.upcase
57
68
  end
58
69
 
59
70
  def [](key)
@@ -11,27 +11,25 @@ module NewRelic
11
11
  PERFORM_ACTION = 'perform_action.action_cable'.freeze
12
12
 
13
13
  def start name, id, payload #THREAD_LOCAL_ACCESS
14
- state = NewRelic::Agent::TransactionState.tl_get
15
14
  return unless state.is_execution_traced?
16
15
  event = super
17
16
  if event.name == PERFORM_ACTION
18
- start_transaction state, event
17
+ start_transaction event
19
18
  else
20
- start_recording_metrics state, event
19
+ start_recording_metrics event
21
20
  end
22
21
  rescue => e
23
22
  log_notification_error e, name, 'start'
24
23
  end
25
24
 
26
25
  def finish name, id, payload #THREAD_LOCAL_ACCESS
27
- state = NewRelic::Agent::TransactionState.tl_get
28
26
  return unless state.is_execution_traced?
29
27
  event = super
30
28
  notice_error payload if payload.key? :exception
31
29
  if event.name == PERFORM_ACTION
32
- finish_transaction state
30
+ finish_transaction
33
31
  else
34
- stop_recording_metrics state, event
32
+ stop_recording_metrics event
35
33
  end
36
34
  rescue => e
37
35
  log_notification_error e, name, 'finish'
@@ -39,23 +37,20 @@ module NewRelic
39
37
 
40
38
  private
41
39
 
42
- def start_transaction state, event
40
+ def start_transaction event
43
41
  Transaction.start(state, :action_cable, :transaction_name => transaction_name_from_event(event))
44
42
  end
45
43
 
46
- def finish_transaction state
44
+ def finish_transaction
47
45
  Transaction.stop(state)
48
46
  end
49
47
 
50
- def start_recording_metrics state, event
51
- expected_scope = MethodTracerHelpers::trace_execution_scoped_header(state, event.time.to_f)
52
- event.payload[:expected_scope] = expected_scope
48
+ def start_recording_metrics event
49
+ event.payload[:segment] = Transaction.start_segment metric_name_from_event(event)
53
50
  end
54
51
 
55
- def stop_recording_metrics state, event
56
- expected_scope = event.payload.delete :expected_scope
57
- metric_name = metric_name_from_event event
58
- MethodTracerHelpers::trace_execution_scoped_footer(state, event.time.to_f, metric_name, [], expected_scope, {:metric => true}, event.end.to_f)
52
+ def stop_recording_metrics event
53
+ event.payload[:segment].finish if event.payload[:segment]
59
54
  end
60
55
 
61
56
  def transaction_name_from_event event
@@ -11,13 +11,12 @@ module NewRelic
11
11
  class ActionControllerSubscriber < EventedSubscriber
12
12
 
13
13
  def start(name, id, payload) #THREAD_LOCAL_ACCESS
14
- state = TransactionState.tl_get
15
14
  request = state.request
16
15
  event = ControllerEvent.new(name, Time.now, nil, id, payload, request)
17
16
  push_event(event)
18
17
 
19
18
  if state.is_execution_traced? && !event.ignored?
20
- start_transaction(state, event)
19
+ start_transaction(event)
21
20
  else
22
21
  # if this transaction is ignored, make sure child
23
22
  # transaction are also ignored
@@ -32,10 +31,8 @@ module NewRelic
32
31
  event = pop_event(id)
33
32
  event.payload.merge!(payload)
34
33
 
35
- state = TransactionState.tl_get
36
-
37
34
  if state.is_execution_traced? && !event.ignored?
38
- stop_transaction(state, event)
35
+ stop_transaction(event)
39
36
  else
40
37
  Agent.instance.pop_trace_execution_flag
41
38
  end
@@ -43,7 +40,7 @@ module NewRelic
43
40
  log_notification_error(e, name, 'finish')
44
41
  end
45
42
 
46
- def start_transaction(state, event)
43
+ def start_transaction(event)
47
44
  Transaction.start(state, :controller,
48
45
  :request => event.request,
49
46
  :filtered_params => filter(event.payload[:params]),
@@ -51,7 +48,7 @@ module NewRelic
51
48
  :transaction_name => event.metric_name)
52
49
  end
53
50
 
54
- def stop_transaction(state, event)
51
+ def stop_transaction(event)
55
52
  txn = state.current_transaction
56
53
  txn.ignore_apdex! if event.apdex_ignored?
57
54
  txn.ignore_enduser! if event.enduser_ignored?
@@ -9,15 +9,12 @@ module NewRelic
9
9
  module Agent
10
10
  module Instrumentation
11
11
  class ActionViewSubscriber < EventedSubscriber
12
+
12
13
  def start(name, id, payload) #THREAD_LOCAL_ACCESS
13
14
  event = RenderEvent.new(name, Time.now, nil, id, payload)
14
15
  push_event(event)
15
-
16
- state = NewRelic::Agent::TransactionState.tl_get
17
-
18
16
  if state.is_execution_traced? && event.recordable?
19
- stack = state.traced_method_stack
20
- event.frame = stack.push_frame(state, :action_view, event.time)
17
+ event.segment = NewRelic::Agent::Transaction.start_segment event.metric_name
21
18
  end
22
19
  rescue => e
23
20
  log_notification_error(e, name, 'start')
@@ -25,25 +22,13 @@ module NewRelic
25
22
 
26
23
  def finish(name, id, payload) #THREAD_LOCAL_ACCESS
27
24
  event = pop_event(id)
28
-
29
- state = NewRelic::Agent::TransactionState.tl_get
30
-
31
- if state.is_execution_traced? && event.recordable?
32
- stack = state.traced_method_stack
33
- frame = stack.pop_frame(state, event.frame, event.metric_name, event.end)
34
- record_metrics(event, frame)
35
- end
25
+ event.segment.finish if event.segment
36
26
  rescue => e
37
27
  log_notification_error(e, name, 'finish')
38
28
  end
39
29
 
40
- def record_metrics(event, frame) #THREAD_LOCAL_ACCESS
41
- exclusive = event.duration - frame.children_time
42
- NewRelic::Agent.instance.stats_engine.tl_record_scoped_and_unscoped_metrics(
43
- event.metric_name, nil, event.duration, exclusive)
44
- end
45
-
46
30
  class RenderEvent < Event
31
+ attr_accessor :segment
47
32
 
48
33
  RENDER_TEMPLATE_EVENT_NAME = 'render_template.action_view'.freeze
49
34
  RENDER_PARTIAL_EVENT_NAME = 'render_partial.action_view'.freeze
@@ -32,7 +32,6 @@ module NewRelic
32
32
 
33
33
  def finish(name, id, payload) #THREAD_LOCAL_ACCESS
34
34
  return if payload[:name] == CACHED_QUERY_NAME
35
- state = NewRelic::Agent::TransactionState.tl_get
36
35
  return unless state.is_execution_traced?
37
36
  event = pop_event(id)
38
37
  event.finish
@@ -124,13 +124,15 @@ DependencyDetection.defer do
124
124
  # tracing if it's enabled.
125
125
  def hook_pending_request(request) #THREAD_LOCAL_ACCESS
126
126
  wrapped_request, wrapped_response = wrap_request(request)
127
- state = NewRelic::Agent::TransactionState.tl_get
128
- t0 = Time.now
129
- node = NewRelic::Agent::CrossAppTracing.start_trace(state, t0, wrapped_request)
127
+
128
+ segment = NewRelic::Agent::Transaction.start_external_request_segment(
129
+ wrapped_request.type, wrapped_request.uri, wrapped_request.method)
130
+
131
+ segment.add_request_headers wrapped_request
130
132
 
131
133
  unless request._nr_instrumented
132
134
  install_header_callback(request, wrapped_response)
133
- install_completion_callback(request, t0, node, wrapped_request, wrapped_response)
135
+ install_completion_callback(request, wrapped_response, segment)
134
136
  request._nr_instrumented = true
135
137
  end
136
138
  rescue => err
@@ -163,14 +165,14 @@ DependencyDetection.defer do
163
165
  end
164
166
 
165
167
  # Install a callback that will finish the trace.
166
- def install_completion_callback(request, t0, node, wrapped_request, wrapped_response) #THREAD_LOCAL_ACCESS
168
+ def install_completion_callback(request, wrapped_response, segment) #THREAD_LOCAL_ACCESS
167
169
  original_callback = request.on_complete
168
170
  request._nr_original_on_complete = original_callback
169
171
  request.on_complete do |finished_request|
170
172
  begin
171
- state = NewRelic::Agent::TransactionState.tl_get
172
- NewRelic::Agent::CrossAppTracing.finish_trace(state, t0, node, wrapped_request, wrapped_response)
173
+ segment.read_response_headers wrapped_response
173
174
  ensure
175
+ segment.finish
174
176
  # Make sure the existing completion callback is run, and restore the
175
177
  # on_complete callback to how it was before.
176
178
  original_callback.call(finished_request) if original_callback
@@ -58,6 +58,10 @@ module NewRelic
58
58
  def event_stack
59
59
  Thread.current[@queue_key] ||= Hash.new {|h,id| h[id] = [] }
60
60
  end
61
+
62
+ def state
63
+ NewRelic::Agent::TransactionState.tl_get
64
+ end
61
65
  end
62
66
 
63
67
  # Taken from ActiveSupport::Notifications::Event, pasted here
@@ -15,14 +15,24 @@ module ::Excon
15
15
  end
16
16
 
17
17
  def request_with_newrelic_trace(params, &block)
18
- orig_response = nil
19
18
  resolved_params = newrelic_resolved_request_params(params)
20
19
  wrapped_request = ::NewRelic::Agent::HTTPClients::ExconHTTPRequest.new(resolved_params)
21
- ::NewRelic::Agent::CrossAppTracing.tl_trace_http_request(wrapped_request) do
22
- orig_response = request_without_newrelic_trace(resolved_params, &block)
23
- ::NewRelic::Agent::HTTPClients::ExconHTTPResponse.new(orig_response)
20
+ segment = NewRelic::Agent::Transaction.start_external_request_segment(
21
+ wrapped_request.type, wrapped_request.uri, wrapped_request.method)
22
+
23
+ begin
24
+ response = nil
25
+ segment.add_request_headers wrapped_request
26
+
27
+ response = request_without_newrelic_trace(resolved_params, &block)
28
+
29
+ wrapped_response = ::NewRelic::Agent::HTTPClients::ExconHTTPResponse.new(response)
30
+ segment.read_response_headers wrapped_response
31
+
32
+ response
33
+ ensure
34
+ segment.finish
24
35
  end
25
- orig_response
26
36
  end
27
37
 
28
38
  def self.install_newrelic_instrumentation