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
@@ -30,21 +30,45 @@ module NewRelic
30
30
  assert_equal ["Segment/all", "Other/all"], segment.unscoped_metrics
31
31
  end
32
32
 
33
- def test_segment_records_metrics
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
- assert_metrics_recorded ["Custom/simple/segment", "Segment/all"]
39
+ refute_metrics_recorded ["Custom/simple/segment", "Segment/all"]
40
40
  end
41
41
 
42
- def test_segment_records_metrics_when_given_as_array
43
- segment = Segment.new "Custom/simple/segment", ["Segment/all", "Other/all"]
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
- segment = Transaction.start_datastore_segment
96
- segment.finish
90
+ segment = Transaction.start_datastore_segment
91
+ segment.finish
97
92
 
98
- assert_equal "Datastore/operation/Unknown/other", segment.name
99
- assert_equal "Unknown", segment.product
100
- assert_equal "other", segment.operation
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
- def test_start_segment_with_tracing_disabled_outside_transaction
117
- segment = nil
118
- NewRelic::Agent.disable_all_tracing do
119
- segment = Transaction.start_segment "Custom/segment/method", "Custom/all"
120
- advance_time 1
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 test_current_segment_in_transaction
145
+ def test_start_external_request_segment
128
146
  in_transaction "test_txn" do |txn|
129
- segment = Transaction.start_datastore_segment "SQLite", "insert", "Blog"
130
- assert_equal segment, txn.current_segment
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
@@ -13,6 +13,7 @@ class NewRelic::CollectionHelperTest < Minitest::Test
13
13
  super
14
14
  end
15
15
  def teardown
16
+ NewRelic::Agent.shutdown
16
17
  super
17
18
  end
18
19
 
@@ -54,6 +54,7 @@ class DispatcherTest < Minitest::Test
54
54
  NewRelic::Agent.manual_start(:dispatcher => :resque)
55
55
  assert_equal :resque, NewRelic::Agent.config[:dispatcher]
56
56
  assert_dispatcher_reported_to_environment_report :resque
57
+ NewRelic::Agent.shutdown
57
58
  end
58
59
 
59
60
  end
@@ -3,7 +3,7 @@
3
3
  # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
4
 
5
5
  require 'rack'
6
- require 'fake_server'
6
+ require 'new_relic/fake_server'
7
7
  require 'new_relic/rack/agent_hooks'
8
8
 
9
9
  require 'json' if RUBY_VERSION >= '1.9'
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # This file is distributed under New Relic"s license terms.
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"s license terms.
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 = get_response
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 = get_response(uri.to_s, 'Host' => 'test.local')
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 = get_response(uri.to_s, 'host' => 'test.local')
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 = get_response_multi(default_url, n)
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 = get_response("#{protocol}://foo:^password*12@localhost:#{server.port}/status")
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
- refute last_node.params.key?(:uri)
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
@@ -32,6 +32,7 @@ module NewRelic::Rack
32
32
 
33
33
  def teardown
34
34
  NewRelic::Agent.drop_buffered_data
35
+ NewRelic::Agent.shutdown
35
36
  end
36
37
 
37
38
  def test_notice_and_reraise_errors
@@ -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