seanwalbran-rpm_contrib 2.1.6.1
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 +133 -0
- data/Gemfile +13 -0
- data/LICENSE +20 -0
- data/README.md +293 -0
- data/Rakefile +79 -0
- data/lib/new_relic/control/camping.rb +14 -0
- data/lib/rpm_contrib/agent_compatibility.rb +11 -0
- data/lib/rpm_contrib/detection/camping.rb +24 -0
- data/lib/rpm_contrib/detection.rb +5 -0
- data/lib/rpm_contrib/instrumentation/active_messaging.rb +22 -0
- data/lib/rpm_contrib/instrumentation/aws.rb +68 -0
- data/lib/rpm_contrib/instrumentation/camping.rb +50 -0
- data/lib/rpm_contrib/instrumentation/cassandra.rb +30 -0
- data/lib/rpm_contrib/instrumentation/crack.rb +41 -0
- data/lib/rpm_contrib/instrumentation/curb.rb +52 -0
- data/lib/rpm_contrib/instrumentation/elastic_search.rb +26 -0
- data/lib/rpm_contrib/instrumentation/kyototycoon.rb +28 -0
- data/lib/rpm_contrib/instrumentation/mongo.rb +50 -0
- data/lib/rpm_contrib/instrumentation/paperclip.rb +29 -0
- data/lib/rpm_contrib/instrumentation/picky.rb +41 -0
- data/lib/rpm_contrib/instrumentation/redis.rb +42 -0
- data/lib/rpm_contrib/instrumentation/resque.rb +83 -0
- data/lib/rpm_contrib/instrumentation/riak_client.rb +48 -0
- data/lib/rpm_contrib/instrumentation/ripple.rb +37 -0
- data/lib/rpm_contrib/instrumentation/sinatra.rb +30 -0
- data/lib/rpm_contrib/instrumentation/thinking_sphinx.rb +22 -0
- data/lib/rpm_contrib/instrumentation/typhoeus.rb +33 -0
- data/lib/rpm_contrib/instrumentation/ultrasphinx.rb +22 -0
- data/lib/rpm_contrib/instrumentation/workling.rb +27 -0
- data/lib/rpm_contrib/instrumentation/yajl.rb +41 -0
- data/lib/rpm_contrib/instrumentation.rb +16 -0
- data/lib/rpm_contrib/language_support.rb +31 -0
- data/lib/rpm_contrib/samplers.rb +17 -0
- data/lib/rpm_contrib.rb +36 -0
- data/test/helper.rb +9 -0
- data/test/schema.rb +19 -0
- data/test/test_curb.rb +69 -0
- data/test/test_picky.rb +55 -0
- data/test/test_redis.rb +34 -0
- data/test/test_resque.rb +74 -0
- data/test/test_workling.rb +34 -0
- metadata +148 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
module RPMContrib
|
2
|
+
module Instrumentation
|
3
|
+
# == Instrumentation for Camping
|
4
|
+
# To instrument all controllers do the following:
|
5
|
+
# 1. Add require 'rpm_contrib' after loading camping.
|
6
|
+
# 2. Add an include at the end of your main Camping app module
|
7
|
+
# 3. Run the following command to get the NewRelic license key to use: heroku config -all
|
8
|
+
# 4. Create a newrelic.yml under the /config folder with the following content:
|
9
|
+
#
|
10
|
+
# common: &default_settings
|
11
|
+
# license_key: 'PASTE THE VALUE OF NEW_RELIC_LICENSE_KEY HERE'
|
12
|
+
# app_name: PASTE THE NAME OF YOUR CAMPING APP HERE
|
13
|
+
# monitor_mode: true
|
14
|
+
#
|
15
|
+
# production:
|
16
|
+
# <<: *default_settings
|
17
|
+
#
|
18
|
+
# Camping code example:
|
19
|
+
# -------------------------------------------------------------------------------------
|
20
|
+
#
|
21
|
+
# require "rpm_contrib"
|
22
|
+
#
|
23
|
+
# Camping.goes :NewRelicCampingTest
|
24
|
+
#
|
25
|
+
# module NewRelicCampingTest
|
26
|
+
# # your code
|
27
|
+
#
|
28
|
+
# include RPMContrib::Instrumentation::Camping
|
29
|
+
#
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
#
|
33
|
+
module Camping
|
34
|
+
|
35
|
+
def self.included(mod)
|
36
|
+
require 'new_relic/agent/instrumentation/controller_instrumentation'
|
37
|
+
# Since the Camping::Base module is essentially copied
|
38
|
+
# into the main module (the mod passed in) of a Camping app
|
39
|
+
# using the Camping.goes :NewRelicCampingTest syntax
|
40
|
+
# we need to evaluate "weld" the NewRelic plugin in the context of the new Base
|
41
|
+
|
42
|
+
(Kernel.const_get(mod.name)::Base).module_eval do
|
43
|
+
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
44
|
+
add_transaction_tracer :service
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end #RPMContrib::Instrumentation::Camping
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :cassandra
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Cassandra) && !NewRelic::Control.instance['disable_cassandra_instrumentation']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Cassandra instrumentation'
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
::Cassandra.class_eval do
|
14
|
+
add_method_tracer :insert, 'Database/Cassandra/insert'
|
15
|
+
add_method_tracer :remove, 'Database/Cassandra/remove'
|
16
|
+
add_method_tracer :clear_column_family!, 'Database/Cassandra/clear_column_family!'
|
17
|
+
add_method_tracer :clear_keyspace!, 'Database/Cassandra/clear_keyspace!'
|
18
|
+
add_method_tracer :count_columns, 'Database/Cassandra/count_columns'
|
19
|
+
add_method_tracer :multi_count_columns, 'Database/Cassandra/multi_count_columns'
|
20
|
+
add_method_tracer :get_columns, 'Database/Cassandra/get_columns'
|
21
|
+
add_method_tracer :multi_get_columns, 'Database/Cassandra/multi_get_columns'
|
22
|
+
add_method_tracer :get, 'Database/Cassandra/get'
|
23
|
+
add_method_tracer :multi_get, 'Database/Cassandra/multi_get'
|
24
|
+
add_method_tracer :exists?, 'Database/Cassandra/exists?'
|
25
|
+
add_method_tracer :get_range, 'Database/Cassandra/get_range'
|
26
|
+
add_method_tracer :count_range, 'Database/Cassandra/count_range'
|
27
|
+
add_method_tracer :batch, 'Database/Cassandra/batch'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :crack_json
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Crack::JSON) && !NewRelic::Control.instance['disable_crack']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Crack::JSON instrumentation'
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
::Crack::JSON.class_eval do
|
14
|
+
class << self
|
15
|
+
include NewRelic::Agent::MethodTracer
|
16
|
+
add_method_tracer :parse, 'Parser/#{self.name}/parse'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
DependencyDetection.defer do
|
23
|
+
@name = :crack_xml
|
24
|
+
|
25
|
+
depends_on do
|
26
|
+
defined?(::Crack::XML) && !NewRelic::Control.instance['disable_crack']
|
27
|
+
end
|
28
|
+
|
29
|
+
executes do
|
30
|
+
NewRelic::Agent.logger.debug 'Installing Crack::XML instrumentation'
|
31
|
+
end
|
32
|
+
|
33
|
+
executes do
|
34
|
+
::Crack::XML.class_eval do
|
35
|
+
class << self
|
36
|
+
include NewRelic::Agent::MethodTracer
|
37
|
+
add_method_tracer :parse, 'Parser/#{self.name}/parse'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :curb
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Curl) and not NewRelic::Control.instance['disable_curb']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Curb instrumentation'
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
::Curl::Easy.class_eval do
|
14
|
+
def host
|
15
|
+
URI.parse(self.url).host
|
16
|
+
end
|
17
|
+
|
18
|
+
# TODO: http, http_delete, http_get, http_post, http_head, http_put
|
19
|
+
def perform_with_newrelic_trace(*args, &block)
|
20
|
+
metrics = ["External/#{host}/Curl::Easy","External/#{host}/all"]
|
21
|
+
if NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction?
|
22
|
+
metrics << "External/allWeb"
|
23
|
+
else
|
24
|
+
metrics << "External/allOther"
|
25
|
+
end
|
26
|
+
self.class.trace_execution_scoped metrics do
|
27
|
+
perform_without_newrelic_trace(*args, &block)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
alias perform_without_newrelic_trace perform
|
31
|
+
alias perform perform_with_newrelic_trace
|
32
|
+
end
|
33
|
+
|
34
|
+
::Curl::Multi.class_eval do
|
35
|
+
# TODO: http
|
36
|
+
def perform_with_newrelic_trace(*args, &block)
|
37
|
+
metrics = ["External/Curl::Multi"]
|
38
|
+
if NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction?
|
39
|
+
metrics << "External/allWeb"
|
40
|
+
else
|
41
|
+
metrics << "External/allOther"
|
42
|
+
end
|
43
|
+
self.class.trace_execution_scoped metrics do
|
44
|
+
perform_without_newrelic_trace(*args, &block)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
alias perform_without_newrelic_trace perform
|
48
|
+
alias perform perform_with_newrelic_trace
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# == Elastic Search Instrumentation
|
2
|
+
#
|
3
|
+
DependencyDetection.defer do
|
4
|
+
@name = :elastic_search
|
5
|
+
|
6
|
+
depends_on do
|
7
|
+
defined?(::ElasticSearch::Client) && !NewRelic::Control.instance['disable_elastic_search_instrumentation']
|
8
|
+
end
|
9
|
+
|
10
|
+
executes do
|
11
|
+
NewRelic::Agent.logger.debug 'Installing Elastic Search instrumentation'
|
12
|
+
end
|
13
|
+
|
14
|
+
executes do
|
15
|
+
::ElasticSearch::Client.class_eval do
|
16
|
+
add_method_tracer :index, 'ActiveRecord/ElasticSearch/index'
|
17
|
+
add_method_tracer :get, 'ActiveRecord/ElasticSearch/get'
|
18
|
+
add_method_tracer :delete, 'ActiveRecord/ElasticSearch/delete'
|
19
|
+
add_method_tracer :search, 'ActiveRecord/ElasticSearch/search'
|
20
|
+
add_method_tracer :scroll, 'ActiveRecord/ElasticSearch/scroll'
|
21
|
+
add_method_tracer :count, 'ActiveRecord/ElasticSearch/count'
|
22
|
+
add_method_tracer :bulk, 'ActiveRecord/ElasticSearch/bulk'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# KyotoTycoon instrumentation
|
2
|
+
|
3
|
+
DependencyDetection.defer do
|
4
|
+
@name = :kyototycoon
|
5
|
+
|
6
|
+
depends_on do
|
7
|
+
defined?(::KyotoTycoon) && !NewRelic::Control.instance['disable_kyototycoon']
|
8
|
+
end
|
9
|
+
|
10
|
+
executes do
|
11
|
+
NewRelic::Agent.logger.debug 'Installing KyotoTycoon instrumentation'
|
12
|
+
end
|
13
|
+
|
14
|
+
executes do
|
15
|
+
::KyotoTycoon.class_eval do
|
16
|
+
require 'new_relic/agent/method_tracer'
|
17
|
+
include NewRelic::Agent::MethodTracer
|
18
|
+
|
19
|
+
[:get, :remove, :set, :add, :replace,
|
20
|
+
:append, :cas, :increment, :decrement, :increment_double,
|
21
|
+
:set_bulk, :get_bulk, :remove_bulk, :clear, :vacuum,
|
22
|
+
:sync, :report, :status, :match_prefix, :match_regex,
|
23
|
+
:keys].each do |method|
|
24
|
+
add_method_tracer method
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Mongo Instrumentation contributed by Alexey Palazhchenko
|
2
|
+
DependencyDetection.defer do
|
3
|
+
@name = :mongodb
|
4
|
+
|
5
|
+
depends_on do
|
6
|
+
defined?(::Mongo) and not NewRelic::Control.instance['disable_mongodb']
|
7
|
+
end
|
8
|
+
|
9
|
+
executes do
|
10
|
+
NewRelic::Agent.logger.debug 'Installing MongoDB instrumentation'
|
11
|
+
end
|
12
|
+
|
13
|
+
executes do
|
14
|
+
::Mongo::Connection.class_eval do
|
15
|
+
include NewRelic::Agent::MethodTracer
|
16
|
+
|
17
|
+
def instrument_with_newrelic_trace(name, payload = {}, &blk)
|
18
|
+
collection = payload[:collection]
|
19
|
+
if collection == '$cmd'
|
20
|
+
f = payload[:selector].first
|
21
|
+
name, collection = f if f
|
22
|
+
end
|
23
|
+
|
24
|
+
trace_execution_scoped("Database/#{collection}/#{name}") do
|
25
|
+
t0 = Time.now
|
26
|
+
res = instrument_without_newrelic_trace(name, payload, &blk)
|
27
|
+
NewRelic::Agent.instance.transaction_sampler.notice_sql(payload.inspect, nil, (Time.now - t0).to_f)
|
28
|
+
res
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method :instrument_without_newrelic_trace, :instrument
|
33
|
+
alias_method :instrument, :instrument_with_newrelic_trace
|
34
|
+
end
|
35
|
+
|
36
|
+
::Mongo::Cursor.class_eval do
|
37
|
+
include NewRelic::Agent::MethodTracer
|
38
|
+
|
39
|
+
def refresh_with_newrelic_trace
|
40
|
+
trace_execution_scoped("Database/#{collection.name}/refresh") do
|
41
|
+
refresh_without_newrelic_trace
|
42
|
+
end
|
43
|
+
end
|
44
|
+
alias_method :refresh_without_newrelic_trace, :refresh
|
45
|
+
alias_method :refresh, :refresh_with_newrelic_trace
|
46
|
+
add_method_tracer :close, 'Database/#{collection.name}/close'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :paperclip
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Paperclip) && !NewRelic::Control.instance['disable_paperclip']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Paperclip instrumentation'
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
::Paperclip::Attachment.class_eval do
|
14
|
+
add_method_tracer :save, 'Paperclip/#{name}/save'
|
15
|
+
add_method_tracer :assign, 'Paperclip/#{name}/assign'
|
16
|
+
add_method_tracer :post_process, 'Paperclip/#{name}/post_process'
|
17
|
+
end
|
18
|
+
|
19
|
+
::Paperclip::Storage::Filesystem.class_eval do
|
20
|
+
add_method_tracer :flush_deletes, 'Paperclip/Storage/flush_deletes'
|
21
|
+
add_method_tracer :flush_writes, 'Paperclip/Storage/flush_writes'
|
22
|
+
end
|
23
|
+
|
24
|
+
::Paperclip::Storage::S3.class_eval do
|
25
|
+
add_method_tracer :flush_deletes, 'Paperclip/Storage/flush_deletes'
|
26
|
+
add_method_tracer :flush_writes, 'Paperclip/Storage/flush_writes'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
if defined?(::Picky)
|
2
|
+
|
3
|
+
class Picky::NewRelic
|
4
|
+
def self.obfuscate_tokens tokens
|
5
|
+
tokens.map { |t|
|
6
|
+
o = 'xxx'
|
7
|
+
o += '~' if t.similar?
|
8
|
+
o += '*' if t.partial?
|
9
|
+
o = t.qualifiers.sort.join(',') + ':' + o if t.qualifiers && t.qualifiers.respond_to?(:join)
|
10
|
+
o
|
11
|
+
}.sort.join(' ')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
DependencyDetection.defer do
|
18
|
+
@name = :picky
|
19
|
+
|
20
|
+
depends_on do
|
21
|
+
defined?(::Picky) && !NewRelic::Control.instance['disable_picky']
|
22
|
+
end
|
23
|
+
|
24
|
+
executes do
|
25
|
+
NewRelic::Agent.logger.debug 'Installing Picky instrumentation'
|
26
|
+
end
|
27
|
+
|
28
|
+
executes do
|
29
|
+
::Picky::Search.class_eval do
|
30
|
+
include NewRelic::Agent::MethodTracer
|
31
|
+
|
32
|
+
def execute_with_newrelic_trace *args
|
33
|
+
metrics = "Custom/Picky/search: #{Picky::NewRelic.obfuscate_tokens args[0]}"
|
34
|
+
self.class.trace_execution_scoped(metrics){ execute_without_newrelic_trace(*args) }
|
35
|
+
end
|
36
|
+
|
37
|
+
alias_method :execute_without_newrelic_trace, :execute
|
38
|
+
alias_method :execute, :execute_with_newrelic_trace
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Redis instrumentation contributed by Ashley Martens of ngmoco
|
2
|
+
#
|
3
|
+
DependencyDetection.defer do
|
4
|
+
@name = :redis
|
5
|
+
|
6
|
+
depends_on do
|
7
|
+
defined?(::Redis) && !NewRelic::Control.instance['disable_redis']
|
8
|
+
end
|
9
|
+
|
10
|
+
executes do
|
11
|
+
NewRelic::Agent.logger.debug 'Installing Redis instrumentation'
|
12
|
+
end
|
13
|
+
|
14
|
+
executes do
|
15
|
+
::Redis::Client.class_eval do
|
16
|
+
|
17
|
+
include NewRelic::Agent::MethodTracer
|
18
|
+
|
19
|
+
def self.redis_call_method
|
20
|
+
::Redis::Client.new.respond_to?(:call) ? :call : :raw_call_command
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def raw_call_command_with_newrelic_trace *args
|
25
|
+
method_name = args[0].is_a?(Array) ? args[0][0] : args[0]
|
26
|
+
metrics = ["Database/Redis/#{method_name}",
|
27
|
+
(NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction? ? 'Database/Redis/allWeb' : 'Database/Redis/allOther')]
|
28
|
+
self.class.trace_execution_scoped(metrics) do
|
29
|
+
# NewRelic::Control.instance.log.debug("Instrumenting Redis Call[#{method_name}]: #{args[0].inspect}")
|
30
|
+
raw_call_command_without_newrelic_trace(*args)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_method :raw_call_command_without_newrelic_trace, redis_call_method
|
35
|
+
alias_method redis_call_method, :raw_call_command_with_newrelic_trace
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'rpm_contrib/language_support'
|
2
|
+
|
3
|
+
# call this now so it is memoized before potentially forking worker processes
|
4
|
+
RPMContrib::LanguageSupport.can_fork?
|
5
|
+
|
6
|
+
module Resque
|
7
|
+
module Plugins
|
8
|
+
module NewRelicInstrumentation
|
9
|
+
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
10
|
+
|
11
|
+
def around_perform_with_monitoring(*args)
|
12
|
+
begin
|
13
|
+
trace_options = if (defined?(::Backgrounded::Handler::ResqueHandler) && payload_class == ::Backgrounded::Handler::ResqueHandler)
|
14
|
+
{
|
15
|
+
:class_name => args[0],
|
16
|
+
:name => args[2].to_s,
|
17
|
+
:params => @payload,
|
18
|
+
:category => 'OtherTransaction/BackgroundedResqueJob'
|
19
|
+
}
|
20
|
+
else
|
21
|
+
{
|
22
|
+
:class_name => self.name,
|
23
|
+
:name => 'perform',
|
24
|
+
:category => 'OtherTransaction/ResqueJob'
|
25
|
+
}
|
26
|
+
end
|
27
|
+
perform_action_with_newrelic_trace(trace_options) do
|
28
|
+
yield(*args)
|
29
|
+
end
|
30
|
+
ensure
|
31
|
+
NewRelic::Agent.shutdown if RPMContrib::LanguageSupport.can_fork?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module RPMContrib
|
39
|
+
module Instrumentation
|
40
|
+
module ResqueInstrumentationInstaller
|
41
|
+
def payload_class
|
42
|
+
klass = super
|
43
|
+
klass.instance_eval do
|
44
|
+
extend ::Resque::Plugins::NewRelicInstrumentation
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
DependencyDetection.defer do
|
52
|
+
@name = :resque
|
53
|
+
|
54
|
+
depends_on do
|
55
|
+
defined?(::Resque::Job) and not NewRelic::Control.instance['disable_resque']
|
56
|
+
end
|
57
|
+
|
58
|
+
executes do
|
59
|
+
NewRelic::Agent.logger.debug 'Installing Resque instrumentation'
|
60
|
+
end
|
61
|
+
|
62
|
+
executes do
|
63
|
+
# == Resque Instrumentation
|
64
|
+
#
|
65
|
+
# Installs a hook to ensure the agent starts manually when the worker
|
66
|
+
# starts and also adds the tracer to the process method which executes
|
67
|
+
# in the forked task.
|
68
|
+
::Resque::Job.class_eval do
|
69
|
+
def self.new(*args)
|
70
|
+
super(*args).extend RPMContrib::Instrumentation::ResqueInstrumentationInstaller
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
::Resque.before_first_fork do
|
75
|
+
NewRelic::Agent.manual_start(:dispatcher => :resque,
|
76
|
+
:sync_startup => true)
|
77
|
+
end
|
78
|
+
|
79
|
+
::Resque.after_fork do
|
80
|
+
NewRelic::Agent.after_fork(:force_reconnect => false)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :riak_client
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Riak) and not NewRelic::Control.instance['disable_riak_client']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Riak client instrumentation'
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
backend_tracers = proc do
|
14
|
+
add_method_tracer :ping, 'Database/Riak/ping'
|
15
|
+
|
16
|
+
add_method_tracer :list_buckets, 'Database/Riak/list_buckets'
|
17
|
+
add_method_tracer :get_bucket_props, 'Database/Riak/get_bucket_props'
|
18
|
+
add_method_tracer :set_bucket_props, 'Database/Riak/set_bucket_props'
|
19
|
+
|
20
|
+
add_method_tracer :mapred, 'Database/Riak/mapred'
|
21
|
+
|
22
|
+
add_method_tracer :list_keys, 'Database/Riak/list_keys'
|
23
|
+
add_method_tracer :fetch_object, 'Database/Riak/fetch_object'
|
24
|
+
add_method_tracer :reload_object, 'Database/Riak/reload_object'
|
25
|
+
add_method_tracer :store_object, 'Database/Riak/store_object'
|
26
|
+
add_method_tracer :delete_object, 'Database/Riak/delete_object'
|
27
|
+
end
|
28
|
+
|
29
|
+
::Riak::Client::BeefcakeProtobuffsBackend.class_eval &backend_tracers
|
30
|
+
::Riak::Client::BeefcakeProtobuffsBackend.class_eval do
|
31
|
+
add_method_tracer :server_info, 'Database/Riak/server_info'
|
32
|
+
add_method_tracer :get_client_id, 'Database/Riak/get_client_id'
|
33
|
+
add_method_tracer :set_client_id, 'Database/Riak/set_client_id'
|
34
|
+
end
|
35
|
+
::Riak::Client::HTTPBackend.class_eval &backend_tracers
|
36
|
+
::Riak::Client::HTTPBackend.class_eval do
|
37
|
+
add_method_tracer :stats, 'Database/Riak/stats'
|
38
|
+
add_method_tracer :link_walk, 'Database/Riak/link_walk'
|
39
|
+
add_method_tracer :get_index, 'Database/Riak/get_index'
|
40
|
+
add_method_tracer :search, 'Database/Riak/search'
|
41
|
+
add_method_tracer :update_search_index, 'Database/Riak/update_search_index'
|
42
|
+
end
|
43
|
+
|
44
|
+
::Riak::RObject.class_eval do
|
45
|
+
add_method_tracer :serialize, 'Database/Riak/serialize'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :ripple
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Ripple) and not
|
6
|
+
NewRelic::Control.instance['disable_ripple']
|
7
|
+
end
|
8
|
+
|
9
|
+
executes do
|
10
|
+
NewRelic::Agent.logger.debug 'Installing Ripple instrumentation'
|
11
|
+
end
|
12
|
+
|
13
|
+
executes do
|
14
|
+
::Ripple::Callbacks::InstanceMethods.class_eval do
|
15
|
+
add_method_tracer :valid?, 'Database/Riak/Ripple/valid?'
|
16
|
+
end
|
17
|
+
|
18
|
+
::Ripple::Document::Persistence::ClassMethods.class_eval do
|
19
|
+
add_method_tracer :create, 'Database/Riak/Ripple/create'
|
20
|
+
add_method_tracer :destroy_all, 'Database/Riak/Ripple/destroy_all'
|
21
|
+
end
|
22
|
+
|
23
|
+
::Ripple::Document::Persistence::InstanceMethods.class_eval do
|
24
|
+
add_method_tracer :really_save, 'Database/Riak/Ripple/really_save'
|
25
|
+
add_method_tracer :reload, 'Database/Riak/Ripple/reload'
|
26
|
+
add_method_tracer :delete, 'Database/Riak/Ripple/delete'
|
27
|
+
add_method_tracer :destroy, 'Database/Riak/Ripple/destroy'
|
28
|
+
add_method_tracer :update_attribute, 'Database/Riak/Ripple/update_attribute'
|
29
|
+
add_method_tracer :update_attributes, 'Database/Riak/Ripple/update_attributes'
|
30
|
+
end
|
31
|
+
|
32
|
+
::Ripple::Document::Finders::ClassMethods.class_eval do
|
33
|
+
add_method_tracer :find, 'Database/Riak/Ripple/find'
|
34
|
+
add_method_tracer :list, 'Database/Riak/Ripple/list'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :sinatra_view
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Sinatra::Base) and not NewRelic::Control.instance['disable_sinatra_template']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Sinatra view instrumentation'
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
::Sinatra::Base.class_eval do
|
14
|
+
def render_with_newrelic_trace(*args, &block)
|
15
|
+
engine, file = *args
|
16
|
+
return render_without_newrelic_trace(*args, &block) if file == "= yield"
|
17
|
+
|
18
|
+
file = "Proc" if file.is_a?(Proc)
|
19
|
+
metrics = ["View/#{engine}/#{file}/Rendering"]
|
20
|
+
|
21
|
+
self.class.trace_execution_scoped metrics do
|
22
|
+
render_without_newrelic_trace(*args, &block)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
alias render_without_newrelic_trace render
|
27
|
+
alias render render_with_newrelic_trace
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :thinking_sphinx
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::ThinkingSphinx) and not ::NewRelic::Control.instance['disable_thinking_sphinx']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Thinking Sphinx instrumentation'
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
class ::ThinkingSphinx::Search
|
14
|
+
include NewRelic::Agent::MethodTracer
|
15
|
+
|
16
|
+
add_method_tracer :initialize
|
17
|
+
add_method_tracer :populate
|
18
|
+
add_method_tracer :results
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :typhoeus
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Typhoeus) and not ::NewRelic::Control.instance['disable_typhoeus']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Typhoeus instrumentation'
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
require 'uri'
|
14
|
+
::Typhoeus::Request.instance_eval do
|
15
|
+
def get_with_newrelic_trace(*args, &block)
|
16
|
+
uri = URI.parse(args.first)
|
17
|
+
metrics = ["External/#{uri.host}/Typhoeus/GET","External/#{uri.host}/all"]
|
18
|
+
if NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction?
|
19
|
+
metrics << "External/allWeb"
|
20
|
+
else
|
21
|
+
metrics << "External/allOther"
|
22
|
+
end
|
23
|
+
self.class.trace_execution_scoped metrics do
|
24
|
+
get_without_newrelic_trace(*args, &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
alias get_without_newrelic_trace get
|
28
|
+
alias get get_with_newrelic_trace
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
@name = :ultrasphinx
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Ultrasphinx) and not ::NewRelic::Control.instance['disable_ultrasphinx']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
NewRelic::Agent.logger.debug 'Installing Ultrasphinx instrumentation'
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
class ::Ultrasphinx::Search
|
14
|
+
include NewRelic::Agent::MethodTracer
|
15
|
+
|
16
|
+
add_method_tracer :run
|
17
|
+
add_method_tracer :results
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|