newrelic_rpm 3.7.0.174.beta → 3.7.0.177

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG +27 -4
  3. data/bin/nrdebug +10 -4
  4. data/lib/new_relic/agent.rb +33 -11
  5. data/lib/new_relic/agent/agent.rb +83 -120
  6. data/lib/new_relic/agent/agent_logger.rb +28 -16
  7. data/lib/new_relic/agent/audit_logger.rb +3 -4
  8. data/lib/new_relic/agent/autostart.rb +20 -8
  9. data/lib/new_relic/agent/commands/agent_command_router.rb +26 -17
  10. data/lib/new_relic/agent/commands/thread_profiler_session.rb +2 -2
  11. data/lib/new_relic/agent/configuration/default_source.rb +146 -59
  12. data/lib/new_relic/agent/configuration/manager.rb +3 -3
  13. data/lib/new_relic/agent/cross_app_monitor.rb +15 -40
  14. data/lib/new_relic/agent/cross_app_tracing.rb +20 -12
  15. data/lib/new_relic/agent/database.rb +24 -0
  16. data/lib/new_relic/agent/error_collector.rb +6 -2
  17. data/lib/new_relic/agent/instrumentation/merb/controller.rb +3 -1
  18. data/lib/new_relic/agent/javascript_instrumentor.rb +187 -0
  19. data/lib/new_relic/agent/new_relic_service.rb +30 -22
  20. data/lib/new_relic/agent/obfuscator.rb +48 -0
  21. data/lib/new_relic/agent/request_sampler.rb +5 -13
  22. data/lib/new_relic/agent/shim_agent.rb +1 -0
  23. data/lib/new_relic/agent/sql_sampler.rb +15 -5
  24. data/lib/new_relic/agent/stats_engine/metric_stats.rb +9 -4
  25. data/lib/new_relic/agent/transaction.rb +0 -1
  26. data/lib/new_relic/agent/transaction_sampler.rb +28 -16
  27. data/lib/new_relic/agent/transaction_state.rb +9 -0
  28. data/lib/new_relic/agent/transaction_timings.rb +5 -1
  29. data/lib/new_relic/agent/worker_loop.rb +0 -10
  30. data/lib/new_relic/cli/deployments.rb +1 -1
  31. data/lib/new_relic/control/instance_methods.rb +1 -1
  32. data/lib/new_relic/helper.rb +3 -1
  33. data/lib/new_relic/rack/browser_monitoring.rb +1 -2
  34. data/lib/new_relic/transaction_sample.rb +11 -13
  35. data/lib/newrelic_rpm.rb +1 -0
  36. data/test/agent_helper.rb +20 -5
  37. data/test/environments/lib/environments/runner.rb +1 -0
  38. data/test/helpers/file_searching.rb +28 -0
  39. data/test/multiverse/lib/multiverse/suite.rb +36 -19
  40. data/test/multiverse/suites/agent_only/collector_exception_handling_test.rb +49 -0
  41. data/test/multiverse/suites/agent_only/http_response_code_test.rb +2 -2
  42. data/test/multiverse/suites/agent_only/rum_instrumentation_test.rb +4 -2
  43. data/test/multiverse/suites/agent_only/service_timeout_test.rb +1 -1
  44. data/test/multiverse/suites/agent_only/set_transaction_name_test.rb +7 -4
  45. data/test/multiverse/suites/agent_only/thread_profiling_test.rb +2 -1
  46. data/test/multiverse/suites/rails/error_tracing_test.rb +34 -4
  47. data/test/multiverse/suites/rails/ignore_test.rb +1 -1
  48. data/test/multiverse/suites/rails/request_statistics_test.rb +1 -3
  49. data/test/multiverse/suites/sequel/sequel_instrumentation_test.rb +10 -7
  50. data/test/multiverse/suites/sinatra/ignoring_test.rb +1 -1
  51. data/test/new_relic/agent/agent/start_worker_thread_test.rb +1 -1
  52. data/test/new_relic/agent/agent_logger_test.rb +108 -114
  53. data/test/new_relic/agent/agent_test.rb +139 -21
  54. data/test/new_relic/agent/audit_logger_test.rb +22 -20
  55. data/test/new_relic/agent/autostart_test.rb +3 -2
  56. data/test/new_relic/agent/commands/agent_command_router_test.rb +51 -32
  57. data/test/new_relic/agent/configuration/default_source_test.rb +8 -2
  58. data/test/new_relic/agent/configuration/manager_test.rb +5 -1
  59. data/test/new_relic/agent/configuration/orphan_configuration_test.rb +57 -0
  60. data/test/new_relic/agent/cross_app_monitor_test.rb +10 -26
  61. data/test/new_relic/agent/database_test.rb +32 -0
  62. data/test/new_relic/agent/error_collector_test.rb +33 -16
  63. data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +88 -71
  64. data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +2 -2
  65. data/test/new_relic/agent/javascript_instrumentor_test.rb +341 -0
  66. data/test/new_relic/agent/memcache_instrumentation_test.rb +91 -89
  67. data/test/new_relic/agent/method_tracer_test.rb +1 -1
  68. data/test/new_relic/agent/obfuscator_test.rb +77 -0
  69. data/test/new_relic/agent/pipe_channel_manager_test.rb +5 -5
  70. data/test/new_relic/agent/pipe_service_test.rb +1 -1
  71. data/test/new_relic/agent/request_sampler_test.rb +21 -11
  72. data/test/new_relic/agent/sql_sampler_test.rb +52 -8
  73. data/test/new_relic/agent/stats_engine/metric_stats_test.rb +6 -6
  74. data/test/new_relic/agent/stats_engine_test.rb +18 -2
  75. data/test/new_relic/agent/transaction_sampler_test.rb +98 -53
  76. data/test/new_relic/agent/transaction_state_test.rb +44 -0
  77. data/test/new_relic/agent/transaction_test.rb +1 -1
  78. data/test/new_relic/agent/transaction_timings_test.rb +15 -5
  79. data/test/new_relic/agent/worker_loop_test.rb +0 -9
  80. data/test/new_relic/agent_test.rb +9 -21
  81. data/test/new_relic/data_container_tests.rb +72 -0
  82. data/test/new_relic/fake_collector.rb +69 -20
  83. data/test/new_relic/http_client_test_cases.rb +17 -2
  84. data/test/new_relic/license_test.rb +6 -15
  85. data/test/new_relic/multiverse_helpers.rb +2 -3
  86. data/test/new_relic/rack/browser_monitoring_test.rb +15 -37
  87. data/test/new_relic/transaction_sample_test.rb +92 -62
  88. data/test/performance/suites/rum_autoinsertion.rb +0 -3
  89. data/test/rum/x_ua_meta_tag_spaces_around_equals.result.html +10 -0
  90. data/test/rum/x_ua_meta_tag_spaces_around_equals.source.html +10 -0
  91. data/test/test_helper.rb +9 -5
  92. metadata +29 -11
  93. metadata.gz.sig +0 -0
  94. data/lib/new_relic/agent/beacon_configuration.rb +0 -37
  95. data/lib/new_relic/agent/browser_monitoring.rb +0 -257
  96. data/test/new_relic/agent/beacon_configuration_test.rb +0 -44
  97. data/test/new_relic/agent/browser_monitoring_test.rb +0 -474
@@ -27,121 +27,123 @@ rescue Errno::ECONNREFUSED
27
27
  rescue Errno::ETIMEDOUT
28
28
  end
29
29
 
30
- class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
31
- include NewRelic::Agent::Instrumentation::ControllerInstrumentation
30
+ if memcached_ready
31
+ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
32
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
32
33
 
33
- def setup
34
- NewRelic::Agent.manual_start
35
- @engine = NewRelic::Agent.instance.stats_engine
34
+ def setup
35
+ NewRelic::Agent.manual_start
36
+ @engine = NewRelic::Agent.instance.stats_engine
36
37
 
37
- case MEMCACHED_CLASS.name
38
- when 'Memcached'
39
- @cache = MEMCACHED_CLASS.new('localhost', :support_cas => true)
40
- when 'Spymemcached'
41
- @cache = MEMCACHED_CLASS.new('localhost:11211')
42
- else
43
- @cache = MEMCACHED_CLASS.new('localhost')
38
+ case MEMCACHED_CLASS.name
39
+ when 'Memcached'
40
+ @cache = MEMCACHED_CLASS.new('localhost', :support_cas => true)
41
+ when 'Spymemcached'
42
+ @cache = MEMCACHED_CLASS.new('localhost:11211')
43
+ else
44
+ @cache = MEMCACHED_CLASS.new('localhost')
45
+ end
46
+ @key = 'schluessel'
47
+ @cache.set('schluessel', 1)
44
48
  end
45
- @key = 'schluessel'
46
- @cache.set('schluessel', 1)
47
- end
48
49
 
49
- def teardown
50
- if MEMCACHED_CLASS.name == 'Memcached'
51
- @cache.flush
52
- elsif MEMCACHED_CLASS.name == 'Spymemcached'
53
- @cache.flush
54
- @cache.instance_eval{ @client.shutdown }
55
- else
56
- @cache.flush_all
50
+ def teardown
51
+ if MEMCACHED_CLASS.name == 'Memcached'
52
+ @cache.flush
53
+ elsif MEMCACHED_CLASS.name == 'Spymemcached'
54
+ @cache.flush
55
+ @cache.instance_eval{ @client.shutdown }
56
+ else
57
+ @cache.flush_all
58
+ end
57
59
  end
58
- end
59
60
 
60
- def _call_test_method_in_web_transaction(method, *args)
61
- @engine.clear_stats
62
- perform_action_with_newrelic_trace(:name=>'action', :category => :controller) do
63
- @cache.send(method.to_sym, *[@key, *args])
61
+ def _call_test_method_in_web_transaction(method, *args)
62
+ @engine.clear_stats
63
+ perform_action_with_newrelic_trace(:name=>'action', :category => :controller) do
64
+ @cache.send(method.to_sym, *[@key, *args])
65
+ end
64
66
  end
65
- end
66
67
 
67
- def _call_test_method_in_background_task(method, *args)
68
- @engine.clear_stats
69
- perform_action_with_newrelic_trace(:name => 'bg_task', :category => :task) do
70
- @cache.send(method.to_sym, *[@key, *args])
68
+ def _call_test_method_in_background_task(method, *args)
69
+ @engine.clear_stats
70
+ perform_action_with_newrelic_trace(:name => 'bg_task', :category => :task) do
71
+ @cache.send(method.to_sym, *[@key, *args])
72
+ end
71
73
  end
72
- end
73
74
 
74
- def test_reads__web
75
- commands = ['get']
76
- commands << 'get_multi' unless MEMCACHED_CLASS.name == 'Spymemcached'
77
- commands.each do |method|
78
- if @cache.class.method_defined?(method)
79
- _call_test_method_in_web_transaction(method)
80
- compare_metrics ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"],
81
- @engine.metrics.select{|m| m =~ /^memcache.*/i}
75
+ def test_reads__web
76
+ commands = ['get']
77
+ commands << 'get_multi' unless MEMCACHED_CLASS.name == 'Spymemcached'
78
+ commands.each do |method|
79
+ if @cache.class.method_defined?(method)
80
+ _call_test_method_in_web_transaction(method)
81
+ compare_metrics ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"],
82
+ @engine.metrics.select{|m| m =~ /^memcache.*/i}
83
+ end
82
84
  end
83
85
  end
84
- end
85
86
 
86
- def test_writes__web
87
- %w[delete].each do |method|
88
- if @cache.class.method_defined?(method)
89
- _call_test_method_in_web_transaction(method)
90
- expected_metrics = ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"]
91
- compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
87
+ def test_writes__web
88
+ %w[delete].each do |method|
89
+ if @cache.class.method_defined?(method)
90
+ _call_test_method_in_web_transaction(method)
91
+ expected_metrics = ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"]
92
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
93
+ end
92
94
  end
93
- end
94
95
 
95
- %w[set add].each do |method|
96
- @cache.delete(@key) rescue nil
97
- if @cache.class.method_defined?(method)
98
- expected_metrics = ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"]
99
- _call_test_method_in_web_transaction(method, 'value')
100
- compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
96
+ %w[set add].each do |method|
97
+ @cache.delete(@key) rescue nil
98
+ if @cache.class.method_defined?(method)
99
+ expected_metrics = ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"]
100
+ _call_test_method_in_web_transaction(method, 'value')
101
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
102
+ end
101
103
  end
102
104
  end
103
- end
104
105
 
105
- def test_reads__background
106
- commands = ['get']
107
- commands << 'get_multi' unless MEMCACHED_CLASS.name == 'Spymemcached'
108
- commands.each do |method|
109
- if @cache.class.method_defined?(method)
110
- _call_test_method_in_background_task(method)
111
- compare_metrics ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"],
112
- @engine.metrics.select{|m| m =~ /^memcache.*/i}
106
+ def test_reads__background
107
+ commands = ['get']
108
+ commands << 'get_multi' unless MEMCACHED_CLASS.name == 'Spymemcached'
109
+ commands.each do |method|
110
+ if @cache.class.method_defined?(method)
111
+ _call_test_method_in_background_task(method)
112
+ compare_metrics ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"],
113
+ @engine.metrics.select{|m| m =~ /^memcache.*/i}
114
+ end
113
115
  end
114
116
  end
115
- end
116
117
 
117
- def test_writes__background
118
- %w[delete].each do |method|
119
- expected_metrics = ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
120
- if @cache.class.method_defined?(method)
121
- _call_test_method_in_background_task(method)
122
- compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
118
+ def test_writes__background
119
+ %w[delete].each do |method|
120
+ expected_metrics = ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
121
+ if @cache.class.method_defined?(method)
122
+ _call_test_method_in_background_task(method)
123
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
124
+ end
123
125
  end
124
- end
125
126
 
126
- %w[set add].each do |method|
127
- @cache.delete(@key) rescue nil
128
- expected_metrics = ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
129
- if @cache.class.method_defined?(method)
130
- _call_test_method_in_background_task(method, 'value')
131
- compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
127
+ %w[set add].each do |method|
128
+ @cache.delete(@key) rescue nil
129
+ expected_metrics = ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
130
+ if @cache.class.method_defined?(method)
131
+ _call_test_method_in_background_task(method, 'value')
132
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
133
+ end
132
134
  end
133
135
  end
134
- end
135
136
 
136
- def test_handles_cas
137
- expected_metrics = ["Memcache/cas", "Memcache/allOther", "Memcache/cas:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
138
- if @cache.class.method_defined?(:cas)
139
- @engine.clear_stats
140
- perform_action_with_newrelic_trace(:name => 'bg_task', :category => :task) do
141
- @cache.cas(@key) {|val| val += 2 }
137
+ def test_handles_cas
138
+ expected_metrics = ["Memcache/cas", "Memcache/allOther", "Memcache/cas:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
139
+ if @cache.class.method_defined?(:cas)
140
+ @engine.clear_stats
141
+ perform_action_with_newrelic_trace(:name => 'bg_task', :category => :task) do
142
+ @cache.cas(@key) {|val| val += 2 }
143
+ end
144
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
145
+ assert_equal 3, @cache.get(@key)
142
146
  end
143
- compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
144
- assert_equal 3, @cache.get(@key)
145
147
  end
146
148
  end
147
- end if memcached_ready
149
+ end
@@ -212,7 +212,7 @@ class NewRelic::Agent::MethodTracerTest < Test::Unit::TestCase
212
212
  assert_equal 2, stats.call_count
213
213
  stats = @stats_engine.get_stats("thrower")
214
214
  assert_equal 6, stats.call_count
215
- sample = @old_sampler.harvest
215
+ sample = @old_sampler.harvest!
216
216
  assert_not_nil sample
217
217
  end
218
218
 
@@ -0,0 +1,77 @@
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/obfuscator"
7
+
8
+ class NewRelic::Agent::ObfuscatorTest < Test::Unit::TestCase
9
+
10
+ OBFUSCATION_KEY = (1..40).to_a.pack('c*')
11
+ RUM_KEY_LENGTH = 13
12
+
13
+ def setup
14
+ @config = { :license_key => OBFUSCATION_KEY }
15
+ NewRelic::Agent.config.apply_config(@config)
16
+ end
17
+
18
+ def teardown
19
+ NewRelic::Agent.config.remove_config(@config)
20
+ @obfuscator = nil
21
+ end
22
+
23
+ def obfuscator(length=nil)
24
+ @obfuscator ||= NewRelic::Agent::Obfuscator.new(OBFUSCATION_KEY, length)
25
+ end
26
+
27
+ def test_obfuscate_basic
28
+ assert_encoded(RUM_KEY_LENGTH,
29
+ 'a happy piece of small text',
30
+ 'YCJrZXV2fih5Y25vaCFtZSR2a2ZkZSp/aXV1')
31
+ end
32
+
33
+ def test_obfuscate_long_string
34
+ assert_encoded(RUM_KEY_LENGTH,
35
+ 'a happy piece of small text' * 5,
36
+ 'YCJrZXV2fih5Y25vaCFtZSR2a2ZkZSp/aXV1YyNsZHZ3cSl6YmluZCJsYiV1amllZit4aHl2YiRtZ3d4cCp7ZWhiZyNrYyZ0ZWhmZyx5ZHp3ZSVuZnh5cyt8ZGRhZiRqYCd7ZGtnYC11Z3twZCZvaXl6cix9aGdgYSVpYSh6Z2pgYSF2Znxx')
37
+ end
38
+
39
+ def test_obfuscate_utf8
40
+ assert_encoded(RUM_KEY_LENGTH,
41
+ "foooooééoooo - blah",
42
+ "Z21sa2ppxKHKo2RjYm4iLiRnamZg")
43
+ end
44
+
45
+
46
+ def test_decoding_blank
47
+ obfuscator = NewRelic::Agent::Obfuscator.new('query')
48
+ assert_equal "", obfuscator.deobfuscate("")
49
+ end
50
+
51
+ def test_decoding_empty_key
52
+ obfuscator = NewRelic::Agent::Obfuscator.new("")
53
+ assert_equal "querty", obfuscator.encode('querty')
54
+ end
55
+
56
+ def test_encode_with_nil_uses_empty_key
57
+ obfuscator = NewRelic::Agent::Obfuscator.new(nil)
58
+ assert_equal "querty", obfuscator.encode('querty')
59
+ end
60
+
61
+ def test_encoding_functions_can_roundtrip_utf8_text
62
+ str = 'Анастасі́я Олексі́ївна Каме́нських'
63
+ obfuscator = NewRelic::Agent::Obfuscator.new('potap')
64
+ encoded = obfuscator.obfuscate(str)
65
+ decoded = obfuscator.deobfuscate(encoded)
66
+ decoded.force_encoding( 'utf-8' ) if decoded.respond_to?( :force_encoding )
67
+ assert_equal str, decoded
68
+ end
69
+
70
+ def assert_encoded(key_length, text, expected)
71
+ output = obfuscator(key_length).obfuscate(text)
72
+ assert_equal(expected, output)
73
+
74
+ unoutput = obfuscator.obfuscate(Base64.decode64(output))
75
+ assert_equal Base64.encode64(text).gsub("\n", ''), unoutput
76
+ end
77
+ end
@@ -11,7 +11,7 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
11
11
 
12
12
  def setup
13
13
  @test_config = { :developer_mode => true }
14
- NewRelic::Agent.agent.reset_stats
14
+ NewRelic::Agent.agent.drop_buffered_data
15
15
  NewRelic::Agent.config.apply_config(@test_config)
16
16
  NewRelic::Agent::PipeChannelManager.listener.close_all_pipes
17
17
  NewRelic::Agent.manual_start
@@ -47,13 +47,13 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
47
47
  NewRelic::Agent.after_fork
48
48
  new_engine = NewRelic::Agent::StatsEngine.new
49
49
  new_engine.get_stats_no_scope(metric).record_data_point(2.0)
50
- listener.pipes[666].write(:stats => new_engine.harvest)
50
+ listener.pipes[666].write(:stats => new_engine.harvest!)
51
51
  end
52
52
  Process.wait(pid)
53
53
  listener.stop
54
54
 
55
55
  assert_equal(3.0, engine.lookup_stats(metric).total_call_time)
56
- engine.reset_stats
56
+ engine.reset!
57
57
  end
58
58
 
59
59
  def test_listener_merges_transaction_traces
@@ -66,7 +66,7 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
66
66
  NewRelic::Agent.after_fork
67
67
  with_config(:'transaction_tracer.transaction_threshold' => 0.0) do
68
68
  sample = run_sample_trace_on(sampler)
69
- listener.pipes[667].write(:transaction_traces => sampler.harvest)
69
+ listener.pipes[667].write(:transaction_traces => sampler.harvest!)
70
70
  end
71
71
  end
72
72
  Process.wait(pid)
@@ -93,7 +93,7 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
93
93
  new_sampler.notice_error(Exception.new("new message"), :uri => '/myurl/',
94
94
  :metric => 'path', :referer => 'test_referer',
95
95
  :request_params => {:x => 'y'})
96
- listener.pipes[668].write(:error_traces => new_sampler.harvest_errors)
96
+ listener.pipes[668].write(:error_traces => new_sampler.harvest!)
97
97
  end
98
98
  Process.wait(pid)
99
99
  listener.stop
@@ -102,7 +102,7 @@ class PipeServiceTest < Test::Unit::TestCase
102
102
  def generate_metric_data(metric_name, data=1.0)
103
103
  engine = NewRelic::Agent::StatsEngine.new
104
104
  engine.get_stats_no_scope(metric_name).record_data_point(data)
105
- engine.harvest
105
+ engine.harvest!
106
106
  end
107
107
 
108
108
  def read_from_pipe
@@ -4,6 +4,7 @@
4
4
  # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
5
5
 
6
6
  require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
7
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','data_container_tests'))
7
8
  require 'new_relic/agent/request_sampler'
8
9
 
9
10
  class NewRelic::Agent::RequestSamplerTest < Test::Unit::TestCase
@@ -14,6 +15,22 @@ class NewRelic::Agent::RequestSamplerTest < Test::Unit::TestCase
14
15
  @sampler = NewRelic::Agent::RequestSampler.new( @event_listener )
15
16
  end
16
17
 
18
+ # Helpers for DataContainerTests
19
+
20
+ def create_container
21
+ @sampler
22
+ end
23
+
24
+ def populate_container(sampler, n)
25
+ n.times do |i|
26
+ generate_request("whatever#{i}")
27
+ end
28
+ end
29
+
30
+ include NewRelic::DataContainerTests
31
+
32
+ # Tests
33
+
17
34
  def test_samples_on_transaction_finished_event
18
35
  with_sampler_config do
19
36
  generate_request
@@ -74,18 +91,11 @@ class NewRelic::Agent::RequestSamplerTest < Test::Unit::TestCase
74
91
  end
75
92
  end
76
93
 
77
- def test_can_disable_sampling_for_analytics_transactions
78
- with_sampler_config( :'analytics_events.transactions.enabled' => false ) do
79
- generate_request
80
- assert @sampler.samples.empty?
81
- end
82
- end
83
-
84
94
  def test_harvest_returns_previous_sample_list
85
95
  with_sampler_config do
86
96
  5.times { generate_request }
87
97
 
88
- old_samples = @sampler.harvest
98
+ old_samples = @sampler.harvest!
89
99
 
90
100
  assert_equal 5, old_samples.size
91
101
  assert_equal 0, @sampler.samples.size
@@ -95,7 +105,7 @@ class NewRelic::Agent::RequestSamplerTest < Test::Unit::TestCase
95
105
  def test_merge_merges_samples_back_into_buffer
96
106
  with_sampler_config do
97
107
  5.times { generate_request }
98
- old_samples = @sampler.harvest
108
+ old_samples = @sampler.harvest!
99
109
  5.times { generate_request }
100
110
 
101
111
  @sampler.merge!(old_samples)
@@ -106,7 +116,7 @@ class NewRelic::Agent::RequestSamplerTest < Test::Unit::TestCase
106
116
  def test_merge_abides_by_max_samples_limit
107
117
  with_sampler_config(:'analytics_events.max_samples_stored' => 5) do
108
118
  4.times { generate_request }
109
- old_samples = @sampler.harvest
119
+ old_samples = @sampler.harvest!
110
120
  4.times { generate_request }
111
121
 
112
122
  @sampler.merge!(old_samples)
@@ -127,7 +137,7 @@ class NewRelic::Agent::RequestSamplerTest < Test::Unit::TestCase
127
137
  samples_before = @sampler.samples
128
138
  assert_equal 50, samples_before.size
129
139
 
130
- @sampler.harvest
140
+ @sampler.harvest!
131
141
 
132
142
  150.times { generate_request('after') }
133
143
  samples_after = @sampler.samples
@@ -3,6 +3,7 @@
3
3
  # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
4
 
5
5
  require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
6
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','data_container_tests'))
6
7
 
7
8
  class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
8
9
  def setup
@@ -14,6 +15,24 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
14
15
  NewRelic::Agent::Database.stubs(:get_connection).returns(@connection)
15
16
  end
16
17
 
18
+ # Helpers for DataContainerTests
19
+
20
+ def create_container
21
+ NewRelic::Agent::SqlSampler.new
22
+ end
23
+
24
+ def populate_container(sampler, n)
25
+ n.times do |i|
26
+ sampler.notice_first_scope_push nil
27
+ sampler.notice_sql("SELECT * FROM test#{i}", "Database/test/select", nil, 1)
28
+ sampler.notice_scope_empty('txn')
29
+ end
30
+ end
31
+
32
+ include NewRelic::DataContainerTests
33
+
34
+ # Tests
35
+
17
36
  def test_notice_first_scope_push
18
37
  assert_nil @sampler.transaction_data
19
38
  @sampler.notice_first_scope_push nil
@@ -82,7 +101,7 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
82
101
  NewRelic::Agent::SlowSql.new("select * from test2", "Database/test2/select", {}, 1.1)]
83
102
  @sampler.harvest_slow_sql data
84
103
 
85
- sql_traces = @sampler.harvest
104
+ sql_traces = @sampler.harvest!
86
105
  assert_equal 2, sql_traces.size
87
106
  end
88
107
 
@@ -96,7 +115,7 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
96
115
  end
97
116
 
98
117
  @sampler.harvest_slow_sql data
99
- result = @sampler.harvest
118
+ result = @sampler.harvest!
100
119
 
101
120
  assert_equal(10, result.size)
102
121
  assert_equal(14, result.sort{|a,b| b.max_call_time <=> a.max_call_time}.first.total_call_time)
@@ -114,7 +133,7 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
114
133
  data.sql_data.concat(queries)
115
134
  @sampler.harvest_slow_sql data
116
135
 
117
- sql_traces = @sampler.harvest
136
+ sql_traces = @sampler.harvest!
118
137
  assert_equal 2, sql_traces.size
119
138
  end
120
139
 
@@ -141,7 +160,7 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
141
160
  ]
142
161
  data.sql_data.concat(queries)
143
162
  @sampler.harvest_slow_sql data
144
- sql_traces = @sampler.harvest
163
+ sql_traces = @sampler.harvest!
145
164
  assert_equal(["header0", "header1", "header2"],
146
165
  sql_traces[0].params[:explain_plan][0].sort)
147
166
  assert_equal(["header0", "header1", "header2"],
@@ -174,7 +193,7 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
174
193
  ]
175
194
  data.sql_data.concat(queries)
176
195
  @sampler.harvest_slow_sql data
177
- sql_traces = @sampler.harvest
196
+ sql_traces = @sampler.harvest!
178
197
  assert_equal(nil, sql_traces[0].params[:explain_plan])
179
198
  end
180
199
  end
@@ -199,7 +218,7 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
199
218
  NewRelic::Agent::SlowSql.new("select * from test where foo in (1,2,3,4,5)",
200
219
  "Database/test/select", {}, 1.2)])
201
220
  @sampler.harvest_slow_sql(data)
202
- sql_traces = @sampler.harvest
221
+ sql_traces = @sampler.harvest!
203
222
 
204
223
  assert_equal('select * from test where foo = ?', sql_traces[0].sql)
205
224
  assert_equal('select * from test where foo in (?,?,?,?,?)', sql_traces[1].sql)
@@ -214,7 +233,7 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
214
233
  "Database/test/select",
215
234
  {}, 1.5, &explainer)])
216
235
  @sampler.harvest_slow_sql(data)
217
- sql_traces = @sampler.harvest
236
+ sql_traces = @sampler.harvest!
218
237
 
219
238
  assert_nothing_raised do
220
239
  Marshal.dump(sql_traces)
@@ -231,7 +250,7 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
231
250
  "Database/test/select",
232
251
  {}, 1.5)])
233
252
  @sampler.harvest_slow_sql(data)
234
- sql_traces = @sampler.harvest
253
+ sql_traces = @sampler.harvest!
235
254
 
236
255
  params = RUBY_VERSION >= '1.9.2' ? "eJyrrgUAAXUA+Q==\n" : {}
237
256
  expected = [ 'WebTransaction/Controller/c/a', '/c/a', 526336943,
@@ -267,4 +286,29 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
267
286
  assert_equal expected, trace.to_collector_array(marshaller.default_encoder)
268
287
  end
269
288
 
289
+ def test_merge_without_existing_trace
290
+ query = "select * from test"
291
+ slow_sql = NewRelic::Agent::SlowSql.new(query, "Database/test/select", {}, 1)
292
+ trace = NewRelic::Agent::SqlTrace.new(query, slow_sql, "txn_name", "uri")
293
+
294
+ @sampler.merge!([trace])
295
+ assert_equal(trace, @sampler.sql_traces[query])
296
+ end
297
+
298
+ def test_merge_with_existing_trace
299
+ query = "select * from test"
300
+
301
+ slow_sql0 = NewRelic::Agent::SlowSql.new(query, "Database/test/select", {}, 1)
302
+ slow_sql1 = NewRelic::Agent::SlowSql.new(query, "Database/test/select", {}, 2)
303
+
304
+ trace0 = NewRelic::Agent::SqlTrace.new(query, slow_sql0, "txn_name", "uri")
305
+ trace1 = NewRelic::Agent::SqlTrace.new(query, slow_sql1, "txn_name", "uri")
306
+
307
+ @sampler.merge!([trace0])
308
+ @sampler.merge!([trace1])
309
+
310
+ aggregated_trace = @sampler.sql_traces[query]
311
+ assert_equal(2, aggregated_trace.call_count)
312
+ assert_equal(3, aggregated_trace.total_call_time)
313
+ end
270
314
  end