wireframe-rpm_contrib 1.0.12.7 → 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 +69 -3
- data/Gemfile +13 -0
- data/README.md +137 -14
- data/Rakefile +5 -3
- data/lib/rpm_contrib.rb +17 -24
- data/lib/rpm_contrib/agent_compatibility.rb +11 -0
- data/lib/rpm_contrib/detection.rb +5 -0
- data/lib/rpm_contrib/detection/camping.rb +1 -1
- data/lib/rpm_contrib/instrumentation.rb +16 -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 +7 -10
- data/lib/rpm_contrib/instrumentation/cassandra.rb +26 -19
- 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 +54 -0
- data/lib/rpm_contrib/instrumentation/mongoid.rb +12 -44
- data/lib/rpm_contrib/instrumentation/paperclip.rb +25 -18
- data/lib/rpm_contrib/instrumentation/picky.rb +41 -0
- data/lib/rpm_contrib/instrumentation/redis.rb +29 -20
- data/lib/rpm_contrib/instrumentation/resque.rb +78 -42
- 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/language_support.rb +31 -0
- data/lib/rpm_contrib/samplers.rb +17 -0
- data/test/helper.rb +1 -1
- data/test/schema.rb +1 -1
- data/test/test_curb.rb +69 -0
- data/test/test_picky.rb +55 -0
- data/test/test_redis.rb +2 -2
- data/test/test_resque.rb +74 -0
- data/test/{test_mongoid.rb → test_workling.rb} +6 -14
- metadata +74 -64
- data/lib/rpm_contrib/detection/resque.rb +0 -15
- data/lib/rpm_contrib/instrumentation/aws/s3.rb +0 -56
- data/lib/rpm_contrib/instrumentation/mongo_mapper.rb +0 -44
@@ -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
|
@@ -1,33 +1,42 @@
|
|
1
1
|
# Redis instrumentation contributed by Ashley Martens of ngmoco
|
2
2
|
#
|
3
|
+
DependencyDetection.defer do
|
4
|
+
@name = :redis
|
3
5
|
|
4
|
-
|
6
|
+
depends_on do
|
7
|
+
defined?(::Redis) && !NewRelic::Control.instance['disable_redis']
|
8
|
+
end
|
5
9
|
|
10
|
+
executes do
|
11
|
+
NewRelic::Agent.logger.debug 'Installing Redis instrumentation'
|
12
|
+
end
|
6
13
|
|
7
|
-
|
8
|
-
|
9
|
-
include NewRelic::Agent::MethodTracer
|
14
|
+
executes do
|
15
|
+
::Redis::Client.class_eval do
|
10
16
|
|
11
|
-
|
12
|
-
Redis::Client.new.respond_to?(:call) ? :call : :raw_call_command
|
13
|
-
end
|
17
|
+
include NewRelic::Agent::MethodTracer
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
method_name = args[0].is_a?(Array) ? args[0][0] : args[0]
|
18
|
-
metrics = ["Database/Redis/#{method_name}",
|
19
|
-
(NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction? ? 'Database/Redis/allWeb' : 'Database/Redis/allOther')]
|
20
|
-
self.class.trace_execution_scoped(metrics) do
|
21
|
-
# NewRelic::Control.instance.log.debug("Instrumenting Redis Call[#{method_name}]: #{args[0].inspect}")
|
22
|
-
raw_call_command_without_newrelic_trace(*args)
|
19
|
+
def self.redis_call_method
|
20
|
+
::Redis::Client.new.respond_to?(:call) ? :call : :raw_call_command
|
23
21
|
end
|
24
|
-
end
|
25
22
|
|
26
|
-
alias_method :raw_call_command_without_newrelic_trace, redis_call_method
|
27
|
-
alias_method redis_call_method, :raw_call_command_with_newrelic_trace
|
28
|
-
|
29
|
-
end
|
30
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
|
31
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
|
32
36
|
|
37
|
+
end
|
38
|
+
end
|
33
39
|
end
|
40
|
+
|
41
|
+
|
42
|
+
|
@@ -1,54 +1,90 @@
|
|
1
|
+
require 'rpm_contrib/language_support'
|
1
2
|
|
2
|
-
|
3
|
-
|
4
|
-
# == Resque Instrumentation
|
5
|
-
#
|
6
|
-
# Installs a hook to ensure the agent starts manually when the worker
|
7
|
-
# starts and also adds the tracer to the process method which executes
|
8
|
-
# in the forked task.
|
9
|
-
module ResqueInstrumentation
|
10
|
-
::Resque::Job.class_eval do
|
11
|
-
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
12
|
-
|
13
|
-
old_perform_method = instance_method(:perform)
|
3
|
+
# call this now so it is memoized before potentially forking worker processes
|
4
|
+
RPMContrib::LanguageSupport.can_fork?
|
14
5
|
|
15
|
-
|
16
|
-
|
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
|
17
13
|
perform_action_with_newrelic_trace(trace_options) do
|
18
|
-
|
14
|
+
yield(*args)
|
19
15
|
end
|
20
|
-
|
21
|
-
NewRelic::Agent.shutdown
|
16
|
+
ensure
|
17
|
+
NewRelic::Agent.shutdown if RPMContrib::LanguageSupport.can_fork?
|
22
18
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
19
|
+
end
|
20
|
+
private
|
21
|
+
def backgrounded_job?
|
22
|
+
defined?(::Backgrounded::Handler::ResqueHandler) && payload_class == ::Backgrounded::Handler::ResqueHandler
|
23
|
+
end
|
24
|
+
def trace_options
|
25
|
+
if backgrounded_job?
|
26
|
+
{
|
27
|
+
:class_name => args[0],
|
28
|
+
:name => args[2].to_s,
|
29
|
+
:params => @payload,
|
30
|
+
:category => 'OtherTransaction/BackgroundedResqueJob'
|
31
|
+
}
|
32
|
+
else
|
33
|
+
class_name = (payload_class || self.class).name
|
34
|
+
{
|
35
|
+
:class_name => class_name,
|
36
|
+
:name => 'perform',
|
37
|
+
:category => 'OtherTransaction/ResqueJob'
|
38
|
+
}
|
44
39
|
end
|
45
40
|
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
46
44
|
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
module RPMContrib
|
46
|
+
module Instrumentation
|
47
|
+
module ResqueInstrumentationInstaller
|
48
|
+
def payload_class
|
49
|
+
klass = super
|
50
|
+
klass.instance_eval do
|
51
|
+
extend ::Resque::Plugins::NewRelicInstrumentation
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
53
55
|
end
|
54
|
-
end
|
56
|
+
end
|
57
|
+
|
58
|
+
DependencyDetection.defer do
|
59
|
+
@name = :resque
|
60
|
+
|
61
|
+
depends_on do
|
62
|
+
defined?(::Resque::Job) and not NewRelic::Control.instance['disable_resque']
|
63
|
+
end
|
64
|
+
|
65
|
+
executes do
|
66
|
+
NewRelic::Agent.logger.debug 'Installing Resque instrumentation'
|
67
|
+
end
|
68
|
+
|
69
|
+
executes do
|
70
|
+
# == Resque Instrumentation
|
71
|
+
#
|
72
|
+
# Installs a hook to ensure the agent starts manually when the worker
|
73
|
+
# starts and also adds the tracer to the process method which executes
|
74
|
+
# in the forked task.
|
75
|
+
::Resque::Job.class_eval do
|
76
|
+
def self.new(*args)
|
77
|
+
super(*args).extend RPMContrib::Instrumentation::ResqueInstrumentationInstaller
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
::Resque.before_first_fork do
|
82
|
+
NewRelic::Agent.manual_start(:dispatcher => :resque,
|
83
|
+
:sync_startup => true)
|
84
|
+
end
|
85
|
+
|
86
|
+
::Resque.after_fork do
|
87
|
+
NewRelic::Agent.after_fork(:force_reconnect => false)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
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
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Workling instrumentation contributed by Chad Ingram of Aurora Feint
|
2
|
+
#
|
3
|
+
DependencyDetection.defer do
|
4
|
+
@name = :workling
|
5
|
+
|
6
|
+
depends_on do
|
7
|
+
defined?(::Workling) and not ::NewRelic::Control.instance['disable_workling']
|
8
|
+
end
|
9
|
+
|
10
|
+
executes do
|
11
|
+
NewRelic::Agent.logger.debug 'Installing Workling instrumentation'
|
12
|
+
end
|
13
|
+
|
14
|
+
executes do
|
15
|
+
::Workling::Base.class_eval do
|
16
|
+
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
17
|
+
end
|
18
|
+
|
19
|
+
::Workling::Discovery.discovered.each do |clazz|
|
20
|
+
(clazz.public_instance_methods - ::Workling::Base.public_instance_methods).each do |method|
|
21
|
+
puts "added method tracer Workling/#{clazz.name}/#{method}"
|
22
|
+
clazz.send(:add_method_tracer, method, "Workling/#{clazz.name}/#{method}", :category => :task)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|