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,278 @@
|
|
|
1
|
+
ENV['SKIP_RAILS'] = 'true'
|
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
|
|
3
|
+
require "new_relic/agent/browser_monitoring"
|
|
4
|
+
|
|
5
|
+
class NewRelic::Agent::BrowserMonitoringTest < Test::Unit::TestCase
|
|
6
|
+
include NewRelic::Agent::BrowserMonitoring
|
|
7
|
+
|
|
8
|
+
def setup
|
|
9
|
+
NewRelic::Agent.manual_start
|
|
10
|
+
@browser_monitoring_key = "fred"
|
|
11
|
+
@episodes_file = "this_is_my_file"
|
|
12
|
+
NewRelic::Agent.instance.instance_eval do
|
|
13
|
+
@beacon_configuration = NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => true, "browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"})
|
|
14
|
+
end
|
|
15
|
+
Thread.current[:newrelic_most_recent_transaction] = "MyCoolTransaction"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def teardown
|
|
19
|
+
mocha_teardown
|
|
20
|
+
Thread.current[:newrelic_start_time] = nil
|
|
21
|
+
Thread.current[:newrelic_metric_frame] = nil
|
|
22
|
+
Thread.current[:newrelic_most_recent_transaction] = nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_browser_timing_header_with_no_beacon_configuration
|
|
26
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).returns( nil)
|
|
27
|
+
header = browser_timing_header
|
|
28
|
+
assert_equal "", header
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_browser_timing_header
|
|
32
|
+
header = browser_timing_header
|
|
33
|
+
assert_equal "<script type=\"text/javascript\">var NREUMQ=NREUMQ||[];NREUMQ.push([\"mark\",\"firstbyte\",new Date().getTime()]);</script>", header
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_browser_timing_header_with_rum_enabled_not_specified
|
|
37
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).at_least_once.returns( NewRelic::Agent::BeaconConfiguration.new({"browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
|
|
38
|
+
header = browser_timing_header
|
|
39
|
+
assert_equal "<script type=\"text/javascript\">var NREUMQ=NREUMQ||[];NREUMQ.push([\"mark\",\"firstbyte\",new Date().getTime()]);</script>", header
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_browser_timing_header_with_rum_enabled_false
|
|
43
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).twice.returns( NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => false, "browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
|
|
44
|
+
header = browser_timing_header
|
|
45
|
+
assert_equal "", header
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_browser_timing_header_disable_all_tracing
|
|
49
|
+
header = nil
|
|
50
|
+
NewRelic::Agent.disable_all_tracing do
|
|
51
|
+
header = browser_timing_header
|
|
52
|
+
end
|
|
53
|
+
assert_equal "", header
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_browser_timing_header_disable_transaction_tracing
|
|
57
|
+
header = nil
|
|
58
|
+
NewRelic::Agent.disable_transaction_tracing do
|
|
59
|
+
header = browser_timing_header
|
|
60
|
+
end
|
|
61
|
+
assert_equal "", header
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_browser_timing_footer
|
|
65
|
+
browser_timing_header
|
|
66
|
+
NewRelic::Control.instance.expects(:license_key).returns("a" * 13)
|
|
67
|
+
|
|
68
|
+
Thread.current[:newrelic_start_time] = Time.now
|
|
69
|
+
|
|
70
|
+
footer = browser_timing_footer
|
|
71
|
+
snippet = '<script type="text/javascript">if (!NREUMQ.f) { NREUMQ.f=function() {
|
|
72
|
+
NREUMQ.push(["load",new Date().getTime()]);
|
|
73
|
+
var e=document.createElement("script");'
|
|
74
|
+
assert footer.include?(snippet), "Expected footer to include snippet: #{snippet}, but instead was #{footer}"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_browser_timing_footer_without_calling_header
|
|
78
|
+
Thread.current[:newrelic_start_time] = nil
|
|
79
|
+
assert_equal "", browser_timing_footer
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_browser_timing_footer_with_no_browser_key_rum_enabled
|
|
83
|
+
browser_timing_header
|
|
84
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => true, "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
|
|
85
|
+
footer = browser_timing_footer
|
|
86
|
+
assert_equal "", footer
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_browser_timing_footer_with_no_browser_key_rum_disabled
|
|
90
|
+
browser_timing_header
|
|
91
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => false, "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
|
|
92
|
+
footer = browser_timing_footer
|
|
93
|
+
assert_equal "", footer
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_browser_timing_footer_with_rum_enabled_not_specified
|
|
97
|
+
browser_timing_header
|
|
98
|
+
Thread.current[:newrelic_start_time] = Time.now
|
|
99
|
+
|
|
100
|
+
license_bytes = [];
|
|
101
|
+
("a" * 13).each_byte {|byte| license_bytes << byte}
|
|
102
|
+
config = NewRelic::Agent::BeaconConfiguration.new({"browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file", "license_bytes" => license_bytes})
|
|
103
|
+
config.expects(:license_bytes).returns(license_bytes).at_least_once
|
|
104
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).returns(config).at_least_once
|
|
105
|
+
footer = browser_timing_footer
|
|
106
|
+
beginning_snippet = '<script type="text/javascript">if (!NREUMQ.f) { NREUMQ.f=function() {
|
|
107
|
+
NREUMQ.push(["load",new Date().getTime()]);
|
|
108
|
+
var e=document.createElement("script");'
|
|
109
|
+
ending_snippet = "])</script>"
|
|
110
|
+
assert(footer.include?(beginning_snippet), "expected footer to include beginning snippet: #{beginning_snippet}, but was #{footer}")
|
|
111
|
+
assert(footer.include?(ending_snippet), "expected footer to include ending snippet: #{ending_snippet}, but was #{footer}")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_browser_timing_footer_with_no_beacon_configuration
|
|
115
|
+
browser_timing_header
|
|
116
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).returns( nil)
|
|
117
|
+
footer = browser_timing_footer
|
|
118
|
+
assert_equal "", footer
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def test_browser_timing_footer_with_no_start_time
|
|
122
|
+
browser_timing_header
|
|
123
|
+
Thread.current[:newrelic_start_time] = nil
|
|
124
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new({"browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
|
|
125
|
+
footer = browser_timing_footer
|
|
126
|
+
assert_equal('', footer)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def test_browser_timing_footer_disable_all_tracing
|
|
131
|
+
browser_timing_header
|
|
132
|
+
footer = nil
|
|
133
|
+
NewRelic::Agent.disable_all_tracing do
|
|
134
|
+
footer = browser_timing_footer
|
|
135
|
+
end
|
|
136
|
+
assert_equal "", footer
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_browser_timing_footer_disable_transaction_tracing
|
|
140
|
+
browser_timing_header
|
|
141
|
+
footer = nil
|
|
142
|
+
NewRelic::Agent.disable_transaction_tracing do
|
|
143
|
+
footer = browser_timing_footer
|
|
144
|
+
end
|
|
145
|
+
assert_equal "", footer
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_browser_timing_footer_browser_monitoring_key_missing
|
|
149
|
+
fake_config = mock('beacon configuration')
|
|
150
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).returns(fake_config)
|
|
151
|
+
fake_config.expects(:nil?).returns(false)
|
|
152
|
+
fake_config.expects(:rum_enabled).returns(true)
|
|
153
|
+
fake_config.expects(:browser_monitoring_key).returns(nil)
|
|
154
|
+
self.expects(:generate_footer_js).never
|
|
155
|
+
assert_equal('', browser_timing_footer, "should not return a footer when there is no key")
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def test_generate_footer_js_null_case
|
|
159
|
+
self.expects(:browser_monitoring_start_time).returns(nil)
|
|
160
|
+
assert_equal('', generate_footer_js, "should not send javascript when there is no start time")
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def test_generate_footer_js_with_start_time
|
|
164
|
+
self.expects(:browser_monitoring_start_time).returns(Time.at(100))
|
|
165
|
+
fake_bc = mock('beacon configuration')
|
|
166
|
+
fake_bc.expects(:application_id).returns(1)
|
|
167
|
+
fake_bc.expects(:beacon).returns('beacon')
|
|
168
|
+
fake_bc.expects(:browser_monitoring_key).returns('a' * 40)
|
|
169
|
+
NewRelic::Agent.instance.expects(:beacon_configuration).returns(fake_bc)
|
|
170
|
+
self.expects(:footer_js_string).with('beacon', 'a' * 40, 1).returns('footer js')
|
|
171
|
+
assert_equal('footer js', generate_footer_js, 'should generate and return the footer JS when there is a start time')
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def test_browser_monitoring_transaction_name_basic
|
|
175
|
+
Thread.current[:newrelic_most_recent_transaction] = 'a transaction name'
|
|
176
|
+
assert_equal('a transaction name', browser_monitoring_transaction_name, "should take the value from the thread local")
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def test_browser_monitoring_transaction_name_empty
|
|
180
|
+
Thread.current[:newrelic_most_recent_transaction] = ''
|
|
181
|
+
assert_equal('', browser_monitoring_transaction_name, "should take the value even when it is empty")
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def test_browser_monitoring_transaction_name_nil
|
|
185
|
+
Thread.current[:newrelic_most_recent_transaction] = nil
|
|
186
|
+
assert_equal('<unknown>', browser_monitoring_transaction_name, "should fill in a default when it is nil")
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def test_browser_monitoring_start_time
|
|
190
|
+
Thread.current[:newrelic_start_time] = Time.at(100)
|
|
191
|
+
assert_equal(Time.at(100), browser_monitoring_start_time, "should take the value from the thread local")
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def test_clamp_to_positive
|
|
195
|
+
assert_equal(0.0, clamp_to_positive(-1), "should clamp a negative value to zero")
|
|
196
|
+
assert_equal(1232, clamp_to_positive(1232), "should pass through the value when it is positive")
|
|
197
|
+
assert_equal(0, clamp_to_positive(0), "should not mess with zero when passing it through")
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def test_browser_monitoring_app_time_nonzero
|
|
201
|
+
start = Time.now
|
|
202
|
+
self.expects(:browser_monitoring_start_time).returns(start - 1)
|
|
203
|
+
Time.expects(:now).returns(start)
|
|
204
|
+
assert_equal(1000, browser_monitoring_app_time, 'should return a rounded time')
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def test_browser_monitoring_queue_time_nil
|
|
208
|
+
Thread.current[:newrelic_queue_time] = nil
|
|
209
|
+
assert_equal(0.0, browser_monitoring_queue_time, 'should return zero when there is no queue time')
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def test_browser_monitoring_queue_time_zero
|
|
213
|
+
Thread.current[:newrelic_queue_time] = 0.0
|
|
214
|
+
assert_equal(0.0, browser_monitoring_queue_time, 'should return zero when there is zero queue time')
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def test_browser_monitoring_queue_time_ducks
|
|
218
|
+
Thread.current[:newrelic_queue_time] = 'a duck'
|
|
219
|
+
assert_equal(0.0, browser_monitoring_queue_time, 'should return zero when there is an incorrect queue time')
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def test_browser_monitoring_queue_time_nonzero
|
|
223
|
+
Thread.current[:newrelic_queue_time] = 3.00002
|
|
224
|
+
assert_equal(3000, browser_monitoring_queue_time, 'should return a rounded time')
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def test_footer_js_string_basic
|
|
228
|
+
beacon = ''
|
|
229
|
+
license_key = ''
|
|
230
|
+
application_id = 1
|
|
231
|
+
|
|
232
|
+
Thread.current[:newrelic_queue_time] = nil
|
|
233
|
+
# mocking this because JRuby thinks that Time.now - Time.now
|
|
234
|
+
# always takes at least 1ms
|
|
235
|
+
self.expects(:browser_monitoring_app_time).returns(0)
|
|
236
|
+
Thread.current[:newrelic_most_recent_transaction] = 'most recent transaction'
|
|
237
|
+
|
|
238
|
+
self.expects(:obfuscate).with('most recent transaction').returns('most recent transaction')
|
|
239
|
+
|
|
240
|
+
value = footer_js_string(beacon, license_key, application_id)
|
|
241
|
+
assert_equal("<script type=\"text/javascript\">if (!NREUMQ.f) { NREUMQ.f=function() {\nNREUMQ.push([\"load\",new Date().getTime()]);\nvar e=document.createElement(\"script\");\ne.type=\"text/javascript\";e.async=true;e.src=\"this_is_my_file\";\ndocument.body.appendChild(e);\nif(NREUMQ.a)NREUMQ.a();\n};\nNREUMQ.a=window.onload;window.onload=NREUMQ.f;\n};\nNREUMQ.push([\"nrf2\",\"\",\"\",1,\"most recent transaction\",0,0,new Date().getTime()])</script>", value, "should return the javascript given some default values")
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def test_html_safe_if_needed_unsafed
|
|
245
|
+
string = mock('string')
|
|
246
|
+
# here to handle 1.9 encoding - we stub this out because it should
|
|
247
|
+
# be handled automatically and is outside the scope of this test
|
|
248
|
+
string.stubs(:respond_to?).with(:encoding).returns(false)
|
|
249
|
+
string.expects(:respond_to?).with(:html_safe).returns(false)
|
|
250
|
+
assert_equal(string, html_safe_if_needed(string))
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def test_html_safe_if_needed_safed
|
|
254
|
+
string = mock('string')
|
|
255
|
+
string.expects(:respond_to?).with(:html_safe).returns(true)
|
|
256
|
+
string.expects(:html_safe).returns(string)
|
|
257
|
+
# here to handle 1.9 encoding - we stub this out because it should
|
|
258
|
+
# be handled automatically and is outside the scope of this test
|
|
259
|
+
string.stubs(:respond_to?).with(:encoding).returns(false)
|
|
260
|
+
assert_equal(string, html_safe_if_needed(string))
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def test_obfuscate_basic
|
|
264
|
+
text = 'a happy piece of small text'
|
|
265
|
+
key = (1..40).to_a
|
|
266
|
+
NewRelic::Agent.instance.beacon_configuration.expects(:license_bytes).returns(key)
|
|
267
|
+
output = obfuscate(text)
|
|
268
|
+
assert_equal('YCJrZXV2fih5Y25vaCFtZSR2a2ZkZSp/aXV1', output, "should output obfuscated text")
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def test_obfuscate_long_string
|
|
272
|
+
text = 'a happy piece of small text' * 5
|
|
273
|
+
key = (1..40).to_a
|
|
274
|
+
NewRelic::Agent.instance.beacon_configuration.expects(:license_bytes).returns(key)
|
|
275
|
+
output = obfuscate(text)
|
|
276
|
+
assert_equal('YCJrZXV2fih5Y25vaCFtZSR2a2ZkZSp/aXV1YyNsZHZ3cSl6YmluZCJsYiV1amllZit4aHl2YiRtZ3d4cCp7ZWhiZyNrYyZ0ZWhmZyx5ZHp3ZSVuZnh5cyt8ZGRhZiRqYCd7ZGtnYC11Z3twZCZvaXl6cix9aGdgYSVpYSh6Z2pgYSF2Znxx', output, "should output obfuscated text")
|
|
277
|
+
end
|
|
278
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Run faster standalone
|
|
2
|
+
ENV['SKIP_RAILS'] = 'true'
|
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
|
|
4
|
+
class NewRelic::Agent::BusyCalculatorTest < Test::Unit::TestCase
|
|
5
|
+
attr_reader :now
|
|
6
|
+
def setup
|
|
7
|
+
@now = Time.now.to_f
|
|
8
|
+
NewRelic::Agent::BusyCalculator.reset
|
|
9
|
+
@instance_busy = NewRelic::MethodTraceStats.new
|
|
10
|
+
NewRelic::Agent::BusyCalculator.stubs(:instance_busy_stats).returns(@instance_busy)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_normal
|
|
14
|
+
# start the timewindow 10 seconds ago
|
|
15
|
+
# start a request at 10 seconds, 5 seconds long
|
|
16
|
+
NewRelic::Agent::BusyCalculator.stubs(:harvest_start).returns(now - 10.0)
|
|
17
|
+
NewRelic::Agent::BusyCalculator.dispatcher_start(now - 10.0)
|
|
18
|
+
NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 5.0)
|
|
19
|
+
assert_equal 5, NewRelic::Agent::BusyCalculator.accumulator
|
|
20
|
+
NewRelic::Agent::BusyCalculator.harvest_busy
|
|
21
|
+
|
|
22
|
+
assert_equal 1, @instance_busy.call_count
|
|
23
|
+
assert_in_delta 0.50, @instance_busy.total_call_time, 0.05
|
|
24
|
+
end
|
|
25
|
+
def test_split
|
|
26
|
+
# start the timewindow 10 seconds ago
|
|
27
|
+
# start a request at 5 seconds, don't finish
|
|
28
|
+
NewRelic::Agent::BusyCalculator.stubs(:harvest_start).returns(now - 10.0)
|
|
29
|
+
NewRelic::Agent::BusyCalculator.dispatcher_start(now - 5.0)
|
|
30
|
+
NewRelic::Agent::BusyCalculator.harvest_busy
|
|
31
|
+
|
|
32
|
+
assert_equal 1, @instance_busy.call_count, @instance_busy
|
|
33
|
+
assert_in_delta 0.50, @instance_busy.total_call_time, 0.05
|
|
34
|
+
end
|
|
35
|
+
def test_reentrancy
|
|
36
|
+
# start the timewindow 10 seconds ago
|
|
37
|
+
# start a request at 5 seconds, don't finish, but make two more
|
|
38
|
+
# complete calls, which should be ignored.
|
|
39
|
+
NewRelic::Agent::BusyCalculator.stubs(:harvest_start).returns(now - 10.0)
|
|
40
|
+
NewRelic::Agent::BusyCalculator.dispatcher_start(now - 5.0)
|
|
41
|
+
NewRelic::Agent::BusyCalculator.dispatcher_start(now - 4.5)
|
|
42
|
+
NewRelic::Agent::BusyCalculator.dispatcher_start(now - 4.0)
|
|
43
|
+
NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 3.5)
|
|
44
|
+
NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 3.0)
|
|
45
|
+
NewRelic::Agent::BusyCalculator.dispatcher_start(now - 2.0)
|
|
46
|
+
NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 1.0)
|
|
47
|
+
NewRelic::Agent::BusyCalculator.harvest_busy
|
|
48
|
+
|
|
49
|
+
assert_equal 1, @instance_busy.call_count
|
|
50
|
+
assert_in_delta 0.50, @instance_busy.total_call_time, 0.05
|
|
51
|
+
end
|
|
52
|
+
def test_concurrency
|
|
53
|
+
# start the timewindow 10 seconds ago
|
|
54
|
+
# start a request at 10 seconds, 5 seconds long
|
|
55
|
+
NewRelic::Agent::BusyCalculator.stubs(:harvest_start).returns(now - 10.0)
|
|
56
|
+
NewRelic::Agent::BusyCalculator.dispatcher_start(now - 8.0)
|
|
57
|
+
worker = Thread.new do
|
|
58
|
+
# Get busy for 6 - 3 seconds
|
|
59
|
+
NewRelic::Agent::BusyCalculator.dispatcher_start(now - 6.0)
|
|
60
|
+
NewRelic::Agent::BusyCalculator.dispatcher_start(now - 5.0)
|
|
61
|
+
NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 4.0)
|
|
62
|
+
NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 3.0)
|
|
63
|
+
end
|
|
64
|
+
# Get busy for 8 - 2 seconds
|
|
65
|
+
NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 2.0)
|
|
66
|
+
worker.join
|
|
67
|
+
NewRelic::Agent::BusyCalculator.harvest_busy
|
|
68
|
+
|
|
69
|
+
assert_equal 1, @instance_busy.call_count
|
|
70
|
+
# 3 + 6 = 9, or 90%
|
|
71
|
+
assert_in_delta 0.90, @instance_busy.total_call_time, 0.1
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
def test_dont_ignore_zero_counts
|
|
75
|
+
assert_equal 0, @instance_busy.call_count, "Problem with test--instance busy not starting off at zero."
|
|
76
|
+
NewRelic::Agent::BusyCalculator.harvest_busy
|
|
77
|
+
NewRelic::Agent::BusyCalculator.harvest_busy
|
|
78
|
+
NewRelic::Agent::BusyCalculator.harvest_busy
|
|
79
|
+
assert_equal 3, @instance_busy.call_count
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..',
|
|
2
|
+
'test_helper'))
|
|
3
|
+
require 'new_relic/agent/database'
|
|
4
|
+
class NewRelic::Agent::DatabaseTest < Test::Unit::TestCase
|
|
5
|
+
def teardown
|
|
6
|
+
NewRelic::Agent::Database::Obfuscator.instance.reset
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test_process_resultset
|
|
10
|
+
resultset = [["column"]]
|
|
11
|
+
assert_equal([nil, [["column"]]],
|
|
12
|
+
NewRelic::Agent::Database.process_resultset(resultset))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_explain_sql_select_with_mysql_connection
|
|
16
|
+
config = {:adapter => 'mysql'}
|
|
17
|
+
config.default('val')
|
|
18
|
+
sql = 'SELECT foo'
|
|
19
|
+
connection = mock('connection')
|
|
20
|
+
plan = {
|
|
21
|
+
"select_type"=>"SIMPLE", "key_len"=>nil, "table"=>"blogs", "id"=>"1",
|
|
22
|
+
"possible_keys"=>nil, "type"=>"ALL", "Extra"=>"", "rows"=>"2",
|
|
23
|
+
"ref"=>nil, "key"=>nil
|
|
24
|
+
}
|
|
25
|
+
result = mock('explain plan')
|
|
26
|
+
result.expects(:each_hash).yields(plan)
|
|
27
|
+
# two rows, two columns
|
|
28
|
+
connection.expects(:execute).with('EXPLAIN SELECT foo').returns(result)
|
|
29
|
+
NewRelic::Agent::Database.expects(:get_connection).with(config).returns(connection)
|
|
30
|
+
|
|
31
|
+
result = NewRelic::Agent::Database.explain_sql(sql, config)
|
|
32
|
+
assert_equal(plan.keys.sort, result[0].sort)
|
|
33
|
+
assert_equal(plan.values.compact.sort, result[1][0].compact.sort)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_explain_sql_one_select_with_pg_connection
|
|
37
|
+
config = {:adapter => 'postgresql'}
|
|
38
|
+
config.default('val')
|
|
39
|
+
sql = 'select count(id) from blogs limit 1'
|
|
40
|
+
connection = mock('connection')
|
|
41
|
+
plan = [{"QUERY PLAN"=>"Limit (cost=11.75..11.76 rows=1 width=4)"},
|
|
42
|
+
{"QUERY PLAN"=>" -> Aggregate (cost=11.75..11.76 rows=1 width=4)"},
|
|
43
|
+
{"QUERY PLAN"=>" -> Seq Scan on blogs (cost=0.00..11.40 rows=140 width=4)"}]
|
|
44
|
+
connection.expects(:execute).returns(plan)
|
|
45
|
+
NewRelic::Agent::Database.expects(:get_connection).with(config).returns(connection)
|
|
46
|
+
assert_equal([['QUERY PLAN'],
|
|
47
|
+
[["Limit (cost=11.75..11.76 rows=1 width=4)"],
|
|
48
|
+
[" -> Aggregate (cost=11.75..11.76 rows=1 width=4)"],
|
|
49
|
+
[" -> Seq Scan on blogs (cost=0.00..11.40 rows=140 width=4)"]]],
|
|
50
|
+
NewRelic::Agent::Database.explain_sql(sql, config))
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_explain_sql_no_sql
|
|
54
|
+
assert_equal(nil, NewRelic::Agent::Database.explain_sql(nil, nil))
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_explain_sql_no_connection_config
|
|
58
|
+
assert_equal(nil, NewRelic::Agent::Database.explain_sql('select foo', nil))
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_explain_sql_non_select
|
|
62
|
+
assert_equal([], NewRelic::Agent::Database.explain_sql('foo',
|
|
63
|
+
mock('config')))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_explain_sql_one_select_no_connection
|
|
67
|
+
# NB this test raises an error in the log, much as it might if a
|
|
68
|
+
# user supplied a config that was not valid. This is generally
|
|
69
|
+
# expected behavior - the get_connection method shouldn't allow
|
|
70
|
+
# errors to percolate up.
|
|
71
|
+
config = mock('config')
|
|
72
|
+
config.stubs(:[]).returns(nil)
|
|
73
|
+
assert_equal([], NewRelic::Agent::Database.explain_sql('SELECT', config))
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_handle_exception_in_explain
|
|
77
|
+
fake_error = Exception.new('a message')
|
|
78
|
+
NewRelic::Control.instance.log.expects(:error).with('Error getting query plan: a message')
|
|
79
|
+
# backtrace can be basically any string, just should get logged
|
|
80
|
+
NewRelic::Control.instance.log.expects(:debug).with(instance_of(String))
|
|
81
|
+
|
|
82
|
+
NewRelic::Agent::Database.handle_exception_in_explain do
|
|
83
|
+
raise(fake_error)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def test_sql_normalization
|
|
88
|
+
# basic statement
|
|
89
|
+
assert_equal "INSERT INTO X values(?,?, ? , ?)",
|
|
90
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('test',0, 1 , 2)")
|
|
91
|
+
|
|
92
|
+
# escaped literals
|
|
93
|
+
assert_equal "INSERT INTO X values(?, ?,?, ? , ?)",
|
|
94
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('', 'jim''s ssn',0, 1 , 'jim''s son''s son')")
|
|
95
|
+
|
|
96
|
+
# multiple string literals
|
|
97
|
+
assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
|
|
98
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('jim''s ssn','x',0, 1 , 2)")
|
|
99
|
+
|
|
100
|
+
# empty string literal
|
|
101
|
+
# NOTE: the empty string literal resolves to empty string, which for our purposes is acceptable
|
|
102
|
+
assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
|
|
103
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('','x',0, 1 , 2)")
|
|
104
|
+
|
|
105
|
+
# try a select statement
|
|
106
|
+
assert_equal "select * from table where name=? and ssn=?",
|
|
107
|
+
NewRelic::Agent::Database.obfuscate_sql("select * from table where name='jim gochee' and ssn=0012211223")
|
|
108
|
+
|
|
109
|
+
# number literals embedded in sql - oh well
|
|
110
|
+
assert_equal "select * from table_? where name=? and ssn=?",
|
|
111
|
+
NewRelic::Agent::Database.obfuscate_sql("select * from table_007 where name='jim gochee' and ssn=0012211223")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_sql_normalization__single_quotes
|
|
115
|
+
assert_equal "INSERT ? into table",
|
|
116
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT 'this isn''t a real value' into table")
|
|
117
|
+
assert_equal "INSERT ? into table",
|
|
118
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT '"' into table])
|
|
119
|
+
assert_equal "INSERT ? into table",
|
|
120
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT ' "some text" \" ' into table])
|
|
121
|
+
# could not get this one licked. no biggie
|
|
122
|
+
# assert_equal "INSERT ? into table",
|
|
123
|
+
# @agent.send(:default_sql_obfuscator, %q[INSERT '\'' into table])
|
|
124
|
+
assert_equal "INSERT ? into table",
|
|
125
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT ''' ' into table])
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_sql_normalization__double_quotes
|
|
129
|
+
assert_equal "INSERT ? into table",
|
|
130
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT "this isn't a real value" into table])
|
|
131
|
+
assert_equal "INSERT ? into table",
|
|
132
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT "'" into table])
|
|
133
|
+
assert_equal "INSERT ? into table",
|
|
134
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT " \" " into table])
|
|
135
|
+
assert_equal "INSERT ? into table",
|
|
136
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT " 'some text' " into table])
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_sql_obfuscation_filters
|
|
140
|
+
NewRelic::Agent::Database.set_sql_obfuscator(:replace) do |string|
|
|
141
|
+
"1" + string
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
sql = "SELECT * FROM TABLE 123 'jim'"
|
|
145
|
+
|
|
146
|
+
assert_equal "1" + sql, NewRelic::Agent::Database.obfuscate_sql(sql)
|
|
147
|
+
|
|
148
|
+
NewRelic::Agent::Database.set_sql_obfuscator(:before) do |string|
|
|
149
|
+
"2" + string
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
assert_equal "12" + sql, NewRelic::Agent::Database.obfuscate_sql(sql)
|
|
153
|
+
|
|
154
|
+
NewRelic::Agent::Database.set_sql_obfuscator(:after) do |string|
|
|
155
|
+
string + "3"
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
assert_equal "12" + sql + "3", NewRelic::Agent::Database.obfuscate_sql(sql)
|
|
159
|
+
|
|
160
|
+
NewRelic::Agent::Database::Obfuscator.instance.reset
|
|
161
|
+
end
|
|
162
|
+
end
|