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.
- checksums.yaml +4 -4
- data/.travis.yml +32 -10
- data/CHANGELOG.md +43 -3
- data/Rakefile +0 -21
- data/lib/new_relic/agent/cross_app_tracing.rb +34 -269
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +10 -2
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +18 -9
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +12 -6
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +13 -6
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +13 -6
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +14 -3
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +10 -15
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +4 -7
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +4 -19
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +0 -1
- data/lib/new_relic/agent/instrumentation/curb.rb +9 -7
- data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +4 -0
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +15 -5
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +17 -12
- data/lib/new_relic/agent/instrumentation/http.rb +12 -5
- data/lib/new_relic/agent/instrumentation/httpclient.rb +13 -4
- data/lib/new_relic/agent/instrumentation/net.rb +13 -2
- data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +2 -10
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +8 -3
- data/lib/new_relic/agent/method_tracer_helpers.rb +3 -1
- data/lib/new_relic/agent/parameter_filtering.rb +1 -1
- data/lib/new_relic/agent/stats_engine/metric_stats.rb +0 -18
- data/lib/new_relic/agent/supported_versions.rb +1 -0
- data/lib/new_relic/agent/transaction/abstract_segment.rb +7 -9
- data/lib/new_relic/agent/transaction/external_request_segment.rb +139 -0
- data/lib/new_relic/agent/transaction/segment.rb +1 -1
- data/lib/new_relic/agent/transaction/tracing.rb +10 -1
- data/lib/new_relic/recipes/capistrano3.rb +3 -1
- data/lib/new_relic/version.rb +2 -2
- data/lib/tasks/multiverse.rb +27 -7
- data/test/environments/rails42/Gemfile +1 -0
- data/test/multiverse/lib/multiverse.rb +32 -0
- data/test/multiverse/lib/multiverse/runner.rb +2 -2
- data/test/multiverse/lib/multiverse/suite.rb +43 -22
- data/test/multiverse/suites/active_record/Envfile +3 -1
- data/test/multiverse/suites/activemerchant/Envfile +5 -1
- data/test/multiverse/suites/agent_only/Envfile +1 -0
- data/test/multiverse/suites/capistrano/deployment_test.rb +6 -9
- data/test/multiverse/suites/capistrano2/deployment_test.rb +6 -6
- data/test/multiverse/suites/curb/curb_test.rb +2 -3
- data/test/multiverse/suites/datamapper/Envfile +4 -0
- data/test/multiverse/suites/datamapper/datamapper_test.rb +106 -36
- data/test/multiverse/suites/delayed_job/Envfile +3 -3
- data/test/multiverse/suites/excon/excon_test.rb +1 -1
- data/test/multiverse/suites/grape/grape_test.rb +1 -1
- data/test/multiverse/suites/grape/grape_test_api.rb +1 -1
- data/test/multiverse/suites/grape/grape_versioning_test.rb +1 -1
- data/test/multiverse/suites/grape/grape_versioning_test_api.rb +1 -1
- data/test/multiverse/suites/grape/unsupported_version_test.rb +1 -1
- data/test/multiverse/suites/httpclient/Envfile +2 -0
- data/test/multiverse/suites/httpclient/httpclient_test.rb +1 -1
- data/test/multiverse/suites/httprb/Envfile +2 -0
- data/test/multiverse/suites/httprb/httprb_test.rb +1 -1
- data/test/multiverse/suites/json/Envfile +7 -2
- data/test/multiverse/suites/memcached/Envfile +2 -0
- data/test/multiverse/suites/mongo/Envfile +2 -0
- data/test/multiverse/suites/mongo/helpers/mongo_operation_tests.rb +95 -33
- data/test/multiverse/suites/mongo/mongo2_instrumentation_test.rb +62 -23
- data/test/multiverse/suites/net_http/Envfile +2 -0
- data/test/multiverse/suites/net_http/net_http_test.rb +7 -3
- data/test/multiverse/suites/padrino/Envfile +2 -0
- data/test/multiverse/suites/rack/Envfile +2 -0
- data/test/multiverse/suites/rack/url_map_test.rb +4 -0
- data/test/multiverse/suites/rails/Envfile +34 -29
- data/test/multiverse/suites/rake/Envfile +11 -6
- data/test/multiverse/suites/redis/Envfile +2 -0
- data/test/multiverse/suites/redis/redis_instrumentation_test.rb +31 -12
- data/test/multiverse/suites/sidekiq/Envfile +6 -2
- data/test/multiverse/suites/sinatra/Envfile +2 -0
- data/test/multiverse/suites/typhoeus/Envfile +31 -27
- data/test/multiverse/suites/typhoeus/typhoeus_test.rb +4 -3
- data/test/multiverse/suites/yajl/Envfile +4 -2
- data/test/new_relic/agent/datastores_test.rb +0 -10
- data/test/new_relic/agent/instrumentation/action_cable_subscriber_test.rb +2 -2
- data/test/new_relic/agent/instrumentation/action_view_subscriber_test.rb +64 -65
- data/test/new_relic/agent/instrumentation/active_record_subscriber_test.rb +11 -9
- data/test/new_relic/agent/instrumentation/instance_identification_test.rb +9 -8
- data/test/new_relic/agent/instrumentation/mongodb_command_subscriber_test.rb +7 -11
- data/test/new_relic/agent/instrumentation/net_instrumentation_test.rb +4 -0
- data/test/new_relic/agent/method_tracer/instance_methods/trace_execution_scoped_test.rb +0 -9
- data/test/new_relic/agent/method_tracer_test.rb +24 -8
- data/test/new_relic/agent/parameter_filtering_test.rb +2 -2
- data/test/new_relic/agent/stats_engine/metric_stats_test.rb +1 -0
- data/test/new_relic/agent/transaction/abstract_segment_test.rb +25 -16
- data/test/new_relic/agent/transaction/datastore_segment_test.rb +55 -38
- data/test/new_relic/agent/transaction/external_request_segment_test.rb +330 -0
- data/test/new_relic/agent/transaction/segment_test.rb +28 -4
- data/test/new_relic/agent/transaction/tracing_test.rb +60 -22
- data/test/new_relic/agent_test.rb +2 -1
- data/test/new_relic/collection_helper_test.rb +1 -0
- data/test/new_relic/dispatcher_test.rb +1 -0
- data/test/new_relic/fake_external_server.rb +1 -1
- data/test/new_relic/filtering_test_app.rb +1 -1
- data/test/new_relic/http_client_test_cases.rb +38 -20
- data/test/new_relic/rack/error_collector_test.rb +1 -0
- data/test/performance/suites/external_segment.rb +82 -0
- data/test/script/before_install/update_bundler.sh +12 -0
- data/test/script/external_server.rb +31 -0
- metadata +8 -5
- data/test/multiverse/lib/multiverse/environment.rb +0 -19
- data/test/new_relic/agent/cross_app_tracing_test.rb +0 -71
- 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
|
-
|
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
|
-
|
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[
|
40
|
-
|
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
|
-
|
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}://#{
|
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
|
-
|
38
|
+
HTTP_RB
|
35
39
|
end
|
36
40
|
|
37
|
-
def
|
38
|
-
if hostname = self[
|
39
|
-
hostname.split(
|
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
|
-
|
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
|
46
|
-
if hostname = (self[
|
47
|
-
hostname.split(
|
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
|
-
|
17
|
+
NET_HTTP
|
16
18
|
end
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
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
|
-
|
61
|
+
host_from_header || @uri.host
|
53
62
|
end
|
54
63
|
|
64
|
+
GET = 'GET'.freeze
|
65
|
+
|
55
66
|
def method
|
56
|
-
(@request.options[:method] ||
|
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
|
17
|
+
start_transaction event
|
19
18
|
else
|
20
|
-
start_recording_metrics
|
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
|
30
|
+
finish_transaction
|
33
31
|
else
|
34
|
-
stop_recording_metrics
|
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
|
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
|
44
|
+
def finish_transaction
|
47
45
|
Transaction.stop(state)
|
48
46
|
end
|
49
47
|
|
50
|
-
def start_recording_metrics
|
51
|
-
|
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
|
56
|
-
|
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(
|
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(
|
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(
|
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(
|
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
|
-
|
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
|
@@ -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
|
-
|
128
|
-
|
129
|
-
|
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,
|
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,
|
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
|
-
|
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
|
@@ -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
|
-
|
22
|
-
|
23
|
-
|
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
|