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,172 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'test_helper'))
|
|
2
|
+
require 'new_relic/agent/instrumentation/metric_frame/pop'
|
|
3
|
+
class NewRelic::Agent::Instrumentation::MetricFrame::PopTest < Test::Unit::TestCase
|
|
4
|
+
include NewRelic::Agent::Instrumentation::MetricFrame::Pop
|
|
5
|
+
|
|
6
|
+
attr_reader :agent
|
|
7
|
+
attr_reader :transaction_sampler
|
|
8
|
+
attr_reader :sql_sampler
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
@agent = mock('agent')
|
|
12
|
+
@transaction_sampler = mock('transaction sampler')
|
|
13
|
+
@sql_sampler = mock('sql sampler')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def teardown
|
|
17
|
+
Thread.current[:newrelic_start_time] = nil
|
|
18
|
+
Thread.current[:newrelic_metric_frame] = nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_clear_thread_metric_frame
|
|
22
|
+
Thread.current[:newrelic_metric_frame] = 'whee'
|
|
23
|
+
clear_thread_metric_frame!
|
|
24
|
+
assert_equal nil, Thread.current[:newrelic_metric_frame], 'should nil out the thread var'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_set_new_scope
|
|
28
|
+
fakeagent = mock('agent')
|
|
29
|
+
self.expects(:agent).returns(fakeagent)
|
|
30
|
+
fakeengine = mock('stats_engine')
|
|
31
|
+
fakeagent.expects(:stats_engine).returns(fakeengine)
|
|
32
|
+
fakeengine.expects(:scope_name=).with('A METRIC')
|
|
33
|
+
|
|
34
|
+
set_new_scope!('A METRIC')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_log_underflow
|
|
38
|
+
NewRelic::Agent.logger.expects(:error).with(regexp_matches(/Underflow in metric frames: /))
|
|
39
|
+
log_underflow
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_notice_scope_empty
|
|
43
|
+
transaction_sampler.expects(:notice_scope_empty)
|
|
44
|
+
sql_sampler.expects(:notice_scope_empty)
|
|
45
|
+
notice_scope_empty
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_record_transaction_cpu_positive
|
|
49
|
+
self.expects(:cpu_burn).once.returns(1.0)
|
|
50
|
+
transaction_sampler.expects(:notice_transaction_cpu_time).with(1.0)
|
|
51
|
+
record_transaction_cpu
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_record_transaction_cpu_negative
|
|
55
|
+
self.expects(:cpu_burn).once.returns(nil)
|
|
56
|
+
# should not be called for the nil case
|
|
57
|
+
transaction_sampler.expects(:notice_transaction_cpu_time).never
|
|
58
|
+
record_transaction_cpu
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_normal_cpu_burn_positive
|
|
62
|
+
@process_cpu_start = 3
|
|
63
|
+
self.expects(:process_cpu).returns(4)
|
|
64
|
+
assert_equal 1, normal_cpu_burn
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_normal_cpu_burn_negative
|
|
68
|
+
@process_cpu_start = nil
|
|
69
|
+
self.expects(:process_cpu).never
|
|
70
|
+
assert_equal nil, normal_cpu_burn
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_jruby_cpu_burn_positive
|
|
74
|
+
@jruby_cpu_start = 3
|
|
75
|
+
self.expects(:jruby_cpu_time).returns(4)
|
|
76
|
+
self.expects(:record_jruby_cpu_burn).with(1)
|
|
77
|
+
assert_equal 1, jruby_cpu_burn
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_jruby_cpu_burn_negative
|
|
81
|
+
@jruby_cpu_start = nil
|
|
82
|
+
self.expects(:jruby_cpu_time).never
|
|
83
|
+
self.expects(:record_jruby_cpu_burn).never
|
|
84
|
+
assert_equal nil, jruby_cpu_burn
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def test_record_jruby_cpu_burn
|
|
88
|
+
NewRelic::Agent.get_stats_no_scope(NewRelic::Metrics::USER_TIME).expects(:record_data_point).with(1.0)
|
|
89
|
+
record_jruby_cpu_burn(1.0)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_cpu_burn_normal
|
|
93
|
+
self.expects(:normal_cpu_burn).returns(1)
|
|
94
|
+
self.expects(:jruby_cpu_burn).never
|
|
95
|
+
assert_equal 1, cpu_burn
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def test_cpu_burn_jruby
|
|
99
|
+
self.expects(:normal_cpu_burn).returns(nil)
|
|
100
|
+
self.expects(:jruby_cpu_burn).returns(2)
|
|
101
|
+
assert_equal 2, cpu_burn
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_end_transaction
|
|
105
|
+
fake_stats_engine = mock('stats engine')
|
|
106
|
+
agent.expects(:stats_engine).returns(fake_stats_engine)
|
|
107
|
+
fake_stats_engine.expects(:end_transaction)
|
|
108
|
+
end_transaction!
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def test_notify_transaction_sampler_true
|
|
112
|
+
self.expects(:record_transaction_cpu)
|
|
113
|
+
self.expects(:notice_scope_empty)
|
|
114
|
+
notify_transaction_sampler(true)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def test_notify_transaction_sampler_false
|
|
118
|
+
self.expects(:record_transaction_cpu)
|
|
119
|
+
self.expects(:notice_scope_empty)
|
|
120
|
+
notify_transaction_sampler(false)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def test_traced
|
|
124
|
+
NewRelic::Agent.expects(:is_execution_traced?)
|
|
125
|
+
traced?
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_handle_empty_path_stack_default
|
|
129
|
+
@path_stack = [] # it is empty
|
|
130
|
+
self.expects(:traced?).returns(true)
|
|
131
|
+
fakemetric = mock('metric')
|
|
132
|
+
fakemetric.expects(:is_web_transaction?).returns(true)
|
|
133
|
+
self.expects(:notify_transaction_sampler).with(true)
|
|
134
|
+
self.expects(:end_transaction!)
|
|
135
|
+
self.expects(:clear_thread_metric_frame!)
|
|
136
|
+
handle_empty_path_stack(fakemetric)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_handle_empty_path_stack_non_web
|
|
140
|
+
@path_stack = [] # it is empty
|
|
141
|
+
self.expects(:traced?).returns(true)
|
|
142
|
+
fakemetric = mock('metric')
|
|
143
|
+
fakemetric.expects(:is_web_transaction?).returns(false)
|
|
144
|
+
self.expects(:notify_transaction_sampler).with(false)
|
|
145
|
+
self.expects(:end_transaction!)
|
|
146
|
+
self.expects(:clear_thread_metric_frame!)
|
|
147
|
+
handle_empty_path_stack(fakemetric)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def test_handle_empty_path_stack_error
|
|
151
|
+
@path_stack = ['not empty']
|
|
152
|
+
assert_raise(RuntimeError) do
|
|
153
|
+
handle_empty_path_stack(mock('metric'))
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def test_handle_empty_path_stack_untraced
|
|
158
|
+
@path_stack = [] # it is empty
|
|
159
|
+
self.expects(:traced?).returns(false)
|
|
160
|
+
fakemetric = mock('metric')
|
|
161
|
+
fakemetric.expects(:is_web_transaction?).never
|
|
162
|
+
self.expects(:end_transaction!)
|
|
163
|
+
self.expects(:clear_thread_metric_frame!)
|
|
164
|
+
handle_empty_path_stack(fakemetric)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def test_current_stack_metric
|
|
168
|
+
self.expects(:metric_name)
|
|
169
|
+
current_stack_metric
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
|
|
2
|
+
|
|
3
|
+
class NewRelic::Agent::Instrumentation::MetricFrameTest < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
attr_reader :f
|
|
6
|
+
def setup
|
|
7
|
+
@f = NewRelic::Agent::Instrumentation::MetricFrame.new
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_request_parsing__none
|
|
11
|
+
assert_nil f.uri
|
|
12
|
+
assert_nil f.referer
|
|
13
|
+
end
|
|
14
|
+
def test_request_parsing__path
|
|
15
|
+
request = stub(:path => '/path?hello=bob#none')
|
|
16
|
+
f.request = request
|
|
17
|
+
assert_equal "/path", f.uri
|
|
18
|
+
end
|
|
19
|
+
def test_request_parsing__fullpath
|
|
20
|
+
request = stub(:fullpath => '/path?hello=bob#none')
|
|
21
|
+
f.request = request
|
|
22
|
+
assert_equal "/path", f.uri
|
|
23
|
+
end
|
|
24
|
+
def test_request_parsing__referer
|
|
25
|
+
request = stub(:referer => 'https://www.yahoo.com:8080/path/hello?bob=none&foo=bar')
|
|
26
|
+
f.request = request
|
|
27
|
+
assert_nil f.uri
|
|
28
|
+
assert_equal "https://www.yahoo.com:8080/path/hello", f.referer
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_request_parsing__uri
|
|
32
|
+
request = stub(:uri => 'http://creature.com/path?hello=bob#none', :referer => '/path/hello?bob=none&foo=bar')
|
|
33
|
+
f.request = request
|
|
34
|
+
assert_equal "/path", f.uri
|
|
35
|
+
assert_equal "/path/hello", f.referer
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_request_parsing__hostname_only
|
|
39
|
+
request = stub(:uri => 'http://creature.com')
|
|
40
|
+
f.request = request
|
|
41
|
+
assert_equal "/", f.uri
|
|
42
|
+
assert_nil f.referer
|
|
43
|
+
end
|
|
44
|
+
def test_request_parsing__slash
|
|
45
|
+
request = stub(:uri => 'http://creature.com/')
|
|
46
|
+
f.request = request
|
|
47
|
+
assert_equal "/", f.uri
|
|
48
|
+
assert_nil f.referer
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
unless ENV['FAST_TESTS']
|
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
|
|
3
|
+
|
|
4
|
+
class NewRelic::Agent::Instrumentation::NetInstrumentationTest < Test::Unit::TestCase
|
|
5
|
+
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
|
6
|
+
def setup
|
|
7
|
+
NewRelic::Agent.manual_start
|
|
8
|
+
@engine = NewRelic::Agent.instance.stats_engine
|
|
9
|
+
@engine.clear_stats
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def metrics_without_gc
|
|
13
|
+
@engine.metrics - ['GC/cumulative']
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private :metrics_without_gc
|
|
17
|
+
|
|
18
|
+
def test_get
|
|
19
|
+
url = URI.parse('http://www.google.com/index.html')
|
|
20
|
+
res = Net::HTTP.start(url.host, url.port) {|http|
|
|
21
|
+
http.get('/index.html')
|
|
22
|
+
}
|
|
23
|
+
assert_match /<head>/, res.body
|
|
24
|
+
assert_equal %w[External/all External/www.google.com/Net::HTTP/GET External/allOther External/www.google.com/all].sort,
|
|
25
|
+
metrics_without_gc.sort
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_background
|
|
29
|
+
perform_action_with_newrelic_trace("task", :category => :task) do
|
|
30
|
+
url = URI.parse('http://www.google.com/index.html')
|
|
31
|
+
res = Net::HTTP.start(url.host, url.port) {|http|
|
|
32
|
+
http.get('/index.html')
|
|
33
|
+
}
|
|
34
|
+
assert_match /<head>/, res.body
|
|
35
|
+
end
|
|
36
|
+
assert_equal %w[External/all External/www.google.com/Net::HTTP/GET External/allOther External/www.google.com/all
|
|
37
|
+
External/www.google.com/Net::HTTP/GET:OtherTransaction/Background/NewRelic::Agent::Instrumentation::NetInstrumentationTest/task].sort, metrics_without_gc.select{|m| m =~ /^External/}.sort
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_transactional
|
|
41
|
+
perform_action_with_newrelic_trace("task") do
|
|
42
|
+
url = URI.parse('http://www.google.com/index.html')
|
|
43
|
+
res = Net::HTTP.start(url.host, url.port) {|http|
|
|
44
|
+
http.get('/index.html')
|
|
45
|
+
}
|
|
46
|
+
assert_match /<head>/, res.body
|
|
47
|
+
end
|
|
48
|
+
assert_equal %w[External/all External/www.google.com/Net::HTTP/GET External/allWeb External/www.google.com/all
|
|
49
|
+
External/www.google.com/Net::HTTP/GET:Controller/NewRelic::Agent::Instrumentation::NetInstrumentationTest/task].sort, metrics_without_gc.select{|m| m =~ /^External/}.sort
|
|
50
|
+
end
|
|
51
|
+
def test_get__simple
|
|
52
|
+
Net::HTTP.get URI.parse('http://www.google.com/index.html')
|
|
53
|
+
assert_equal metrics_without_gc.sort,
|
|
54
|
+
%w[External/all External/www.google.com/Net::HTTP/GET External/allOther External/www.google.com/all].sort
|
|
55
|
+
end
|
|
56
|
+
def test_ignore
|
|
57
|
+
NewRelic::Agent.disable_all_tracing do
|
|
58
|
+
url = URI.parse('http://www.google.com/index.html')
|
|
59
|
+
res = Net::HTTP.start(url.host, url.port) {|http|
|
|
60
|
+
http.post('/index.html','data')
|
|
61
|
+
}
|
|
62
|
+
end
|
|
63
|
+
assert_equal 0, metrics_without_gc.size
|
|
64
|
+
end
|
|
65
|
+
def test_head
|
|
66
|
+
url = URI.parse('http://www.google.com/index.html')
|
|
67
|
+
res = Net::HTTP.start(url.host, url.port) {|http|
|
|
68
|
+
http.head('/index.html')
|
|
69
|
+
}
|
|
70
|
+
assert_equal %w[External/all External/www.google.com/Net::HTTP/HEAD External/allOther External/www.google.com/all].sort,
|
|
71
|
+
metrics_without_gc.sort
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_post
|
|
75
|
+
url = URI.parse('http://www.google.com/index.html')
|
|
76
|
+
res = Net::HTTP.start(url.host, url.port) {|http|
|
|
77
|
+
http.post('/index.html','data')
|
|
78
|
+
}
|
|
79
|
+
assert_equal %w[External/all External/www.google.com/Net::HTTP/POST External/allOther External/www.google.com/all].sort,
|
|
80
|
+
metrics_without_gc.sort
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper'))
|
|
2
|
+
class NewRelic::Agent::Instrumentation::QueueTimeTest < Test::Unit::TestCase
|
|
3
|
+
require 'new_relic/agent/instrumentation/queue_time'
|
|
4
|
+
include NewRelic::Agent::Instrumentation::QueueTime
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
NewRelic::Agent.instance.stats_engine.clear_stats
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def create_test_start_time(env)
|
|
11
|
+
env[APP_HEADER] = "t=#{convert_to_microseconds(Time.at(1002))}"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_parse_frontend_headers
|
|
15
|
+
middleware_start = Time.at(1002)
|
|
16
|
+
queue_start = Time.at(1001)
|
|
17
|
+
server_start = Time.at(1000)
|
|
18
|
+
Time.stubs(:now).returns(Time.at(1003)) # whee!
|
|
19
|
+
self.expects(:add_end_time_header).with(Time.at(1003), {:env => 'hash'})
|
|
20
|
+
# ordering is important here, unfortunately, the mocks don't
|
|
21
|
+
# support that kind of checking.
|
|
22
|
+
self.expects(:parse_middleware_time_from).with({:env => 'hash'}).returns(middleware_start)
|
|
23
|
+
self.expects(:parse_queue_time_from).with({:env => 'hash'}).returns(queue_start)
|
|
24
|
+
self.expects(:parse_server_time_from).with({:env => 'hash'}).returns(server_start)
|
|
25
|
+
assert_equal(server_start, parse_frontend_headers({:env => 'hash'}), "should return the oldest start time")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_parse_frontend_headers_should_return_earliest_start
|
|
29
|
+
middleware_start = Time.at(1002)
|
|
30
|
+
queue_start = Time.at(1000)
|
|
31
|
+
server_start = Time.at(1001)
|
|
32
|
+
Time.stubs(:now).returns(Time.at(1003)) # whee!
|
|
33
|
+
self.expects(:add_end_time_header).with(Time.at(1003), {:env => 'hash'})
|
|
34
|
+
# ordering is important here, unfortunately, the mocks don't
|
|
35
|
+
# support that kind of checking.
|
|
36
|
+
self.expects(:parse_middleware_time_from).with({:env => 'hash'}).returns(middleware_start)
|
|
37
|
+
self.expects(:parse_queue_time_from).with({:env => 'hash'}).returns(queue_start)
|
|
38
|
+
self.expects(:parse_server_time_from).with({:env => 'hash'}).returns(server_start)
|
|
39
|
+
assert_equal(queue_start, parse_frontend_headers({:env => 'hash'}), "should return the oldest start time")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_all_combined_frontend_headers
|
|
43
|
+
env = {}
|
|
44
|
+
env[MAIN_HEADER] = "t=#{convert_to_microseconds(Time.at(1000))}"
|
|
45
|
+
env[QUEUE_HEADER] = "t=#{convert_to_microseconds(Time.at(1001))}"
|
|
46
|
+
env[MIDDLEWARE_HEADER] = "t=#{convert_to_microseconds(Time.at(1002))}"
|
|
47
|
+
|
|
48
|
+
env[APP_HEADER] = "t=#{convert_to_microseconds(Time.at(1003))}"
|
|
49
|
+
|
|
50
|
+
assert_calls_metrics('WebFrontend/WebServer/all', 'WebFrontend/QueueTime', 'Middleware/all') do
|
|
51
|
+
assert_equal(Time.at(1002), parse_middleware_time_from(env))
|
|
52
|
+
assert_equal(Time.at(1001), parse_queue_time_from(env))
|
|
53
|
+
assert_equal(Time.at(1000), parse_server_time_from(env))
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
check_metric_time('WebFrontend/WebServer/all', 1.0, 0.001)
|
|
57
|
+
check_metric_time('WebFrontend/QueueTime', 1.0, 0.001)
|
|
58
|
+
check_metric_time('Middleware/all', 1.0, 0.001)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_combined_middleware_and_queue
|
|
62
|
+
env = {}
|
|
63
|
+
env[QUEUE_HEADER] = "t=#{convert_to_microseconds(Time.at(1000))}"
|
|
64
|
+
env[MIDDLEWARE_HEADER] = "t=#{convert_to_microseconds(Time.at(1001))}"
|
|
65
|
+
create_test_start_time(env)
|
|
66
|
+
|
|
67
|
+
assert_calls_metrics('Middleware/all', 'WebFrontend/QueueTime') do
|
|
68
|
+
parse_middleware_time_from(env)
|
|
69
|
+
assert_equal(Time.at(1000), parse_queue_time_from(env))
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
check_metric_time('Middleware/all', 1.0, 0.001)
|
|
73
|
+
check_metric_time('WebFrontend/QueueTime', 1.0, 0.001)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_combined_queue_and_server
|
|
77
|
+
env = {}
|
|
78
|
+
env[MAIN_HEADER] = "t=#{convert_to_microseconds(Time.at(1000))}"
|
|
79
|
+
env[QUEUE_HEADER] = "t=#{convert_to_microseconds(Time.at(1001))}"
|
|
80
|
+
create_test_start_time(env)
|
|
81
|
+
|
|
82
|
+
assert_calls_metrics('WebFrontend/WebServer/all', 'WebFrontend/QueueTime') do
|
|
83
|
+
assert_equal(Time.at(1001), parse_queue_time_from(env))
|
|
84
|
+
parse_server_time_from(env)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
check_metric_time('WebFrontend/WebServer/all', 1.0, 0.001)
|
|
88
|
+
check_metric_time('WebFrontend/QueueTime', 1.0, 0.001)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test_combined_middleware_and_server
|
|
92
|
+
env = {}
|
|
93
|
+
env[MAIN_HEADER] = "t=#{convert_to_microseconds(Time.at(1000))}"
|
|
94
|
+
env[MIDDLEWARE_HEADER] = "t=#{convert_to_microseconds(Time.at(1001))}"
|
|
95
|
+
create_test_start_time(env)
|
|
96
|
+
|
|
97
|
+
assert_calls_metrics('WebFrontend/WebServer/all', 'Middleware/all') do
|
|
98
|
+
parse_middleware_time_from(env)
|
|
99
|
+
parse_server_time_from(env)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
check_metric_time('WebFrontend/WebServer/all', 1.0, 0.001)
|
|
103
|
+
check_metric_time('Middleware/all', 1.0, 0.001)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# initial base case, a router and a static content server
|
|
107
|
+
def test_parse_server_time_from_initial
|
|
108
|
+
env = {}
|
|
109
|
+
create_test_start_time(env)
|
|
110
|
+
time1 = convert_to_microseconds(Time.at(1000))
|
|
111
|
+
time2 = convert_to_microseconds(Time.at(1001))
|
|
112
|
+
env['HTTP_X_REQUEST_START'] = "servera t=#{time1}, serverb t=#{time2}"
|
|
113
|
+
assert_calls_metrics('WebFrontend/WebServer/all', 'WebFrontend/WebServer/servera', 'WebFrontend/WebServer/serverb') do
|
|
114
|
+
parse_server_time_from(env)
|
|
115
|
+
end
|
|
116
|
+
check_metric_time('WebFrontend/WebServer/all', 2.0, 0.1)
|
|
117
|
+
check_metric_time('WebFrontend/WebServer/servera', 1.0, 0.1)
|
|
118
|
+
check_metric_time('WebFrontend/WebServer/serverb', 1.0, 0.1)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# test for backwards compatibility with old header
|
|
122
|
+
def test_parse_server_time_from_with_no_server_name
|
|
123
|
+
env = {'HTTP_X_REQUEST_START' => "t=#{convert_to_microseconds(Time.at(1001))}"}
|
|
124
|
+
create_test_start_time(env)
|
|
125
|
+
assert_calls_metrics('WebFrontend/WebServer/all') do
|
|
126
|
+
parse_server_time_from(env)
|
|
127
|
+
end
|
|
128
|
+
check_metric_time('WebFrontend/WebServer/all', 1.0, 0.1)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def test_parse_server_time_from_with_bad_header
|
|
132
|
+
env = {'HTTP_X_REQUEST_START' => 't=t=t=t='}
|
|
133
|
+
create_test_start_time(env)
|
|
134
|
+
assert_calls_metrics('WebFrontend/WebServer/all') do
|
|
135
|
+
parse_server_time_from(env)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_parse_server_time_from_with_no_header
|
|
140
|
+
assert_calls_metrics('WebFrontend/WebServer/all') do
|
|
141
|
+
parse_server_time_from({})
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def test_parse_middleware_time
|
|
146
|
+
env = {}
|
|
147
|
+
create_test_start_time(env)
|
|
148
|
+
time1 = convert_to_microseconds(Time.at(1000))
|
|
149
|
+
time2 = convert_to_microseconds(Time.at(1001))
|
|
150
|
+
|
|
151
|
+
env['HTTP_X_MIDDLEWARE_START'] = "base t=#{time1}, second t=#{time2}"
|
|
152
|
+
assert_calls_metrics('Middleware/all', 'Middleware/base', 'Middleware/second') do
|
|
153
|
+
parse_middleware_time_from(env)
|
|
154
|
+
end
|
|
155
|
+
check_metric_time('Middleware/all', 2.0, 0.1)
|
|
156
|
+
check_metric_time('Middleware/base', 1.0, 0.1)
|
|
157
|
+
check_metric_time('Middleware/second', 1.0, 0.1)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_parse_queue_time
|
|
161
|
+
env = {}
|
|
162
|
+
create_test_start_time(env)
|
|
163
|
+
time1 = convert_to_microseconds(Time.at(1000))
|
|
164
|
+
|
|
165
|
+
env['HTTP_X_QUEUE_START'] = "t=#{time1}"
|
|
166
|
+
assert_calls_metrics('WebFrontend/QueueTime') do
|
|
167
|
+
assert_equal(Time.at(1000), parse_queue_time_from(env))
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
check_metric_time('WebFrontend/QueueTime', 2.0, 0.1)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def test_check_for_alternate_queue_length
|
|
174
|
+
env = {}
|
|
175
|
+
create_test_start_time(env)
|
|
176
|
+
env['HTTP_X_QUEUE_TIME'] = '1000000'
|
|
177
|
+
assert_calls_metrics('WebFrontend/QueueTime') do
|
|
178
|
+
assert_equal(Time.at(1001), parse_queue_time_from(env))
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
check_metric_time('WebFrontend/QueueTime', 1.0, 0.001)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def test_check_for_alternate_queue_length_override
|
|
185
|
+
env = {}
|
|
186
|
+
create_test_start_time(env)
|
|
187
|
+
env['HTTP_X_QUEUE_START'] = 't=1' # obviously incorrect
|
|
188
|
+
env['HTTP_X_QUEUE_TIME'] = '1000000'
|
|
189
|
+
assert_calls_metrics('WebFrontend/QueueTime') do
|
|
190
|
+
assert_equal(Time.at(1001), parse_queue_time_from(env))
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# alternate queue should override normal header
|
|
194
|
+
check_metric_time('WebFrontend/QueueTime', 1.0, 0.001)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def test_check_for_heroku_queue_length
|
|
198
|
+
env = {}
|
|
199
|
+
create_test_start_time(env)
|
|
200
|
+
env['HTTP_X_HEROKU_QUEUE_WAIT_TIME'] = '1000'
|
|
201
|
+
assert_calls_metrics('WebFrontend/QueueTime') do
|
|
202
|
+
assert_equal(Time.at(1001), parse_queue_time_from(env))
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
check_metric_time('WebFrontend/QueueTime', 1.0, 0.001)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def test_check_for_heroku_queue_length_override
|
|
209
|
+
env = {}
|
|
210
|
+
create_test_start_time(env)
|
|
211
|
+
env['HTTP_X_QUEUE_TIME'] = '10000000' # ten MEEELION useconds
|
|
212
|
+
env['HTTP_X_HEROKU_QUEUE_WAIT_TIME'] = '1000'
|
|
213
|
+
assert_calls_metrics('WebFrontend/QueueTime') do
|
|
214
|
+
assert_equal(Time.at(1001), parse_queue_time_from(env))
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# heroku queue should override alternate queue
|
|
218
|
+
check_metric_time('WebFrontend/QueueTime', 1.0, 0.001)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# each server should be one second, and the total would be 2 seconds
|
|
222
|
+
def test_record_individual_server_stats
|
|
223
|
+
matches = [['foo', Time.at(1000)], ['bar', Time.at(1001)]]
|
|
224
|
+
assert_calls_metrics('WebFrontend/WebServer/foo', 'WebFrontend/WebServer/bar') do
|
|
225
|
+
record_individual_server_stats(Time.at(1002), matches)
|
|
226
|
+
end
|
|
227
|
+
check_metric_time('WebFrontend/WebServer/foo', 1.0, 0.1)
|
|
228
|
+
check_metric_time('WebFrontend/WebServer/bar', 1.0, 0.1)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def test_record_rollup_server_stat
|
|
232
|
+
assert_calls_metrics('WebFrontend/WebServer/all') do
|
|
233
|
+
record_rollup_server_stat(Time.at(1001), [['a', Time.at(1000)]])
|
|
234
|
+
end
|
|
235
|
+
check_metric_time('WebFrontend/WebServer/all', 1.0, 0.1)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def test_record_rollup_server_stat_no_data
|
|
239
|
+
assert_calls_metrics('WebFrontend/WebServer/all') do
|
|
240
|
+
record_rollup_server_stat(Time.at(1001), [])
|
|
241
|
+
end
|
|
242
|
+
check_metric_time('WebFrontend/WebServer/all', 0.0, 0.001)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def test_record_rollup_middleware_stat
|
|
246
|
+
assert_calls_metrics('Middleware/all') do
|
|
247
|
+
record_rollup_middleware_stat(Time.at(1001), [['a', Time.at(1000)]])
|
|
248
|
+
end
|
|
249
|
+
check_metric_time('Middleware/all', 1.0, 0.1)
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def test_record_rollup_middleware_stat_no_data
|
|
253
|
+
assert_calls_metrics('Middleware/all') do
|
|
254
|
+
record_rollup_middleware_stat(Time.at(1001), [])
|
|
255
|
+
end
|
|
256
|
+
check_metric_time('Middleware/all', 0.0, 0.001)
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def test_record_rollup_queue_stat
|
|
260
|
+
assert_calls_metrics('WebFrontend/QueueTime') do
|
|
261
|
+
record_rollup_queue_stat(Time.at(1001), [[nil, Time.at(1000)]])
|
|
262
|
+
end
|
|
263
|
+
check_metric_time('WebFrontend/QueueTime', 1.0, 0.1)
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
def test_record_rollup_queue_stat_no_data
|
|
267
|
+
assert_calls_metrics('WebFrontend/QueueTime') do
|
|
268
|
+
record_rollup_queue_stat(Time.at(1001), [])
|
|
269
|
+
end
|
|
270
|
+
check_metric_time('WebFrontend/QueueTime', 0.0, 0.001)
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
# check all the combinations to make sure that ordering doesn't
|
|
275
|
+
# affect the return value
|
|
276
|
+
def test_find_oldest_time
|
|
277
|
+
test_arrays = [
|
|
278
|
+
['a', Time.at(1000)],
|
|
279
|
+
['b', Time.at(1001)],
|
|
280
|
+
['c', Time.at(1002)],
|
|
281
|
+
['d', Time.at(1000)],
|
|
282
|
+
]
|
|
283
|
+
test_arrays = test_arrays.permutation
|
|
284
|
+
test_arrays.each do |test_array|
|
|
285
|
+
assert_equal find_oldest_time(test_array), Time.at(1000), "Should be the oldest time in the array"
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# trivial test but the method doesn't do much
|
|
290
|
+
def test_record_server_time_for
|
|
291
|
+
name = 'foo'
|
|
292
|
+
time = Time.at(1000)
|
|
293
|
+
start_time = Time.at(1001)
|
|
294
|
+
self.expects(:record_time_stat).with('WebFrontend/WebServer/foo', time, start_time)
|
|
295
|
+
record_server_time_for(name, time, start_time)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def test_record_time_stat
|
|
299
|
+
assert_calls_metrics('WebFrontend/WebServer/foo') do
|
|
300
|
+
record_time_stat('WebFrontend/WebServer/foo', Time.at(1000), Time.at(1001))
|
|
301
|
+
end
|
|
302
|
+
check_metric_time('WebFrontend/WebServer/foo', 1.0, 0.1)
|
|
303
|
+
assert_raises(RuntimeError) do
|
|
304
|
+
record_time_stat('foo', Time.at(1001), Time.at(1000))
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
def test_record_time_stat_with_end_after_start
|
|
309
|
+
record_time_stat('WebFrontend/WebServer/foo', 2, 1)
|
|
310
|
+
rescue RuntimeError => e
|
|
311
|
+
assert_equal("should not provide an end time less than start time: 1 is less than 2", e.message)
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
def test_convert_to_microseconds
|
|
315
|
+
assert_equal((1_000_000_000), convert_to_microseconds(Time.at(1000)), 'time at 1000 seconds past epoch should be 1,000,000,000 usec')
|
|
316
|
+
assert_equal 1_000_000_000, convert_to_microseconds(1_000_000_000), 'should not mess with a number if passed in'
|
|
317
|
+
assert_raises(TypeError) do
|
|
318
|
+
convert_to_microseconds('whoo yeah buddy')
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def test_convert_from_microseconds
|
|
323
|
+
assert_equal Time.at(1000), convert_from_microseconds(1_000_000_000), 'time at 1,000,000,000 usec should be 1000 seconds after epoch'
|
|
324
|
+
assert_equal Time.at(1000), convert_from_microseconds(Time.at(1000)), 'should not mess with a time passed in'
|
|
325
|
+
assert_raises(TypeError) do
|
|
326
|
+
convert_from_microseconds('10000000000')
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def test_add_end_time_header
|
|
331
|
+
env = {}
|
|
332
|
+
start_time = Time.at(1)
|
|
333
|
+
add_end_time_header(start_time, env)
|
|
334
|
+
assert_equal({'HTTP_X_APPLICATION_START' => "t=#{convert_to_microseconds(Time.at(1))}"}, env, "should add the header to the env hash")
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
def test_parse_end_time_base
|
|
338
|
+
env = {}
|
|
339
|
+
env['HTTP_X_APPLICATION_START'] = "t=#{convert_to_microseconds(Time.at(1))}"
|
|
340
|
+
start_time = parse_end_time(env)
|
|
341
|
+
assert_equal(Time.at(1), start_time, "should pull the correct start time from the app header")
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def test_get_matches_from_header
|
|
345
|
+
env = {'A HEADER' => 't=1000000'}
|
|
346
|
+
self.expects(:convert_from_microseconds).with(1000000).returns(Time.at(1))
|
|
347
|
+
matches = get_matches_from_header('A HEADER', env)
|
|
348
|
+
assert_equal [[nil, Time.at(1)]], matches, "should pull the correct time from the string"
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def test_convert_to_name_time_pair
|
|
352
|
+
name = :foo
|
|
353
|
+
time = "1000000"
|
|
354
|
+
|
|
355
|
+
pair = convert_to_name_time_pair(name, time)
|
|
356
|
+
assert_equal [:foo, Time.at(1)], pair
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def test_get_matches
|
|
360
|
+
str = "servera t=1000000, serverb t=1000000"
|
|
361
|
+
matches = get_matches(str) # start a fire
|
|
362
|
+
assert_equal [['servera', '1000000'], ['serverb', '1000000']], matches
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
def test_matches_with_bad_data
|
|
366
|
+
str = "stephan is a dumb lol"
|
|
367
|
+
matches = get_matches(str)
|
|
368
|
+
assert_equal [], matches
|
|
369
|
+
|
|
370
|
+
str = "t=100"
|
|
371
|
+
matches = get_matches(str)
|
|
372
|
+
assert_equal [[nil, '100']], matches
|
|
373
|
+
|
|
374
|
+
str = nil
|
|
375
|
+
matches = get_matches(str)
|
|
376
|
+
assert_equal [], matches
|
|
377
|
+
end
|
|
378
|
+
# each server should be one second, and the total would be 2 seconds
|
|
379
|
+
def test_record_individual_middleware_stats
|
|
380
|
+
matches = [['foo', Time.at(1000)], ['bar', Time.at(1001)]]
|
|
381
|
+
assert_calls_metrics('Middleware/foo', 'Middleware/bar') do
|
|
382
|
+
record_individual_middleware_stats(Time.at(1002), matches)
|
|
383
|
+
end
|
|
384
|
+
check_metric_time('Middleware/foo', 1.0, 0.1)
|
|
385
|
+
check_metric_time('Middleware/bar', 1.0, 0.1)
|
|
386
|
+
end
|
|
387
|
+
end
|