dolores_rpm 3.2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +559 -0
- data/LICENSE +64 -0
- data/README.rdoc +179 -0
- data/bin/mongrel_rpm +33 -0
- data/bin/newrelic +13 -0
- data/bin/newrelic_cmd +5 -0
- data/cert/cacert.pem +118 -0
- data/cert/oldsite.pem +28 -0
- data/cert/site.pem +27 -0
- data/dolores_rpm-3.3.4.fork.gem +0 -0
- data/install.rb +9 -0
- data/lib/conditional_vendored_dependency_detection.rb +3 -0
- data/lib/conditional_vendored_metric_parser.rb +5 -0
- data/lib/new_relic/agent/agent.rb +1311 -0
- data/lib/new_relic/agent/beacon_configuration.rb +110 -0
- data/lib/new_relic/agent/browser_monitoring.rb +102 -0
- data/lib/new_relic/agent/busy_calculator.rb +99 -0
- data/lib/new_relic/agent/chained_call.rb +13 -0
- data/lib/new_relic/agent/database.rb +203 -0
- data/lib/new_relic/agent/error_collector.rb +251 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +27 -0
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +68 -0
- data/lib/new_relic/agent/instrumentation/authlogic.rb +19 -0
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +424 -0
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +57 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +52 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +80 -0
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +41 -0
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +29 -0
- data/lib/new_relic/agent/instrumentation/metric_frame/pop.rb +80 -0
- data/lib/new_relic/agent/instrumentation/metric_frame.rb +332 -0
- data/lib/new_relic/agent/instrumentation/net.rb +29 -0
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +36 -0
- data/lib/new_relic/agent/instrumentation/queue_time.rb +210 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +98 -0
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +114 -0
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +42 -0
- data/lib/new_relic/agent/instrumentation/rails/active_record_instrumentation.rb +115 -0
- data/lib/new_relic/agent/instrumentation/rails/errors.rb +42 -0
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +118 -0
- data/lib/new_relic/agent/instrumentation/rails3/active_record_instrumentation.rb +122 -0
- data/lib/new_relic/agent/instrumentation/rails3/errors.rb +37 -0
- data/lib/new_relic/agent/instrumentation/sinatra.rb +58 -0
- data/lib/new_relic/agent/instrumentation/sunspot.rb +29 -0
- data/lib/new_relic/agent/instrumentation/unicorn_instrumentation.rb +21 -0
- data/lib/new_relic/agent/instrumentation.rb +9 -0
- data/lib/new_relic/agent/method_tracer.rb +528 -0
- data/lib/new_relic/agent/sampler.rb +50 -0
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +58 -0
- data/lib/new_relic/agent/samplers/delayed_job_lock_sampler.rb +40 -0
- data/lib/new_relic/agent/samplers/memory_sampler.rb +144 -0
- data/lib/new_relic/agent/samplers/object_sampler.rb +26 -0
- data/lib/new_relic/agent/shim_agent.rb +29 -0
- data/lib/new_relic/agent/sql_sampler.rb +267 -0
- data/lib/new_relic/agent/stats_engine/metric_stats.rb +187 -0
- data/lib/new_relic/agent/stats_engine/samplers.rb +95 -0
- data/lib/new_relic/agent/stats_engine/transactions.rb +208 -0
- data/lib/new_relic/agent/stats_engine.rb +25 -0
- data/lib/new_relic/agent/transaction_sample_builder.rb +101 -0
- data/lib/new_relic/agent/transaction_sampler.rb +397 -0
- data/lib/new_relic/agent/worker_loop.rb +89 -0
- data/lib/new_relic/agent.rb +454 -0
- data/lib/new_relic/collection_helper.rb +75 -0
- data/lib/new_relic/command.rb +85 -0
- data/lib/new_relic/commands/deployments.rb +105 -0
- data/lib/new_relic/commands/install.rb +80 -0
- data/lib/new_relic/control/class_methods.rb +53 -0
- data/lib/new_relic/control/configuration.rb +202 -0
- data/lib/new_relic/control/frameworks/external.rb +16 -0
- data/lib/new_relic/control/frameworks/merb.rb +31 -0
- data/lib/new_relic/control/frameworks/rails.rb +164 -0
- data/lib/new_relic/control/frameworks/rails3.rb +75 -0
- data/lib/new_relic/control/frameworks/ruby.rb +42 -0
- data/lib/new_relic/control/frameworks/sinatra.rb +20 -0
- data/lib/new_relic/control/frameworks.rb +10 -0
- data/lib/new_relic/control/instance_methods.rb +179 -0
- data/lib/new_relic/control/instrumentation.rb +100 -0
- data/lib/new_relic/control/logging_methods.rb +143 -0
- data/lib/new_relic/control/profiling.rb +25 -0
- data/lib/new_relic/control/server_methods.rb +114 -0
- data/lib/new_relic/control.rb +46 -0
- data/lib/new_relic/data_serialization.rb +157 -0
- data/lib/new_relic/delayed_job_injection.rb +46 -0
- data/lib/new_relic/language_support.rb +69 -0
- data/lib/new_relic/local_environment.rb +414 -0
- data/lib/new_relic/merbtasks.rb +6 -0
- data/lib/new_relic/metric_data.rb +51 -0
- data/lib/new_relic/metric_spec.rb +75 -0
- data/lib/new_relic/metrics.rb +9 -0
- data/lib/new_relic/noticed_error.rb +24 -0
- data/lib/new_relic/rack/browser_monitoring.rb +68 -0
- data/lib/new_relic/rack/developer_mode.rb +268 -0
- data/lib/new_relic/recipes.rb +73 -0
- data/lib/new_relic/stats.rb +388 -0
- data/lib/new_relic/timer_lib.rb +27 -0
- data/lib/new_relic/transaction_analysis/segment_summary.rb +49 -0
- data/lib/new_relic/transaction_analysis.rb +77 -0
- data/lib/new_relic/transaction_sample/composite_segment.rb +27 -0
- data/lib/new_relic/transaction_sample/fake_segment.rb +9 -0
- data/lib/new_relic/transaction_sample/segment.rb +201 -0
- data/lib/new_relic/transaction_sample/summary_segment.rb +21 -0
- data/lib/new_relic/transaction_sample.rb +245 -0
- data/lib/new_relic/url_rule.rb +14 -0
- data/lib/new_relic/version.rb +55 -0
- data/lib/newrelic_rpm.rb +49 -0
- data/lib/tasks/all.rb +4 -0
- data/lib/tasks/install.rake +7 -0
- data/lib/tasks/tests.rake +19 -0
- data/newrelic.yml +265 -0
- data/recipes/newrelic.rb +6 -0
- data/test/active_record_fixtures.rb +77 -0
- data/test/config/newrelic.yml +48 -0
- data/test/config/test_control.rb +48 -0
- data/test/new_relic/agent/agent/connect_test.rb +410 -0
- data/test/new_relic/agent/agent/start_test.rb +255 -0
- data/test/new_relic/agent/agent/start_worker_thread_test.rb +153 -0
- data/test/new_relic/agent/agent_test.rb +139 -0
- data/test/new_relic/agent/agent_test_controller.rb +77 -0
- data/test/new_relic/agent/agent_test_controller_test.rb +363 -0
- data/test/new_relic/agent/apdex_from_server_test.rb +9 -0
- data/test/new_relic/agent/beacon_configuration_test.rb +108 -0
- data/test/new_relic/agent/browser_monitoring_test.rb +278 -0
- data/test/new_relic/agent/busy_calculator_test.rb +81 -0
- data/test/new_relic/agent/database_test.rb +162 -0
- data/test/new_relic/agent/error_collector/notice_error_test.rb +257 -0
- data/test/new_relic/agent/error_collector_test.rb +175 -0
- data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +538 -0
- data/test/new_relic/agent/instrumentation/controller_instrumentation_test.rb +36 -0
- data/test/new_relic/agent/instrumentation/instrumentation_test.rb +11 -0
- data/test/new_relic/agent/instrumentation/metric_frame/pop_test.rb +172 -0
- data/test/new_relic/agent/instrumentation/metric_frame_test.rb +50 -0
- data/test/new_relic/agent/instrumentation/net_instrumentation_test.rb +84 -0
- data/test/new_relic/agent/instrumentation/queue_time_test.rb +387 -0
- data/test/new_relic/agent/instrumentation/rack_test.rb +35 -0
- data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +184 -0
- data/test/new_relic/agent/memcache_instrumentation_test.rb +143 -0
- data/test/new_relic/agent/method_tracer/class_methods/add_method_tracer_test.rb +164 -0
- data/test/new_relic/agent/method_tracer/instance_methods/trace_execution_scoped_test.rb +234 -0
- data/test/new_relic/agent/method_tracer_test.rb +386 -0
- data/test/new_relic/agent/mock_scope_listener.rb +23 -0
- data/test/new_relic/agent/rpm_agent_test.rb +149 -0
- data/test/new_relic/agent/sampler_test.rb +19 -0
- data/test/new_relic/agent/shim_agent_test.rb +20 -0
- data/test/new_relic/agent/sql_sampler_test.rb +160 -0
- data/test/new_relic/agent/stats_engine/metric_stats/harvest_test.rb +150 -0
- data/test/new_relic/agent/stats_engine/metric_stats_test.rb +82 -0
- data/test/new_relic/agent/stats_engine/samplers_test.rb +99 -0
- data/test/new_relic/agent/stats_engine_test.rb +185 -0
- data/test/new_relic/agent/transaction_sample_builder_test.rb +195 -0
- data/test/new_relic/agent/transaction_sampler_test.rb +955 -0
- data/test/new_relic/agent/worker_loop_test.rb +66 -0
- data/test/new_relic/agent_test.rb +175 -0
- data/test/new_relic/collection_helper_test.rb +149 -0
- data/test/new_relic/command/deployments_test.rb +68 -0
- data/test/new_relic/control/class_methods_test.rb +62 -0
- data/test/new_relic/control/configuration_test.rb +72 -0
- data/test/new_relic/control/logging_methods_test.rb +185 -0
- data/test/new_relic/control_test.rb +254 -0
- data/test/new_relic/data_serialization_test.rb +208 -0
- data/test/new_relic/delayed_job_injection_test.rb +16 -0
- data/test/new_relic/local_environment_test.rb +72 -0
- data/test/new_relic/metric_data_test.rb +125 -0
- data/test/new_relic/metric_spec_test.rb +95 -0
- data/test/new_relic/rack/all_test.rb +11 -0
- data/test/new_relic/rack/browser_monitoring_test.rb +84 -0
- data/test/new_relic/rack/developer_mode_helper_test.rb +141 -0
- data/test/new_relic/rack/developer_mode_test.rb +43 -0
- data/test/new_relic/stats_test.rb +426 -0
- data/test/new_relic/transaction_analysis/segment_summary_test.rb +91 -0
- data/test/new_relic/transaction_analysis_test.rb +121 -0
- data/test/new_relic/transaction_sample/composite_segment_test.rb +35 -0
- data/test/new_relic/transaction_sample/fake_segment_test.rb +17 -0
- data/test/new_relic/transaction_sample/segment_test.rb +389 -0
- data/test/new_relic/transaction_sample/summary_segment_test.rb +31 -0
- data/test/new_relic/transaction_sample_subtest_test.rb +56 -0
- data/test/new_relic/transaction_sample_test.rb +164 -0
- data/test/new_relic/version_number_test.rb +89 -0
- data/test/test_contexts.rb +29 -0
- data/test/test_helper.rb +154 -0
- data/ui/helpers/developer_mode_helper.rb +357 -0
- data/ui/helpers/google_pie_chart.rb +48 -0
- data/ui/views/layouts/newrelic_default.rhtml +47 -0
- data/ui/views/newrelic/_explain_plans.rhtml +27 -0
- data/ui/views/newrelic/_sample.rhtml +20 -0
- data/ui/views/newrelic/_segment.rhtml +28 -0
- data/ui/views/newrelic/_segment_limit_message.rhtml +1 -0
- data/ui/views/newrelic/_segment_row.rhtml +12 -0
- data/ui/views/newrelic/_show_sample_detail.rhtml +24 -0
- data/ui/views/newrelic/_show_sample_sql.rhtml +24 -0
- data/ui/views/newrelic/_show_sample_summary.rhtml +3 -0
- data/ui/views/newrelic/_sql_row.rhtml +16 -0
- data/ui/views/newrelic/_stack_trace.rhtml +15 -0
- data/ui/views/newrelic/_table.rhtml +12 -0
- data/ui/views/newrelic/explain_sql.rhtml +43 -0
- data/ui/views/newrelic/file/images/arrow-close.png +0 -0
- data/ui/views/newrelic/file/images/arrow-open.png +0 -0
- data/ui/views/newrelic/file/images/blue_bar.gif +0 -0
- data/ui/views/newrelic/file/images/file_icon.png +0 -0
- data/ui/views/newrelic/file/images/gray_bar.gif +0 -0
- data/ui/views/newrelic/file/images/new-relic-rpm-desktop.gif +0 -0
- data/ui/views/newrelic/file/images/new_relic_rpm_desktop.gif +0 -0
- data/ui/views/newrelic/file/images/textmate.png +0 -0
- data/ui/views/newrelic/file/javascript/jquery-1.4.2.js +6240 -0
- data/ui/views/newrelic/file/javascript/transaction_sample.js +120 -0
- data/ui/views/newrelic/file/stylesheets/style.css +490 -0
- data/ui/views/newrelic/index.rhtml +71 -0
- data/ui/views/newrelic/sample_not_found.rhtml +2 -0
- data/ui/views/newrelic/show_sample.rhtml +80 -0
- data/ui/views/newrelic/show_source.rhtml +3 -0
- data/ui/views/newrelic/threads.rhtml +53 -0
- data/vendor/gems/dependency_detection-0.0.1.build/LICENSE +5 -0
- data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection/version.rb +3 -0
- data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection.rb +62 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/metric_parser.rb +1 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/action_mailer.rb +14 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_merchant.rb +31 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_record.rb +33 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/apdex.rb +89 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/background_transaction.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/client.rb +46 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller.rb +67 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_cpu.rb +43 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_ext.rb +17 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database.rb +48 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database_pool.rb +24 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net.rb +28 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net_parser.rb +17 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/errors.rb +11 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/external.rb +55 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/frontend.rb +40 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/gc.rb +20 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/hibernate_session.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java.rb +31 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java_parser.rb +17 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp.rb +34 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp_tag.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/mem_cache.rb +55 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/metric_parser.rb +122 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/orm.rb +27 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/other_transaction.rb +40 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_context_listener.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_filter.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr.rb +27 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr_request_handler.rb +15 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring.rb +54 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring_controller.rb +6 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring_view.rb +6 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_action.rb +20 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_result.rb +20 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/version.rb +5 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/view.rb +70 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_frontend.rb +18 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_service.rb +14 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_transaction.rb +133 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser.rb +64 -0
- metadata +398 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','..','test_helper'))
|
|
2
|
+
class NewRelic::Agent::MethodTracer::InstanceMethods::TraceExecutionScopedTest < Test::Unit::TestCase
|
|
3
|
+
require 'new_relic/agent/method_tracer'
|
|
4
|
+
include NewRelic::Agent::MethodTracer::InstanceMethods::TraceExecutionScoped
|
|
5
|
+
|
|
6
|
+
def test_trace_disabled_negative
|
|
7
|
+
self.expects(:traced?).returns(false)
|
|
8
|
+
options = {:force => false}
|
|
9
|
+
assert trace_disabled?(options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_trace_disabled_forced
|
|
13
|
+
self.expects(:traced?).returns(false)
|
|
14
|
+
options = {:force => true}
|
|
15
|
+
assert !(trace_disabled?(options))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_trace_disabled_positive
|
|
19
|
+
self.expects(:traced?).returns(true)
|
|
20
|
+
options = {:force => false}
|
|
21
|
+
assert !(trace_disabled?(options))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_get_stats_unscoped
|
|
25
|
+
fake_engine = mocked_object('stat_engine')
|
|
26
|
+
fake_engine.expects(:get_stats_no_scope).with('foob').returns('fakestats')
|
|
27
|
+
assert_equal 'fakestats', get_stats_unscoped('foob')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_get_stats_scoped_scoped_only
|
|
31
|
+
fake_engine = mocked_object('stat_engine')
|
|
32
|
+
fake_engine.expects(:get_stats).with('foob', true, true).returns('fakestats')
|
|
33
|
+
assert_equal 'fakestats', get_stats_scoped('foob', true)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_get_stats_scoped_no_scoped_only
|
|
37
|
+
fake_engine = mocked_object('stat_engine')
|
|
38
|
+
fake_engine.expects(:get_stats).with('foob', true, false).returns('fakestats')
|
|
39
|
+
assert_equal 'fakestats', get_stats_scoped('foob', false)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_stat_engine
|
|
43
|
+
assert_equal agent_instance.stats_engine, stat_engine
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_agent_instance
|
|
47
|
+
assert_equal NewRelic::Agent.instance, agent_instance
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_main_stat
|
|
51
|
+
self.expects(:get_stats_scoped).with('hello', true)
|
|
52
|
+
opts = {:scoped_metric_only => true}
|
|
53
|
+
main_stat('hello', opts)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_get_metric_stats_metric
|
|
57
|
+
metrics = ['foo', 'bar', 'baz']
|
|
58
|
+
opts = {:metric => true}
|
|
59
|
+
self.expects(:get_stats_unscoped).twice
|
|
60
|
+
self.expects(:main_stat).with('foo', opts)
|
|
61
|
+
first_name, stats = get_metric_stats(metrics, opts)
|
|
62
|
+
assert_equal 'foo', first_name
|
|
63
|
+
assert_equal 3, stats.length
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_get_metric_stats_no_metric
|
|
67
|
+
metrics = ['foo', 'bar', 'baz']
|
|
68
|
+
opts = {:metric => false}
|
|
69
|
+
self.expects(:get_stats_unscoped).twice
|
|
70
|
+
first_name, stats = get_metric_stats(metrics, opts)
|
|
71
|
+
assert_equal 'foo', first_name
|
|
72
|
+
assert_equal 2, stats.length
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_set_if_nil
|
|
76
|
+
h = {}
|
|
77
|
+
set_if_nil(h, :foo)
|
|
78
|
+
assert h[:foo]
|
|
79
|
+
h[:bar] = false
|
|
80
|
+
set_if_nil(h, :bar)
|
|
81
|
+
assert !h[:bar]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_push_flag_true
|
|
85
|
+
fake_agent = mocked_object('agent_instance')
|
|
86
|
+
fake_agent.expects(:push_trace_execution_flag).with(true)
|
|
87
|
+
push_flag!(true)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_push_flag_false
|
|
91
|
+
self.expects(:agent_instance).never
|
|
92
|
+
push_flag!(false)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_pop_flag_true
|
|
96
|
+
fake_agent = mocked_object('agent_instance')
|
|
97
|
+
fake_agent.expects(:pop_trace_execution_flag)
|
|
98
|
+
pop_flag!(true)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_pop_flag_false
|
|
102
|
+
self.expects(:agent_instance).never
|
|
103
|
+
pop_flag!(false)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_log_errors_base
|
|
107
|
+
NewRelic::Control.instance.expects(:log).never
|
|
108
|
+
ran = false
|
|
109
|
+
log_errors("name", "metric") do
|
|
110
|
+
ran = true
|
|
111
|
+
end
|
|
112
|
+
assert ran, "should run the contents of the block"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def test_log_errors_with_return
|
|
116
|
+
NewRelic::Control.instance.expects(:log).never
|
|
117
|
+
ran = false
|
|
118
|
+
return_val = log_errors('name', 'metric') do
|
|
119
|
+
ran = true
|
|
120
|
+
'happy trees'
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
assert ran, "should run contents of block"
|
|
124
|
+
assert_equal 'happy trees', return_val, "should return contents of the block"
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def test_log_errors_with_error
|
|
128
|
+
fakelog = mock('log')
|
|
129
|
+
NewRelic::Control.instance.expects(:log).returns(fakelog).at_least_once
|
|
130
|
+
# normally I don't do this, but we really don't care what the
|
|
131
|
+
# backtrace looks like, beyond that it actually gets logged. Also,
|
|
132
|
+
# the mocks are reversed because apparently order matters.
|
|
133
|
+
fakelog.expects(:error).with(any_parameters)
|
|
134
|
+
fakelog.expects(:error).with("Caught exception in name. Metric name = metric, exception = should not propagate out of block")
|
|
135
|
+
|
|
136
|
+
log_errors("name", "metric") do
|
|
137
|
+
raise "should not propagate out of block"
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def test_trace_execution_scoped_header
|
|
142
|
+
options = {:force => false, :deduct_call_time_from_parent => false}
|
|
143
|
+
self.expects(:log_errors).with('trace_execution_scoped header', 'foo').yields
|
|
144
|
+
self.expects(:push_flag!).with(false)
|
|
145
|
+
fakestats = mocked_object('stat_engine')
|
|
146
|
+
fakestats.expects(:push_scope).with('foo', 1.0, false)
|
|
147
|
+
trace_execution_scoped_header('foo', options, 1.0)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def test_trace_execution_scoped_footer
|
|
151
|
+
t0 = 1.0
|
|
152
|
+
t1 = 2.0
|
|
153
|
+
metric = 'foo'
|
|
154
|
+
metric_stats = [mock('fakestat')]
|
|
155
|
+
metric_stats.first.expects(:trace_call).with(1.0, 0.5)
|
|
156
|
+
expected_scope = 'an expected scope'
|
|
157
|
+
engine = mocked_object('stat_engine')
|
|
158
|
+
scope = mock('scope')
|
|
159
|
+
engine.expects(:pop_scope).with('an expected scope', 1.0, 2.0).returns(scope)
|
|
160
|
+
scope.expects(:children_time).returns(0.5)
|
|
161
|
+
self.expects(:pop_flag!).with(false)
|
|
162
|
+
self.expects(:log_errors).with('trace_method_execution footer', 'foo').yields
|
|
163
|
+
|
|
164
|
+
trace_execution_scoped_footer(t0, metric, metric_stats, expected_scope, false, t1)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def test_trace_execution_scoped_disabled
|
|
168
|
+
self.expects(:trace_disabled?).returns(true)
|
|
169
|
+
# make sure the method doesn't beyond the abort
|
|
170
|
+
self.expects(:set_if_nil).never
|
|
171
|
+
ran = false
|
|
172
|
+
value = trace_execution_scoped(nil, {:options => 'hash'}) do
|
|
173
|
+
ran = true
|
|
174
|
+
1172
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
assert ran, 'should run contents of block'
|
|
178
|
+
assert_equal 1172, value, 'should return contents of block'
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def test_trace_execution_scoped_default
|
|
182
|
+
passed_in_opts = {}
|
|
183
|
+
opts_after_correction = {:metric => true, :deduct_call_time_from_parent => true}
|
|
184
|
+
self.expects(:trace_disabled?).returns(false)
|
|
185
|
+
self.expects(:get_metric_stats).with(['metric', 'array'], opts_after_correction).returns(['metric', ['stats']])
|
|
186
|
+
self.expects(:trace_execution_scoped_header).with('metric', opts_after_correction).returns(['start_time', 'expected_scope'])
|
|
187
|
+
self.expects(:trace_execution_scoped_footer).with('start_time', 'metric', ['stats'], 'expected_scope', nil)
|
|
188
|
+
ran = false
|
|
189
|
+
value = trace_execution_scoped(['metric', 'array'], passed_in_opts) do
|
|
190
|
+
ran = true
|
|
191
|
+
1172
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
assert ran, 'should run contents of the block'
|
|
195
|
+
assert_equal 1172, value, 'should return the contents of the block'
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def test_trace_execution_scoped_with_error
|
|
199
|
+
passed_in_opts = {}
|
|
200
|
+
opts_after_correction = {:metric => true, :deduct_call_time_from_parent => true}
|
|
201
|
+
self.expects(:trace_disabled?).returns(false)
|
|
202
|
+
self.expects(:get_metric_stats).with(['metric', 'array'], opts_after_correction).returns(['metric', ['stats']])
|
|
203
|
+
self.expects(:trace_execution_scoped_header).with('metric', opts_after_correction).returns(['start_time', 'expected_scope'])
|
|
204
|
+
self.expects(:trace_execution_scoped_footer).with('start_time', 'metric', ['stats'], 'expected_scope', nil)
|
|
205
|
+
ran = false
|
|
206
|
+
assert_raises(RuntimeError) do
|
|
207
|
+
trace_execution_scoped(['metric', 'array'], passed_in_opts) do
|
|
208
|
+
ran = true
|
|
209
|
+
raise 'raising a test error'
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
assert ran, 'should run contents of the block'
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
private
|
|
217
|
+
|
|
218
|
+
def mocked_object(name)
|
|
219
|
+
object = mock(name)
|
|
220
|
+
self.stubs(name).returns(object)
|
|
221
|
+
object
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def mocked_log
|
|
226
|
+
mocked_object('log')
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def mocked_control
|
|
231
|
+
mocked_object('control')
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
|
|
2
|
+
require 'new_relic/agent/mock_scope_listener'
|
|
3
|
+
|
|
4
|
+
class Module
|
|
5
|
+
def method_traced?(method_name, metric_name)
|
|
6
|
+
traced_method_prefix = _traced_method_name(method_name, metric_name)
|
|
7
|
+
|
|
8
|
+
method_defined? traced_method_prefix
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Insider
|
|
13
|
+
def initialize(stats_engine)
|
|
14
|
+
@stats_engine = stats_engine
|
|
15
|
+
end
|
|
16
|
+
def catcher(level=0)
|
|
17
|
+
thrower(level) if level>0
|
|
18
|
+
end
|
|
19
|
+
def thrower(level)
|
|
20
|
+
if level == 0
|
|
21
|
+
# don't use a real sampler because we can't instantiate one
|
|
22
|
+
# sampler = NewRelic::Agent::TransactionSampler.new(NewRelic::Agent.instance)
|
|
23
|
+
sampler = "<none>"
|
|
24
|
+
begin
|
|
25
|
+
@stats_engine.transaction_sampler = sampler
|
|
26
|
+
fail "This should not have worked."
|
|
27
|
+
rescue; end
|
|
28
|
+
else
|
|
29
|
+
thrower(level-1)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
module NewRelic
|
|
35
|
+
module Agent
|
|
36
|
+
extend self
|
|
37
|
+
def module_method_to_be_traced (x, testcase)
|
|
38
|
+
testcase.assert x == "x"
|
|
39
|
+
testcase.assert testcase.stats_engine.peek_scope.name == "x"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
module TestModuleWithLog
|
|
45
|
+
extend self
|
|
46
|
+
def other_method
|
|
47
|
+
#just here to be traced
|
|
48
|
+
log "12345"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def log( msg )
|
|
52
|
+
msg
|
|
53
|
+
end
|
|
54
|
+
include NewRelic::Agent::MethodTracer
|
|
55
|
+
add_method_tracer :other_method, 'Custom/foo/bar'
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
class NewRelic::Agent::MethodTracerTest < Test::Unit::TestCase
|
|
59
|
+
attr_reader :stats_engine
|
|
60
|
+
|
|
61
|
+
def setup
|
|
62
|
+
NewRelic::Agent.manual_start
|
|
63
|
+
@stats_engine = NewRelic::Agent.instance.stats_engine
|
|
64
|
+
@stats_engine.clear_stats
|
|
65
|
+
@scope_listener = NewRelic::Agent::MockScopeListener.new
|
|
66
|
+
@old_sampler = NewRelic::Agent.instance.transaction_sampler
|
|
67
|
+
@stats_engine.transaction_sampler = @scope_listener
|
|
68
|
+
super
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def teardown
|
|
72
|
+
@stats_engine.transaction_sampler = @old_sampler
|
|
73
|
+
@stats_engine.clear_stats
|
|
74
|
+
begin
|
|
75
|
+
self.class.remove_method_tracer :method_to_be_traced, @metric_name if @metric_name
|
|
76
|
+
rescue RuntimeError
|
|
77
|
+
# ignore 'no tracer' errors from remove method tracer
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
@metric_name = nil
|
|
81
|
+
super
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_preserve_logging
|
|
85
|
+
assert_equal '12345', TestModuleWithLog.other_method
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def test_basic
|
|
89
|
+
metric = "hello"
|
|
90
|
+
t1 = Time.now
|
|
91
|
+
self.class.trace_execution_scoped metric do
|
|
92
|
+
sleep 0.05
|
|
93
|
+
assert metric == @stats_engine.peek_scope.name
|
|
94
|
+
end
|
|
95
|
+
elapsed = Time.now - t1
|
|
96
|
+
|
|
97
|
+
stats = @stats_engine.get_stats(metric)
|
|
98
|
+
check_time stats.total_call_time, elapsed
|
|
99
|
+
assert stats.call_count == 1
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def test_basic__original_api
|
|
103
|
+
metric = "hello"
|
|
104
|
+
t1 = Time.now
|
|
105
|
+
self.class.trace_method_execution metric, true, true, true do
|
|
106
|
+
sleep 0.05
|
|
107
|
+
assert metric == @stats_engine.peek_scope.name
|
|
108
|
+
end
|
|
109
|
+
elapsed = Time.now - t1
|
|
110
|
+
|
|
111
|
+
stats = @stats_engine.get_stats(metric)
|
|
112
|
+
check_time stats.total_call_time, elapsed
|
|
113
|
+
assert stats.call_count == 1
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
METRIC = "metric"
|
|
117
|
+
def test_add_method_tracer
|
|
118
|
+
@metric_name = METRIC
|
|
119
|
+
self.class.add_method_tracer :method_to_be_traced, METRIC
|
|
120
|
+
|
|
121
|
+
t1 = Time.now
|
|
122
|
+
method_to_be_traced 1,2,3,true,METRIC
|
|
123
|
+
elapsed = Time.now - t1
|
|
124
|
+
|
|
125
|
+
begin
|
|
126
|
+
self.class.remove_method_tracer :method_to_be_traced, METRIC
|
|
127
|
+
rescue RuntimeError
|
|
128
|
+
# ignore 'no tracer' errors from remove method tracer
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
stats = @stats_engine.get_stats(METRIC)
|
|
133
|
+
check_time stats.total_call_time, elapsed
|
|
134
|
+
assert stats.call_count == 1
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def test_add_method_tracer__default
|
|
138
|
+
self.class.add_method_tracer :simple_method
|
|
139
|
+
|
|
140
|
+
simple_method
|
|
141
|
+
|
|
142
|
+
stats = @stats_engine.get_stats("Custom/#{self.class.name}/simple_method")
|
|
143
|
+
assert stats.call_count == 1
|
|
144
|
+
|
|
145
|
+
end
|
|
146
|
+
def test_add_method_tracer__reentry
|
|
147
|
+
self.class.add_method_tracer :simple_method
|
|
148
|
+
self.class.add_method_tracer :simple_method
|
|
149
|
+
self.class.add_method_tracer :simple_method
|
|
150
|
+
|
|
151
|
+
simple_method
|
|
152
|
+
|
|
153
|
+
stats = @stats_engine.get_stats("Custom/#{self.class.name}/simple_method")
|
|
154
|
+
assert stats.call_count == 1
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def test_method_traced?
|
|
158
|
+
assert !self.class.method_traced?(:method_to_be_traced, METRIC)
|
|
159
|
+
self.class.add_method_tracer :method_to_be_traced, METRIC
|
|
160
|
+
assert self.class.method_traced?(:method_to_be_traced, METRIC)
|
|
161
|
+
begin
|
|
162
|
+
self.class.remove_method_tracer :method_to_be_traced, METRIC
|
|
163
|
+
rescue RuntimeError
|
|
164
|
+
# ignore 'no tracer' errors from remove method tracer
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def test_tt_only
|
|
169
|
+
|
|
170
|
+
assert_nil @scope_listener.scope["c2"]
|
|
171
|
+
self.class.add_method_tracer :method_c1, "c1", :push_scope => true
|
|
172
|
+
|
|
173
|
+
self.class.add_method_tracer :method_c2, "c2", :metric => false
|
|
174
|
+
self.class.add_method_tracer :method_c3, "c3", :push_scope => false
|
|
175
|
+
|
|
176
|
+
method_c1
|
|
177
|
+
|
|
178
|
+
assert_not_nil @stats_engine.lookup_stats("c1")
|
|
179
|
+
assert_nil @stats_engine.lookup_stats("c2")
|
|
180
|
+
assert_not_nil @stats_engine.lookup_stats("c3")
|
|
181
|
+
|
|
182
|
+
assert_not_nil @scope_listener.scope["c2"]
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def test_nested_scope_tracer
|
|
186
|
+
Insider.add_method_tracer :catcher, "catcher", :push_scope => true
|
|
187
|
+
Insider.add_method_tracer :thrower, "thrower", :push_scope => true
|
|
188
|
+
sampler = NewRelic::Agent.instance.transaction_sampler
|
|
189
|
+
mock = Insider.new(@stats_engine)
|
|
190
|
+
mock.catcher(0)
|
|
191
|
+
mock.catcher(5)
|
|
192
|
+
stats = @stats_engine.get_stats("catcher")
|
|
193
|
+
assert_equal 2, stats.call_count
|
|
194
|
+
stats = @stats_engine.get_stats("thrower")
|
|
195
|
+
assert_equal 6, stats.call_count
|
|
196
|
+
sample = sampler.harvest
|
|
197
|
+
assert_not_nil sample
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def test_add_same_tracer_twice
|
|
201
|
+
@metric_name = METRIC
|
|
202
|
+
self.class.add_method_tracer :method_to_be_traced, METRIC
|
|
203
|
+
self.class.add_method_tracer :method_to_be_traced, METRIC
|
|
204
|
+
|
|
205
|
+
t1 = Time.now
|
|
206
|
+
method_to_be_traced 1,2,3,true,METRIC
|
|
207
|
+
elapsed = Time.now - t1
|
|
208
|
+
|
|
209
|
+
begin
|
|
210
|
+
self.class.remove_method_tracer :method_to_be_traced, METRIC
|
|
211
|
+
rescue RuntimeError
|
|
212
|
+
# ignore 'no tracer' errors from remove method tracer
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
stats = @stats_engine.get_stats(METRIC)
|
|
216
|
+
check_time stats.total_call_time, elapsed
|
|
217
|
+
assert stats.call_count == 1
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def test_add_tracer_with_dynamic_metric
|
|
221
|
+
metric_code = '#{args[0]}.#{args[1]}'
|
|
222
|
+
@metric_name = metric_code
|
|
223
|
+
expected_metric = "1.2"
|
|
224
|
+
self.class.add_method_tracer :method_to_be_traced, metric_code
|
|
225
|
+
|
|
226
|
+
t1 = Time.now
|
|
227
|
+
method_to_be_traced 1,2,3,true,expected_metric
|
|
228
|
+
elapsed = Time.now - t1
|
|
229
|
+
|
|
230
|
+
begin
|
|
231
|
+
self.class.remove_method_tracer :method_to_be_traced, metric_code
|
|
232
|
+
rescue RuntimeError
|
|
233
|
+
# ignore 'no tracer' errors from remove method tracer
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
stats = @stats_engine.get_stats(expected_metric)
|
|
237
|
+
check_time stats.total_call_time, elapsed
|
|
238
|
+
assert stats.call_count == 1
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def test_trace_method_with_block
|
|
242
|
+
self.class.add_method_tracer :method_with_block, METRIC
|
|
243
|
+
|
|
244
|
+
t1 = Time.now
|
|
245
|
+
method_with_block(1,2,3,true,METRIC) do |scope|
|
|
246
|
+
assert scope == METRIC
|
|
247
|
+
end
|
|
248
|
+
elapsed = Time.now - t1
|
|
249
|
+
|
|
250
|
+
stats = @stats_engine.get_stats(METRIC)
|
|
251
|
+
check_time stats.total_call_time, elapsed
|
|
252
|
+
assert stats.call_count == 1
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def test_trace_module_method
|
|
256
|
+
NewRelic::Agent.add_method_tracer :module_method_to_be_traced, '#{args[0]}'
|
|
257
|
+
NewRelic::Agent.module_method_to_be_traced "x", self
|
|
258
|
+
NewRelic::Agent.remove_method_tracer :module_method_to_be_traced, '#{args[0]}'
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def test_remove
|
|
262
|
+
self.class.add_method_tracer :method_to_be_traced, METRIC
|
|
263
|
+
self.class.remove_method_tracer :method_to_be_traced, METRIC
|
|
264
|
+
|
|
265
|
+
t1 = Time.now
|
|
266
|
+
method_to_be_traced 1,2,3,false,METRIC
|
|
267
|
+
elapsed = Time.now - t1
|
|
268
|
+
|
|
269
|
+
stats = @stats_engine.get_stats(METRIC)
|
|
270
|
+
assert stats.call_count == 0
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def self.static_method(x, testcase, is_traced)
|
|
274
|
+
testcase.assert x == "x"
|
|
275
|
+
testcase.assert((testcase.stats_engine.peek_scope.name == "x") == is_traced)
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def trace_trace_static_method
|
|
279
|
+
self.add_method_tracer :static_method, '#{args[0]}'
|
|
280
|
+
self.class.static_method "x", self, true
|
|
281
|
+
self.remove_method_tracer :static_method, '#{args[0]}'
|
|
282
|
+
self.class.static_method "x", self, false
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def test_multiple_metrics__scoped
|
|
286
|
+
metrics = %w[first second third]
|
|
287
|
+
self.class.trace_execution_scoped metrics do
|
|
288
|
+
sleep 0.05
|
|
289
|
+
end
|
|
290
|
+
elapsed = @stats_engine.get_stats('first').average_call_time
|
|
291
|
+
metrics.map{|name| @stats_engine.get_stats name}.each do | m |
|
|
292
|
+
assert_equal 1, m.call_count
|
|
293
|
+
assert_equal elapsed, m.total_call_time
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
def test_multiple_metrics__unscoped
|
|
297
|
+
metrics = %w[first second third]
|
|
298
|
+
self.class.trace_execution_unscoped metrics do
|
|
299
|
+
sleep 0.05
|
|
300
|
+
end
|
|
301
|
+
elapsed = @stats_engine.get_stats('first').average_call_time
|
|
302
|
+
metrics.map{|name| @stats_engine.get_stats name}.each do | m |
|
|
303
|
+
assert_equal 1, m.call_count
|
|
304
|
+
assert_equal elapsed, m.total_call_time
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
def test_exception
|
|
308
|
+
begin
|
|
309
|
+
metric = "hey"
|
|
310
|
+
self.class.trace_execution_scoped metric do
|
|
311
|
+
assert @stats_engine.peek_scope.name == metric
|
|
312
|
+
throw Exception.new
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
assert false # should never get here
|
|
316
|
+
rescue Exception
|
|
317
|
+
# make sure the scope gets popped
|
|
318
|
+
assert @stats_engine.peek_scope == nil
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
stats = @stats_engine.get_stats metric
|
|
322
|
+
assert stats.call_count == 1
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
def test_add_multiple_tracers
|
|
326
|
+
self.class.add_method_tracer :method_to_be_traced, 'X', :push_scope => false
|
|
327
|
+
method_to_be_traced 1,2,3,true,nil
|
|
328
|
+
self.class.add_method_tracer :method_to_be_traced, 'Y'
|
|
329
|
+
method_to_be_traced 1,2,3,true,'Y'
|
|
330
|
+
self.class.remove_method_tracer :method_to_be_traced, 'Y'
|
|
331
|
+
method_to_be_traced 1,2,3,true,nil
|
|
332
|
+
self.class.remove_method_tracer :method_to_be_traced, 'X'
|
|
333
|
+
method_to_be_traced 1,2,3,false,'X'
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def trace_no_push_scope
|
|
337
|
+
self.class.add_method_tracer :method_to_be_traced, 'X', :push_scope => false
|
|
338
|
+
method_to_be_traced 1,2,3,true,nil
|
|
339
|
+
self.class.remove_method_tracer :method_to_be_traced, 'X'
|
|
340
|
+
method_to_be_traced 1,2,3,false,'X'
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
def check_time(t1, t2)
|
|
344
|
+
assert_in_delta t2, t1, 0.05
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
# =======================================================
|
|
348
|
+
# test methods to be traced
|
|
349
|
+
def method_to_be_traced(x, y, z, is_traced, expected_metric)
|
|
350
|
+
sleep 0.01
|
|
351
|
+
assert x == 1
|
|
352
|
+
assert y == 2
|
|
353
|
+
assert z == 3
|
|
354
|
+
scope_name = @stats_engine.peek_scope ? @stats_engine.peek_scope.name : nil
|
|
355
|
+
if is_traced
|
|
356
|
+
assert_equal expected_metric, scope_name
|
|
357
|
+
else
|
|
358
|
+
assert_not_equal expected_metric, scope_name
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
def method_with_block(x, y, z, is_traced, expected_metric, &block)
|
|
363
|
+
sleep 0.01
|
|
364
|
+
assert x == 1
|
|
365
|
+
assert y == 2
|
|
366
|
+
assert z == 3
|
|
367
|
+
block.call(@stats_engine.peek_scope.name)
|
|
368
|
+
|
|
369
|
+
scope_name = @stats_engine.peek_scope ? @stats_engine.peek_scope.name : nil
|
|
370
|
+
assert((expected_metric == scope_name) == is_traced)
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
def method_c1
|
|
374
|
+
method_c2
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
def method_c2
|
|
378
|
+
method_c3
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
def method_c3
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
def simple_method
|
|
385
|
+
end
|
|
386
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
class NewRelic::Agent::MockScopeListener
|
|
3
|
+
|
|
4
|
+
attr_reader :scope
|
|
5
|
+
|
|
6
|
+
def initialize
|
|
7
|
+
@scope = {}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def notice_first_scope_push(time)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def notice_push_scope(scope, time)
|
|
14
|
+
@scope[scope] = true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def notice_pop_scope(scope, time)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def notice_scope_empty(time)
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|