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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +174 -11
  3. data/CHANGELOG +22 -0
  4. data/Rakefile +5 -0
  5. data/lib/new_relic/agent/agent.rb +22 -7
  6. data/lib/new_relic/agent/aws_info.rb +1 -1
  7. data/lib/new_relic/agent/custom_event_aggregator.rb +19 -44
  8. data/lib/new_relic/agent/error_event_aggregator.rb +11 -103
  9. data/lib/new_relic/agent/event_aggregator.rb +130 -0
  10. data/lib/new_relic/agent/event_buffer.rb +7 -0
  11. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +18 -2
  12. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +12 -4
  13. data/lib/new_relic/agent/new_relic_service.rb +6 -4
  14. data/lib/new_relic/agent/sampled_buffer.rb +9 -6
  15. data/lib/new_relic/agent/stats_engine/metric_stats.rb +1 -2
  16. data/lib/new_relic/agent/stats_engine/stats_hash.rb +2 -1
  17. data/lib/new_relic/agent/supported_versions.rb +1 -1
  18. data/lib/new_relic/agent/synthetics_event_aggregator.rb +52 -0
  19. data/lib/new_relic/agent/synthetics_event_buffer.rb +0 -2
  20. data/lib/new_relic/agent/transaction.rb +14 -7
  21. data/lib/new_relic/agent/transaction/request_attributes.rb +7 -2
  22. data/lib/new_relic/agent/transaction_error_primitive.rb +72 -0
  23. data/lib/new_relic/agent/transaction_event_aggregator.rb +33 -210
  24. data/lib/new_relic/agent/transaction_event_primitive.rb +106 -0
  25. data/lib/new_relic/agent/transaction_event_recorder.rb +48 -0
  26. data/lib/new_relic/agent/transaction_metrics.rb +9 -1
  27. data/lib/new_relic/agent/transction_event_recorder.rb +35 -0
  28. data/lib/new_relic/recipes/capistrano3.rb +1 -1
  29. data/lib/new_relic/version.rb +1 -1
  30. data/lib/tasks/versions.html.erb +13 -11
  31. data/lib/tasks/versions.postface.html +8 -0
  32. data/lib/tasks/versions.preface.html +3 -0
  33. data/lib/tasks/versions.rake +15 -5
  34. data/test/agent_helper.rb +1 -1
  35. data/test/environments/rails31/Gemfile +2 -0
  36. data/test/environments/rails32/Gemfile +2 -0
  37. data/test/environments/rails32/Rakefile +2 -1
  38. data/test/environments/rails32/config/database.yml +1 -6
  39. data/test/multiverse/suites/active_record/Envfile +1 -0
  40. data/test/multiverse/suites/agent_only/agent_attributes_test.rb +18 -0
  41. data/test/multiverse/suites/agent_only/custom_analytics_events_test.rb +21 -6
  42. data/test/multiverse/suites/agent_only/error_events_test.rb +14 -6
  43. data/test/multiverse/suites/agent_only/transaction_events_test.rb +31 -0
  44. data/test/multiverse/suites/agent_only/utilization_data_collection_test.rb +2 -0
  45. data/test/multiverse/suites/capistrano/Envfile +9 -3
  46. data/test/multiverse/suites/capistrano2/Envfile +4 -0
  47. data/test/multiverse/suites/config_file_loading/Envfile +1 -1
  48. data/test/multiverse/suites/curb/Envfile +1 -1
  49. data/test/multiverse/suites/datamapper/Envfile +3 -0
  50. data/test/multiverse/suites/deferred_instrumentation/sinatra_test.rb +7 -3
  51. data/test/multiverse/suites/grape/grape_test.rb +2 -0
  52. data/test/multiverse/suites/padrino/Envfile +4 -3
  53. data/test/multiverse/suites/padrino/config/newrelic.yml +2 -0
  54. data/test/multiverse/suites/rack/config/newrelic.yml +18 -0
  55. data/test/multiverse/suites/rack/nested_non_rack_app_test.rb +1 -1
  56. data/test/multiverse/suites/rack/puma_rack_builder_test.rb +17 -14
  57. data/test/multiverse/suites/rack/rack_auto_instrumentation_test.rb +16 -13
  58. data/test/multiverse/suites/rack/rack_unsupported_version_test.rb +1 -1
  59. data/test/multiverse/suites/rails/Envfile +5 -0
  60. data/test/multiverse/suites/rails/parameter_capture_test.rb +9 -0
  61. data/test/multiverse/suites/rake/Envfile +2 -1
  62. data/test/multiverse/suites/redis/redis_instrumentation_test.rb +1 -1
  63. data/test/multiverse/suites/sidekiq/Envfile +18 -0
  64. data/test/multiverse/suites/sidekiq/sidekiq_instrumentation_test.rb +11 -10
  65. data/test/multiverse/suites/sidekiq/test_model.rb +12 -0
  66. data/test/multiverse/suites/sinatra/ignoring_test.rb +43 -25
  67. data/test/multiverse/suites/sinatra/nested_middleware_test.rb +10 -2
  68. data/test/multiverse/suites/sinatra/sinatra_classic_test.rb +4 -0
  69. data/test/multiverse/suites/sinatra/sinatra_metric_explosion_test.rb +8 -2
  70. data/test/multiverse/suites/sinatra/sinatra_modular_test.rb +4 -0
  71. data/test/multiverse/suites/sinatra/sinatra_parameter_capture_test.rb +2 -0
  72. data/test/multiverse/suites/sinatra/sinatra_test_cases.rb +79 -10
  73. data/test/new_relic/agent/agent_test.rb +3 -3
  74. data/test/new_relic/agent/aws_info_test.rb +1 -2
  75. data/test/new_relic/agent/configuration/orphan_configuration_test.rb +2 -0
  76. data/test/new_relic/agent/custom_event_aggregator_test.rb +43 -4
  77. data/test/new_relic/agent/error_collector_test.rb +1 -1
  78. data/test/new_relic/agent/error_event_aggregator_test.rb +13 -81
  79. data/test/new_relic/agent/event_aggregator_test.rb +178 -0
  80. data/test/new_relic/agent/event_buffer_test_cases.rb +16 -0
  81. data/test/new_relic/agent/instrumentation/sinatra/transaction_namer_test.rb +7 -0
  82. data/test/new_relic/agent/new_relic_service_test.rb +7 -1
  83. data/test/new_relic/agent/pipe_channel_manager_test.rb +45 -3
  84. data/test/new_relic/agent/rpm_agent_test.rb +1 -0
  85. data/test/new_relic/agent/stats_engine/stats_hash_test.rb +2 -2
  86. data/test/new_relic/agent/synthetics_event_aggregator_test.rb +179 -0
  87. data/test/new_relic/agent/transaction/request_attributes_test.rb +8 -0
  88. data/test/new_relic/agent/transaction_error_primitive_test.rb +117 -0
  89. data/test/new_relic/agent/transaction_event_aggregator_test.rb +148 -374
  90. data/test/new_relic/agent/transaction_event_primitive_test.rb +195 -0
  91. data/test/new_relic/agent/transaction_event_recorder_test.rb +80 -0
  92. data/test/new_relic/agent/transaction_metrics_test.rb +7 -7
  93. data/test/new_relic/agent/transaction_test.rb +4 -4
  94. data/test/new_relic/agent/utilization_data_test.rb +7 -7
  95. data/test/new_relic/fake_collector.rb +10 -17
  96. data/test/new_relic/license_test.rb +2 -0
  97. data/test/new_relic/marshalling_test_cases.rb +1 -1
  98. data/test/nullverse/default_source_require_test.rb +21 -0
  99. data/test/nullverse/nullverse_helper.rb +10 -0
  100. data/test/performance/suites/active_record.rb +1 -1
  101. data/test/performance/suites/sql_obfuscation.rb +7 -6
  102. data/test/script/ci.sh +10 -165
  103. data/test/script/install_mongodb.sh +6 -0
  104. metadata +21 -6
  105. data/test/script/build_test_gem.sh +0 -57
  106. data/test/script/ci_agent-tests_runner.sh +0 -82
  107. data/test/script/ci_bench.sh +0 -52
  108. 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/GET main"])
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/GET middle"])
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
@@ -21,6 +21,10 @@ configure do
21
21
  end
22
22
  end
23
23
 
24
+ get '/' do
25
+ "root path"
26
+ end
27
+
24
28
  get '/user/login' do
25
29
  "please log in"
26
30
  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
- 'Controller/Sinatra/SinatraTestApp/GET hello/([^/?#]+)',
47
- 'Apdex/Sinatra/SinatraTestApp/GET hello/([^/?#]+)'
52
+ "Controller/Sinatra/SinatraTestApp/#{segment}",
53
+ "Apdex/Sinatra/SinatraTestApp/#{segment}"
48
54
  ])
49
55
  end
50
56
 
@@ -21,6 +21,10 @@ class SinatraModularTestApp < Sinatra::Base
21
21
  end
22
22
  end
23
23
 
24
+ get '/' do
25
+ "root path"
26
+ end
27
+
24
28
  get '/user/login' do
25
29
  "please log in"
26
30
  end
@@ -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}/GET route/([^/?#]+)"])
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}/GET route/no_match"])
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}/GET regex.*"])
143
+ assert_metrics_recorded(["Controller/Sinatra/#{app_name}/#{regex_segment}"])
85
144
  end
86
145
 
87
- def test_set_unknown_transaction_name_if_error_in_routing
88
- ::NewRelic::Agent::Instrumentation::Sinatra::TransactionNamer \
89
- .stubs(:http_verb).raises(StandardError.new('madness'))
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
- get '/user/login'
92
- assert_metrics_recorded(["Controller/Sinatra/#{app_name}/(unknown)"])
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}/GET precondition"])
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}/GET ignored"])
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.instance_variable_get(:@transaction_event_aggregator).expects(:merge!).never
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.instance_variable_get(:@transaction_event_aggregator)
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 "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']
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 "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]
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 :@error_event_buffer
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 :@error_event_buffer
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