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,98 @@
|
|
|
1
|
+
require 'new_relic/agent/instrumentation/controller_instrumentation'
|
|
2
|
+
|
|
3
|
+
module NewRelic
|
|
4
|
+
module Agent
|
|
5
|
+
module Instrumentation
|
|
6
|
+
# == Instrumentation for Rack
|
|
7
|
+
#
|
|
8
|
+
# New Relic will instrument a #call method as if it were a controller
|
|
9
|
+
# action, collecting transaction traces and errors. The middleware will
|
|
10
|
+
# be identified only by it's class, so if you want to instrument multiple
|
|
11
|
+
# actions in a middleware, you need to use
|
|
12
|
+
# NewRelic::Agent::Instrumentation::ControllerInstrumentation::ClassMethods#add_transaction_tracer
|
|
13
|
+
#
|
|
14
|
+
# Example:
|
|
15
|
+
# require 'newrelic_rpm'
|
|
16
|
+
# require 'new_relic/agent/instrumentation/rack'
|
|
17
|
+
# class Middleware
|
|
18
|
+
# def call(env)
|
|
19
|
+
# ...
|
|
20
|
+
# end
|
|
21
|
+
# # Do the include after the call method is defined:
|
|
22
|
+
# include NewRelic::Agent::Instrumentation::Rack
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# == Instrumenting Metal and Cascading Middlewares
|
|
26
|
+
#
|
|
27
|
+
# Metal apps and apps belonging to Rack::Cascade middleware
|
|
28
|
+
# follow a convention of returning a 404 for all requests except
|
|
29
|
+
# the ones they are set up to handle. This means that New Relic
|
|
30
|
+
# needs to ignore these calls when they return a 404.
|
|
31
|
+
#
|
|
32
|
+
# In these cases, you should not include or extend the Rack
|
|
33
|
+
# module but instead include
|
|
34
|
+
# NewRelic::Agent::Instrumentation::ControllerInstrumentation.
|
|
35
|
+
# Here's how that might look for a Metal app:
|
|
36
|
+
#
|
|
37
|
+
# require 'new_relic/agent/instrumentation/controller_instrumentation'
|
|
38
|
+
# class MetalApp
|
|
39
|
+
# extend NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
|
40
|
+
# def self.call(env)
|
|
41
|
+
# if should_do_my_thing?
|
|
42
|
+
# perform_action_with_newrelic_trace(:category => :rack) do
|
|
43
|
+
# return my_response(env)
|
|
44
|
+
# end
|
|
45
|
+
# else
|
|
46
|
+
# return [404, {"Content-Type" => "text/html"}, ["Not Found"]]
|
|
47
|
+
# end
|
|
48
|
+
# end
|
|
49
|
+
# end
|
|
50
|
+
#
|
|
51
|
+
# == Overriding the metric name
|
|
52
|
+
#
|
|
53
|
+
# By default the middleware is identified only by its class, but if you want to
|
|
54
|
+
# be more specific and pass in name, then omit including the Rack instrumentation
|
|
55
|
+
# and instead follow this example:
|
|
56
|
+
#
|
|
57
|
+
# require 'newrelic_rpm'
|
|
58
|
+
# require 'new_relic/agent/instrumentation/controller_instrumentation'
|
|
59
|
+
# class Middleware
|
|
60
|
+
# include NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
|
61
|
+
# def call(env)
|
|
62
|
+
# ...
|
|
63
|
+
# end
|
|
64
|
+
# add_transaction_tracer :call, :category => :rack, :name => 'my app'
|
|
65
|
+
# end
|
|
66
|
+
#
|
|
67
|
+
module Rack
|
|
68
|
+
def newrelic_request_headers
|
|
69
|
+
@newrelic_request.env
|
|
70
|
+
end
|
|
71
|
+
def call_with_newrelic(*args)
|
|
72
|
+
@newrelic_request = ::Rack::Request.new(args.first)
|
|
73
|
+
perform_action_with_newrelic_trace(:category => :rack, :request => @newrelic_request) do
|
|
74
|
+
result = call_without_newrelic(*args)
|
|
75
|
+
# Ignore cascaded calls
|
|
76
|
+
MetricFrame.abort_transaction! if result.first == 404
|
|
77
|
+
result
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
def self.included middleware #:nodoc:
|
|
81
|
+
middleware.class_eval do
|
|
82
|
+
alias call_without_newrelic call
|
|
83
|
+
alias call call_with_newrelic
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
include ControllerInstrumentation
|
|
87
|
+
def self.extended middleware #:nodoc:
|
|
88
|
+
middleware.class_eval do
|
|
89
|
+
class << self
|
|
90
|
+
alias call_without_newrelic call
|
|
91
|
+
alias call call_with_newrelic
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
DependencyDetection.defer do
|
|
2
|
+
@name = :rails21_view
|
|
3
|
+
|
|
4
|
+
depends_on do
|
|
5
|
+
!NewRelic::Control.instance['disable_view_instrumentation'] &&
|
|
6
|
+
defined?(ActionController) && defined?(ActionController::Base) && defined?(ActionView::PartialTemplate) && defined?(ActionView::Template) &&
|
|
7
|
+
defined?(Rails::VERSION::STRING) && Rails::VERSION::STRING =~ /^2\.1\./ # Rails 2.1 &&
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
executes do
|
|
11
|
+
NewRelic::Agent.logger.debug 'Installing Rails 2.1 View instrumentation'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
executes do
|
|
15
|
+
ActionView::PartialTemplate.class_eval do
|
|
16
|
+
add_method_tracer :render, 'View/#{path_without_extension[%r{^(/.*/)?(.*)$},2]}.#{@view.template_format}.#{extension}/Partial'
|
|
17
|
+
end
|
|
18
|
+
# this is for template rendering, as opposed to partial rendering.
|
|
19
|
+
ActionView::Template.class_eval do
|
|
20
|
+
add_method_tracer :render, 'View/#{(path_without_extension || @view.controller.newrelic_metric_path)[%r{^(/.*/)?(.*)$},2]}.#{@view.template_format}.#{extension}/Rendering'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
DependencyDetection.defer do
|
|
26
|
+
@name = :old_rails_view
|
|
27
|
+
|
|
28
|
+
depends_on do
|
|
29
|
+
!NewRelic::Control.instance['disable_view_instrumentation'] &&
|
|
30
|
+
defined?(ActionController) && defined?(ActionController::Base) &&
|
|
31
|
+
defined?(Rails::VERSION::STRING) && Rails::VERSION::STRING =~ /^(1\.|2\.0)/ # Rails 1.* - 2.0
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
executes do
|
|
35
|
+
NewRelic::Agent.logger.debug 'Installing Rails 1.* - 2.0 View instrumentation'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
executes do
|
|
39
|
+
ActionController::Base.class_eval do
|
|
40
|
+
add_method_tracer :render, 'View/#{newrelic_metric_path}/Rendering'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
DependencyDetection.defer do
|
|
47
|
+
@name = :rails23_view
|
|
48
|
+
|
|
49
|
+
depends_on do
|
|
50
|
+
!NewRelic::Control.instance['disable_view_instrumentation'] &&
|
|
51
|
+
defined?(ActionView) && defined?(ActionView::Template) && defined?(ActionView::RenderablePartial) &&
|
|
52
|
+
defined?(Rails::VERSION::STRING) && Rails::VERSION::STRING =~ /^2\.[23]/
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
executes do
|
|
56
|
+
NewRelic::Agent.logger.debug 'Installing Rails 2.2 - 2.3 View instrumentation'
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
executes do
|
|
60
|
+
ActionView::RenderablePartial.module_eval do
|
|
61
|
+
add_method_tracer :render_partial, 'View/#{path[%r{^(/.*/)?(.*)$},2]}/Partial'
|
|
62
|
+
end
|
|
63
|
+
ActionView::Template.class_eval do
|
|
64
|
+
add_method_tracer :render, 'View/#{path[%r{^(/.*/)?(.*)$},2]}/Rendering'
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
DependencyDetection.defer do
|
|
70
|
+
@name = :rails2_controller
|
|
71
|
+
|
|
72
|
+
depends_on do
|
|
73
|
+
defined?(ActionController) && defined?(ActionController::Base)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
depends_on do
|
|
77
|
+
defined?(Rails) && Rails::VERSION::MAJOR.to_i == 2
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
executes do
|
|
81
|
+
NewRelic::Agent.logger.debug 'Installing Rails 2 Controller instrumentation'
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
executes do
|
|
85
|
+
ActionController::Base.class_eval do
|
|
86
|
+
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
|
87
|
+
|
|
88
|
+
# Compare with #alias_method_chain, which is not available in
|
|
89
|
+
# Rails 1.1:
|
|
90
|
+
alias_method :perform_action_without_newrelic_trace, :perform_action
|
|
91
|
+
alias_method :perform_action, :perform_action_with_newrelic_trace
|
|
92
|
+
private :perform_action
|
|
93
|
+
|
|
94
|
+
def self.newrelic_write_attr(attr_name, value) # :nodoc:
|
|
95
|
+
write_inheritable_attribute(attr_name, value)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def self.newrelic_read_attr(attr_name) # :nodoc:
|
|
99
|
+
read_inheritable_attribute(attr_name)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# determine the path that is used in the metric name for
|
|
103
|
+
# the called controller action
|
|
104
|
+
def newrelic_metric_path(action_name_override = nil)
|
|
105
|
+
action_part = action_name_override || action_name
|
|
106
|
+
if action_name_override || self.class.action_methods.include?(action_part)
|
|
107
|
+
"#{self.class.controller_path}/#{action_part}"
|
|
108
|
+
else
|
|
109
|
+
"#{self.class.controller_path}/(other)"
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
DependencyDetection.defer do
|
|
2
|
+
@name = :rails_action_web_service
|
|
3
|
+
|
|
4
|
+
depends_on do
|
|
5
|
+
defined?(ActionWebService)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
executes do
|
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Rails ActionWebService instrumentation'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
executes do
|
|
13
|
+
# NewRelic Agent instrumentation for WebServices
|
|
14
|
+
|
|
15
|
+
# Note Action Web Service is removed from default package in rails
|
|
16
|
+
# 2.0, this is purely here as a service to our legacy customers.
|
|
17
|
+
|
|
18
|
+
# instrumentation for Web Service martialing - XML RPC
|
|
19
|
+
ActionWebService::Protocol::XmlRpc::XmlRpcProtocol.class_eval do
|
|
20
|
+
add_method_tracer :decode_request, "WebService/Xml Rpc/XML Decode"
|
|
21
|
+
add_method_tracer :encode_request, "WebService/Xml Rpc/XML Encode"
|
|
22
|
+
add_method_tracer :decode_response, "WebService/Xml Rpc/XML Decode"
|
|
23
|
+
add_method_tracer :encode_response, "WebService/Xml Rpc/XML Encode"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# instrumentation for Web Service martialing - Soap
|
|
27
|
+
ActionWebService::Protocol::Soap::SoapProtocol.class_eval do
|
|
28
|
+
add_method_tracer :decode_request, "WebService/Soap/XML Decode"
|
|
29
|
+
add_method_tracer :encode_request, "WebService/Soap/XML Encode"
|
|
30
|
+
add_method_tracer :decode_response, "WebService/Soap/XML Decode"
|
|
31
|
+
add_method_tracer :encode_response, "WebService/Soap/XML Encode"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
if defined?(ActionController) && defined?(ActionController::Base)
|
|
35
|
+
ActionController::Base.class_eval do
|
|
36
|
+
if method_defined? :perform_invocation
|
|
37
|
+
add_method_tracer :perform_invocation, 'WebService/#{controller_name}/#{args.first}'
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
module NewRelic
|
|
2
|
+
module Agent
|
|
3
|
+
module Instrumentation
|
|
4
|
+
module ActiveRecordInstrumentation
|
|
5
|
+
|
|
6
|
+
def self.included(instrumented_class)
|
|
7
|
+
instrumented_class.class_eval do
|
|
8
|
+
alias_method :log_without_newrelic_instrumentation, :log
|
|
9
|
+
alias_method :log, :log_with_newrelic_instrumentation
|
|
10
|
+
protected :log
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def log_with_newrelic_instrumentation(sql, name, &block)
|
|
15
|
+
|
|
16
|
+
return log_without_newrelic_instrumentation(sql, name, &block) unless NewRelic::Agent.is_execution_traced?
|
|
17
|
+
|
|
18
|
+
# Capture db config if we are going to try to get the explain plans
|
|
19
|
+
if (defined?(ActiveRecord::ConnectionAdapters::MysqlAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::MysqlAdapter)) ||
|
|
20
|
+
(defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) && self.is_a?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)) ||
|
|
21
|
+
(defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter))
|
|
22
|
+
supported_config = @config
|
|
23
|
+
end
|
|
24
|
+
if name && (parts = name.split " ") && parts.size == 2
|
|
25
|
+
model = parts.first
|
|
26
|
+
operation = parts.last.downcase
|
|
27
|
+
metric_name = case operation
|
|
28
|
+
when 'load' then 'find'
|
|
29
|
+
when 'indexes', 'columns' then nil # fall back to DirectSQL
|
|
30
|
+
when 'destroy', 'find', 'save', 'create' then operation
|
|
31
|
+
when 'update' then 'save'
|
|
32
|
+
else
|
|
33
|
+
if model == 'Join'
|
|
34
|
+
operation
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
metric = "ActiveRecord/#{model}/#{metric_name}" if metric_name
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if metric.nil?
|
|
41
|
+
metric = NewRelic::Agent::Instrumentation::MetricFrame.database_metric_name
|
|
42
|
+
if metric.nil?
|
|
43
|
+
if sql =~ /^(select|update|insert|delete|show)/i
|
|
44
|
+
# Could not determine the model/operation so let's find a better
|
|
45
|
+
# metric. If it doesn't match the regex, it's probably a show
|
|
46
|
+
# command or some DDL which we'll ignore.
|
|
47
|
+
metric = "Database/SQL/#{$1.downcase}"
|
|
48
|
+
else
|
|
49
|
+
metric = "Database/SQL/other"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if !metric
|
|
55
|
+
log_without_newrelic_instrumentation(sql, name, &block)
|
|
56
|
+
else
|
|
57
|
+
metrics = [metric, "ActiveRecord/all"]
|
|
58
|
+
metrics << "ActiveRecord/#{metric_name}" if metric_name
|
|
59
|
+
self.class.trace_execution_scoped(metrics) do
|
|
60
|
+
t0 = Time.now
|
|
61
|
+
begin
|
|
62
|
+
log_without_newrelic_instrumentation(sql, name, &block)
|
|
63
|
+
ensure
|
|
64
|
+
NewRelic::Agent.instance.transaction_sampler.notice_sql(sql, supported_config, (Time.now - t0).to_f)
|
|
65
|
+
NewRelic::Agent.instance.sql_sampler.notice_sql(sql, metric, supported_config, (Time.now - t0).to_f)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
DependencyDetection.defer do
|
|
77
|
+
@name = :rails2_active_record
|
|
78
|
+
|
|
79
|
+
depends_on do
|
|
80
|
+
defined?(ActiveRecord) && defined?(ActiveRecord::Base)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
depends_on do
|
|
84
|
+
defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 2
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
depends_on do
|
|
88
|
+
!NewRelic::Control.instance['skip_ar_instrumentation']
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
depends_on do
|
|
92
|
+
!NewRelic::Control.instance['disable_activerecord_instrumentation']
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
executes do
|
|
96
|
+
NewRelic::Agent.logger.debug 'Installing Rails 2 ActiveRecord instrumentation'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
executes do
|
|
100
|
+
ActiveRecord::ConnectionAdapters::AbstractAdapter.module_eval do
|
|
101
|
+
include ::NewRelic::Agent::Instrumentation::ActiveRecordInstrumentation
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
executes do
|
|
106
|
+
ActiveRecord::Base.class_eval do
|
|
107
|
+
class << self
|
|
108
|
+
add_method_tracer :find_by_sql, 'ActiveRecord/#{self.name}/find_by_sql', :metric => false
|
|
109
|
+
add_method_tracer :transaction, 'ActiveRecord/#{self.name}/transaction', :metric => false
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
DependencyDetection.detect!
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
DependencyDetection.defer do
|
|
2
|
+
@name = :rails2_error
|
|
3
|
+
|
|
4
|
+
depends_on do
|
|
5
|
+
defined?(ActionController) && defined?(ActionController::Base)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
depends_on do
|
|
9
|
+
defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 2
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
executes do
|
|
13
|
+
NewRelic::Agent.logger.debug 'Installing Rails 2 Error instrumentation'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
executes do
|
|
17
|
+
|
|
18
|
+
ActionController::Base.class_eval do
|
|
19
|
+
|
|
20
|
+
# Make a note of an exception associated with the currently executing
|
|
21
|
+
# controller action. Note that this used to be available on Object
|
|
22
|
+
# but we replaced that global method with NewRelic::Agent#notice_error.
|
|
23
|
+
# Use that one outside of controller actions.
|
|
24
|
+
def newrelic_notice_error(exception, custom_params = {})
|
|
25
|
+
NewRelic::Agent::Instrumentation::MetricFrame.notice_error exception, :custom_params => custom_params, :request => request
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def rescue_action_with_newrelic_trace(exception)
|
|
29
|
+
rescue_action_without_newrelic_trace exception
|
|
30
|
+
NewRelic::Agent::Instrumentation::MetricFrame.notice_error exception, :request => request
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Compare with #alias_method_chain, which is not available in
|
|
34
|
+
# Rails 1.1:
|
|
35
|
+
alias_method :rescue_action_without_newrelic_trace, :rescue_action
|
|
36
|
+
alias_method :rescue_action, :rescue_action_with_newrelic_trace
|
|
37
|
+
protected :rescue_action
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
module NewRelic
|
|
2
|
+
module Agent
|
|
3
|
+
module Instrumentation
|
|
4
|
+
module Rails3
|
|
5
|
+
module ActionController
|
|
6
|
+
def self.newrelic_write_attr(attr_name, value) # :nodoc:
|
|
7
|
+
write_inheritable_attribute(attr_name, value)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.newrelic_read_attr(attr_name) # :nodoc:
|
|
11
|
+
read_inheritable_attribute(attr_name)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# determine the path that is used in the metric name for
|
|
15
|
+
# the called controller action
|
|
16
|
+
def newrelic_metric_path(action_name_override = nil)
|
|
17
|
+
action_part = action_name_override || action_name
|
|
18
|
+
if action_name_override || self.class.action_methods.include?(action_part)
|
|
19
|
+
"#{self.class.controller_path}/#{action_part}"
|
|
20
|
+
else
|
|
21
|
+
"#{self.class.controller_path}/(other)"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def process_action(*args)
|
|
26
|
+
# skip instrumentation if we are in an ignored action
|
|
27
|
+
if _is_filtered?('do_not_trace')
|
|
28
|
+
NewRelic::Agent.disable_all_tracing do
|
|
29
|
+
return super
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
perform_action_with_newrelic_trace(:category => :controller, :name => self.action_name, :path => newrelic_metric_path, :params => request.filtered_parameters, :class_name => self.class.name) do
|
|
34
|
+
super
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
module ActionView
|
|
41
|
+
def _render_template(template, layout = nil, options = {}) #:nodoc:
|
|
42
|
+
NewRelic::Agent.trace_execution_scoped "View/#{template.virtual_path}/Rendering" do
|
|
43
|
+
super
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
module PartialRenderer
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
DependencyDetection.defer do
|
|
56
|
+
@name = :rails3_controller
|
|
57
|
+
|
|
58
|
+
depends_on do
|
|
59
|
+
defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 3
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
depends_on do
|
|
63
|
+
defined?(ActionController) && defined?(ActionController::Base)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
executes do
|
|
67
|
+
NewRelic::Agent.logger.debug 'Installing Rails 3 Controller instrumentation'
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
executes do
|
|
71
|
+
class ActionController::Base
|
|
72
|
+
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
|
73
|
+
include NewRelic::Agent::Instrumentation::Rails3::ActionController
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
DependencyDetection.defer do
|
|
79
|
+
@name = :rails3_view
|
|
80
|
+
|
|
81
|
+
depends_on do
|
|
82
|
+
defined?(ActionView) && defined?(ActionView::Base) && defined?(ActionView::Partials)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
depends_on do
|
|
86
|
+
defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 3 && ::Rails::VERSION::MINOR.to_i >= 1
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
depends_on do
|
|
90
|
+
!NewRelic::Control.instance['disable_view_instrumentation']
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
executes do
|
|
94
|
+
NewRelic::Agent.logger.debug 'Installing Rails 3 view instrumentation'
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
executes do
|
|
98
|
+
class ActionView::Base
|
|
99
|
+
include NewRelic::Agent::Instrumentation::Rails3::ActionView
|
|
100
|
+
end
|
|
101
|
+
old_klass = ActionView::Partials::PartialRenderer
|
|
102
|
+
ActionView::Partials::PartialRenderer = Class.new(old_klass)
|
|
103
|
+
class ActionView::Partials::PartialRenderer
|
|
104
|
+
def render_partial(*args)
|
|
105
|
+
NewRelic::Agent.trace_execution_scoped "View/#{@template.virtual_path}/Partial" do
|
|
106
|
+
super
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def render_collection(*args)
|
|
111
|
+
name = @template ? @template.virtual_path : "Mixed"
|
|
112
|
+
NewRelic::Agent.trace_execution_scoped "View/#{name}/Collection" do
|
|
113
|
+
super
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
module NewRelic
|
|
2
|
+
module Agent
|
|
3
|
+
module Instrumentation
|
|
4
|
+
module ActiveRecordInstrumentation
|
|
5
|
+
|
|
6
|
+
def self.included(instrumented_class)
|
|
7
|
+
instrumented_class.class_eval do
|
|
8
|
+
unless instrumented_class.method_defined?(:log_without_newrelic_instrumentation)
|
|
9
|
+
alias_method :log_without_newrelic_instrumentation, :log
|
|
10
|
+
alias_method :log, :log_with_newrelic_instrumentation
|
|
11
|
+
protected :log
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def log_with_newrelic_instrumentation(*args, &block)
|
|
17
|
+
|
|
18
|
+
return log_without_newrelic_instrumentation(*args, &block) unless NewRelic::Agent.is_execution_traced?
|
|
19
|
+
|
|
20
|
+
sql, name, binds = args
|
|
21
|
+
|
|
22
|
+
# Capture db config if we are going to try to get the explain plans
|
|
23
|
+
if (defined?(ActiveRecord::ConnectionAdapters::MysqlAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::MysqlAdapter)) ||
|
|
24
|
+
(defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) && self.is_a?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)) ||
|
|
25
|
+
(defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter))
|
|
26
|
+
supported_config = @config
|
|
27
|
+
end
|
|
28
|
+
if name && (parts = name.split " ") && parts.size == 2
|
|
29
|
+
model = parts.first
|
|
30
|
+
operation = parts.last.downcase
|
|
31
|
+
metric_name = case operation
|
|
32
|
+
when 'load', 'count', 'exists' then 'find'
|
|
33
|
+
when 'indexes', 'columns' then nil # fall back to DirectSQL
|
|
34
|
+
when 'destroy', 'find', 'save', 'create' then operation
|
|
35
|
+
when 'update' then 'save'
|
|
36
|
+
else
|
|
37
|
+
if model == 'Join'
|
|
38
|
+
operation
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
metric = "ActiveRecord/#{model}/#{metric_name}" if metric_name
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
if metric.nil?
|
|
45
|
+
metric = NewRelic::Agent::Instrumentation::MetricFrame.database_metric_name
|
|
46
|
+
if metric.nil?
|
|
47
|
+
if sql =~ /^(select|update|insert|delete|show)/i
|
|
48
|
+
# Could not determine the model/operation so let's find a better
|
|
49
|
+
# metric. If it doesn't match the regex, it's probably a show
|
|
50
|
+
# command or some DDL which we'll ignore.
|
|
51
|
+
metric = "Database/SQL/#{$1.downcase}"
|
|
52
|
+
else
|
|
53
|
+
metric = "Database/SQL/other"
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
if !metric
|
|
59
|
+
log_without_newrelic_instrumentation(*args, &block)
|
|
60
|
+
else
|
|
61
|
+
metrics = [metric, "ActiveRecord/all"]
|
|
62
|
+
metrics << "ActiveRecord/#{metric_name}" if metric_name
|
|
63
|
+
self.class.trace_execution_scoped(metrics) do
|
|
64
|
+
sql, name, binds = args
|
|
65
|
+
t0 = Time.now
|
|
66
|
+
begin
|
|
67
|
+
log_without_newrelic_instrumentation(*args, &block)
|
|
68
|
+
ensure
|
|
69
|
+
NewRelic::Agent.instance.transaction_sampler.notice_sql(sql, supported_config, (Time.now - t0).to_f)
|
|
70
|
+
NewRelic::Agent.instance.sql_sampler.notice_sql(sql, metric, supported_config, (Time.now - t0).to_f)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
DependencyDetection.defer do
|
|
82
|
+
@name = :rails3_active_record
|
|
83
|
+
|
|
84
|
+
depends_on do
|
|
85
|
+
defined?(ActiveRecord) && defined?(ActiveRecord::Base)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
depends_on do
|
|
89
|
+
defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 3
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
depends_on do
|
|
93
|
+
!NewRelic::Control.instance['skip_ar_instrumentation']
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
depends_on do
|
|
97
|
+
!NewRelic::Control.instance['disable_activerecord_instrumentation']
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
executes do
|
|
101
|
+
NewRelic::Agent.logger.debug 'Installing Rails 3 ActiveRecord instrumentation'
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
executes do
|
|
105
|
+
Rails.configuration.after_initialize do
|
|
106
|
+
ActiveRecord::ConnectionAdapters::AbstractAdapter.module_eval do
|
|
107
|
+
include ::NewRelic::Agent::Instrumentation::ActiveRecordInstrumentation
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
executes do
|
|
113
|
+
Rails.configuration.after_initialize do
|
|
114
|
+
ActiveRecord::Base.class_eval do
|
|
115
|
+
class << self
|
|
116
|
+
add_method_tracer :find_by_sql, 'ActiveRecord/#{self.name}/find_by_sql', :metric => false
|
|
117
|
+
add_method_tracer :transaction, 'ActiveRecord/#{self.name}/transaction', :metric => false
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module NewRelic
|
|
2
|
+
module Agent
|
|
3
|
+
module Instrumentation
|
|
4
|
+
module Rails3
|
|
5
|
+
module Errors
|
|
6
|
+
def newrelic_notice_error(exception, custom_params = {})
|
|
7
|
+
filtered_params = (respond_to? :filter_parameters) ? filter_parameters(params) : params
|
|
8
|
+
filtered_params.merge!(custom_params)
|
|
9
|
+
NewRelic::Agent.agent.error_collector.notice_error(exception, request, newrelic_metric_path, filtered_params)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
DependencyDetection.defer do
|
|
18
|
+
@name = :rails3_error
|
|
19
|
+
|
|
20
|
+
depends_on do
|
|
21
|
+
defined?(::Rails) && ::Rails.respond_to?(:version) && ::Rails.version.to_i == 3
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
depends_on do
|
|
25
|
+
defined?(ActionController) && defined?(ActionController::Base)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
executes do
|
|
29
|
+
NewRelic::Agent.logger.debug 'Installing Rails3 Error instrumentation'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
executes do
|
|
33
|
+
class ActionController::Base
|
|
34
|
+
include NewRelic::Agent::Instrumentation::Rails3::Errors
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|