newrelic_rpm 3.6.0.74.beta → 3.6.0.78

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data.tar.gz.sig +1 -2
  2. data/CHANGELOG +18 -0
  3. data/Gemfile +3 -3
  4. data/Rakefile +8 -0
  5. data/lib/new_relic/agent/agent.rb +4 -9
  6. data/lib/new_relic/agent/agent_logger.rb +1 -2
  7. data/lib/new_relic/agent/audit_logger.rb +7 -3
  8. data/lib/new_relic/agent/busy_calculator.rb +3 -3
  9. data/lib/new_relic/agent/configuration/server_source.rb +23 -10
  10. data/lib/new_relic/agent/cross_app_monitor.rb +1 -0
  11. data/lib/new_relic/agent/database.rb +2 -0
  12. data/lib/new_relic/agent/error_collector.rb +1 -1
  13. data/lib/new_relic/agent/instrumentation/active_record.rb +14 -13
  14. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +72 -0
  15. data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -76
  16. data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +138 -0
  17. data/lib/new_relic/agent/instrumentation/rails4/active_record.rb +108 -0
  18. data/lib/new_relic/agent/null_logger.rb +15 -0
  19. data/lib/new_relic/agent/stats.rb +1 -0
  20. data/lib/new_relic/agent/stats_engine/transactions.rb +4 -4
  21. data/lib/new_relic/control/frameworks/rails.rb +0 -37
  22. data/lib/new_relic/control/frameworks/rails3.rb +0 -17
  23. data/lib/new_relic/control/instance_methods.rb +1 -2
  24. data/lib/new_relic/environment_report.rb +159 -0
  25. data/lib/new_relic/helper.rb +4 -0
  26. data/lib/new_relic/local_environment.rb +0 -161
  27. data/lib/newrelic_rpm.rb +1 -1
  28. data/test/multiverse/lib/multiverse/suite.rb +7 -0
  29. data/test/multiverse/suites/active_record/Envfile +0 -1
  30. data/test/multiverse/suites/agent_only/key_transactions_test.rb +22 -12
  31. data/test/multiverse/suites/rails/Envfile +8 -1
  32. data/test/multiverse/suites/rails/app.rb +7 -2
  33. data/test/multiverse/suites/rails/error_tracing_test.rb +28 -16
  34. data/test/multiverse/suites/rails/view_instrumentation_test.rb +8 -2
  35. data/test/new_relic/agent/agent/connect_test.rb +5 -8
  36. data/test/new_relic/agent/agent/start_test.rb +3 -1
  37. data/test/new_relic/agent/agent_logger_test.rb +8 -8
  38. data/test/new_relic/agent/agent_test.rb +0 -6
  39. data/test/new_relic/agent/agent_test_controller_test.rb +18 -14
  40. data/test/new_relic/agent/audit_logger_test.rb +12 -0
  41. data/test/new_relic/agent/configuration/server_source_test.rb +48 -0
  42. data/test/new_relic/agent/cross_app_monitor_test.rb +8 -0
  43. data/test/new_relic/agent/instrumentation/action_view_subscriber_test.rb +254 -0
  44. data/test/new_relic/agent/instrumentation/active_record_helper_test.rb +52 -0
  45. data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +32 -51
  46. data/test/new_relic/agent/instrumentation/active_record_subscriber_test.rb +132 -0
  47. data/test/new_relic/agent/instrumentation/net_instrumentation_test.rb +20 -0
  48. data/test/new_relic/agent_test.rb +0 -8
  49. data/test/new_relic/control_test.rb +1 -2
  50. data/test/new_relic/dispatcher_test.rb +1 -5
  51. data/test/new_relic/environment_report_test.rb +89 -0
  52. data/test/new_relic/license_test.rb +1 -3
  53. data/test/new_relic/load_test.rb +5 -1
  54. data/test/new_relic/local_environment_test.rb +0 -27
  55. data/test/new_relic/rack/browser_monitoring_test.rb +1 -0
  56. data/test/script/ci.sh +19 -18
  57. data/test/test_helper.rb +15 -3
  58. metadata +42 -3
  59. metadata.gz.sig +0 -0
@@ -0,0 +1,52 @@
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
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
5
+ require 'new_relic/agent/instrumentation/active_record_helper'
6
+
7
+ class NewRelic::Agent::Instrumentation::ActiveRecordHelperTest < Test::Unit::TestCase
8
+ include NewRelic::Agent::Instrumentation
9
+
10
+ def test_metric_for_name_find
11
+ metric_name = 'ActiveRecord/Model/find'
12
+ assert_equal metric_name, ActiveRecordHelper.metric_for_name('Model Find')
13
+ assert_equal metric_name, ActiveRecordHelper.metric_for_name('Model Load')
14
+ assert_equal metric_name, ActiveRecordHelper.metric_for_name('Model Count')
15
+ assert_equal metric_name, ActiveRecordHelper.metric_for_name('Model Exists')
16
+ end
17
+
18
+ def test_metric_for_name_with_namespace
19
+ assert_equal('ActiveRecord/Namespace::Model/find',
20
+ ActiveRecordHelper.metric_for_name('Namespace::Model Load'))
21
+ end
22
+
23
+ def test_metric_for_name_destroy
24
+ assert_equal('ActiveRecord/Model/destroy',
25
+ ActiveRecordHelper.metric_for_name('Model Destroy'))
26
+ end
27
+
28
+ def test_metric_for_name_create
29
+ assert_equal('ActiveRecord/Model/create',
30
+ ActiveRecordHelper.metric_for_name('Model Create'))
31
+ end
32
+
33
+ def test_metric_for_name_update
34
+ assert_equal('ActiveRecord/Model/save',
35
+ ActiveRecordHelper.metric_for_name('Model Update'))
36
+ end
37
+
38
+ def test_metric_for_name_columns
39
+ assert_nil ActiveRecordHelper.metric_for_name('Model Columns')
40
+ end
41
+
42
+ def test_rollup_metric_for_lists_rollups
43
+ rollup_metrics = ActiveRecordHelper.rollup_metrics_for('ActiveRecord/Model/find')
44
+ assert rollup_metrics.include?('ActiveRecord/find')
45
+ assert rollup_metrics.include?('ActiveRecord/all')
46
+ end
47
+
48
+ def test_remote_service_metric
49
+ assert_equal('RemoteService/sql/mysql/server',
50
+ ActiveRecordHelper.remote_service_metric('mysql', 'server'))
51
+ end
52
+ end
@@ -31,6 +31,8 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
31
31
 
32
32
  def teardown
33
33
  super
34
+ NewRelic::Agent::TransactionInfo.reset
35
+ Thread::current[:newrelic_scope_name] = nil
34
36
  NewRelic::Agent.shutdown
35
37
  end
36
38
 
@@ -74,28 +76,6 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
74
76
  end
75
77
  end
76
78
 
77
- # multiple duplicate find calls should only cause metric trigger on the first
78
- # call. the others are ignored.
79
- def test_query_cache
80
- # Not sure why we get a transaction error with sqlite
81
- return if isSqlite?
82
-
83
- find_metric = "ActiveRecord/ActiveRecordFixtures::Order/find"
84
- ActiveRecordFixtures::Order.cache do
85
- m = ActiveRecordFixtures::Order.create :id => 1, :name => 'jeff'
86
- assert_calls_metrics(find_metric) do
87
- all_finder(ActiveRecordFixtures::Order)
88
- end
89
-
90
- check_metric_count(find_metric, 1)
91
-
92
- assert_calls_metrics(find_metric) do
93
- 10.times { ActiveRecordFixtures::Order.find m.id }
94
- end
95
- check_metric_count(find_metric, 2)
96
- end
97
- end
98
-
99
79
  def test_metric_names_jruby
100
80
  # fails due to a bug in rails 3 - log does not provide the correct
101
81
  # transaction type - it returns 'SQL' instead of 'Foo Create', for example.
@@ -352,7 +332,6 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
352
332
  return if isPostgres?
353
333
 
354
334
  expected_metrics = %W[ActiveRecord/all Database/SQL/show RemoteService/sql/#{adapter}/localhost]
355
-
356
335
  assert_calls_metrics(*expected_metrics) do
357
336
  ActiveRecordFixtures::Order.connection.execute "show tables"
358
337
  end
@@ -372,7 +351,7 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
372
351
  metrics = NewRelic::Agent.instance.stats_engine.metrics
373
352
  compare_metrics [], metrics
374
353
  end
375
-
354
+
376
355
  def test_run_explains
377
356
  perform_action_with_newrelic_trace :name => 'bogosity' do
378
357
  ActiveRecordFixtures::Order.add_delay
@@ -380,12 +359,11 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
380
359
  end
381
360
 
382
361
  # that's a mouthful. perhaps we should ponder our API.
383
- segment = NewRelic::Agent.instance.transaction_sampler.last_sample \
384
- .root_segment.called_segments[0].called_segments[0].called_segments[0]
362
+ segment = last_segment(NewRelic::Agent.instance.transaction_sampler.last_sample)
385
363
  regex = /^SELECT (["`]?#{ActiveRecordFixtures::Order.table_name}["`]?.)?\* FROM ["`]?#{ActiveRecordFixtures::Order.table_name}["`]?$/
386
364
  assert_match regex, segment.params[:sql].strip
387
365
  end
388
-
366
+
389
367
  def test_prepare_to_send
390
368
  perform_action_with_newrelic_trace :name => 'bogosity' do
391
369
  ActiveRecordFixtures::Order.add_delay
@@ -397,14 +375,12 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
397
375
  includes_gc = false
398
376
  sample.each_segment {|s| includes_gc ||= s.metric_name =~ /GC/ }
399
377
 
400
- assert_equal (includes_gc ? 4 : 3), sample.count_segments, sample.to_s
401
-
402
- sql_segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
378
+ sql_segment = last_segment(sample)
403
379
  assert_not_nil sql_segment, sample.to_s
404
380
  assert_match /^SELECT /, sql_segment.params[:sql]
405
381
  assert sql_segment.duration > 0.0, "Segment duration must be greater than zero."
406
382
  sample = sample.prepare_to_send(:record_sql => :raw, :explain_sql => 0.0)
407
- sql_segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
383
+ sql_segment = last_segment(sample)
408
384
  assert_match /^SELECT /, sql_segment.params[:sql]
409
385
  explanations = sql_segment.params[:explain_plan]
410
386
  if isMysql? || isPostgres?
@@ -416,6 +392,7 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
416
392
 
417
393
  def test_transaction_mysql
418
394
  return unless isMysql? && !defined?(JRuby)
395
+
419
396
  ActiveRecordFixtures.setup
420
397
  sample = NewRelic::Agent.instance.transaction_sampler.reset!
421
398
  perform_action_with_newrelic_trace :name => 'bogosity' do
@@ -424,9 +401,8 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
424
401
  end
425
402
 
426
403
  sample = NewRelic::Agent.instance.transaction_sampler.last_sample
427
-
428
404
  sample = sample.prepare_to_send(:record_sql => :obfuscated, :explain_sql => 0.0)
429
- segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
405
+ segment = last_segment(sample)
430
406
  explanation = segment.params[:explain_plan]
431
407
  assert_not_nil explanation, "No explains in segment: #{segment}"
432
408
  assert_equal 2, explanation.size,"No explains in segment: #{segment}"
@@ -456,7 +432,7 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
456
432
  sample = NewRelic::Agent.instance.transaction_sampler.last_sample
457
433
 
458
434
  sample = sample.prepare_to_send(:record_sql => :obfuscated, :explain_sql => 0.0)
459
- segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
435
+ segment = last_segment(sample)
460
436
  explanations = segment.params[:explain_plan]
461
437
 
462
438
  assert_not_nil explanations, "No explains in segment: #{segment}"
@@ -481,7 +457,7 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
481
457
  sample = NewRelic::Agent.instance.transaction_sampler.last_sample
482
458
 
483
459
  sample = sample.prepare_to_send(:record_sql => :obfuscated, :explain_sql => 0.0)
484
- segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
460
+ segment = last_segment(sample)
485
461
 
486
462
  s = NewRelic::Agent.get_stats("ActiveRecord/ActiveRecordFixtures::Order/find")
487
463
  assert_equal 1, s.call_count
@@ -496,7 +472,7 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
496
472
  scope :jeffs, :conditions => { :name => 'Jeff' }
497
473
  else
498
474
  named_scope :jeffs, :conditions => { :name => 'Jeff' }
499
- end
475
+ end
500
476
  end
501
477
  def test_named_scope
502
478
  ActiveRecordFixtures::Order.create :name => 'Jeff'
@@ -552,31 +528,24 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
552
528
  assert_equal 'preserve-me!', e.message
553
529
  end
554
530
  end
555
-
531
+
556
532
  def test_remote_service_metric_respects_dynamic_connection_config
557
533
  return unless isMysql?
558
534
 
559
- # puts NewRelic::Agent::Database.config.inspect
560
-
561
535
  ActiveRecordFixtures::Shipment.connection.execute('SHOW TABLES');
562
536
  assert(NewRelic::Agent.get_stats("RemoteService/sql/#{adapter}/localhost").call_count != 0)
563
537
 
564
- config = ActiveRecordFixtures::Shipment.connection.instance_eval { @config }
538
+ config = ActiveRecordFixtures::Shipment.connection.instance_eval { @config }
565
539
  config[:host] = '127.0.0.1'
566
540
  connection = ActiveRecordFixtures::Shipment.establish_connection(config)
567
-
568
- # puts ActiveRecord::Base.connection.instance_eval { @config }.inspect
569
- # puts NewRelic::Agent::Database.config.inspect
570
-
541
+
571
542
  ActiveRecordFixtures::Shipment.connection.execute('SHOW TABLES');
572
543
  assert(NewRelic::Agent.get_stats("RemoteService/sql/#{adapter}/127.0.0.1").call_count != 0)
573
544
 
574
545
  config[:host] = 'localhost'
575
546
  ActiveRecordFixtures::Shipment.establish_connection(config)
576
-
577
- # raise NewRelic::Agent.instance.stats_engine.inspect
578
547
  end
579
-
548
+
580
549
  private
581
550
 
582
551
  def rails3?
@@ -599,12 +568,24 @@ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::
599
568
  end
600
569
 
601
570
  def all_finder(relation)
602
- if NewRelic::Control.instance.rails_version >= NewRelic::VersionNumber.new("4.0")
603
- relation.all.load
604
- elsif NewRelic::Control.instance.rails_version >= NewRelic::VersionNumber.new("3.0")
605
- relation.all
571
+ if defined?(::ActiveRecord::VERSION)
572
+ if ::ActiveRecord::VERSION::MAJOR.to_i >= 4
573
+ relation.all.load
574
+ elsif ::ActiveRecord::VERSION::MAJOR.to_i >= 3
575
+ relation.all
576
+ else
577
+ relation.find(:all)
578
+ end
606
579
  else
607
580
  relation.find(:all)
608
581
  end
609
582
  end
583
+
584
+ def last_segment(txn_sample)
585
+ last = nil
586
+ txn_sample.root_segment.each_segment do |segment|
587
+ last = segment
588
+ end
589
+ last
590
+ end
610
591
  end
@@ -0,0 +1,132 @@
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
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
5
+ require 'new_relic/agent/instrumentation/rails4/active_record'
6
+
7
+ if ::Rails::VERSION::MAJOR.to_i >= 4 && !NewRelic::LanguageSupport.using_engine?('jruby')
8
+ class NewRelic::Agent::Instrumentation::ActiveRecordSubscriberTest < Test::Unit::TestCase
9
+ class Order; end
10
+
11
+ def setup
12
+ @config = { :adapter => 'mysql', :host => 'server' }
13
+ @connection = Object.new
14
+ @connection.instance_variable_set(:@config, @config)
15
+ Order.stubs(:connection_pool).returns(stub(:connections => [ @connection ]))
16
+
17
+ @params = {
18
+ :name => 'NewRelic::Agent::Instrumentation::ActiveRecordSubscriberTest::Order Load',
19
+ :sql => 'SELECT * FROM sandwiches',
20
+ :connection_id => @connection.object_id
21
+ }
22
+
23
+ @subscriber = NewRelic::Agent::Instrumentation::ActiveRecordSubscriber.new
24
+
25
+ @stats_engine = NewRelic::Agent.instance.stats_engine
26
+ @stats_engine.clear_stats
27
+ end
28
+
29
+ def test_records_metrics_for_simple_find
30
+ t1 = Time.now
31
+ t0 = t1 - 2
32
+ @subscriber.call('sql.active_record', t0, t1, :id, @params)
33
+
34
+ metric_name = 'ActiveRecord/NewRelic::Agent::Instrumentation::ActiveRecordSubscriberTest::Order/find'
35
+
36
+ metric = @stats_engine.lookup_stats(metric_name)
37
+ assert_equal(1, metric.call_count)
38
+ assert_equal(2.0, metric.total_call_time)
39
+ end
40
+
41
+ def test_records_scoped_metrics
42
+ t1 = Time.now
43
+ t0 = t1 - 2
44
+
45
+ @stats_engine.start_transaction('test_txn')
46
+ @subscriber.call('sql.active_record', t0, t1, :id, @params)
47
+
48
+ metric_name = 'ActiveRecord/NewRelic::Agent::Instrumentation::ActiveRecordSubscriberTest::Order/find'
49
+
50
+ scoped_metric = @stats_engine.lookup_stats(metric_name, 'test_txn')
51
+ assert_equal(1, scoped_metric.call_count)
52
+ assert_equal(2.0, scoped_metric.total_call_time)
53
+ end
54
+
55
+ def test_records_nothing_if_tracing_disabled
56
+ t1 = Time.now
57
+ t0 = t1 - 2
58
+
59
+ NewRelic::Agent.disable_all_tracing do
60
+ @subscriber.call('sql.active_record', t0, t1, :id, @params)
61
+ end
62
+
63
+ metric = @stats_engine \
64
+ .lookup_stats('ActiveRecord/NewRelic::Agent::Instrumentation::ActiveRecordSubscriberTest::Order/find')
65
+ assert_nil metric
66
+ end
67
+
68
+ def test_records_rollup_metrics
69
+ t1 = Time.now
70
+ t0 = t1 - 2
71
+
72
+ @subscriber.call('sql.active_record', t0, t1, :id, @params)
73
+
74
+ ['ActiveRecord/find', 'ActiveRecord/all'].each do |metric_name|
75
+ metric = @stats_engine.lookup_stats(metric_name)
76
+ assert_equal(1, metric.call_count,
77
+ "Incorrect call count for #{metric_name}")
78
+ assert_equal(2.0, metric.total_call_time,
79
+ "Incorrect call time for #{metric_name}")
80
+ end
81
+ end
82
+
83
+ def test_records_remote_service_metric
84
+ t1 = Time.now
85
+ t0 = t1 - 2
86
+
87
+ @subscriber.call('sql.active_record', t0, t1, :id, @params)
88
+
89
+ metric = @stats_engine.lookup_stats('RemoteService/sql/mysql/server')
90
+ assert_equal(1, metric.call_count)
91
+ assert_equal(2.0, metric.total_call_time)
92
+ end
93
+
94
+ def test_creates_txn_segment
95
+ t1 = Time.now
96
+ t0 = t1 - 2
97
+
98
+ NewRelic::Agent.manual_start
99
+ @stats_engine.start_transaction('test')
100
+ sampler = NewRelic::Agent.instance.transaction_sampler
101
+ sampler.notice_first_scope_push(Time.now.to_f)
102
+ sampler.notice_transaction('/path', '/path', {})
103
+ sampler.notice_push_scope('Controller/sandwiches/index')
104
+ @subscriber.call('sql.active_record', t0, t1, :id, @params)
105
+ sampler.notice_pop_scope('Controller/sandwiches/index')
106
+ sampler.notice_scope_empty
107
+
108
+ last_segment = nil
109
+ sampler.last_sample.root_segment.each_segment{|s| last_segment = s }
110
+ NewRelic::Agent.shutdown
111
+
112
+ assert_equal('ActiveRecord/NewRelic::Agent::Instrumentation::ActiveRecordSubscriberTest::Order/find',
113
+ last_segment.metric_name)
114
+ assert_equal('SELECT * FROM sandwiches',
115
+ last_segment.params[:sql])
116
+ end
117
+
118
+ def test_creates_slow_sql_node
119
+ NewRelic::Agent.manual_start
120
+ sampler = NewRelic::Agent.instance.sql_sampler
121
+ sampler.notice_first_scope_push nil
122
+ t1 = Time.now
123
+ t0 = t1 - 2
124
+
125
+ @subscriber.call('sql.active_record', t0, t1, :id, @params)
126
+
127
+ assert_equal 'SELECT * FROM sandwiches', sampler.transaction_data.sql_data[0].sql
128
+ ensure
129
+ NewRelic::Agent.shutdown
130
+ end
131
+ end
132
+ end
@@ -461,4 +461,24 @@ class NewRelic::Agent::Instrumentation::NetInstrumentationTest < Test::Unit::Tes
461
461
  end
462
462
  end
463
463
  end
464
+
465
+ def test_doesnt_misbehave_when_transaction_tracing_is_disabled
466
+ @engine.transaction_sampler = nil
467
+
468
+ # The error should have any other consequence other than logging the error, so
469
+ # this will capture logs
470
+ logger = NewRelic::Agent::MemoryLogger.new
471
+ NewRelic::Agent.logger = logger
472
+
473
+ with_config(:"cross_application_tracer.enabled" => true) do
474
+ Net::HTTP.get(URI.parse('http://www.google.com/index.html'))
475
+ end
476
+
477
+ assert_no_match( /undefined method `rename_scope_segment' for nil:NilClass/i,
478
+ logger.messages.flatten.map {|log| log.to_s }.join(' ') )
479
+
480
+ ensure
481
+ @engine.transaction_sampler = NewRelic::Agent.agent.transaction_sampler
482
+ end
483
+
464
484
  end
@@ -62,14 +62,6 @@ module NewRelic
62
62
  NewRelic::Agent.after_fork
63
63
  end
64
64
 
65
- def test_after_fork_sets_forked_flag
66
- agent = NewRelic::Agent::Agent.new
67
- assert !agent.forked?
68
- agent.after_fork
69
-
70
- assert agent.forked?
71
- end
72
-
73
65
  if NewRelic::LanguageSupport.can_fork? &&
74
66
  !NewRelic::LanguageSupport.using_version?('1.9.1')
75
67
  def test_timeslice_harvest_with_after_fork_report_to_channel
@@ -48,9 +48,8 @@ class NewRelic::ControlTest < Test::Unit::TestCase
48
48
 
49
49
  def test_info
50
50
  NewRelic::Agent.manual_start(:dispatcher_instance_id => 'test')
51
- props = NewRelic::Control.instance.local_env.snapshot
52
51
  if defined?(Rails)
53
- assert_match /jdbc|postgres|mysql|sqlite/, props.assoc('Database adapter').last, props.inspect
52
+ assert_match /jdbc|postgres|mysql|sqlite/, NewRelic::EnvironmentReport.new["Database adapter"]
54
53
  end
55
54
  end
56
55
 
@@ -13,11 +13,7 @@ class DispatcherTest < Test::Unit::TestCase
13
13
  end
14
14
 
15
15
  def assert_dispatcher_reported_to_environment_report(dispatcher)
16
- NewRelic::Control.instance.local_env.gather_environment_info
17
- key, value = NewRelic::Control.instance.local_env.snapshot.detect do |(k, v)|
18
- k == "Dispatcher"
19
- end
20
- assert_equal dispatcher.to_s, value
16
+ assert_equal dispatcher.to_s, NewRelic::EnvironmentReport.new["Dispatcher"]
21
17
  end
22
18
 
23
19
  def test_detects_dispatcher_via_loaded_libraries
@@ -0,0 +1,89 @@
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
+
7
+ require 'new_relic/environment_report'
8
+
9
+ class EnvironmentReportTest < Test::Unit::TestCase
10
+ def setup
11
+ @old_logic = ::NewRelic::EnvironmentReport.registered_reporters.dup
12
+ @report = ::NewRelic::EnvironmentReport.new
13
+ end
14
+
15
+ def teardown
16
+ ::NewRelic::EnvironmentReport.registered_reporters = @old_logic
17
+ end
18
+
19
+ def test_converts_to_array
20
+ ::NewRelic::EnvironmentReport.report_on("something"){"awesome"}
21
+ data = Array(::NewRelic::EnvironmentReport.new)
22
+ expected = ["something", "awesome"]
23
+ assert data.include?(expected), "expected to find #{expected} in #{data.inspect}"
24
+ end
25
+
26
+ def test_register_a_value_to_report_on
27
+ ::NewRelic::EnvironmentReport.report_on("What time is it?") do
28
+ "beer-o-clock"
29
+ end
30
+ assert_equal 'beer-o-clock', ::NewRelic::EnvironmentReport.new["What time is it?"]
31
+ end
32
+
33
+ def test_report_on_handles_errors_gracefully
34
+ assert_nothing_raised do
35
+ ::NewRelic::EnvironmentReport.report_on("What time is it?") do
36
+ raise ArgumentError, "woah! something blew up"
37
+ end
38
+ assert_nil ::NewRelic::EnvironmentReport.new["What time is it?"]
39
+ end
40
+ end
41
+
42
+ def test_it_does_not_set_keys_for_nil_values
43
+ ::NewRelic::EnvironmentReport.report_on("What time is it?") do
44
+ nil
45
+ end
46
+ assert ! NewRelic::EnvironmentReport.new.data.has_key?("What time is it?")
47
+ end
48
+
49
+ def test_can_set_an_environment_value_directly
50
+ @report['My Value'] = "so awesome!!"
51
+ assert_equal "so awesome!!", @report['My Value']
52
+ end
53
+
54
+ def test_it_knows_what_gems_are_in_the_environment
55
+ assert(@report['Gems'].size > 5, "Expected at least 5 gems in #{@report['Gems'].inspect}")
56
+ rake = @report['Gems'].detect{|s| s.include? 'rake'}
57
+ assert_match(/^rake\([\d\.]+\)$/, rake)
58
+ end
59
+
60
+ def test_gathers_ruby_version
61
+ assert_equal RUBY_VERSION, @report['Ruby version']
62
+ end
63
+
64
+ def test_has_logic_for_keys
65
+ [
66
+ "Gems",
67
+ "Plugin List",
68
+ "Ruby version",
69
+ "Ruby description",
70
+ "Ruby platform",
71
+ "Ruby patchlevel",
72
+ 'JRuby version',
73
+ 'Java VM version',
74
+ 'Processors',
75
+ 'Database adapter',
76
+ 'Framework',
77
+ 'Dispatcher',
78
+ 'Environment',
79
+ 'Arch',
80
+ 'OS version',
81
+ 'OS',
82
+ 'Rails Env',
83
+ 'Rails version',
84
+ 'Rails threadsafe',
85
+ ].each do |key|
86
+ assert NewRelic::EnvironmentReport.registered_reporters.has_key?(key), "Expected logic for #{key.inspect} in EnvironmentReport."
87
+ end
88
+ end
89
+ end