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
@@ -30,21 +30,45 @@ module NewRelic
|
|
30
30
|
assert_equal ["Segment/all", "Other/all"], segment.unscoped_metrics
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
33
|
+
def test_segment_does_not_record_metrics_outside_of_txn
|
34
34
|
segment = Segment.new "Custom/simple/segment", "Segment/all"
|
35
35
|
segment.start
|
36
36
|
advance_time 1.0
|
37
37
|
segment.finish
|
38
38
|
|
39
|
-
|
39
|
+
refute_metrics_recorded ["Custom/simple/segment", "Segment/all"]
|
40
40
|
end
|
41
41
|
|
42
|
-
def
|
43
|
-
segment = Segment.new "Custom/simple/segment",
|
42
|
+
def test_segment_does_not_record_metrics_outside_of_txn
|
43
|
+
segment = Segment.new "Custom/simple/segment", "Segment/all"
|
44
44
|
segment.start
|
45
45
|
advance_time 1.0
|
46
46
|
segment.finish
|
47
47
|
|
48
|
+
assert_metrics_not_recorded ["Custom/simple/segment", "Segment/all"]
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_segment_records_metrics
|
52
|
+
in_transaction do |txn|
|
53
|
+
segment = Segment.new "Custom/simple/segment", "Segment/all"
|
54
|
+
txn.add_segment segment
|
55
|
+
segment.start
|
56
|
+
advance_time 1.0
|
57
|
+
segment.finish
|
58
|
+
end
|
59
|
+
|
60
|
+
assert_metrics_recorded ["Custom/simple/segment", "Segment/all"]
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_segment_records_metrics_when_given_as_array
|
64
|
+
in_transaction do |txn|
|
65
|
+
segment = Segment.new "Custom/simple/segment", ["Segment/all", "Other/all"]
|
66
|
+
txn.add_segment segment
|
67
|
+
segment.start
|
68
|
+
advance_time 1.0
|
69
|
+
segment.finish
|
70
|
+
end
|
71
|
+
|
48
72
|
assert_metrics_recorded ["Custom/simple/segment", "Segment/all", "Other/all"]
|
49
73
|
end
|
50
74
|
end
|
@@ -18,15 +18,6 @@ module NewRelic
|
|
18
18
|
NewRelic::Agent.drop_buffered_data
|
19
19
|
end
|
20
20
|
|
21
|
-
def test_segment_without_transaction_records_metrics
|
22
|
-
segment = Transaction.start_segment "Custom/simple/segment", "Segment/all"
|
23
|
-
segment.start
|
24
|
-
advance_time 1.0
|
25
|
-
segment.finish
|
26
|
-
|
27
|
-
assert_metrics_recorded ["Custom/simple/segment", "Segment/all"]
|
28
|
-
end
|
29
|
-
|
30
21
|
def test_segment_bound_to_transaction_records_metrics
|
31
22
|
in_transaction "test_txn" do
|
32
23
|
segment = Transaction.start_segment "Custom/simple/segment", "Segment/all"
|
@@ -47,6 +38,10 @@ module NewRelic
|
|
47
38
|
segment.start
|
48
39
|
advance_time 1.0
|
49
40
|
segment.finish
|
41
|
+
|
42
|
+
#clean up traced method stack
|
43
|
+
txn.unstub(:segment_complete)
|
44
|
+
txn.segment_complete(segment)
|
50
45
|
end
|
51
46
|
end
|
52
47
|
|
@@ -92,12 +87,28 @@ module NewRelic
|
|
92
87
|
end
|
93
88
|
|
94
89
|
def test_start_datastore_segment_provides_defaults_without_params
|
95
|
-
|
96
|
-
|
90
|
+
segment = Transaction.start_datastore_segment
|
91
|
+
segment.finish
|
97
92
|
|
98
|
-
|
99
|
-
|
100
|
-
|
93
|
+
assert_equal "Datastore/operation/Unknown/other", segment.name
|
94
|
+
assert_equal "Unknown", segment.product
|
95
|
+
assert_equal "other", segment.operation
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_start_datastore_segment_does_not_record_metrics_outside_of_txn
|
99
|
+
segment = Transaction.start_datastore_segment "SQLite", "insert", "Blog"
|
100
|
+
segment.start
|
101
|
+
advance_time 1
|
102
|
+
segment.finish
|
103
|
+
|
104
|
+
refute_metrics_recorded [
|
105
|
+
"Datastore/statement/SQLite/Blog/insert",
|
106
|
+
"Datastore/operation/SQLite/insert",
|
107
|
+
"Datastore/SQLite/allWeb",
|
108
|
+
"Datastore/SQLite/all",
|
109
|
+
"Datastore/allWeb",
|
110
|
+
"Datastore/all"
|
111
|
+
]
|
101
112
|
end
|
102
113
|
|
103
114
|
def test_start_segment_with_tracing_disabled_in_transaction
|
@@ -113,24 +124,51 @@ module NewRelic
|
|
113
124
|
refute_metrics_recorded ["Custom/segment/method", "Custom/all"]
|
114
125
|
end
|
115
126
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
segment = Transaction.
|
120
|
-
|
127
|
+
|
128
|
+
def test_current_segment_in_transaction
|
129
|
+
in_transaction "test_txn" do |txn|
|
130
|
+
segment = Transaction.start_datastore_segment "SQLite", "insert", "Blog"
|
131
|
+
assert_equal segment, txn.current_segment
|
121
132
|
segment.finish
|
122
133
|
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_segment_started_oustide_txn_does_not_record_metrics
|
137
|
+
segment = Transaction.start_segment "Custom/segment/method", "Custom/all"
|
138
|
+
advance_time 1
|
139
|
+
segment.finish
|
140
|
+
|
123
141
|
assert_nil segment.transaction, "Did not expect segment to associated with a transaction"
|
124
142
|
refute_metrics_recorded ["Custom/segment/method", "Custom/all"]
|
125
143
|
end
|
126
144
|
|
127
|
-
def
|
145
|
+
def test_start_external_request_segment
|
128
146
|
in_transaction "test_txn" do |txn|
|
129
|
-
segment = Transaction.
|
130
|
-
assert_equal
|
147
|
+
segment = Transaction.start_external_request_segment "Net::HTTP", "http://site.com/endpoint", "GET"
|
148
|
+
assert_equal Time.now, segment.start_time
|
149
|
+
assert_equal txn, segment.transaction
|
150
|
+
assert_equal "Net::HTTP", segment.library
|
151
|
+
assert_equal "http://site.com/endpoint", segment.uri.to_s
|
152
|
+
assert_equal "GET", segment.procedure
|
153
|
+
|
154
|
+
advance_time 1
|
131
155
|
segment.finish
|
156
|
+
assert_equal Time.now, segment.end_time
|
132
157
|
end
|
133
158
|
end
|
159
|
+
|
160
|
+
def test_segment_does_not_record_metrics_outside_of_txn
|
161
|
+
segment = Transaction.start_external_request_segment "Net::HTTP", "http://remotehost.com/blogs/index", "GET"
|
162
|
+
segment.finish
|
163
|
+
|
164
|
+
refute_metrics_recorded [
|
165
|
+
"External/remotehost.com/Net::HTTP/GET",
|
166
|
+
"External/all",
|
167
|
+
"External/remotehost.com/all",
|
168
|
+
"External/allWeb",
|
169
|
+
["External/remotehost.com/Net::HTTP/GET", "test"]
|
170
|
+
]
|
171
|
+
end
|
134
172
|
end
|
135
173
|
end
|
136
174
|
end
|
@@ -14,7 +14,6 @@ module NewRelic
|
|
14
14
|
|
15
15
|
def setup
|
16
16
|
NewRelic::Agent.drop_buffered_data
|
17
|
-
NewRelic::Agent.manual_start
|
18
17
|
NewRelic::Agent.reset_config
|
19
18
|
NewRelic::Agent.instance.stubs(:start_worker_thread)
|
20
19
|
end
|
@@ -98,6 +97,7 @@ module NewRelic
|
|
98
97
|
|
99
98
|
NewRelic::Agent.manual_start
|
100
99
|
end
|
100
|
+
NewRelic::Agent.shutdown
|
101
101
|
end
|
102
102
|
|
103
103
|
def test_get_stats
|
@@ -195,6 +195,7 @@ module NewRelic
|
|
195
195
|
def test_instance
|
196
196
|
NewRelic::Agent.manual_start
|
197
197
|
assert_equal(NewRelic::Agent.agent, NewRelic::Agent.instance, "should return the same agent for both identical methods")
|
198
|
+
NewRelic::Agent.shutdown
|
198
199
|
end
|
199
200
|
|
200
201
|
def test_register_report_channel
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# This file is distributed under New Relic
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
3
|
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
|
4
4
|
|
5
5
|
# This is a simple test app for testing parameter filtering as provided by
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# This file is distributed under New Relic
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
3
|
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
|
4
4
|
|
5
5
|
require "newrelic_rpm"
|
@@ -95,7 +95,8 @@ module HttpClientTestCases
|
|
95
95
|
end
|
96
96
|
|
97
97
|
def test_get
|
98
|
-
res =
|
98
|
+
res = nil
|
99
|
+
in_transaction { res = get_response }
|
99
100
|
|
100
101
|
assert_match %r/<head>/i, body(res)
|
101
102
|
assert_externals_recorded_for("localhost", "GET")
|
@@ -108,7 +109,11 @@ module HttpClientTestCases
|
|
108
109
|
def test_get_with_host_header
|
109
110
|
uri = default_uri
|
110
111
|
uri.host = '127.0.0.1'
|
111
|
-
res =
|
112
|
+
res = nil
|
113
|
+
|
114
|
+
in_transaction do
|
115
|
+
res = get_response(uri.to_s, 'Host' => 'test.local')
|
116
|
+
end
|
112
117
|
|
113
118
|
assert_match %r/<head>/i, body(res)
|
114
119
|
assert_externals_recorded_for("test.local", "GET")
|
@@ -117,7 +122,11 @@ module HttpClientTestCases
|
|
117
122
|
def test_get_with_host_header_lowercase
|
118
123
|
uri = default_uri
|
119
124
|
uri.host = '127.0.0.1'
|
120
|
-
res =
|
125
|
+
res = nil
|
126
|
+
|
127
|
+
in_transaction do
|
128
|
+
res = get_response(uri.to_s, 'host' => 'test.local')
|
129
|
+
end
|
121
130
|
|
122
131
|
assert_match %r/<head>/i, body(res)
|
123
132
|
assert_externals_recorded_for("test.local", "GET")
|
@@ -128,7 +137,11 @@ module HttpClientTestCases
|
|
128
137
|
def test_get_with_reused_connection
|
129
138
|
if self.respond_to?(:get_response_multi)
|
130
139
|
n = 2
|
131
|
-
responses =
|
140
|
+
responses = nil
|
141
|
+
|
142
|
+
in_transaction do
|
143
|
+
responses = get_response_multi(default_url, n)
|
144
|
+
end
|
132
145
|
|
133
146
|
responses.each do |res|
|
134
147
|
assert_match %r/<head>/i, body(res)
|
@@ -195,28 +208,31 @@ module HttpClientTestCases
|
|
195
208
|
end
|
196
209
|
|
197
210
|
def test_head
|
198
|
-
head_response
|
211
|
+
in_transaction { head_response }
|
199
212
|
assert_externals_recorded_for("localhost", "HEAD")
|
200
213
|
end
|
201
214
|
|
202
215
|
def test_post
|
203
|
-
post_response
|
216
|
+
in_transaction { post_response }
|
204
217
|
assert_externals_recorded_for("localhost", "POST")
|
205
218
|
end
|
206
219
|
|
207
220
|
def test_put
|
208
|
-
put_response
|
221
|
+
in_transaction { put_response }
|
209
222
|
assert_externals_recorded_for("localhost", "PUT")
|
210
223
|
end
|
211
224
|
|
212
225
|
def test_delete
|
213
|
-
delete_response
|
226
|
+
in_transaction { delete_response }
|
214
227
|
assert_externals_recorded_for("localhost", "DELETE")
|
215
228
|
end
|
216
229
|
|
217
230
|
if defined?(::Addressable)
|
218
231
|
def test_url_not_supported_by_stdlib_uri
|
219
|
-
res =
|
232
|
+
res = nil
|
233
|
+
in_transaction do
|
234
|
+
res = get_response("#{protocol}://foo:^password*12@localhost:#{server.port}/status")
|
235
|
+
end
|
220
236
|
|
221
237
|
assert_match %r/<head>/i, body(res)
|
222
238
|
assert_externals_recorded_for("localhost", "GET")
|
@@ -228,14 +244,14 @@ module HttpClientTestCases
|
|
228
244
|
|
229
245
|
def test_adds_a_request_header_to_outgoing_requests_if_xp_enabled
|
230
246
|
with_config(:"cross_application_tracer.enabled" => true) do
|
231
|
-
get_response
|
247
|
+
in_transaction { get_response }
|
232
248
|
assert_equal "VURQV1BZRkZdXUFT", server.requests.last["HTTP_X_NEWRELIC_ID"]
|
233
249
|
end
|
234
250
|
end
|
235
251
|
|
236
252
|
def test_adds_a_request_header_to_outgoing_requests_if_old_xp_config_is_present
|
237
253
|
with_config(:cross_application_tracing => true) do
|
238
|
-
get_response
|
254
|
+
in_transaction { get_response }
|
239
255
|
assert_equal "VURQV1BZRkZdXUFT", server.requests.last["HTTP_X_NEWRELIC_ID"]
|
240
256
|
end
|
241
257
|
end
|
@@ -263,14 +279,14 @@ module HttpClientTestCases
|
|
263
279
|
end
|
264
280
|
|
265
281
|
def test_agent_doesnt_add_a_request_header_to_outgoing_requests_if_xp_disabled
|
266
|
-
get_response
|
282
|
+
in_transaction { get_response }
|
267
283
|
assert_equal false, server.requests.last.keys.any? {|k| k =~ /NEWRELIC_ID/}
|
268
284
|
end
|
269
285
|
|
270
286
|
def test_agent_doesnt_add_a_request_header_if_empty_cross_process_id
|
271
287
|
with_config(:'cross_application_tracer.enabled' => true,
|
272
288
|
:cross_process_id => "") do
|
273
|
-
get_response
|
289
|
+
in_transaction { get_response }
|
274
290
|
assert_equal false, server.requests.last.keys.any? {|k| k =~ /NEWRELIC_ID/}
|
275
291
|
end
|
276
292
|
end
|
@@ -278,7 +294,7 @@ module HttpClientTestCases
|
|
278
294
|
def test_agent_doesnt_add_a_request_header_if_empty_encoding_key
|
279
295
|
with_config(:'cross_application_tracer.enabled' => true,
|
280
296
|
:encoding_key => "") do
|
281
|
-
get_response
|
297
|
+
in_transaction { get_response }
|
282
298
|
assert_equal false, server.requests.last.keys.any? {|k| k =~ /NEWRELIC_ID/}
|
283
299
|
end
|
284
300
|
end
|
@@ -376,7 +392,7 @@ module HttpClientTestCases
|
|
376
392
|
raises( NoMethodError, "undefined method `push_scope'" )
|
377
393
|
|
378
394
|
with_config(:"cross_application_tracer.enabled" => true) do
|
379
|
-
res = get_response
|
395
|
+
in_transaction { res = get_response }
|
380
396
|
end
|
381
397
|
|
382
398
|
assert_equal NewRelic::FakeExternalServer::STATUS_MESSAGE, body(res)
|
@@ -388,7 +404,7 @@ module HttpClientTestCases
|
|
388
404
|
raises( NoMethodError, "undefined method `pop_scope'" )
|
389
405
|
|
390
406
|
with_config(:"cross_application_tracer.enabled" => true) do
|
391
|
-
res = get_response
|
407
|
+
in_transaction { res = get_response }
|
392
408
|
end
|
393
409
|
|
394
410
|
assert_equal NewRelic::FakeExternalServer::STATUS_MESSAGE, body(res)
|
@@ -401,7 +417,7 @@ module HttpClientTestCases
|
|
401
417
|
NewRelic::Agent.logger = logger
|
402
418
|
|
403
419
|
with_config(:"cross_application_tracer.enabled" => true) do
|
404
|
-
get_response
|
420
|
+
in_transaction { get_response }
|
405
421
|
end
|
406
422
|
|
407
423
|
refute_match( /undefined method `.*" for nil:NilClass/i,
|
@@ -424,7 +440,7 @@ module HttpClientTestCases
|
|
424
440
|
NewRelic::JSONWrapper.stubs(:dump).raises("Boom!")
|
425
441
|
|
426
442
|
with_config(:"cross_application_tracer.enabled" => true) do
|
427
|
-
get_response
|
443
|
+
in_transaction { get_response }
|
428
444
|
end
|
429
445
|
|
430
446
|
assert_externals_recorded_for("localhost", "GET")
|
@@ -440,7 +456,9 @@ module HttpClientTestCases
|
|
440
456
|
get_response
|
441
457
|
|
442
458
|
last_node = find_last_transaction_node()
|
443
|
-
|
459
|
+
unless last_node.metric_name.start_with? "External"
|
460
|
+
refute last_node.params.key?(:uri)
|
461
|
+
end
|
444
462
|
end
|
445
463
|
end
|
446
464
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
|
4
|
+
|
5
|
+
require 'net/http'
|
6
|
+
require 'new_relic/agent/obfuscator'
|
7
|
+
|
8
|
+
class ExternalSegment < Performance::TestCase
|
9
|
+
|
10
|
+
CONFIG = {
|
11
|
+
:license_key => 'a' * 40,
|
12
|
+
:developer_mode => false,
|
13
|
+
:'cross_application_tracer.enabled' => true,
|
14
|
+
:cross_process_id => "1#1884",
|
15
|
+
:encoding_key => "jotorotoes",
|
16
|
+
:trusted_account_ids => [1]
|
17
|
+
}
|
18
|
+
|
19
|
+
def setup
|
20
|
+
NewRelic::Agent.config.add_config_for_testing(CONFIG)
|
21
|
+
|
22
|
+
NewRelic::Agent.manual_start(
|
23
|
+
:developer_mode => false,
|
24
|
+
:monitor_mode => false
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
TEST_URI = URI("http://localhost:3035/status")
|
29
|
+
|
30
|
+
def test_external_request
|
31
|
+
io_server = start_server
|
32
|
+
measure do
|
33
|
+
in_transaction do
|
34
|
+
Net::HTTP.get(TEST_URI)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
stop_server io_server
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_external_cat_request
|
41
|
+
io_server = start_server
|
42
|
+
reply_with_cat_headers io_server
|
43
|
+
measure do
|
44
|
+
in_transaction do
|
45
|
+
Net::HTTP.get(TEST_URI)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
stop_server io_server
|
49
|
+
end
|
50
|
+
|
51
|
+
SERVER_SCRIPT_PATH = File.expand_path('../../../script/external_server.rb', __FILE__)
|
52
|
+
|
53
|
+
def start_server
|
54
|
+
io = IO.popen(SERVER_SCRIPT_PATH, 'r+')
|
55
|
+
response = JSON.parse(io.gets)
|
56
|
+
if response["message"] == "started"
|
57
|
+
io
|
58
|
+
else
|
59
|
+
fail "Could not start server"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def reply_with_cat_headers io_server
|
64
|
+
message = {
|
65
|
+
:command => "add_headers",
|
66
|
+
:payload => cat_response_headers
|
67
|
+
}.to_json
|
68
|
+
io_server.puts message
|
69
|
+
end
|
70
|
+
|
71
|
+
def stop_server io_server
|
72
|
+
message = {:command => "shutdown"}.to_json
|
73
|
+
io_server.puts message
|
74
|
+
Process.wait
|
75
|
+
end
|
76
|
+
|
77
|
+
def cat_response_headers
|
78
|
+
obfuscator = NewRelic::Agent::Obfuscator.new NewRelic::Agent.config[:encoding_key]
|
79
|
+
app_data = obfuscator.obfuscate(["1#1884", "txn-name", 2, 8, 0, 'BEC1BC64675138B9'].to_json) + "\n"
|
80
|
+
{'X-NewRelic-App-Data' => app_data}
|
81
|
+
end
|
82
|
+
end
|