newrelic_rpm 3.13.2.302 → 3.14.0.305
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +20 -0
- data/README.md +1 -13
- data/lib/new_relic/agent/agent.rb +40 -15
- data/lib/new_relic/agent/agent_logger.rb +1 -1
- data/lib/new_relic/agent/configuration/default_source.rb +16 -6
- data/lib/new_relic/agent/configuration/server_source.rb +2 -1
- data/lib/new_relic/agent/error_collector.rb +13 -21
- data/lib/new_relic/agent/error_event_aggregator.rb +124 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +15 -5
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +16 -2
- data/lib/new_relic/agent/new_relic_service.rb +11 -10
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +1 -1
- data/lib/new_relic/agent/payload_metric_mapping.rb +58 -0
- data/lib/new_relic/agent/sampled_buffer.rb +15 -1
- data/lib/new_relic/agent/supported_versions.rb +4 -4
- data/lib/new_relic/agent/transaction.rb +52 -44
- data/lib/new_relic/agent/transaction/request_attributes.rb +110 -0
- data/lib/new_relic/agent/transaction_event_aggregator.rb +4 -41
- data/lib/new_relic/noticed_error.rb +25 -9
- data/lib/new_relic/rack/agent_middleware.rb +5 -0
- data/lib/new_relic/version.rb +2 -2
- data/newrelic_rpm.gemspec +6 -0
- data/test/agent_helper.rb +16 -7
- data/test/environments/norails/Gemfile +1 -0
- data/test/multiverse/lib/multiverse/runner.rb +1 -1
- data/test/multiverse/lib/multiverse/suite.rb +6 -3
- data/test/multiverse/suites/agent_only/agent_attributes_test.rb +57 -0
- data/test/multiverse/suites/agent_only/audit_log_test.rb +1 -2
- data/test/multiverse/suites/agent_only/error_events_test.rb +82 -0
- data/test/multiverse/suites/agent_only/harvest_timestamps_test.rb +31 -6
- data/test/multiverse/suites/agent_only/logging_test.rb +2 -2
- data/test/multiverse/suites/agent_only/marshaling_test.rb +6 -0
- data/test/multiverse/suites/agent_only/set_transaction_name_test.rb +2 -2
- data/test/multiverse/suites/agent_only/thread_profiling_test.rb +0 -20
- data/test/multiverse/suites/grape/grape_test.rb +16 -1
- data/test/multiverse/suites/no_json/Envfile +12 -0
- data/test/multiverse/suites/no_json/config/newrelic.yml +27 -0
- data/test/multiverse/suites/no_json/marshal_config_test.rb +22 -0
- data/test/multiverse/suites/rack/example_app.rb +19 -0
- data/test/multiverse/suites/rack/response_content_type_test.rb +50 -0
- data/test/multiverse/suites/rails/error_tracing_test.rb +12 -7
- data/test/multiverse/suites/rails/parameter_capture_test.rb +21 -1
- data/test/multiverse/suites/sinatra/sinatra_error_tracing_test.rb +5 -2
- data/test/multiverse/suites/sinatra/sinatra_parameter_capture_test.rb +16 -1
- data/test/multiverse/suites/sinatra/sinatra_test_cases.rb +4 -2
- data/test/new_relic/agent/agent_logger_test.rb +9 -0
- data/test/new_relic/agent/agent_test.rb +6 -4
- data/test/new_relic/agent/audit_logger_test.rb +0 -7
- data/test/new_relic/agent/error_collector_test.rb +20 -250
- data/test/new_relic/agent/error_event_aggregator_test.rb +294 -0
- data/test/new_relic/agent/error_trace_aggregator_test.rb +273 -5
- data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +2 -2
- data/test/new_relic/agent/new_relic_service_test.rb +8 -32
- data/test/new_relic/agent/payload_metric_mapping_test.rb +74 -0
- data/test/new_relic/agent/pipe_channel_manager_test.rb +6 -5
- data/test/new_relic/agent/sampled_buffer_test.rb +36 -0
- data/test/new_relic/agent/sql_sampler_test.rb +4 -14
- data/test/new_relic/agent/stats_engine/stats_hash_test.rb +5 -4
- data/test/new_relic/agent/threading/thread_profile_test.rb +1 -2
- data/test/new_relic/agent/transaction/request_attributes_test.rb +76 -0
- data/test/new_relic/agent/transaction_event_aggregator_test.rb +12 -1
- data/test/new_relic/agent/transaction_test.rb +60 -11
- data/test/new_relic/data_container_tests.rb +17 -6
- data/test/new_relic/fake_collector.rb +16 -21
- data/test/new_relic/marshalling_test_cases.rb +1 -0
- data/test/new_relic/noticed_error_test.rb +59 -0
- data/test/new_relic/rack/agent_hooks_test.rb +1 -1
- data/test/new_relic/rack/error_collector_test.rb +7 -5
- data/test/performance/suites/error_collector.rb +28 -0
- data/test/performance/suites/marshalling.rb +0 -8
- metadata +14 -3
- data/lib/new_relic/agent/new_relic_service/pruby_marshaller.rb +0 -56
@@ -82,9 +82,10 @@ class NewRelic::Agent::PipeChannelManagerTest < Minitest::Test
|
|
82
82
|
sampler.notice_error(Exception.new("message"), :uri => '/myurl/',
|
83
83
|
:metric => 'path', :referer => 'test_referer',
|
84
84
|
:request_params => {:x => 'y'})
|
85
|
-
NewRelic::Agent.agent.merge_data_for_endpoint(:error_data, sampler.
|
85
|
+
NewRelic::Agent.agent.merge_data_for_endpoint(:error_data, sampler.error_trace_aggregator.harvest!)
|
86
86
|
|
87
|
-
|
87
|
+
errors = NewRelic::Agent.agent.error_collector.error_trace_aggregator.instance_variable_get :@errors
|
88
|
+
assert_equal(1, errors.size)
|
88
89
|
|
89
90
|
start_listener_with_pipe(668)
|
90
91
|
|
@@ -95,10 +96,10 @@ class NewRelic::Agent::PipeChannelManagerTest < Minitest::Test
|
|
95
96
|
:metric => 'path', :referer => 'test_referer',
|
96
97
|
:request_params => {:x => 'y'})
|
97
98
|
service = NewRelic::Agent::PipeService.new(668)
|
98
|
-
service.error_data(new_sampler.harvest!)
|
99
|
+
service.error_data(new_sampler.error_trace_aggregator.harvest!)
|
99
100
|
end
|
100
|
-
|
101
|
-
assert_equal(2,
|
101
|
+
errors = NewRelic::Agent.agent.error_collector.error_trace_aggregator.instance_variable_get :@errors
|
102
|
+
assert_equal(2, errors.size)
|
102
103
|
end
|
103
104
|
|
104
105
|
def test_listener_merges_analytics_events
|
@@ -102,5 +102,41 @@ module NewRelic::Agent
|
|
102
102
|
buffer.reset!
|
103
103
|
assert_equal(0.5, buffer.sample_rate_lifetime)
|
104
104
|
end
|
105
|
+
|
106
|
+
def test_append_with_block
|
107
|
+
buffer = buffer_class.new(5)
|
108
|
+
5.times do |i|
|
109
|
+
buffer.append { i }
|
110
|
+
end
|
111
|
+
|
112
|
+
assert_equal [0, 1, 2, 3, 4], buffer.to_a
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_append_with_block_while_sampling
|
116
|
+
buffer = buffer_class.new(5)
|
117
|
+
buffer.stubs(:rand).returns(0)
|
118
|
+
|
119
|
+
10.times do |i|
|
120
|
+
buffer.append { i }
|
121
|
+
end
|
122
|
+
|
123
|
+
assert_equal [9, 1, 2, 3, 4], buffer.to_a
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_append_with_block_increments_seen
|
127
|
+
buffer = buffer_class.new(5)
|
128
|
+
10.times do |i|
|
129
|
+
buffer.append { i }
|
130
|
+
end
|
131
|
+
|
132
|
+
assert_equal 10, buffer.num_seen
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_append_does_not_allow_an_argument_and_block
|
136
|
+
assert_raises ArgumentError do
|
137
|
+
buffer = buffer_class.new 5
|
138
|
+
buffer.append(4) { 5 }
|
139
|
+
end
|
140
|
+
end
|
105
141
|
end
|
106
142
|
end
|
@@ -328,13 +328,8 @@ class NewRelic::Agent::SqlSamplerTest < Minitest::Test
|
|
328
328
|
@sampler.save_slow_sql(data)
|
329
329
|
sql_traces = @sampler.harvest!
|
330
330
|
|
331
|
-
|
332
|
-
|
333
|
-
params = "eJyrrgUAAXUA+Q==\n"
|
334
|
-
else
|
335
|
-
marshaller = NewRelic::Agent::NewRelicService::PrubyMarshaller.new
|
336
|
-
params = {}
|
337
|
-
end
|
331
|
+
marshaller = NewRelic::Agent::NewRelicService::JsonMarshaller.new
|
332
|
+
params = "eJyrrgUAAXUA+Q==\n"
|
338
333
|
|
339
334
|
expected = [ 'WebTransaction/Controller/c/a', '/c/a', 526336943,
|
340
335
|
'select * from test', 'Database/test/select',
|
@@ -351,13 +346,8 @@ class NewRelic::Agent::SqlSamplerTest < Minitest::Test
|
|
351
346
|
trace.call_count = Rational(10, 1)
|
352
347
|
trace.instance_variable_set(:@sql_id, "1234")
|
353
348
|
|
354
|
-
|
355
|
-
|
356
|
-
params = "eJyrrgUAAXUA+Q==\n"
|
357
|
-
else
|
358
|
-
marshaller = NewRelic::Agent::NewRelicService::PrubyMarshaller.new
|
359
|
-
params = {}
|
360
|
-
end
|
349
|
+
marshaller = NewRelic::Agent::NewRelicService::JsonMarshaller.new
|
350
|
+
params = "eJyrrgUAAXUA+Q==\n"
|
361
351
|
|
362
352
|
expected = [ "path", "uri", 1234, "query", "transaction",
|
363
353
|
10, 12000, 12000, 12000, params]
|
@@ -7,7 +7,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..','tes
|
|
7
7
|
class NewRelic::Agent::StatsHashTest < Minitest::Test
|
8
8
|
def setup
|
9
9
|
@hash = NewRelic::Agent::StatsHash.new
|
10
|
-
|
10
|
+
reset_error_traces!
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_creates_default_entries
|
@@ -170,17 +170,18 @@ class NewRelic::Agent::StatsHashTest < Minitest::Test
|
|
170
170
|
|
171
171
|
@hash.record(DEFAULT_SPEC, 1)
|
172
172
|
|
173
|
-
|
173
|
+
assert_has_traced_error NewRelic::Agent::StatsHash::StatsHashLookupError
|
174
174
|
end
|
175
175
|
|
176
176
|
def test_borked_default_proc_heals_thyself
|
177
177
|
fake_borked_default_proc(@hash)
|
178
178
|
|
179
179
|
@hash.record(DEFAULT_SPEC, 1)
|
180
|
-
|
180
|
+
reset_error_traces!
|
181
181
|
|
182
182
|
@hash.record(NewRelic::MetricSpec.new('something/else/entirely'), 1)
|
183
|
-
|
183
|
+
errors = harvest_error_traces!
|
184
|
+
assert_equal 0, errors.size
|
184
185
|
end
|
185
186
|
end
|
186
187
|
|
@@ -123,8 +123,7 @@ if NewRelic::Agent::Threading::BacktraceService.is_supported?
|
|
123
123
|
0
|
124
124
|
]
|
125
125
|
|
126
|
-
|
127
|
-
assert_equal expected, @profile.to_collector_array(identity_encoder)
|
126
|
+
assert_equal expected, @profile.to_collector_array(NewRelic::Agent::NewRelicService::Encoders::Identity)
|
128
127
|
end
|
129
128
|
|
130
129
|
def test_to_collector_array_with_xray_session_id
|
@@ -0,0 +1,76 @@
|
|
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 File.expand_path(File.join(File.dirname(__FILE__), '..', '..','..','test_helper'))
|
6
|
+
require 'new_relic/agent/transaction/request_attributes'
|
7
|
+
|
8
|
+
module NewRelic
|
9
|
+
module Agent
|
10
|
+
class Transaction
|
11
|
+
class RequestAttributesTest < Minitest::Test
|
12
|
+
|
13
|
+
def test_tolerates_request_without_desired_methods
|
14
|
+
request = stub 'request'
|
15
|
+
attrs = RequestAttributes.new request
|
16
|
+
|
17
|
+
assert_equal "/", attrs.request_path
|
18
|
+
assert_nil attrs.referer
|
19
|
+
assert_nil attrs.content_length
|
20
|
+
assert_nil attrs.host
|
21
|
+
assert_nil attrs.user_agent
|
22
|
+
assert_nil attrs.request_method
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_sets_referer_from_request
|
26
|
+
request = stub 'request', :referer => "http://site.com/page"
|
27
|
+
attrs = RequestAttributes.new request
|
28
|
+
|
29
|
+
assert_equal "http://site.com/page", attrs.referer
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_sets_accept_from_request_headers
|
33
|
+
request = stub 'request', :env => {"HTTP_ACCEPT" => "application/json"}
|
34
|
+
attrs = RequestAttributes.new request
|
35
|
+
|
36
|
+
assert_equal "application/json", attrs.accept
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_sets_content_length_from_request
|
40
|
+
request = stub 'request', :content_length => "111"
|
41
|
+
attrs = RequestAttributes.new request
|
42
|
+
|
43
|
+
assert_equal 111, attrs.content_length
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_sets_host_from_request
|
47
|
+
request = stub 'request', :host => "localhost"
|
48
|
+
attrs = RequestAttributes.new request
|
49
|
+
|
50
|
+
assert_equal "localhost", attrs.host
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_sets_port_from_request
|
54
|
+
request = stub 'request', :port => "3000"
|
55
|
+
attrs = RequestAttributes.new request
|
56
|
+
|
57
|
+
assert_equal 3000, attrs.port
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_sets_user_agent_from_request
|
61
|
+
request = stub 'request', :user_agent => "use this!"
|
62
|
+
attrs = RequestAttributes.new request
|
63
|
+
|
64
|
+
assert_equal "use this!", attrs.user_agent
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_sets_method_from_request
|
68
|
+
request = stub 'request', :request_method => "POST"
|
69
|
+
attrs = RequestAttributes.new request
|
70
|
+
|
71
|
+
assert_equal "POST", attrs.request_method
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -68,6 +68,16 @@ class NewRelic::Agent::TransactionEventAggregatorTest < Minitest::Test
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
+
def test_error_is_included_in_event_data
|
72
|
+
with_sampler_config do
|
73
|
+
generate_request('whatever', :error => true)
|
74
|
+
|
75
|
+
event_data, *_ = captured_transaction_event
|
76
|
+
|
77
|
+
assert event_data['error']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
71
81
|
def test_includes_custom_attributes_in_event
|
72
82
|
with_sampler_config do
|
73
83
|
attributes.merge_custom_attributes('bing' => 2)
|
@@ -396,7 +406,8 @@ class NewRelic::Agent::TransactionEventAggregatorTest < Minitest::Test
|
|
396
406
|
:type => :controller,
|
397
407
|
:start_timestamp => options[:timestamp] || Time.now.to_f,
|
398
408
|
:duration => 0.1,
|
399
|
-
:attributes => attributes
|
409
|
+
:attributes => attributes,
|
410
|
+
:error => false
|
400
411
|
}.merge(options)
|
401
412
|
@event_listener.notify(:transaction_finished, payload)
|
402
413
|
end
|
@@ -9,7 +9,7 @@ class NewRelic::Agent::TransactionTest < Minitest::Test
|
|
9
9
|
def setup
|
10
10
|
@stats_engine = NewRelic::Agent.instance.stats_engine
|
11
11
|
@stats_engine.reset!
|
12
|
-
NewRelic::Agent.instance.error_collector.
|
12
|
+
NewRelic::Agent.instance.error_collector.drop_buffered_data
|
13
13
|
end
|
14
14
|
|
15
15
|
def teardown
|
@@ -698,8 +698,8 @@ class NewRelic::Agent::TransactionTest < Minitest::Test
|
|
698
698
|
txn = in_transaction('oops') do
|
699
699
|
NewRelic::Agent::Transaction.notice_error("wat?")
|
700
700
|
end
|
701
|
-
|
702
|
-
error =
|
701
|
+
errors = harvest_error_traces!
|
702
|
+
error = errors.first
|
703
703
|
assert_equal txn.attributes, error.attributes
|
704
704
|
end
|
705
705
|
|
@@ -708,13 +708,15 @@ class NewRelic::Agent::TransactionTest < Minitest::Test
|
|
708
708
|
# no-op
|
709
709
|
end
|
710
710
|
NewRelic::Agent::Transaction.notice_error("")
|
711
|
-
|
711
|
+
errors = harvest_error_traces!
|
712
|
+
assert_equal 1, errors.count
|
712
713
|
end
|
713
714
|
|
714
715
|
def test_notice_error_without_transaction_notifies_error_collector
|
715
716
|
cleanup_transaction
|
716
717
|
NewRelic::Agent::Transaction.notice_error("")
|
717
|
-
|
718
|
+
errors = harvest_error_traces!
|
719
|
+
assert_equal 1, errors.count
|
718
720
|
end
|
719
721
|
|
720
722
|
def test_notice_error_sends_uri_and_referer_from_request
|
@@ -723,8 +725,10 @@ class NewRelic::Agent::TransactionTest < Minitest::Test
|
|
723
725
|
NewRelic::Agent::Transaction.notice_error("wat")
|
724
726
|
end
|
725
727
|
|
726
|
-
|
727
|
-
|
728
|
+
errors = harvest_error_traces!
|
729
|
+
assert_equal 1, errors.count
|
730
|
+
|
731
|
+
error = errors.first
|
728
732
|
assert_equal "/here", error.request_uri
|
729
733
|
end
|
730
734
|
|
@@ -1407,8 +1411,8 @@ class NewRelic::Agent::TransactionTest < Minitest::Test
|
|
1407
1411
|
end
|
1408
1412
|
|
1409
1413
|
def test_http_response_code_included_in_agent_attributes
|
1410
|
-
txn = in_transaction do |
|
1411
|
-
|
1414
|
+
txn = in_transaction do |t|
|
1415
|
+
t.http_response_code = 418
|
1412
1416
|
end
|
1413
1417
|
|
1414
1418
|
actual = txn.attributes.agent_attributes_for(NewRelic::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
|
@@ -1417,7 +1421,7 @@ class NewRelic::Agent::TransactionTest < Minitest::Test
|
|
1417
1421
|
|
1418
1422
|
def test_referer_in_agent_attributes
|
1419
1423
|
request = stub('request', :referer => "/referered", :path => "/")
|
1420
|
-
txn = in_transaction(:request => request) do
|
1424
|
+
txn = in_transaction(:request => request) do
|
1421
1425
|
end
|
1422
1426
|
|
1423
1427
|
actual = txn.attributes.agent_attributes_for(NewRelic::Agent::AttributeFilter::DST_ERROR_COLLECTOR)
|
@@ -1426,10 +1430,55 @@ class NewRelic::Agent::TransactionTest < Minitest::Test
|
|
1426
1430
|
|
1427
1431
|
def test_referer_omitted_if_not_on_request
|
1428
1432
|
request = stub('request', :path => "/")
|
1429
|
-
txn = in_transaction(:request => request) do
|
1433
|
+
txn = in_transaction(:request => request) do
|
1430
1434
|
end
|
1431
1435
|
|
1432
1436
|
actual = txn.attributes.agent_attributes_for(NewRelic::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
|
1433
1437
|
refute_includes actual, :'request.headers.referer'
|
1434
1438
|
end
|
1439
|
+
|
1440
|
+
def test_error_recorded_predicate_false_by_default
|
1441
|
+
txn = in_transaction do
|
1442
|
+
end
|
1443
|
+
|
1444
|
+
refute txn.error_recorded?, "Did not expected error to be recorded"
|
1445
|
+
end
|
1446
|
+
|
1447
|
+
def test_error_recorded_predicate_true_when_error_recorded
|
1448
|
+
txn = in_transaction do |t|
|
1449
|
+
t.notice_error StandardError.new "Sorry!"
|
1450
|
+
end
|
1451
|
+
|
1452
|
+
assert txn.error_recorded?, "Expected error to be recorded"
|
1453
|
+
end
|
1454
|
+
|
1455
|
+
def test_error_recorded_predicate_abides_by_ignore_filter
|
1456
|
+
filter = Proc.new do |error|
|
1457
|
+
error.message == "Sorry!" ? nil : error
|
1458
|
+
end
|
1459
|
+
|
1460
|
+
with_ignore_error_filter filter do
|
1461
|
+
txn = in_transaction do |t|
|
1462
|
+
t.notice_error StandardError.new "Sorry!"
|
1463
|
+
end
|
1464
|
+
|
1465
|
+
refute txn.error_recorded?, "Expected error to be apologetic"
|
1466
|
+
end
|
1467
|
+
end
|
1468
|
+
|
1469
|
+
def test_error_recorded_with_ignore_filter_and_multiple_errors
|
1470
|
+
filter = Proc.new do |error|
|
1471
|
+
error.message == "Sorry!" ? nil : error
|
1472
|
+
end
|
1473
|
+
|
1474
|
+
with_ignore_error_filter filter do
|
1475
|
+
txn = in_transaction do |t|
|
1476
|
+
t.notice_error StandardError.new "Sorry!"
|
1477
|
+
t.notice_error StandardError.new "Not Sorry!"
|
1478
|
+
t.notice_error StandardError.new "Sorry!"
|
1479
|
+
end
|
1480
|
+
|
1481
|
+
assert txn.error_recorded?, "Expected error to be recorded"
|
1482
|
+
end
|
1483
|
+
end
|
1435
1484
|
end
|
@@ -29,11 +29,19 @@ module NewRelic
|
|
29
29
|
self.respond_to?(:max_data_items) ? max_data_items : 5
|
30
30
|
end
|
31
31
|
|
32
|
+
def harvest_size container, items
|
33
|
+
if container.respond_to?(:has_metadata?) && container.has_metadata? && !items.empty?
|
34
|
+
items.last.size
|
35
|
+
else
|
36
|
+
items.size
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
32
40
|
def test_harvest_should_return_all_data_items
|
33
41
|
c = create_container
|
34
42
|
populate_container(c, num_data_items)
|
35
43
|
results = c.harvest!
|
36
|
-
assert_equal(num_data_items, results
|
44
|
+
assert_equal(num_data_items, harvest_size(c, results))
|
37
45
|
end
|
38
46
|
|
39
47
|
def test_calling_harvest_again_should_not_return_items_again
|
@@ -42,16 +50,18 @@ module NewRelic
|
|
42
50
|
|
43
51
|
c.harvest! # clears container
|
44
52
|
results = c.harvest!
|
45
|
-
assert_equal(0, results
|
53
|
+
assert_equal(0, harvest_size(c, results))
|
46
54
|
end
|
47
55
|
|
48
56
|
def test_calling_harvest_after_re_populating_works
|
49
57
|
container = create_container
|
50
58
|
populate_container(container, num_data_items)
|
51
|
-
|
59
|
+
results = container.harvest!
|
60
|
+
assert_equal(num_data_items, harvest_size(container, results))
|
52
61
|
|
53
62
|
populate_container(container, num_data_items)
|
54
|
-
|
63
|
+
results = container.harvest!
|
64
|
+
assert_equal(num_data_items, harvest_size(container, results))
|
55
65
|
end
|
56
66
|
end
|
57
67
|
|
@@ -62,7 +72,8 @@ module NewRelic
|
|
62
72
|
c = create_container
|
63
73
|
populate_container(c, 5)
|
64
74
|
c.reset!
|
65
|
-
|
75
|
+
results = c.harvest!
|
76
|
+
assert_equal(0, harvest_size(c, results))
|
66
77
|
end
|
67
78
|
|
68
79
|
def test_merge_should_re_integrate_items
|
@@ -70,7 +81,7 @@ module NewRelic
|
|
70
81
|
populate_container(c, 5)
|
71
82
|
c.merge!(c.harvest!)
|
72
83
|
results = c.harvest!
|
73
|
-
assert_equal(5, results
|
84
|
+
assert_equal(5, harvest_size(c, results))
|
74
85
|
end
|
75
86
|
end
|
76
87
|
end
|
@@ -71,6 +71,7 @@ module NewRelic
|
|
71
71
|
'shutdown' => Response.new(200, {'return_value' => nil}),
|
72
72
|
'analytic_event_data' => Response.new(200, {'return_value' => nil}),
|
73
73
|
'custom_event_data' => Response.new(200, {'return_value' => nil}),
|
74
|
+
'error_event_data' => Response.new(200, {'return_value' => nil})
|
74
75
|
}
|
75
76
|
reset
|
76
77
|
end
|
@@ -113,15 +114,10 @@ module NewRelic
|
|
113
114
|
|
114
115
|
if uri.path =~ /agent_listener\/\d+\/.+\/(\w+)/
|
115
116
|
method = $1
|
116
|
-
format = json_format?(uri) ? :json : :pruby
|
117
117
|
if @mock.keys.include? method
|
118
118
|
status, body = @mock[method].evaluate
|
119
119
|
res.status = status
|
120
|
-
|
121
|
-
res.write ::NewRelic::JSONWrapper.dump(body)
|
122
|
-
else
|
123
|
-
res.write Marshal.dump(body)
|
124
|
-
end
|
120
|
+
res.write ::NewRelic::JSONWrapper.dump(body)
|
125
121
|
else
|
126
122
|
res.status = 500
|
127
123
|
res.write "Method not found"
|
@@ -133,15 +129,7 @@ module NewRelic
|
|
133
129
|
raw_body = req.body.read
|
134
130
|
raw_body = Zlib::Inflate.inflate(raw_body) if req.env["HTTP_CONTENT_ENCODING"] == "deflate"
|
135
131
|
|
136
|
-
body =
|
137
|
-
body = ::NewRelic::JSONWrapper.load(raw_body)
|
138
|
-
else
|
139
|
-
body = Marshal.load(raw_body)
|
140
|
-
|
141
|
-
# Symbols remain in Ruby-marshalled data, so tidy up so tests can
|
142
|
-
# rely on strings to compare against in fake collector results.
|
143
|
-
body = NewRelic::Agent::EncodingNormalizer.normalize_object(body)
|
144
|
-
end
|
132
|
+
body = ::NewRelic::JSONWrapper.load(raw_body)
|
145
133
|
rescue
|
146
134
|
body = "UNABLE TO DECODE BODY: #{raw_body}"
|
147
135
|
|
@@ -156,16 +144,12 @@ module NewRelic
|
|
156
144
|
@agent_data << AgentPost.create(:action => method,
|
157
145
|
:body => body,
|
158
146
|
:run_id => run_id,
|
159
|
-
:format =>
|
147
|
+
:format => :json,
|
160
148
|
:query_params => query_params)
|
161
149
|
end
|
162
150
|
res.finish
|
163
151
|
end
|
164
152
|
|
165
|
-
def json_format?(uri)
|
166
|
-
uri.query && uri.query.include?('marshal_format=json')
|
167
|
-
end
|
168
|
-
|
169
153
|
def app
|
170
154
|
self
|
171
155
|
end
|
@@ -211,6 +195,8 @@ module NewRelic
|
|
211
195
|
AnalyticEventDataPost.new(opts)
|
212
196
|
when 'error_data'
|
213
197
|
ErrorDataPost.new(opts)
|
198
|
+
when 'error_event_data'
|
199
|
+
ErrorEventDataPost.new(opts)
|
214
200
|
else
|
215
201
|
new(opts)
|
216
202
|
end
|
@@ -397,6 +383,15 @@ module NewRelic
|
|
397
383
|
@params["intrinsics"]
|
398
384
|
end
|
399
385
|
end
|
400
|
-
end
|
401
386
|
|
387
|
+
class ErrorEventDataPost < AgentPost
|
388
|
+
attr_reader :reservoir_metadata, :error_events
|
389
|
+
|
390
|
+
def initialize opts={}
|
391
|
+
super
|
392
|
+
@reservoir_metadata = body[1]
|
393
|
+
@error_events = body[2]
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
402
397
|
end
|