ghazel-newrelic_rpm 3.4.0.2 → 3.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. data/.gitignore +21 -0
  2. data/.project +23 -0
  3. data/.travis.yml +9 -0
  4. data/CHANGELOG +180 -1
  5. data/GUIDELINES_FOR_CONTRIBUTING.md +73 -0
  6. data/Gemfile +16 -0
  7. data/InstallationNotes.md +15 -0
  8. data/LICENSE +1 -1
  9. data/{README.rdoc → README.md} +71 -55
  10. data/Rakefile +54 -0
  11. data/config.dot +290 -0
  12. data/config/database.yml +5 -0
  13. data/init.rb +38 -0
  14. data/lib/new_relic/agent.rb +9 -4
  15. data/lib/new_relic/agent/agent.rb +189 -230
  16. data/lib/new_relic/agent/beacon_configuration.rb +34 -48
  17. data/lib/new_relic/agent/browser_monitoring.rb +108 -61
  18. data/lib/new_relic/agent/busy_calculator.rb +12 -4
  19. data/lib/new_relic/agent/configuration.rb +49 -0
  20. data/lib/new_relic/agent/configuration/defaults.rb +89 -0
  21. data/lib/new_relic/agent/configuration/environment_source.rb +56 -0
  22. data/lib/new_relic/agent/configuration/manager.rb +116 -0
  23. data/lib/new_relic/agent/configuration/server_source.rb +27 -0
  24. data/lib/new_relic/agent/configuration/yaml_source.rb +61 -0
  25. data/lib/new_relic/agent/database.rb +37 -22
  26. data/lib/new_relic/agent/error_collector.rb +47 -43
  27. data/lib/new_relic/agent/instrumentation/active_record.rb +1 -5
  28. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +27 -6
  29. data/lib/new_relic/agent/instrumentation/data_mapper.rb +2 -10
  30. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +1 -1
  31. data/lib/new_relic/agent/instrumentation/memcache.rb +2 -2
  32. data/lib/new_relic/agent/instrumentation/metric_frame.rb +4 -14
  33. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +4 -18
  34. data/lib/new_relic/agent/instrumentation/rack.rb +1 -1
  35. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +3 -3
  36. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +2 -2
  37. data/lib/new_relic/agent/instrumentation/rails3/errors.rb +5 -1
  38. data/lib/new_relic/agent/instrumentation/resque.rb +1 -1
  39. data/lib/new_relic/agent/instrumentation/sinatra.rb +14 -10
  40. data/lib/new_relic/agent/instrumentation/unicorn_instrumentation.rb +4 -3
  41. data/lib/new_relic/agent/method_tracer.rb +5 -1
  42. data/lib/new_relic/agent/new_relic_service.rb +231 -61
  43. data/lib/new_relic/agent/pipe_channel_manager.rb +37 -23
  44. data/lib/new_relic/agent/pipe_service.rb +5 -1
  45. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +2 -5
  46. data/lib/new_relic/agent/samplers/memory_sampler.rb +2 -2
  47. data/lib/new_relic/agent/sql_sampler.rb +44 -68
  48. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +40 -24
  49. data/lib/new_relic/agent/stats_engine/metric_stats.rb +89 -14
  50. data/lib/new_relic/agent/stats_engine/samplers.rb +7 -3
  51. data/lib/new_relic/agent/stats_engine/transactions.rb +19 -11
  52. data/lib/new_relic/agent/thread.rb +27 -0
  53. data/lib/new_relic/agent/thread_profiler.rb +295 -0
  54. data/lib/new_relic/agent/transaction_info.rb +24 -4
  55. data/lib/new_relic/agent/transaction_sample_builder.rb +11 -11
  56. data/lib/new_relic/agent/transaction_sampler.rb +51 -61
  57. data/lib/new_relic/agent/worker_loop.rb +29 -15
  58. data/lib/new_relic/collection_helper.rb +1 -1
  59. data/lib/new_relic/commands/deployments.rb +19 -10
  60. data/lib/new_relic/control.rb +0 -1
  61. data/lib/new_relic/control/class_methods.rb +2 -3
  62. data/lib/new_relic/control/frameworks/rails.rb +24 -18
  63. data/lib/new_relic/control/frameworks/rails3.rb +18 -1
  64. data/lib/new_relic/control/frameworks/ruby.rb +2 -2
  65. data/lib/new_relic/control/instance_methods.rb +36 -53
  66. data/lib/new_relic/control/logging_methods.rb +5 -23
  67. data/lib/new_relic/control/server_methods.rb +11 -13
  68. data/lib/new_relic/delayed_job_injection.rb +1 -1
  69. data/lib/new_relic/helper.rb +13 -0
  70. data/lib/new_relic/language_support.rb +19 -22
  71. data/lib/new_relic/local_environment.rb +2 -3
  72. data/lib/new_relic/metric_data.rb +10 -2
  73. data/lib/new_relic/metric_spec.rb +6 -2
  74. data/lib/new_relic/noticed_error.rb +24 -9
  75. data/lib/new_relic/rack.rb +4 -0
  76. data/lib/new_relic/rack/browser_monitoring.rb +28 -10
  77. data/lib/new_relic/rack/developer_mode.rb +3 -0
  78. data/lib/new_relic/rack/error_collector.rb +56 -0
  79. data/lib/new_relic/transaction_sample.rb +23 -13
  80. data/lib/new_relic/transaction_sample/segment.rb +13 -15
  81. data/lib/new_relic/version.rb +3 -3
  82. data/lib/tasks/tests.rake +8 -8
  83. data/newrelic.yml +15 -32
  84. data/newrelic_rpm.gemspec +158 -38
  85. data/newrelic_rpm.gemspec.erb +55 -0
  86. data/test/config/newrelic.yml +3 -2
  87. data/test/intentional_fail.rb +10 -0
  88. data/test/multiverse/.gitignore +10 -0
  89. data/test/multiverse/README.md +90 -0
  90. data/test/multiverse/Rakefile +17 -0
  91. data/test/multiverse/lib/multiverse/color.rb +13 -0
  92. data/test/multiverse/lib/multiverse/envfile.rb +66 -0
  93. data/test/multiverse/lib/multiverse/environment.rb +16 -0
  94. data/test/multiverse/lib/multiverse/output_collector.rb +29 -0
  95. data/test/multiverse/lib/multiverse/runner.rb +44 -0
  96. data/test/multiverse/lib/multiverse/suite.rb +162 -0
  97. data/test/multiverse/script/run_one +3 -0
  98. data/test/multiverse/script/runner +9 -0
  99. data/test/multiverse/suites/active_record/Envfile +13 -0
  100. data/test/multiverse/suites/active_record/ar_method_aliasing.rb +94 -0
  101. data/test/multiverse/suites/active_record/config/newrelic.yml +22 -0
  102. data/test/multiverse/suites/active_record/encoding_test.rb +26 -0
  103. data/test/multiverse/suites/agent_only/Envfile +3 -0
  104. data/test/multiverse/suites/agent_only/config/newrelic.yml +22 -0
  105. data/test/multiverse/suites/agent_only/http_response_code_test.rb +53 -0
  106. data/test/multiverse/suites/agent_only/marshaling_test.rb +109 -0
  107. data/test/multiverse/suites/agent_only/method_visibility_test.rb +98 -0
  108. data/test/multiverse/suites/agent_only/pipe_manager_test.rb +33 -0
  109. data/test/multiverse/suites/agent_only/service_timeout_test.rb +29 -0
  110. data/test/multiverse/suites/agent_only/test_trace_method_with_punctuation.rb +30 -0
  111. data/test/multiverse/suites/agent_only/test_trace_transaction_with_punctuation.rb +32 -0
  112. data/test/multiverse/suites/agent_only/thread_profiling_test.rb +80 -0
  113. data/test/multiverse/suites/datamapper/Envfile +8 -0
  114. data/test/multiverse/suites/datamapper/config/newrelic.yml +22 -0
  115. data/test/multiverse/suites/datamapper/encoding_test.rb +36 -0
  116. data/test/multiverse/suites/monitor_mode_false/Envfile +2 -0
  117. data/test/multiverse/suites/monitor_mode_false/config/newrelic.yml +25 -0
  118. data/test/multiverse/suites/monitor_mode_false/no_dns_resolv.rb +29 -0
  119. data/test/multiverse/suites/no_load/Envfile +2 -0
  120. data/test/multiverse/suites/no_load/config/newrelic.yml +23 -0
  121. data/test/multiverse/suites/no_load/start_up_test.rb +14 -0
  122. data/test/multiverse/suites/rails_3_error_tracing/Envfile +15 -0
  123. data/test/multiverse/suites/rails_3_error_tracing/config/newrelic.yml +165 -0
  124. data/test/multiverse/suites/rails_3_error_tracing/error_tracing_test.rb +236 -0
  125. data/test/multiverse/suites/rails_3_gc/Envfile +8 -0
  126. data/test/multiverse/suites/rails_3_gc/config/newrelic.yml +167 -0
  127. data/test/multiverse/suites/rails_3_gc/instrumentation_test.rb +92 -0
  128. data/test/multiverse/suites/rails_3_queue_time/Envfile +15 -0
  129. data/test/multiverse/suites/rails_3_queue_time/config/newrelic.yml +165 -0
  130. data/test/multiverse/suites/rails_3_queue_time/queue_time_test.rb +75 -0
  131. data/test/multiverse/suites/rails_3_views/.gitignore +3 -0
  132. data/test/multiverse/suites/rails_3_views/Envfile +16 -0
  133. data/test/multiverse/suites/rails_3_views/app/views/foos/_foo.html.haml +1 -0
  134. data/test/multiverse/suites/rails_3_views/app/views/test/_a_partial.html.erb +1 -0
  135. data/test/multiverse/suites/rails_3_views/app/views/test/_mid_partial.html.erb +1 -0
  136. data/test/multiverse/suites/rails_3_views/app/views/test/_top_partial.html.erb +3 -0
  137. data/test/multiverse/suites/rails_3_views/app/views/test/deep_partial.html.erb +3 -0
  138. data/test/multiverse/suites/rails_3_views/app/views/test/haml_view.html.haml +6 -0
  139. data/test/multiverse/suites/rails_3_views/app/views/test/index.html.erb +4 -0
  140. data/test/multiverse/suites/rails_3_views/config/newrelic.yml +164 -0
  141. data/test/multiverse/suites/rails_3_views/view_instrumentation_test.rb +245 -0
  142. data/test/multiverse/suites/resque/Envfile +21 -0
  143. data/test/multiverse/suites/resque/config/newrelic.yml +22 -0
  144. data/test/multiverse/suites/resque/dump.rdb +0 -0
  145. data/test/multiverse/suites/resque/instrumentation_test.rb +73 -0
  146. data/test/multiverse/suites/rum_auto_instrumentation/Envfile +4 -0
  147. data/test/multiverse/suites/rum_auto_instrumentation/config/newrelic.yml +24 -0
  148. data/test/multiverse/suites/rum_auto_instrumentation/problem_response.html +422 -0
  149. data/test/multiverse/suites/rum_auto_instrumentation/responses/worst_case_small.html +5000 -0
  150. data/test/multiverse/suites/rum_auto_instrumentation/sanity_test.rb +115 -0
  151. data/test/multiverse/suites/sinatra/Envfile +13 -0
  152. data/test/multiverse/suites/sinatra/config/newrelic.yml +24 -0
  153. data/test/multiverse/suites/sinatra/sinatra_metric_explosion_test.rb +76 -0
  154. data/test/multiverse/suites/sinatra/sinatra_routes_test.rb +46 -0
  155. data/test/multiverse/test/multiverse_test.rb +55 -0
  156. data/test/multiverse/test/suite_examples/one/a/Envfile +3 -0
  157. data/test/multiverse/test/suite_examples/one/a/a_test.rb +11 -0
  158. data/test/multiverse/test/suite_examples/one/a/config/newrelic.yml +24 -0
  159. data/test/multiverse/test/suite_examples/one/b/Envfile +3 -0
  160. data/test/multiverse/test/suite_examples/one/b/b_test.rb +11 -0
  161. data/test/multiverse/test/suite_examples/one/b/config/newrelic.yml +24 -0
  162. data/test/multiverse/test/suite_examples/three/a/Envfile +2 -0
  163. data/test/multiverse/test/suite_examples/three/a/fail_test.rb +6 -0
  164. data/test/multiverse/test/suite_examples/three/b/Envfile +2 -0
  165. data/test/multiverse/test/suite_examples/three/b/win_test.rb +6 -0
  166. data/test/multiverse/test/suite_examples/two/a/Envfile +1 -0
  167. data/test/multiverse/test/suite_examples/two/a/fail_test.rb +6 -0
  168. data/test/new_relic/agent/agent/connect_test.rb +134 -164
  169. data/test/new_relic/agent/agent/start_test.rb +111 -81
  170. data/test/new_relic/agent/agent/start_worker_thread_test.rb +6 -33
  171. data/test/new_relic/agent/agent_test.rb +88 -9
  172. data/test/new_relic/agent/agent_test_controller.rb +1 -1
  173. data/test/new_relic/agent/agent_test_controller_test.rb +42 -10
  174. data/test/new_relic/agent/beacon_configuration_test.rb +63 -67
  175. data/test/new_relic/agent/browser_monitoring_test.rb +150 -79
  176. data/test/new_relic/agent/configuration/environment_source_test.rb +74 -0
  177. data/test/new_relic/agent/configuration/manager_test.rb +149 -0
  178. data/test/new_relic/agent/configuration/server_source_test.rb +45 -0
  179. data/test/new_relic/agent/configuration/yaml_source_test.rb +56 -0
  180. data/test/new_relic/agent/error_collector/notice_error_test.rb +63 -50
  181. data/test/new_relic/agent/error_collector_test.rb +22 -12
  182. data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +21 -11
  183. data/test/new_relic/agent/instrumentation/metric_frame_test.rb +6 -0
  184. data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +2 -2
  185. data/test/new_relic/agent/method_tracer/class_methods/add_method_tracer_test.rb +5 -5
  186. data/test/new_relic/agent/method_tracer_test.rb +6 -6
  187. data/test/new_relic/agent/mock_scope_listener.rb +3 -0
  188. data/test/new_relic/agent/new_relic_service_test.rb +208 -23
  189. data/test/new_relic/agent/pipe_channel_manager_test.rb +34 -17
  190. data/test/new_relic/agent/rpm_agent_test.rb +27 -23
  191. data/test/new_relic/agent/sql_sampler_test.rb +81 -56
  192. data/test/new_relic/agent/stats_engine/metric_stats/harvest_test.rb +3 -20
  193. data/test/new_relic/agent/stats_engine/metric_stats_test.rb +12 -1
  194. data/test/new_relic/agent/stats_engine_test.rb +17 -8
  195. data/test/new_relic/agent/thread_profiler_test.rb +536 -0
  196. data/test/new_relic/agent/thread_test.rb +76 -0
  197. data/test/new_relic/agent/threaded_test.rb +65 -0
  198. data/test/new_relic/agent/transaction_info_test.rb +45 -4
  199. data/test/new_relic/agent/transaction_sample_builder_test.rb +8 -6
  200. data/test/new_relic/agent/transaction_sampler_test.rb +193 -204
  201. data/test/new_relic/agent/worker_loop_test.rb +20 -0
  202. data/test/new_relic/agent_test.rb +69 -41
  203. data/test/new_relic/collection_helper_test.rb +7 -8
  204. data/test/new_relic/command/deployments_test.rb +18 -2
  205. data/test/new_relic/control/frameworks/rails_test.rb +26 -0
  206. data/test/new_relic/control/logging_methods_test.rb +78 -52
  207. data/test/new_relic/control_test.rb +91 -129
  208. data/test/new_relic/fake_collector.rb +103 -31
  209. data/test/new_relic/fake_service.rb +8 -2
  210. data/test/new_relic/load_test.rb +13 -0
  211. data/test/new_relic/local_environment_test.rb +7 -10
  212. data/test/new_relic/metric_data_test.rb +45 -16
  213. data/test/new_relic/noticed_error_test.rb +14 -0
  214. data/test/new_relic/rack/browser_monitoring_test.rb +15 -9
  215. data/test/new_relic/rack/developer_mode_test.rb +13 -7
  216. data/test/new_relic/rack/error_collector_test.rb +74 -0
  217. data/test/new_relic/transaction_sample/segment_test.rb +23 -4
  218. data/test/new_relic/transaction_sample_test.rb +47 -2
  219. data/test/script/build_test_gem.sh +9 -3
  220. data/test/script/ci.sh +48 -21
  221. data/test/script/ci_multiverse_runner.sh +11 -11
  222. data/test/test_helper.rb +37 -18
  223. data/ui/helpers/developer_mode_helper.rb +21 -11
  224. data/ui/views/layouts/newrelic_default.rhtml +1 -0
  225. data/ui/views/newrelic/show_sample.rhtml +1 -1
  226. data/ui/views/newrelic/threads.rhtml +2 -10
  227. data/vendor/gems/metric_parser-0.1.0.pre1/.specification +116 -0
  228. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_init.rb +7 -0
  229. metadata +132 -58
  230. data/lib/new_relic/control/configuration.rb +0 -206
  231. data/test/new_relic/control/configuration_test.rb +0 -77
@@ -7,13 +7,15 @@ module NewRelic
7
7
  def initialize
8
8
  @agent_data = []
9
9
  @supported_methods = [ :connect, :metric_data, :transaction_sample_data,
10
- :error_data, :sql_trace_data, :shutdown ]
10
+ :error_data, :sql_trace_data, :profile_data,
11
+ :get_agent_commands, :shutdown ]
11
12
  @collector = NewRelic::Control::Server.new(:name => 'fakehost', :port => 0)
12
13
  @id_counter = 0
13
14
  @base_expectations = {
14
15
  'get_redirect_host' => 'localhost',
15
16
  'connect' => { 'agent_run_id' => agent_run_id },
16
- 'metric_data' => { 'Some/Metric/Spec' => 1 },
17
+ 'get_agent_commands' => [],
18
+ 'metric_data' => [[{ 'name' => 'Some/Metric/Spec' }, 1]],
17
19
  'sql_trace_data' => nil,
18
20
  'transaction_sample_data' => nil,
19
21
  'error_data' => nil,
@@ -31,6 +33,10 @@ module NewRelic
31
33
  @id_counter = 0
32
34
  @agent_data = []
33
35
  end
36
+
37
+ def stub_service(method, value)
38
+ @mock[method.to_s] = value
39
+ end
34
40
 
35
41
  def method_missing(method, *args)
36
42
  if @supported_methods.include?(method)
@@ -0,0 +1,13 @@
1
+ # require File.expand_path(File.join(File.dirname(__FILE__),'..','test_helper'))
2
+ require 'test/unit'
3
+ require 'resolv'
4
+ require 'mocha'
5
+
6
+ class LoadTest < Test::Unit::TestCase
7
+ def test_loading_agent_when_disabled_does_not_resolv_addresses
8
+ ::Resolv.expects(:getaddress).never
9
+ ::IPSocket.expects(:getaddress).never
10
+
11
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','test_helper'))
12
+ end
13
+ end
@@ -28,25 +28,22 @@ class NewRelic::LocalEnvironmentTest < Test::Unit::TestCase
28
28
 
29
29
  def test_passenger
30
30
  class << self
31
- module ::Passenger
32
- const_set "AbstractServer", 0
31
+ module ::PhusionPassenger
33
32
  end
34
33
  end
35
34
  e = NewRelic::LocalEnvironment.new
36
35
  assert_equal :passenger, e.environment
37
36
  assert_nil e.dispatcher_instance_id, "dispatcher instance id should be nil: #{e.dispatcher_instance_id}"
38
37
 
39
- NewRelic::Control.instance.instance_eval do
40
- @settings['app_name'] = 'myapp'
38
+ with_config(:app_name => 'myapp') do
39
+ e = NewRelic::LocalEnvironment.new
40
+ assert_equal :passenger, e.environment
41
+ assert_nil e.dispatcher_instance_id
41
42
  end
42
43
 
43
- e = NewRelic::LocalEnvironment.new
44
- assert_equal :passenger, e.environment
45
- assert_nil e.dispatcher_instance_id
46
-
47
- ::Passenger.class_eval { remove_const :AbstractServer }
44
+ Object.send(:remove_const, :PhusionPassenger)
48
45
  end
49
-
46
+
50
47
  def test_snapshot
51
48
  e = NewRelic::LocalEnvironment.new
52
49
  s = e.snapshot
@@ -14,50 +14,49 @@ class NewRelic::MetricDataTest < Test::Unit::TestCase
14
14
  def test_eql_basic
15
15
  spec = mock('metric_spec')
16
16
  stats = mock('stats')
17
- metric_id = mock('metric_id')
17
+ metric_id = mock('metric_id')
18
18
  md1 = NewRelic::MetricData.new(spec, stats, metric_id)
19
19
  md2 = NewRelic::MetricData.new(spec, stats, metric_id)
20
20
  assert(md1.eql?(md2), "The example metric data objects should be eql?: #{md1.inspect} #{md2.inspect}")
21
- assert(md2.eql?(md1), "The example metric data objects should be eql?: #{md1.inspect} #{md2.inspect}")
21
+ assert(md2.eql?(md1), "The example metric data objects should be eql?: #{md1.inspect} #{md2.inspect}")
22
22
  end
23
23
 
24
24
  def test_eql_unequal_specs
25
-
26
25
  spec = mock('metric_spec')
27
26
  other_spec = mock('other_spec')
28
27
  stats = mock('stats')
29
- metric_id = mock('metric_id')
28
+ metric_id = mock('metric_id')
30
29
  md1 = NewRelic::MetricData.new(spec, stats, metric_id)
31
30
  md2 = NewRelic::MetricData.new(other_spec, stats, metric_id)
32
31
  assert(!md1.eql?(md2), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
33
- assert(!md2.eql?(md1), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
32
+ assert(!md2.eql?(md1), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
34
33
  end
35
34
  def test_eql_unequal_stats
36
35
  spec = mock('metric_spec')
37
36
  stats = mock('stats')
38
37
  other_stats = mock('other_stats')
39
- metric_id = mock('metric_id')
38
+ metric_id = mock('metric_id')
40
39
  md1 = NewRelic::MetricData.new(spec, stats, metric_id)
41
40
  md2 = NewRelic::MetricData.new(spec, other_stats, metric_id)
42
41
  assert(!md1.eql?(md2), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
43
- assert(!md2.eql?(md1), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
42
+ assert(!md2.eql?(md1), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
44
43
  end
45
44
 
46
45
  def test_eql_unequal_metric_ids_dont_matter
47
46
  spec = mock('metric_spec')
48
47
  stats = mock('stats')
49
48
  metric_id = mock('metric_id')
50
- other_metric_id = mock('other_metric_id')
49
+ other_metric_id = mock('other_metric_id')
51
50
  md1 = NewRelic::MetricData.new(spec, stats, metric_id)
52
51
  md2 = NewRelic::MetricData.new(spec, stats, other_metric_id)
53
52
  assert(md1.eql?(md2), "The example metric data objects should be eql? with different metric_ids: #{md1.inspect} #{md2.inspect}")
54
- assert(md2.eql?(md1), "The example metric data objects should be eql? with different metric_ids: #{md1.inspect} #{md2.inspect}")
53
+ assert(md2.eql?(md1), "The example metric data objects should be eql? with different metric_ids: #{md1.inspect} #{md2.inspect}")
55
54
  end
56
55
 
57
56
  def test_original_spec_basic
58
57
  spec = mock('metric_spec')
59
58
  stats = mock('stats')
60
- metric_id = mock('metric_id')
59
+ metric_id = mock('metric_id')
61
60
  md1 = NewRelic::MetricData.new(spec, stats, metric_id)
62
61
  original_spec = md1.instance_variable_get('@original_spec')
63
62
  assert_equal(nil, original_spec, "should start with a nil original spec, but was #{original_spec.inspect}")
@@ -66,26 +65,26 @@ class NewRelic::MetricDataTest < Test::Unit::TestCase
66
65
 
67
66
  def test_metric_spec_equal_should_not_set_original_spec_with_no_metric_spec
68
67
  stats = mock('stats')
69
- metric_id = mock('metric_id')
68
+ metric_id = mock('metric_id')
70
69
  md1 = NewRelic::MetricData.new(nil, stats, metric_id)
71
70
  original_spec = md1.instance_variable_get('@original_spec')
72
71
  assert_equal(nil, original_spec, "should start with a nil original spec, but was #{original_spec.inspect}")
73
-
72
+
74
73
  new_spec = mock('new metric_spec')
75
74
  assert_equal(new_spec, md1.metric_spec=(new_spec), "should return the new spec")
76
75
 
77
76
  new_original_spec = md1.instance_variable_get('@original_spec')
78
77
  assert_equal(nil, new_original_spec, "should not set @original_spec but was #{new_original_spec.inspect}")
79
78
  end
80
-
79
+
81
80
  def test_metric_spec_equal_should_set_original_spec_with_existing_metric_spec
82
81
  spec = mock('metric_spec')
83
82
  stats = mock('stats')
84
- metric_id = mock('metric_id')
83
+ metric_id = mock('metric_id')
85
84
  md1 = NewRelic::MetricData.new(spec, stats, metric_id)
86
85
  original_spec = md1.instance_variable_get('@original_spec')
87
86
  assert_equal(nil, original_spec, "should start with a nil original spec, but was #{original_spec.inspect}")
88
-
87
+
89
88
  new_spec = mock('new metric_spec')
90
89
  assert_equal(new_spec, md1.metric_spec=(new_spec), "should return the new spec")
91
90
 
@@ -96,7 +95,7 @@ class NewRelic::MetricDataTest < Test::Unit::TestCase
96
95
  def test_hash
97
96
  spec = mock('metric_spec')
98
97
  stats = mock('stats')
99
- metric_id = mock('metric_id')
98
+ metric_id = mock('metric_id')
100
99
  md1 = NewRelic::MetricData.new(spec, stats, metric_id)
101
100
  assert((spec.hash ^ stats.hash) == md1.hash, "expected #{spec.hash ^ stats.hash} to equal #{md1.hash}")
102
101
  end
@@ -122,4 +121,34 @@ class NewRelic::MetricDataTest < Test::Unit::TestCase
122
121
  md = NewRelic::MetricData.new(nil, NewRelic::MethodTraceStats.new, 12345)
123
122
  assert_equal('12345: [01/01/70 12:00AM UTC, 0.000s; 0 calls 0s]', md.to_s, "should include the metric id and not have a metric spec")
124
123
  end
124
+
125
+ def test_to_collector_array_with_spec
126
+ stats = NewRelic::MethodTraceStats.new
127
+ stats.record_data_point(1.0)
128
+ stats.record_data_point(2.0, 1.0)
129
+ md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', 'scope'),
130
+ stats, nil)
131
+ expected = [ {'name' => 'Custom/test/method', 'scope' => 'scope'},
132
+ [2, 3.0, 2.0, 1.0, 2.0, 5.0] ]
133
+ assert_equal expected, md.to_collector_array
134
+ end
135
+
136
+ def test_to_collector_array_with_spec_and_id
137
+ stats = NewRelic::MethodTraceStats.new
138
+ stats.record_data_point(1.0)
139
+ stats.record_data_point(2.0, 1.0)
140
+ md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', 'scope'),
141
+ stats, 1234)
142
+ expected = [ 1234, [2, 3.0, 2.0, 1.0, 2.0, 5.0] ]
143
+ assert_equal expected, md.to_collector_array
144
+ end
145
+
146
+ def test_to_collector_array_with_id
147
+ stats = NewRelic::MethodTraceStats.new
148
+ stats.record_data_point(1.0)
149
+ stats.record_data_point(2.0, 1.0)
150
+ md = NewRelic::MetricData.new(nil, stats, 1234)
151
+ expected = [ 1234, [2, 3.0, 2.0, 1.0, 2.0, 5.0] ]
152
+ assert_equal expected, md.to_collector_array
153
+ end
125
154
  end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','test_helper'))
2
+
3
+ class NewRelic::Agent::NoticedErrorTest < Test::Unit::TestCase
4
+ def test_to_collector_array
5
+ time = Time.now
6
+ error = NewRelic::NoticedError.new('path', {'key' => 'val'},
7
+ Exception.new('test exception'), time)
8
+ expected = [
9
+ (time.to_f * 1000).round, 'path', 'test exception', 'Exception',
10
+ {'key' => 'val'}
11
+ ]
12
+ assert_equal expected, error.to_collector_array
13
+ end
14
+ end
@@ -46,11 +46,16 @@ EOL
46
46
  def setup
47
47
  super
48
48
  clear_cookies
49
+ @config = {
50
+ :browser_key => 'some browser key',
51
+ :beacon => 'beacon',
52
+ :application_id => 5,
53
+ :'rum.enabled' => true,
54
+ :episodes_file => 'this_is_my_file'
55
+ }
56
+ NewRelic::Agent.config.apply_config(@config)
49
57
  NewRelic::Agent.manual_start
50
- config = NewRelic::Agent::BeaconConfiguration.new("browser_key" => "browserKey",
51
- "application_id" => "apId",
52
- "beacon"=>"beacon",
53
- "episodes_url"=>"this_is_my_file")
58
+ config = NewRelic::Agent::BeaconConfiguration.new
54
59
  NewRelic::Agent.instance.stubs(:beacon_configuration).returns(config)
55
60
  NewRelic::Agent.stubs(:is_transaction_traced?).returns(true)
56
61
  end
@@ -60,6 +65,7 @@ EOL
60
65
  clear_cookies
61
66
  mocha_teardown
62
67
  TestApp.doc = nil
68
+ NewRelic::Agent.config.remove_config(@config)
63
69
  end
64
70
 
65
71
  def test_make_sure_header_is_set
@@ -110,7 +116,7 @@ EOL
110
116
  def test_insert_timing_footer_right_before_html_body_close
111
117
  get '/'
112
118
 
113
- assert_match(/.*NREUMQ\.push.*new Date\(\)\.getTime\(\),"","","","",""\]\)<\/script><\/body>/,
119
+ assert_match(/.*NREUMQ\.push.*new Date\(\)\.getTime\(\),"","","","",""\]\);<\/script><\/body>/,
114
120
  last_response.body)
115
121
  end
116
122
 
@@ -132,11 +138,11 @@ EOL
132
138
  def test_guid_is_set_in_footer_when_token_is_set
133
139
  guid = 'abcdefgfedcba'
134
140
  NewRelic::TransactionSample.any_instance.stubs(:generate_guid).returns(guid)
135
- NewRelic::Control.instance.stubs(:apdex_t).returns(0.0001)
136
141
  set_cookie "NRAGENT=tk=token"
137
- get '/'
138
-
139
- assert(last_response.body.include?(guid), last_response.body)
142
+ with_config(:apdex_t => 0.0001) do
143
+ get '/'
144
+ assert(last_response.body.include?(guid), last_response.body)
145
+ end
140
146
  end
141
147
  end
142
148
  else
@@ -14,32 +14,38 @@ class DeveloperModeTest < Test::Unit::TestCase
14
14
  mock_app = lambda { |env| [500, {}, "Don't touch me!"] }
15
15
  NewRelic::Rack::DeveloperMode.new(mock_app)
16
16
  end
17
-
17
+
18
18
  def setup
19
+ @test_config = { 'developer_mode' => true }
20
+ NewRelic::Agent.config.apply_config(@test_config)
19
21
  @sampler = NewRelic::Agent::TransactionSampler.new
20
22
  run_sample_trace_on(@sampler, '/here')
21
23
  run_sample_trace_on(@sampler, '/there')
22
24
  run_sample_trace_on(@sampler, '/somewhere')
23
25
  NewRelic::Agent.instance.stubs(:transaction_sampler).returns(@sampler)
24
26
  end
25
-
27
+
28
+ def teardown
29
+ NewRelic::Agent.config.remove_config(@test_config)
30
+ end
31
+
26
32
  def test_index_displays_all_samples
27
33
  get '/newrelic'
28
-
34
+
29
35
  assert last_response.ok?
30
36
  assert last_response.body.include?('/here')
31
37
  assert last_response.body.include?('/there')
32
- assert last_response.body.include?('/somewhere')
38
+ assert last_response.body.include?('/somewhere')
33
39
  end
34
40
 
35
41
  def test_show_sample_summary_displays_sample_details
36
42
  get "/newrelic/show_sample_summary?id=#{@sampler.samples[0].sample_id}"
37
-
43
+
38
44
  assert last_response.ok?
39
45
  assert last_response.body.include?('/here')
40
46
  assert last_response.body.include?('SandwichesController')
41
- assert last_response.body.include?('index')
42
- end
47
+ assert last_response.body.include?('index')
48
+ end
43
49
 
44
50
  def test_explain_sql_displays_query_plan
45
51
  sample = @sampler.samples[0]
@@ -0,0 +1,74 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..', '..',
2
+ 'test_helper'))
3
+ require 'rack/test'
4
+ require 'new_relic/rack/error_collector'
5
+
6
+ module NewRelic::Rack
7
+ class ErrorCollectorTest < Test::Unit::TestCase
8
+ include Rack::Test::Methods
9
+
10
+ class TestApp
11
+ def call(env)
12
+ if env['PATH_INFO'] == '/ignored'
13
+ env['action_dispatch.request.parameters'] = {
14
+ 'controller' => 'test_ignore',
15
+ 'action' => 'ignored'
16
+ }
17
+ end
18
+ raise 'unhandled error'
19
+ end
20
+ end
21
+
22
+ def app
23
+ NewRelic::Rack::ErrorCollector.new(TestApp.new)
24
+ end
25
+
26
+ def setup
27
+ NewRelic::Agent.reset_config
28
+ NewRelic::Agent.manual_start
29
+ NewRelic::Agent.instance.error_collector
30
+ NewRelic::Agent.instance.error_collector.errors = []
31
+
32
+ # sanity checks
33
+ assert NewRelic::Agent.instance.error_collector.enabled?
34
+ NewRelic::Agent.instance.error_collector \
35
+ .instance_variable_set(:@ignore_filter, nil)
36
+ assert !NewRelic::Agent.instance.error_collector.ignore_error_filter
37
+ end
38
+
39
+ def test_notice_and_reraise_errors
40
+ assert_raise RuntimeError do
41
+ get '/'
42
+ end
43
+
44
+ assert_equal('unhandled error',
45
+ NewRelic::Agent.instance.error_collector.errors[0].message)
46
+ end
47
+
48
+ def test_ignore_filtered_errors
49
+ NewRelic::Agent.instance.error_collector.ignore_error_filter do |error|
50
+ !error.kind_of?(RuntimeError)
51
+ end
52
+
53
+ assert_raise RuntimeError do
54
+ get '/'
55
+ end
56
+
57
+ assert(NewRelic::Agent.instance.error_collector.errors.empty?,
58
+ 'noticed an error that should have been ignored')
59
+ end
60
+
61
+ def test_ignore_errors_from_ignored_actions
62
+ assert_raise RuntimeError do
63
+ get '/ignored'
64
+ end
65
+
66
+ assert(NewRelic::Agent.instance.error_collector.errors.empty?,
67
+ 'noticed an error that should have been ignored')
68
+ end
69
+ end
70
+ end
71
+
72
+ class TestIgnoreController
73
+ @do_not_trace = { :only => :ignored }
74
+ end
@@ -39,10 +39,29 @@ class NewRelic::TransactionSample::SegmentTest < Test::Unit::TestCase
39
39
  s.to_s
40
40
  end
41
41
 
42
- def test_to_json
43
- t = Time.now
44
- s = NewRelic::TransactionSample::Segment.new(t, 'Custom/test/metric', nil)
45
- assert_equal({ :entry_timestamp => t, :exit_timestamp => nil, :metric_name => 'Custom/test/metric', :segment_id => s.object_id }.to_json, s.to_json)
42
+ def test_to_array
43
+ parent = NewRelic::TransactionSample::Segment.new(1, 'Custom/test/parent', 1)
44
+ parent.params[:test] = 'value'
45
+ child = NewRelic::TransactionSample::Segment.new(2, 'Custom/test/child', 2)
46
+ child.end_trace(3)
47
+ parent.add_called_segment(child)
48
+ parent.end_trace(4)
49
+ expected_array = [1000, 4000, 'Custom/test/parent', {:test => 'value'},
50
+ [[2000, 3000, 'Custom/test/child', {}, []]]]
51
+ assert_equal(expected_array, parent.to_array)
52
+ end
53
+
54
+ if RUBY_VERSION >= '1.9.2'
55
+ def test_to_json
56
+ parent = NewRelic::TransactionSample::Segment.new(1, 'Custom/test/parent', 1)
57
+ parent.params[:test] = 'value'
58
+ child = NewRelic::TransactionSample::Segment.new(2, 'Custom/test/child', 2)
59
+ child.end_trace(3)
60
+ parent.add_called_segment(child)
61
+ parent.end_trace(4)
62
+ expected_string = "[1000,4000,\"Custom/test/parent\",{\"test\":\"value\"},[[2000,3000,\"Custom/test/child\",{},[]]]]"
63
+ assert_equal(expected_string, parent.to_json)
64
+ end
46
65
  end
47
66
 
48
67
  def test_path_string
@@ -5,6 +5,8 @@ class NewRelic::TransactionSampleTest < Test::Unit::TestCase
5
5
  ::SQL_STATEMENT = "SELECT * from sandwiches"
6
6
 
7
7
  def setup
8
+ @test_config = { 'developer_mode' => true }
9
+ NewRelic::Agent.config.apply_config(@test_config)
8
10
  @connection_stub = Mocha::Mockery.instance.named_mock('connection')
9
11
  @connection_stub.stubs(:execute).returns([['QUERY RESULT']])
10
12
 
@@ -12,6 +14,10 @@ class NewRelic::TransactionSampleTest < Test::Unit::TestCase
12
14
  @t = make_sql_transaction(::SQL_STATEMENT, ::SQL_STATEMENT)
13
15
  end
14
16
 
17
+ def teardown
18
+ NewRelic::Agent.config.remove_config(@test_config)
19
+ end
20
+
15
21
  def test_be_recorded
16
22
  assert_not_nil @t
17
23
  end
@@ -78,7 +84,7 @@ class NewRelic::TransactionSampleTest < Test::Unit::TestCase
78
84
 
79
85
  def test_have_explains
80
86
  s = @t.prepare_to_send(:record_sql => :obfuscated, :explain_sql => 0.00000001)
81
-
87
+
82
88
  s.each_segment do |segment|
83
89
  if segment.params[:explain_plan]
84
90
  explanation = segment.params[:explain_plan]
@@ -138,7 +144,7 @@ class NewRelic::TransactionSampleTest < Test::Unit::TestCase
138
144
  s.to_s
139
145
  end
140
146
  end
141
-
147
+
142
148
  def test_to_s_includes_keys
143
149
  s = @t.prepare_to_send(:explain_sql => 0.1)
144
150
  s.params[:fake_key] = 'a fake param'
@@ -174,4 +180,43 @@ class NewRelic::TransactionSampleTest < Test::Unit::TestCase
174
180
  end
175
181
  assert_equal 6, transaction.count_segments
176
182
  end
183
+
184
+ def test_to_array
185
+ expected_array = [@t.start_time.to_f,
186
+ @t.params[:request_params],
187
+ @t.params[:custom_params],
188
+ @t.root_segment.to_array]
189
+ assert_equal expected_array, @t.to_array
190
+ end
191
+
192
+ if RUBY_VERSION >= '1.9.2'
193
+ def test_to_json
194
+ expected_string = JSON.dump([@t.start_time.to_f,
195
+ @t.params[:request_params],
196
+ @t.params[:custom_params],
197
+ @t.root_segment.to_array])
198
+ assert_equal expected_string, @t.to_json
199
+ end
200
+ end
201
+
202
+ def test_to_collector_array
203
+ if NewRelic::Agent::NewRelicService::JsonMarshaller.is_supported?
204
+ marshaller = NewRelic::Agent::NewRelicService::JsonMarshaller.new
205
+ trace_tree = compress(@t.to_json)
206
+ else
207
+ marshaller = NewRelic::Agent::NewRelicService::PrubyMarshaller.new
208
+ trace_tree = @t.to_array
209
+ end
210
+ expected_array = [(@t.start_time.to_f * 1000).round,
211
+ (@t.duration * 1000).round,
212
+ @t.params[:path], @t.params[:uri],
213
+ trace_tree,
214
+ @t.guid, nil, !!@t.force_persist]
215
+
216
+ assert_equal expected_array, @t.to_collector_array(marshaller)
217
+ end
218
+
219
+ def compress(string)
220
+ Base64.encode64(Zlib::Deflate.deflate(string, Zlib::DEFAULT_COMPRESSION))
221
+ end
177
222
  end