newrelic_rpm 3.14.1.311 → 3.14.2.312
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +174 -11
- data/CHANGELOG +22 -0
- data/Rakefile +5 -0
- data/lib/new_relic/agent/agent.rb +22 -7
- data/lib/new_relic/agent/aws_info.rb +1 -1
- data/lib/new_relic/agent/custom_event_aggregator.rb +19 -44
- data/lib/new_relic/agent/error_event_aggregator.rb +11 -103
- data/lib/new_relic/agent/event_aggregator.rb +130 -0
- data/lib/new_relic/agent/event_buffer.rb +7 -0
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +18 -2
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +12 -4
- data/lib/new_relic/agent/new_relic_service.rb +6 -4
- data/lib/new_relic/agent/sampled_buffer.rb +9 -6
- data/lib/new_relic/agent/stats_engine/metric_stats.rb +1 -2
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +2 -1
- data/lib/new_relic/agent/supported_versions.rb +1 -1
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +52 -0
- data/lib/new_relic/agent/synthetics_event_buffer.rb +0 -2
- data/lib/new_relic/agent/transaction.rb +14 -7
- data/lib/new_relic/agent/transaction/request_attributes.rb +7 -2
- data/lib/new_relic/agent/transaction_error_primitive.rb +72 -0
- data/lib/new_relic/agent/transaction_event_aggregator.rb +33 -210
- data/lib/new_relic/agent/transaction_event_primitive.rb +106 -0
- data/lib/new_relic/agent/transaction_event_recorder.rb +48 -0
- data/lib/new_relic/agent/transaction_metrics.rb +9 -1
- data/lib/new_relic/agent/transction_event_recorder.rb +35 -0
- data/lib/new_relic/recipes/capistrano3.rb +1 -1
- data/lib/new_relic/version.rb +1 -1
- data/lib/tasks/versions.html.erb +13 -11
- data/lib/tasks/versions.postface.html +8 -0
- data/lib/tasks/versions.preface.html +3 -0
- data/lib/tasks/versions.rake +15 -5
- data/test/agent_helper.rb +1 -1
- data/test/environments/rails31/Gemfile +2 -0
- data/test/environments/rails32/Gemfile +2 -0
- data/test/environments/rails32/Rakefile +2 -1
- data/test/environments/rails32/config/database.yml +1 -6
- data/test/multiverse/suites/active_record/Envfile +1 -0
- data/test/multiverse/suites/agent_only/agent_attributes_test.rb +18 -0
- data/test/multiverse/suites/agent_only/custom_analytics_events_test.rb +21 -6
- data/test/multiverse/suites/agent_only/error_events_test.rb +14 -6
- data/test/multiverse/suites/agent_only/transaction_events_test.rb +31 -0
- data/test/multiverse/suites/agent_only/utilization_data_collection_test.rb +2 -0
- data/test/multiverse/suites/capistrano/Envfile +9 -3
- data/test/multiverse/suites/capistrano2/Envfile +4 -0
- data/test/multiverse/suites/config_file_loading/Envfile +1 -1
- data/test/multiverse/suites/curb/Envfile +1 -1
- data/test/multiverse/suites/datamapper/Envfile +3 -0
- data/test/multiverse/suites/deferred_instrumentation/sinatra_test.rb +7 -3
- data/test/multiverse/suites/grape/grape_test.rb +2 -0
- data/test/multiverse/suites/padrino/Envfile +4 -3
- data/test/multiverse/suites/padrino/config/newrelic.yml +2 -0
- data/test/multiverse/suites/rack/config/newrelic.yml +18 -0
- data/test/multiverse/suites/rack/nested_non_rack_app_test.rb +1 -1
- data/test/multiverse/suites/rack/puma_rack_builder_test.rb +17 -14
- data/test/multiverse/suites/rack/rack_auto_instrumentation_test.rb +16 -13
- data/test/multiverse/suites/rack/rack_unsupported_version_test.rb +1 -1
- data/test/multiverse/suites/rails/Envfile +5 -0
- data/test/multiverse/suites/rails/parameter_capture_test.rb +9 -0
- data/test/multiverse/suites/rake/Envfile +2 -1
- data/test/multiverse/suites/redis/redis_instrumentation_test.rb +1 -1
- data/test/multiverse/suites/sidekiq/Envfile +18 -0
- data/test/multiverse/suites/sidekiq/sidekiq_instrumentation_test.rb +11 -10
- data/test/multiverse/suites/sidekiq/test_model.rb +12 -0
- data/test/multiverse/suites/sinatra/ignoring_test.rb +43 -25
- data/test/multiverse/suites/sinatra/nested_middleware_test.rb +10 -2
- data/test/multiverse/suites/sinatra/sinatra_classic_test.rb +4 -0
- data/test/multiverse/suites/sinatra/sinatra_metric_explosion_test.rb +8 -2
- data/test/multiverse/suites/sinatra/sinatra_modular_test.rb +4 -0
- data/test/multiverse/suites/sinatra/sinatra_parameter_capture_test.rb +2 -0
- data/test/multiverse/suites/sinatra/sinatra_test_cases.rb +79 -10
- data/test/new_relic/agent/agent_test.rb +3 -3
- data/test/new_relic/agent/aws_info_test.rb +1 -2
- data/test/new_relic/agent/configuration/orphan_configuration_test.rb +2 -0
- data/test/new_relic/agent/custom_event_aggregator_test.rb +43 -4
- data/test/new_relic/agent/error_collector_test.rb +1 -1
- data/test/new_relic/agent/error_event_aggregator_test.rb +13 -81
- data/test/new_relic/agent/event_aggregator_test.rb +178 -0
- data/test/new_relic/agent/event_buffer_test_cases.rb +16 -0
- data/test/new_relic/agent/instrumentation/sinatra/transaction_namer_test.rb +7 -0
- data/test/new_relic/agent/new_relic_service_test.rb +7 -1
- data/test/new_relic/agent/pipe_channel_manager_test.rb +45 -3
- data/test/new_relic/agent/rpm_agent_test.rb +1 -0
- data/test/new_relic/agent/stats_engine/stats_hash_test.rb +2 -2
- data/test/new_relic/agent/synthetics_event_aggregator_test.rb +179 -0
- data/test/new_relic/agent/transaction/request_attributes_test.rb +8 -0
- data/test/new_relic/agent/transaction_error_primitive_test.rb +117 -0
- data/test/new_relic/agent/transaction_event_aggregator_test.rb +148 -374
- data/test/new_relic/agent/transaction_event_primitive_test.rb +195 -0
- data/test/new_relic/agent/transaction_event_recorder_test.rb +80 -0
- data/test/new_relic/agent/transaction_metrics_test.rb +7 -7
- data/test/new_relic/agent/transaction_test.rb +4 -4
- data/test/new_relic/agent/utilization_data_test.rb +7 -7
- data/test/new_relic/fake_collector.rb +10 -17
- data/test/new_relic/license_test.rb +2 -0
- data/test/new_relic/marshalling_test_cases.rb +1 -1
- data/test/nullverse/default_source_require_test.rb +21 -0
- data/test/nullverse/nullverse_helper.rb +10 -0
- data/test/performance/suites/active_record.rb +1 -1
- data/test/performance/suites/sql_obfuscation.rb +7 -6
- data/test/script/ci.sh +10 -165
- data/test/script/install_mongodb.sh +6 -0
- metadata +21 -6
- data/test/script/build_test_gem.sh +0 -57
- data/test/script/ci_agent-tests_runner.sh +0 -82
- data/test/script/ci_bench.sh +0 -52
- data/test/script/ci_multiverse_runner.sh +0 -63
@@ -28,12 +28,20 @@ class NestedMiddlewareTest < Minitest::Test
|
|
28
28
|
|
29
29
|
def test_inner_transaction
|
30
30
|
get '/main'
|
31
|
-
assert_metrics_recorded(["Controller/Sinatra/MainApp
|
31
|
+
assert_metrics_recorded(["Controller/Sinatra/MainApp/#{name_for_route('main')}"])
|
32
32
|
assert_metrics_not_recorded(["Controller/Sinatra/MiddlewareApp/GET (unknown)"])
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_outer_transaction
|
36
36
|
get '/middle'
|
37
|
-
assert_metrics_recorded(["Controller/Sinatra/MiddlewareApp
|
37
|
+
assert_metrics_recorded(["Controller/Sinatra/MiddlewareApp/#{name_for_route('middle')}"])
|
38
|
+
end
|
39
|
+
|
40
|
+
def name_for_route path
|
41
|
+
if last_request.env.key? 'sinatra.route'
|
42
|
+
"GET /#{path}"
|
43
|
+
else
|
44
|
+
"GET #{path}"
|
45
|
+
end
|
38
46
|
end
|
39
47
|
end
|
@@ -42,9 +42,15 @@ class SinatraMetricExplosionTest < Minitest::Test
|
|
42
42
|
|
43
43
|
def test_transaction_name_from_route
|
44
44
|
get '/hello/world'
|
45
|
+
|
46
|
+
segment = if last_request.env.key? 'sinatra.route'
|
47
|
+
'GET /hello/:name'
|
48
|
+
else
|
49
|
+
'GET hello/([^/?#]+)'
|
50
|
+
end
|
45
51
|
assert_metrics_recorded([
|
46
|
-
|
47
|
-
|
52
|
+
"Controller/Sinatra/SinatraTestApp/#{segment}",
|
53
|
+
"Apdex/Sinatra/SinatraTestApp/#{segment}"
|
48
54
|
])
|
49
55
|
end
|
50
56
|
|
@@ -68,8 +68,10 @@ class SinatraParameterCaptureTest < Minitest::Test
|
|
68
68
|
post '/capture_test'
|
69
69
|
|
70
70
|
expected = {
|
71
|
+
"response.headers.contentLength" => last_response.content_length.to_i,
|
71
72
|
"response.headers.contentType" => last_response.content_type,
|
72
73
|
"request.headers.contentLength" => last_request.content_length.to_i,
|
74
|
+
"request.headers.contentType" => last_request.content_type,
|
73
75
|
"request.headers.host" => last_request.host,
|
74
76
|
"request.method" => last_request.request_method
|
75
77
|
}
|
@@ -10,6 +10,65 @@ module SinatraTestCases
|
|
10
10
|
include Rack::Test::Methods
|
11
11
|
include MultiverseHelpers
|
12
12
|
|
13
|
+
module SinatraRouteNaming
|
14
|
+
# get '/route/:name'
|
15
|
+
def route_name_segment
|
16
|
+
'GET /route/:name'
|
17
|
+
end
|
18
|
+
|
19
|
+
# get '/route/no_match'
|
20
|
+
def route_no_match_segment
|
21
|
+
'GET /route/no_match'
|
22
|
+
end
|
23
|
+
|
24
|
+
# get /\/regex.*/
|
25
|
+
def regex_segment
|
26
|
+
'GET (?-mix:\/regex.*)'
|
27
|
+
end
|
28
|
+
|
29
|
+
# get '/precondition'
|
30
|
+
def precondition_segment
|
31
|
+
'GET /precondition'
|
32
|
+
end
|
33
|
+
|
34
|
+
#get '/ignored'
|
35
|
+
def ignored_segment
|
36
|
+
'GET /ignored'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
module NRRouteNaming
|
41
|
+
# get '/route/:name'
|
42
|
+
def route_name_segment
|
43
|
+
'GET route/([^/?#]+)'
|
44
|
+
end
|
45
|
+
|
46
|
+
# get '/route/no_match'
|
47
|
+
def route_no_match_segment
|
48
|
+
'GET route/no_match'
|
49
|
+
end
|
50
|
+
|
51
|
+
# get /\/regex.*/
|
52
|
+
def regex_segment
|
53
|
+
'GET regex.*'
|
54
|
+
end
|
55
|
+
|
56
|
+
# get '/precondition'
|
57
|
+
def precondition_segment
|
58
|
+
'GET precondition'
|
59
|
+
end
|
60
|
+
|
61
|
+
#get '/ignored'
|
62
|
+
def ignored_segment
|
63
|
+
'GET ignored'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
if Sinatra::VERSION >= '1.4.3'
|
68
|
+
include SinatraRouteNaming
|
69
|
+
else
|
70
|
+
include NRRouteNaming
|
71
|
+
end
|
13
72
|
|
14
73
|
def app
|
15
74
|
raise "Must implement app on your test case"
|
@@ -69,27 +128,30 @@ module SinatraTestCases
|
|
69
128
|
def test_correct_pattern
|
70
129
|
get '/route/match'
|
71
130
|
assert_equal 'first route', last_response.body
|
72
|
-
assert_metrics_recorded(["Controller/Sinatra/#{app_name}
|
131
|
+
assert_metrics_recorded(["Controller/Sinatra/#{app_name}/#{route_name_segment}"])
|
73
132
|
end
|
74
133
|
|
75
134
|
def test_finds_second_route
|
76
135
|
get '/route/no_match'
|
77
136
|
assert_equal 'second route', last_response.body
|
78
|
-
assert_metrics_recorded(["Controller/Sinatra/#{app_name}
|
137
|
+
assert_metrics_recorded(["Controller/Sinatra/#{app_name}/#{route_no_match_segment}"])
|
79
138
|
end
|
80
139
|
|
81
140
|
def test_with_regex_pattern
|
82
141
|
get '/regexes'
|
83
142
|
assert_equal "Yeah, regex's!", last_response.body
|
84
|
-
assert_metrics_recorded(["Controller/Sinatra/#{app_name}
|
143
|
+
assert_metrics_recorded(["Controller/Sinatra/#{app_name}/#{regex_segment}"])
|
85
144
|
end
|
86
145
|
|
87
|
-
|
88
|
-
|
89
|
-
|
146
|
+
# this test is not applicable to environments that use sinatra.route for txn naming
|
147
|
+
if self.include? NRRouteNaming
|
148
|
+
def test_set_unknown_transaction_name_if_error_in_routing
|
149
|
+
::NewRelic::Agent::Instrumentation::Sinatra::TransactionNamer \
|
150
|
+
.stubs(:http_verb).raises(StandardError.new('madness'))
|
90
151
|
|
91
|
-
|
92
|
-
|
152
|
+
get '/user/login'
|
153
|
+
assert_metrics_recorded(["Controller/Sinatra/#{app_name}/(unknown)"])
|
154
|
+
end
|
93
155
|
end
|
94
156
|
|
95
157
|
# https://support.newrelic.com/tickets/31061
|
@@ -98,7 +160,7 @@ module SinatraTestCases
|
|
98
160
|
|
99
161
|
assert_equal 200, last_response.status
|
100
162
|
assert_equal 'precondition only happened once', last_response.body
|
101
|
-
assert_metrics_recorded(["Controller/Sinatra/#{app_name}
|
163
|
+
assert_metrics_recorded(["Controller/Sinatra/#{app_name}/#{precondition_segment}"])
|
102
164
|
end
|
103
165
|
|
104
166
|
def test_filter
|
@@ -112,7 +174,7 @@ module SinatraTestCases
|
|
112
174
|
get '/ignored'
|
113
175
|
|
114
176
|
assert_equal 200, last_response.status
|
115
|
-
assert_metrics_not_recorded(["Controller/Sinatra/#{app_name}
|
177
|
+
assert_metrics_not_recorded(["Controller/Sinatra/#{app_name}/#{ignored_segment}"])
|
116
178
|
end
|
117
179
|
|
118
180
|
def test_rack_request_params_errors_are_swallowed
|
@@ -136,4 +198,11 @@ module SinatraTestCases
|
|
136
198
|
stubs(:params).returns({}).
|
137
199
|
then.raises("Rack::Request#params error")
|
138
200
|
end
|
201
|
+
|
202
|
+
def test_root_path_naming
|
203
|
+
get '/'
|
204
|
+
|
205
|
+
assert_metrics_recorded ["Controller/Sinatra/#{app_name}/GET /"]
|
206
|
+
refute_metrics_recorded ["Controller/Sinatra/#{app_name}/GET "]
|
207
|
+
end
|
139
208
|
end
|
@@ -236,7 +236,7 @@ module NewRelic
|
|
236
236
|
@agent.stats_engine.expects(:merge!).never
|
237
237
|
@agent.error_collector.expects(:merge!).never
|
238
238
|
@agent.transaction_sampler.expects(:merge!).never
|
239
|
-
@agent.
|
239
|
+
@agent.transaction_event_aggregator.expects(:merge!).never
|
240
240
|
@agent.sql_sampler.expects(:merge!).never
|
241
241
|
@agent.merge_data_for_endpoint(:metric_data, [])
|
242
242
|
@agent.merge_data_for_endpoint(:transaction_sample_data, [])
|
@@ -270,8 +270,8 @@ module NewRelic
|
|
270
270
|
|
271
271
|
def test_harvest_and_send_analytic_event_data_merges_in_samples_on_failure
|
272
272
|
service = @agent.service
|
273
|
-
transaction_event_aggregator = @agent.
|
274
|
-
samples = [mock('some analytics event')]
|
273
|
+
transaction_event_aggregator = @agent.transaction_event_aggregator
|
274
|
+
samples = [{:reservoir_size => 100, :events_seen => 1}, [mock('some analytics event')]]
|
275
275
|
|
276
276
|
transaction_event_aggregator.expects(:harvest!).returns(samples)
|
277
277
|
transaction_event_aggregator.expects(:merge!).with(samples)
|
@@ -27,8 +27,7 @@ module NewRelic::Agent
|
|
27
27
|
Net::HTTP.stubs(:get).returns("j" * 1000)
|
28
28
|
|
29
29
|
NewRelic::Agent.logger.stubs(:debug)
|
30
|
-
NewRelic::Agent.logger.expects(:debug).with(anything
|
31
|
-
instance_of(NewRelic::Agent::AWSInfo::ResponseError))
|
30
|
+
NewRelic::Agent.logger.expects(:debug).with(anything)
|
32
31
|
|
33
32
|
AWSInfo.new
|
34
33
|
end
|
@@ -35,6 +35,7 @@ class OrphanedConfigTest < Minitest::Test
|
|
35
35
|
DEFAULT_VALUE_OF_PATTERN = /:default\s*=>\s*value_of\(:['"]?([a-z\._]+)['"]?\)\s*/
|
36
36
|
REGISTER_CALLBACK_PATTERN = /register_callback\(:['"]?([a-z\._]+)['"]?\)/
|
37
37
|
NAMED_DEPENDENCY_PATTERN = /^\s*named[ (]+\:?([a-z0-9\._]+).*$/
|
38
|
+
EVENT_BUFFER_MACRO_PATTERN = /(capacity_key|enabled_key)\s+:['"]?([a-z\._]+)['"]?/
|
38
39
|
|
39
40
|
def test_all_default_source_config_keys_are_used_in_the_agent
|
40
41
|
non_test_files.each do |file|
|
@@ -43,6 +44,7 @@ class OrphanedConfigTest < Minitest::Test
|
|
43
44
|
captures << line.scan(AGENT_CONFIG_PATTERN)
|
44
45
|
captures << line.scan(DEFAULT_VALUE_OF_PATTERN)
|
45
46
|
captures << line.scan(REGISTER_CALLBACK_PATTERN)
|
47
|
+
captures << line.scan(EVENT_BUFFER_MACRO_PATTERN)
|
46
48
|
captures << line.scan(NAMED_DEPENDENCY_PATTERN).map(&method(:disable_name))
|
47
49
|
|
48
50
|
captures.flatten.map do |key|
|
@@ -35,7 +35,9 @@ module NewRelic::Agent
|
|
35
35
|
@aggregator.record(:footype, :number => i)
|
36
36
|
end
|
37
37
|
|
38
|
-
results = @aggregator.harvest!
|
38
|
+
metadata, results = @aggregator.harvest!
|
39
|
+
assert_equal(max_samples, metadata[:reservoir_size])
|
40
|
+
assert_equal(n, metadata[:events_seen])
|
39
41
|
assert_equal(max_samples, results.size)
|
40
42
|
end
|
41
43
|
|
@@ -48,7 +50,9 @@ module NewRelic::Agent
|
|
48
50
|
|
49
51
|
new_max_samples = orig_max_samples - 10
|
50
52
|
with_config(:'custom_insights_events.max_samples_stored' => new_max_samples) do
|
51
|
-
results = @aggregator.harvest!
|
53
|
+
metadata, results = @aggregator.harvest!
|
54
|
+
assert_equal(new_max_samples, metadata[:reservoir_size])
|
55
|
+
assert_equal(orig_max_samples, metadata[:events_seen])
|
52
56
|
assert_equal(new_max_samples, results.size)
|
53
57
|
end
|
54
58
|
end
|
@@ -66,7 +70,7 @@ module NewRelic::Agent
|
|
66
70
|
|
67
71
|
@aggregator.merge!(old_events)
|
68
72
|
|
69
|
-
events = @aggregator.harvest!
|
73
|
+
_, events = @aggregator.harvest!
|
70
74
|
|
71
75
|
assert_equal(10, events.size)
|
72
76
|
end
|
@@ -76,7 +80,7 @@ module NewRelic::Agent
|
|
76
80
|
t0 = Time.now
|
77
81
|
@aggregator.record(:type_a, :foo => :bar, :baz => :qux)
|
78
82
|
|
79
|
-
events = @aggregator.harvest!
|
83
|
+
_, events = @aggregator.harvest!
|
80
84
|
|
81
85
|
assert_equal(1, events.size)
|
82
86
|
event = events.first
|
@@ -84,5 +88,40 @@ module NewRelic::Agent
|
|
84
88
|
assert_equal({ 'type' => 'type_a', 'timestamp' => t0.to_i }, event[0])
|
85
89
|
assert_equal({ 'foo' => 'bar' , 'baz' => 'qux' }, event[1])
|
86
90
|
end
|
91
|
+
|
92
|
+
def test_sample_counts_are_correct_after_merge
|
93
|
+
with_config :'custom_insights_events.max_samples_stored' => 5 do
|
94
|
+
buffer = @aggregator.instance_variable_get :@buffer
|
95
|
+
|
96
|
+
4.times { @aggregator.record(:t, :foo => :bar) }
|
97
|
+
last_harvest = @aggregator.harvest!
|
98
|
+
|
99
|
+
assert_equal 4, buffer.seen_lifetime
|
100
|
+
assert_equal 4, buffer.captured_lifetime
|
101
|
+
assert_equal 4, last_harvest[0][:events_seen]
|
102
|
+
|
103
|
+
4.times { @aggregator.record(:t, :foo => :bar) }
|
104
|
+
@aggregator.merge! last_harvest
|
105
|
+
|
106
|
+
reservoir_stats, samples = @aggregator.harvest!
|
107
|
+
|
108
|
+
assert_equal 5, samples.size
|
109
|
+
assert_equal 8, reservoir_stats[:events_seen]
|
110
|
+
assert_equal 8, buffer.seen_lifetime
|
111
|
+
assert_equal 5, buffer.captured_lifetime
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_records_supportability_metrics_after_harvest
|
116
|
+
with_config :'custom_insights_events.max_samples_stored' => 5 do
|
117
|
+
engine = NewRelic::Agent.instance.stats_engine
|
118
|
+
engine.expects(:tl_record_supportability_metric_count).with("Events/Customer/Seen", 9)
|
119
|
+
engine.expects(:tl_record_supportability_metric_count).with("Events/Customer/Sent", 5)
|
120
|
+
engine.expects(:tl_record_supportability_metric_count).with("Events/Customer/Dropped", 4)
|
121
|
+
|
122
|
+
9.times { @aggregator.record(:t, :foo => :bar) }
|
123
|
+
@aggregator.harvest!
|
124
|
+
end
|
125
|
+
end
|
87
126
|
end
|
88
127
|
end
|
@@ -265,7 +265,7 @@ class NewRelic::Agent::ErrorCollectorTest < Minitest::Test
|
|
265
265
|
|
266
266
|
def test_skip_notice_error_is_true_if_the_error_collector_is_disabled
|
267
267
|
error = StandardError.new
|
268
|
-
with_config(:'error_collector.enabled' => false) do
|
268
|
+
with_config(:'error_collector.enabled' => false, :'error_collector.capture_events' => false) do
|
269
269
|
assert @error_collector.skip_notice_error?(error)
|
270
270
|
end
|
271
271
|
end
|
@@ -38,10 +38,10 @@ module NewRelic
|
|
38
38
|
|
39
39
|
intrinsics, *_ = last_error_event
|
40
40
|
|
41
|
-
assert_equal
|
42
|
-
assert_in_delta Time.now.to_f, intrinsics[
|
43
|
-
assert_equal "RuntimeError", intrinsics[
|
44
|
-
assert_equal "Big Controller!", intrinsics[
|
41
|
+
assert_equal 'TransactionError', intrinsics['type']
|
42
|
+
assert_in_delta Time.now.to_f, intrinsics['timestamp'], 0.001
|
43
|
+
assert_equal "RuntimeError", intrinsics['error.class']
|
44
|
+
assert_equal "Big Controller!", intrinsics['error.message']
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_generates_event_from_error
|
@@ -49,81 +49,13 @@ module NewRelic
|
|
49
49
|
|
50
50
|
intrinsics, *_ = last_error_event
|
51
51
|
|
52
|
-
assert_equal
|
53
|
-
assert_in_delta Time.now.to_f, intrinsics[
|
54
|
-
assert_equal "RuntimeError", intrinsics[
|
55
|
-
assert_equal "Big Controller!", intrinsics[
|
56
|
-
assert_equal "Controller/blogs/index", intrinsics[
|
57
|
-
assert_equal 0.1, intrinsics[
|
58
|
-
assert_equal 80, intrinsics[
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_event_includes_synthetics
|
62
|
-
generate_error :payload_options => {
|
63
|
-
:synthetics_resource_id=>3,
|
64
|
-
:synthetics_job_id=>4,
|
65
|
-
:synthetics_monitor_id=>5
|
66
|
-
}
|
67
|
-
|
68
|
-
intrinsics, *_ = last_error_event
|
69
|
-
|
70
|
-
assert_equal 3, intrinsics[:'nr.syntheticsResourceId']
|
71
|
-
assert_equal 4, intrinsics[:'nr.syntheticsJobId']
|
72
|
-
assert_equal 5, intrinsics[:'nr.syntheticsMonitorId']
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_includes_mapped_metrics
|
76
|
-
metrics = NewRelic::Agent::TransactionMetrics.new
|
77
|
-
metrics.record_unscoped 'Datastore/all', 10
|
78
|
-
metrics.record_unscoped 'GC/Transaction/all', 11
|
79
|
-
metrics.record_unscoped 'WebFrontend/QueueTime', 12
|
80
|
-
metrics.record_unscoped 'External/allWeb', 13
|
81
|
-
|
82
|
-
generate_error :payload_options => {:metrics => metrics}
|
83
|
-
|
84
|
-
intrinsics, *_ = last_error_event
|
85
|
-
|
86
|
-
assert_equal 10.0, intrinsics["databaseDuration"]
|
87
|
-
assert_equal 1, intrinsics["databaseCallCount"]
|
88
|
-
assert_equal 11.0, intrinsics["gcCumulative"]
|
89
|
-
assert_equal 12.0, intrinsics["queueDuration"]
|
90
|
-
assert_equal 13.0, intrinsics["externalDuration"]
|
91
|
-
assert_equal 1, intrinsics["externalCallCount"]
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_includes_cat_attributes
|
95
|
-
generate_error :payload_options => {:guid => "GUID", :referring_transaction_guid=>"REFERRING_GUID"}
|
96
|
-
|
97
|
-
intrinsics, *_ = last_error_event
|
98
|
-
|
99
|
-
assert_equal "GUID", intrinsics[:"nr.transactionGuid"]
|
100
|
-
assert_equal "REFERRING_GUID", intrinsics[:"nr.referringTransactionGuid"]
|
101
|
-
end
|
102
|
-
|
103
|
-
def test_includes_custom_attributes
|
104
|
-
attrs = {"user" => "Wes Mantooth", "channel" => 9}
|
105
|
-
|
106
|
-
attributes = Transaction::Attributes.new(NewRelic::Agent.instance.attribute_filter)
|
107
|
-
attributes.merge_custom_attributes attrs
|
108
|
-
|
109
|
-
generate_error :error_options => {:attributes => attributes}
|
110
|
-
|
111
|
-
_, custom_attrs, _ = last_error_event
|
112
|
-
|
113
|
-
assert_equal attrs, custom_attrs
|
114
|
-
end
|
115
|
-
|
116
|
-
def test_includes_agent_attributes
|
117
|
-
attributes = Transaction::Attributes.new(NewRelic::Agent.instance.attribute_filter)
|
118
|
-
attributes.add_agent_attribute :'request.headers.referer', "http://blog.site/home", AttributeFilter::DST_ERROR_COLLECTOR
|
119
|
-
attributes.add_agent_attribute :httpResponseCode, "200", AttributeFilter::DST_ERROR_COLLECTOR
|
120
|
-
|
121
|
-
generate_error :error_options => {:attributes => attributes}
|
122
|
-
|
123
|
-
_, _, agent_attrs = last_error_event
|
124
|
-
|
125
|
-
expected = {:"request.headers.referer" => "http://blog.site/home", :httpResponseCode => "200"}
|
126
|
-
assert_equal expected, agent_attrs
|
52
|
+
assert_equal 'TransactionError', intrinsics['type']
|
53
|
+
assert_in_delta Time.now.to_f, intrinsics['timestamp'], 0.001
|
54
|
+
assert_equal "RuntimeError", intrinsics['error.class']
|
55
|
+
assert_equal "Big Controller!", intrinsics['error.message']
|
56
|
+
assert_equal "Controller/blogs/index", intrinsics['transactionName']
|
57
|
+
assert_equal 0.1, intrinsics['duration']
|
58
|
+
assert_equal 80, intrinsics['port']
|
127
59
|
end
|
128
60
|
|
129
61
|
def test_respects_max_samples_stored
|
@@ -171,7 +103,7 @@ module NewRelic
|
|
171
103
|
|
172
104
|
def test_sample_counts_are_correct_after_merge
|
173
105
|
with_config :'error_collector.max_event_samples_stored' => 5 do
|
174
|
-
buffer = error_event_aggregator.instance_variable_get :@
|
106
|
+
buffer = error_event_aggregator.instance_variable_get :@buffer
|
175
107
|
|
176
108
|
4.times { generate_error }
|
177
109
|
last_harvest = error_event_aggregator.harvest!
|
@@ -260,7 +192,7 @@ module NewRelic
|
|
260
192
|
def reset_error_event_buffer_state
|
261
193
|
# this is not ideal, but we need to reset these counts to clear out state
|
262
194
|
# between tests
|
263
|
-
buffer = error_event_aggregator.instance_variable_get :@
|
195
|
+
buffer = error_event_aggregator.instance_variable_get :@buffer
|
264
196
|
buffer.instance_variable_set :@seen_lifetime, 0
|
265
197
|
buffer.instance_variable_set :@captured_lifetime, 0
|
266
198
|
end
|