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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +20 -0
  3. data/README.md +1 -13
  4. data/lib/new_relic/agent/agent.rb +40 -15
  5. data/lib/new_relic/agent/agent_logger.rb +1 -1
  6. data/lib/new_relic/agent/configuration/default_source.rb +16 -6
  7. data/lib/new_relic/agent/configuration/server_source.rb +2 -1
  8. data/lib/new_relic/agent/error_collector.rb +13 -21
  9. data/lib/new_relic/agent/error_event_aggregator.rb +124 -0
  10. data/lib/new_relic/agent/error_trace_aggregator.rb +15 -5
  11. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +16 -2
  12. data/lib/new_relic/agent/new_relic_service.rb +11 -10
  13. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +1 -1
  14. data/lib/new_relic/agent/payload_metric_mapping.rb +58 -0
  15. data/lib/new_relic/agent/sampled_buffer.rb +15 -1
  16. data/lib/new_relic/agent/supported_versions.rb +4 -4
  17. data/lib/new_relic/agent/transaction.rb +52 -44
  18. data/lib/new_relic/agent/transaction/request_attributes.rb +110 -0
  19. data/lib/new_relic/agent/transaction_event_aggregator.rb +4 -41
  20. data/lib/new_relic/noticed_error.rb +25 -9
  21. data/lib/new_relic/rack/agent_middleware.rb +5 -0
  22. data/lib/new_relic/version.rb +2 -2
  23. data/newrelic_rpm.gemspec +6 -0
  24. data/test/agent_helper.rb +16 -7
  25. data/test/environments/norails/Gemfile +1 -0
  26. data/test/multiverse/lib/multiverse/runner.rb +1 -1
  27. data/test/multiverse/lib/multiverse/suite.rb +6 -3
  28. data/test/multiverse/suites/agent_only/agent_attributes_test.rb +57 -0
  29. data/test/multiverse/suites/agent_only/audit_log_test.rb +1 -2
  30. data/test/multiverse/suites/agent_only/error_events_test.rb +82 -0
  31. data/test/multiverse/suites/agent_only/harvest_timestamps_test.rb +31 -6
  32. data/test/multiverse/suites/agent_only/logging_test.rb +2 -2
  33. data/test/multiverse/suites/agent_only/marshaling_test.rb +6 -0
  34. data/test/multiverse/suites/agent_only/set_transaction_name_test.rb +2 -2
  35. data/test/multiverse/suites/agent_only/thread_profiling_test.rb +0 -20
  36. data/test/multiverse/suites/grape/grape_test.rb +16 -1
  37. data/test/multiverse/suites/no_json/Envfile +12 -0
  38. data/test/multiverse/suites/no_json/config/newrelic.yml +27 -0
  39. data/test/multiverse/suites/no_json/marshal_config_test.rb +22 -0
  40. data/test/multiverse/suites/rack/example_app.rb +19 -0
  41. data/test/multiverse/suites/rack/response_content_type_test.rb +50 -0
  42. data/test/multiverse/suites/rails/error_tracing_test.rb +12 -7
  43. data/test/multiverse/suites/rails/parameter_capture_test.rb +21 -1
  44. data/test/multiverse/suites/sinatra/sinatra_error_tracing_test.rb +5 -2
  45. data/test/multiverse/suites/sinatra/sinatra_parameter_capture_test.rb +16 -1
  46. data/test/multiverse/suites/sinatra/sinatra_test_cases.rb +4 -2
  47. data/test/new_relic/agent/agent_logger_test.rb +9 -0
  48. data/test/new_relic/agent/agent_test.rb +6 -4
  49. data/test/new_relic/agent/audit_logger_test.rb +0 -7
  50. data/test/new_relic/agent/error_collector_test.rb +20 -250
  51. data/test/new_relic/agent/error_event_aggregator_test.rb +294 -0
  52. data/test/new_relic/agent/error_trace_aggregator_test.rb +273 -5
  53. data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +2 -2
  54. data/test/new_relic/agent/new_relic_service_test.rb +8 -32
  55. data/test/new_relic/agent/payload_metric_mapping_test.rb +74 -0
  56. data/test/new_relic/agent/pipe_channel_manager_test.rb +6 -5
  57. data/test/new_relic/agent/sampled_buffer_test.rb +36 -0
  58. data/test/new_relic/agent/sql_sampler_test.rb +4 -14
  59. data/test/new_relic/agent/stats_engine/stats_hash_test.rb +5 -4
  60. data/test/new_relic/agent/threading/thread_profile_test.rb +1 -2
  61. data/test/new_relic/agent/transaction/request_attributes_test.rb +76 -0
  62. data/test/new_relic/agent/transaction_event_aggregator_test.rb +12 -1
  63. data/test/new_relic/agent/transaction_test.rb +60 -11
  64. data/test/new_relic/data_container_tests.rb +17 -6
  65. data/test/new_relic/fake_collector.rb +16 -21
  66. data/test/new_relic/marshalling_test_cases.rb +1 -0
  67. data/test/new_relic/noticed_error_test.rb +59 -0
  68. data/test/new_relic/rack/agent_hooks_test.rb +1 -1
  69. data/test/new_relic/rack/error_collector_test.rb +7 -5
  70. data/test/performance/suites/error_collector.rb +28 -0
  71. data/test/performance/suites/marshalling.rb +0 -8
  72. metadata +14 -3
  73. data/lib/new_relic/agent/new_relic_service/pruby_marshaller.rb +0 -56
@@ -65,6 +65,7 @@ module MarshallingTestCases
65
65
  "timestamp" => t0.to_f,
66
66
  "name" => "TestTransaction/do_it",
67
67
  "duration" => 0.0,
68
+ "error" => false
68
69
  },
69
70
  {},
70
71
  {}
@@ -126,6 +126,14 @@ class NewRelic::Agent::NoticedErrorTest < Minitest::Test
126
126
  end
127
127
  end
128
128
 
129
+ def test_long_message
130
+ #yes, times 500. it's a 5000 byte string. Assuming strings are
131
+ #still 1 byte / char.
132
+ err = create_error(StandardError.new("1234567890" * 500))
133
+ assert_equal 4096, err.message.length
134
+ assert_equal ('1234567890' * 500)[0..4095], err.message
135
+ end
136
+
129
137
  def test_permits_messages_from_whitelisted_exceptions_in_high_security_mode
130
138
  with_config(:'strip_exception_messages.whitelist' => 'NewRelic::TestHelpers::Exceptions::TestError') do
131
139
  e = TestError.new('whitelisted test exception')
@@ -185,6 +193,57 @@ class NewRelic::Agent::NoticedErrorTest < Minitest::Test
185
193
  end
186
194
  end
187
195
 
196
+ def test_custom_attributes_sent_when_enabled
197
+ with_config :'error_collector.attributes.enabled' => true do
198
+ attributes = NewRelic::Agent::Transaction::Attributes.new(NewRelic::Agent.instance.attribute_filter)
199
+ custom_attrs = {"name" => "Ron Burgundy", "channel" => 4}
200
+ attributes.merge_custom_attributes(custom_attrs)
201
+
202
+ error = NewRelic::NoticedError.new(@path, Exception.new("O_o"))
203
+ error.attributes = attributes
204
+
205
+ assert_equal custom_attrs, error.custom_attributes
206
+ end
207
+ end
208
+
209
+ def test_custom_attributes_not_sent_when_disabled
210
+ with_config :'error_collector.attributes.enabled' => false do
211
+ attributes = NewRelic::Agent::Transaction::Attributes.new(NewRelic::Agent.instance.attribute_filter)
212
+ custom_attrs = {"name" => "Ron Burgundy", "channel" => 4}
213
+ attributes.merge_custom_attributes(custom_attrs)
214
+
215
+ error = NewRelic::NoticedError.new(@path, Exception.new("O_o"))
216
+ error.attributes = attributes
217
+
218
+ assert_equal({}, error.custom_attributes)
219
+ end
220
+ end
221
+
222
+ def test_agent_attributes_sent_when_enabled
223
+ with_config :'error_collector.attributes.enabled' => true do
224
+ attributes = NewRelic::Agent::Transaction::Attributes.new(NewRelic::Agent.instance.attribute_filter)
225
+ attributes.add_agent_attribute :"request.headers.referer", "http://blog.site/home", NewRelic::Agent::AttributeFilter::DST_ALL
226
+
227
+ error = NewRelic::NoticedError.new(@path, Exception.new("O_o"))
228
+ error.attributes = attributes
229
+
230
+ expected = {:"request.headers.referer" => "http://blog.site/home"}
231
+ assert_equal expected, error.agent_attributes
232
+ end
233
+ end
234
+
235
+ def test_agent_attributes_not_sent_when_disabled
236
+ with_config :'error_collector.attributes.enabled' => false do
237
+ attributes = NewRelic::Agent::Transaction::Attributes.new(NewRelic::Agent.instance.attribute_filter)
238
+ attributes.add_agent_attribute :"request.headers.referer", "http://blog.site/home", NewRelic::Agent::AttributeFilter::DST_ALL
239
+
240
+ error = NewRelic::NoticedError.new(@path, Exception.new("O_o"))
241
+ error.attributes = attributes
242
+
243
+ assert_equal({}, error.agent_attributes)
244
+ end
245
+ end
246
+
188
247
  def create_error(exception = StandardError.new)
189
248
  noticed_error = NewRelic::NoticedError.new(@path, exception, @time)
190
249
  noticed_error.attributes = @attributes
@@ -23,7 +23,7 @@ class AgentHooksTest < Minitest::Test
23
23
  end
24
24
 
25
25
  def test_after_call
26
- result = [stub, stub, stub]
26
+ result = [stub, {}, stub]
27
27
  @app.stubs(:call).returns(result)
28
28
 
29
29
  NewRelic::Agent.instance.events.expects(:notify).with(:start_transaction)
@@ -24,7 +24,7 @@ module NewRelic::Rack
24
24
  def setup
25
25
  NewRelic::Agent.reset_config
26
26
  NewRelic::Agent.manual_start
27
- NewRelic::Agent.instance.error_collector.reset!
27
+ NewRelic::Agent.instance.error_collector.drop_buffered_data
28
28
 
29
29
  # sanity checks
30
30
  assert NewRelic::Agent.instance.error_collector.enabled?
@@ -49,7 +49,8 @@ module NewRelic::Rack
49
49
  end
50
50
  end
51
51
 
52
- assert(NewRelic::Agent.instance.error_collector.errors.empty?,
52
+ errors = harvest_error_traces!
53
+ assert(errors.empty?,
53
54
  'noticed an error that should have been ignored')
54
55
  end
55
56
 
@@ -63,14 +64,15 @@ module NewRelic::Rack
63
64
  assert_raises RuntimeError do
64
65
  get '/foo/bar?q=12'
65
66
  end
67
+ error = last_error
66
68
 
67
- assert_equal('unhandled error', last_error.message)
68
- assert_equal('/foo/bar', last_error.request_uri)
69
+ assert_equal('unhandled error', error.message)
70
+ assert_equal('/foo/bar', error.request_uri)
69
71
  end
70
72
  end
71
73
 
72
74
  def last_error
73
- NewRelic::Agent.instance.error_collector.errors[0]
75
+ harvest_error_traces!.last
74
76
  end
75
77
  end
76
78
  end
@@ -0,0 +1,28 @@
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
+ class ErrorCollectorTests < Performance::TestCase
6
+ def setup
7
+ @txn_name = "Controller/blogs/index".freeze
8
+ @err_msg = "Sorry!".freeze
9
+ end
10
+
11
+ def test_notice_error
12
+ measure do
13
+ in_transaction :name => @txn_name do
14
+ NewRelic::Agent.notice_error StandardError.new @err_msg
15
+ end
16
+ end
17
+ end
18
+
19
+ def test_notice_error_with_custom_attributes
20
+ opts = {:custom_params => {:name => "Wes Mantooth", :channel => 9}}
21
+
22
+ measure do
23
+ in_transaction :name => @txn_name do
24
+ NewRelic::Agent.notice_error StandardError.new(@err_msg), opts
25
+ end
26
+ end
27
+ end
28
+ end
@@ -56,14 +56,6 @@ class Marshalling < Performance::TestCase
56
56
  end
57
57
  end
58
58
 
59
- def test_basic_marshalling_pruby
60
- marshaller = NewRelic::Agent::NewRelicService::PrubyMarshaller.new
61
- measure do
62
- marshaller.dump(@payload)
63
- marshaller.dump(@tt_payload)
64
- end
65
- end
66
-
67
59
  # Skips Strings used as Hash keys, since they are frozen
68
60
  def each_string(object, &blk)
69
61
  case object
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: newrelic_rpm
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.13.2.302
4
+ version: 3.14.0.305
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Krajcar
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-09-23 00:00:00.000000000 Z
14
+ date: 2015-10-14 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rake
@@ -267,6 +267,7 @@ files:
267
267
  - lib/new_relic/agent/deprecator.rb
268
268
  - lib/new_relic/agent/encoding_normalizer.rb
269
269
  - lib/new_relic/agent/error_collector.rb
270
+ - lib/new_relic/agent/error_event_aggregator.rb
270
271
  - lib/new_relic/agent/error_trace_aggregator.rb
271
272
  - lib/new_relic/agent/event_buffer.rb
272
273
  - lib/new_relic/agent/event_listener.rb
@@ -348,10 +349,10 @@ files:
348
349
  - lib/new_relic/agent/new_relic_service/encoders.rb
349
350
  - lib/new_relic/agent/new_relic_service/json_marshaller.rb
350
351
  - lib/new_relic/agent/new_relic_service/marshaller.rb
351
- - lib/new_relic/agent/new_relic_service/pruby_marshaller.rb
352
352
  - lib/new_relic/agent/null_logger.rb
353
353
  - lib/new_relic/agent/obfuscator.rb
354
354
  - lib/new_relic/agent/parameter_filtering.rb
355
+ - lib/new_relic/agent/payload_metric_mapping.rb
355
356
  - lib/new_relic/agent/pipe_channel_manager.rb
356
357
  - lib/new_relic/agent/pipe_service.rb
357
358
  - lib/new_relic/agent/rules_engine.rb
@@ -385,6 +386,7 @@ files:
385
386
  - lib/new_relic/agent/transaction.rb
386
387
  - lib/new_relic/agent/transaction/attributes.rb
387
388
  - lib/new_relic/agent/transaction/developer_mode_sample_buffer.rb
389
+ - lib/new_relic/agent/transaction/request_attributes.rb
388
390
  - lib/new_relic/agent/transaction/slowest_sample_buffer.rb
389
391
  - lib/new_relic/agent/transaction/synthetics_sample_buffer.rb
390
392
  - lib/new_relic/agent/transaction/trace.rb
@@ -757,6 +759,7 @@ files:
757
759
  - test/multiverse/suites/agent_only/custom_analytics_events_test.rb
758
760
  - test/multiverse/suites/agent_only/custom_queue_time_test.rb
759
761
  - test/multiverse/suites/agent_only/encoding_handling_test.rb
762
+ - test/multiverse/suites/agent_only/error_events_test.rb
760
763
  - test/multiverse/suites/agent_only/exclusive_time_test.rb
761
764
  - test/multiverse/suites/agent_only/harvest_timestamps_test.rb
762
765
  - test/multiverse/suites/agent_only/http_response_code_test.rb
@@ -853,6 +856,9 @@ files:
853
856
  - test/multiverse/suites/net_http/Envfile
854
857
  - test/multiverse/suites/net_http/config/newrelic.yml
855
858
  - test/multiverse/suites/net_http/net_http_test.rb
859
+ - test/multiverse/suites/no_json/Envfile
860
+ - test/multiverse/suites/no_json/config/newrelic.yml
861
+ - test/multiverse/suites/no_json/marshal_config_test.rb
856
862
  - test/multiverse/suites/padrino/Envfile
857
863
  - test/multiverse/suites/padrino/config/newrelic.yml
858
864
  - test/multiverse/suites/padrino/padrino_test.rb
@@ -866,6 +872,7 @@ files:
866
872
  - test/multiverse/suites/rack/rack_env_mutation_test.rb
867
873
  - test/multiverse/suites/rack/rack_parameter_filtering_test.rb
868
874
  - test/multiverse/suites/rack/rack_unsupported_version_test.rb
875
+ - test/multiverse/suites/rack/response_content_type_test.rb
869
876
  - test/multiverse/suites/rack/url_map_test.rb
870
877
  - test/multiverse/suites/rails/Envfile
871
878
  - test/multiverse/suites/rails/action_controller_live_rum_test.rb
@@ -1005,6 +1012,7 @@ files:
1005
1012
  - test/new_relic/agent/deprecator_test.rb
1006
1013
  - test/new_relic/agent/encoding_normalizer_test.rb
1007
1014
  - test/new_relic/agent/error_collector_test.rb
1015
+ - test/new_relic/agent/error_event_aggregator_test.rb
1008
1016
  - test/new_relic/agent/error_trace_aggregator_test.rb
1009
1017
  - test/new_relic/agent/event_buffer_test_cases.rb
1010
1018
  - test/new_relic/agent/event_listener_test.rb
@@ -1043,6 +1051,7 @@ files:
1043
1051
  - test/new_relic/agent/new_relic_service_test.rb
1044
1052
  - test/new_relic/agent/obfuscator_test.rb
1045
1053
  - test/new_relic/agent/parameter_filtering_test.rb
1054
+ - test/new_relic/agent/payload_metric_mapping_test.rb
1046
1055
  - test/new_relic/agent/pipe_channel_manager_test.rb
1047
1056
  - test/new_relic/agent/pipe_service_test.rb
1048
1057
  - test/new_relic/agent/rpm_agent_test.rb
@@ -1072,6 +1081,7 @@ files:
1072
1081
  - test/new_relic/agent/traced_method_stack_test.rb
1073
1082
  - test/new_relic/agent/transaction/attributes_test.rb
1074
1083
  - test/new_relic/agent/transaction/developer_mode_sample_buffer_test.rb
1084
+ - test/new_relic/agent/transaction/request_attributes_test.rb
1075
1085
  - test/new_relic/agent/transaction/slowest_sample_buffer_test.rb
1076
1086
  - test/new_relic/agent/transaction/synthetics_sample_buffer_test.rb
1077
1087
  - test/new_relic/agent/transaction/trace_node_test.rb
@@ -1165,6 +1175,7 @@ files:
1165
1175
  - test/performance/suites/active_record.rb
1166
1176
  - test/performance/suites/agent_attributes.rb
1167
1177
  - test/performance/suites/config.rb
1178
+ - test/performance/suites/error_collector.rb
1168
1179
  - test/performance/suites/marshalling.rb
1169
1180
  - test/performance/suites/queue_time.rb
1170
1181
  - test/performance/suites/rack_middleware.rb
@@ -1,56 +0,0 @@
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 'new_relic/agent/new_relic_service/marshaller'
6
-
7
- module NewRelic
8
- module Agent
9
- class NewRelicService
10
- # Primitive Ruby Object Notation which complies JSON format data strutures
11
- class PrubyMarshaller < Marshaller
12
- def initialize
13
- ::NewRelic::Agent.logger.debug 'Using Pruby marshaller'
14
- warn_for_pruby_deprecation
15
- end
16
-
17
- def warn_for_pruby_deprecation
18
- if RUBY_VERSION < "1.9" && !defined?(::JSON)
19
- NewRelic::Agent.logger.warn("Upcoming versions of the Ruby agent running on Ruby 1.8.7 will require the 'json' gem. To avoid interuption in reporting, please update your Gemfile. See http://docs.newrelic.com/docs/ruby/ruby-1.8.7-support for more information.")
20
- end
21
- end
22
-
23
- def dump(ruby, opts={})
24
- NewRelic::LanguageSupport.with_cautious_gc do
25
- Marshal.dump(prepare(ruby, opts))
26
- end
27
- rescue => e
28
- ::NewRelic::Agent.logger.debug("#{e.class.name} : #{e.message} when marshalling #{ruby.inspect}")
29
- raise
30
- end
31
-
32
- def load(data)
33
- if data.nil? || data.empty?
34
- ::NewRelic::Agent.logger.error "Empty pruby response from collector: '#{data.inspect}'"
35
- return nil
36
- end
37
-
38
- NewRelic::LanguageSupport.with_cautious_gc do
39
- return_value(Marshal.load(data))
40
- end
41
- rescue
42
- ::NewRelic::Agent.logger.debug "Error encountered loading collector response: #{data}"
43
- raise
44
- end
45
-
46
- def format
47
- 'pruby'
48
- end
49
-
50
- def self.is_supported?
51
- true
52
- end
53
- end
54
- end
55
- end
56
- end