rpm_contrib 2.1.3 → 2.1.4.beta
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +7 -0
- data/Rakefile +2 -2
- data/lib/rpm_contrib/detection/camping.rb +1 -1
- data/lib/rpm_contrib/instrumentation/active_mq.rb +9 -9
- data/lib/rpm_contrib/instrumentation/aws.rb +60 -3
- data/lib/rpm_contrib/instrumentation/camping.rb +3 -6
- data/lib/rpm_contrib/instrumentation/cassandra.rb +20 -26
- data/lib/rpm_contrib/instrumentation/crack.rb +23 -20
- data/lib/rpm_contrib/instrumentation/curb.rb +39 -37
- data/lib/rpm_contrib/instrumentation/elastic_search.rb +13 -17
- data/lib/rpm_contrib/instrumentation/mongo.rb +37 -37
- data/lib/rpm_contrib/instrumentation/paperclip.rb +17 -22
- data/lib/rpm_contrib/instrumentation/redis.rb +25 -27
- data/lib/rpm_contrib/instrumentation/resque.rb +54 -24
- data/lib/rpm_contrib/instrumentation/sinatra.rb +16 -19
- data/lib/rpm_contrib/instrumentation/typhoeus.rb +22 -22
- data/lib/rpm_contrib/instrumentation/ultrasphinx.rb +12 -13
- data/lib/rpm_contrib/instrumentation/workling.rb +16 -14
- data/lib/rpm_contrib/instrumentation/yajl.rb +10 -11
- data/lib/rpm_contrib/instrumentation.rb +12 -18
- data/lib/rpm_contrib/samplers.rb +17 -0
- data/lib/rpm_contrib.rb +20 -19
- metadata +20 -21
- data/lib/rpm_contrib/instrumentation/aws/s3.rb +0 -64
data/CHANGELOG
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
* Version 2.1.4.beta
|
2
|
+
|
3
|
+
Updated requirements to latest agent with some bug fixes for background jobs
|
4
|
+
Converted instrumentation to install with DependencyDetection in the latest Agent
|
5
|
+
Changed Resque instrumentation from a plugin back to method chaining
|
6
|
+
Fixed several reported bugs related to resque
|
7
|
+
|
1
8
|
* Version 2.1.3
|
2
9
|
|
3
10
|
Fixed typo in Resque instrumentation
|
data/Rakefile
CHANGED
@@ -3,7 +3,7 @@ require 'rake'
|
|
3
3
|
# See http://www.rubygems.org/read/chapter/20
|
4
4
|
|
5
5
|
def version
|
6
|
-
@rpm_contrib_version ||= File.read("CHANGELOG")[/Version ([\d\.]
|
6
|
+
@rpm_contrib_version ||= File.read("CHANGELOG")[/Version ([\d\.]+\w*)$/, 1]
|
7
7
|
end
|
8
8
|
|
9
9
|
RDOC_FILES = FileList['README*','LICENSE','CHANGELOG']
|
@@ -22,7 +22,7 @@ begin
|
|
22
22
|
gem.email = "support@newrelic.com"
|
23
23
|
gem.homepage = "http://github.com/newrelic/rpm_contrib"
|
24
24
|
gem.author = "Bill Kayser"
|
25
|
-
gem.add_dependency 'newrelic_rpm', '>=3.
|
25
|
+
gem.add_dependency 'newrelic_rpm', '>=3.1.1'
|
26
26
|
gem.version = version
|
27
27
|
gem.files = FileList['LICENSE', 'README*', 'lib/**/*.rb', 'bin/*', '[A-Z]*', 'test/**/*'].to_a
|
28
28
|
gem.rdoc_options <<
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module NewRelic #:nodoc:
|
2
2
|
# The class defined in the
|
3
|
-
# newrelic_rpm[http://newrelic.github.com/rpm] which can be
|
3
|
+
# newrelic_rpm[http://newrelic.github.com/rpm] which can be amended
|
4
4
|
# to support new frameworks by defining modules in this namespace.
|
5
5
|
class LocalEnvironment #:nodoc:
|
6
6
|
module Camping
|
@@ -2,15 +2,15 @@
|
|
2
2
|
# Robert R. Meyer
|
3
3
|
# Blue-Dog-Archolite @ GitHub
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
DependencyDetection.defer do
|
6
|
+
depends_on do
|
7
|
+
defined?(::ActiveMessaging::Processor) && !NewRelic::Control.instance['disable_active_mq']
|
8
|
+
end
|
9
|
+
|
10
|
+
executes do
|
11
|
+
::ActiveMessaging::Processor.class_eval do
|
12
|
+
class << self
|
13
|
+
add_method_tracer :on_message, 'ActiveMessaging/OnMessage'
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -1,6 +1,63 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# AWS Instrumentation by Brian Doll of New Relic
|
2
|
+
DependencyDetection.defer do
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::AWS::S3) && !NewRelic::Control.instance['disable_aws-s3']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
|
10
|
+
# Instrument connections to the AWS-S3 service
|
11
|
+
::AWS::S3::Connection::Management::ClassMethods.module_eval do
|
12
|
+
add_method_tracer :establish_connection!, 'AWS-S3/establish_connection!'
|
13
|
+
end
|
14
|
+
|
15
|
+
# Instrument methods on Bucket
|
16
|
+
::AWS::S3::Bucket.instance_eval do
|
17
|
+
class << self
|
18
|
+
add_method_tracer :create, 'AWS-S3/Bucket/create'
|
19
|
+
add_method_tracer :find, 'AWS-S3/Bucket/find'
|
20
|
+
add_method_tracer :objects, 'AWS-S3/Bucket/objects'
|
21
|
+
add_method_tracer :delete, 'AWS-S3/Bucket/delete'
|
22
|
+
add_method_tracer :list, 'AWS-S3/Bucket/list'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Instrument methods on Bucket instances
|
27
|
+
::AWS::S3::Bucket.class_eval do
|
28
|
+
add_method_tracer :[], 'AWS-S3/Bucket/#{self.name}/[]'
|
29
|
+
add_method_tracer :new_object,'AWS-S3/Bucket/#{self.name}/new_objects'
|
30
|
+
add_method_tracer :objects, 'AWS-S3/Bucket/#{self.name}/objects'
|
31
|
+
add_method_tracer :delete, 'AWS-S3/Bucket/#{self.name}/delete'
|
32
|
+
add_method_tracer :delete_all,'AWS-S3/Bucket/#{self.name}/delete_all'
|
33
|
+
add_method_tracer :update, 'AWS-S3/Bucket/#{self.name}/update'
|
34
|
+
end
|
35
|
+
|
36
|
+
# Instrument methods on S3Object
|
37
|
+
::AWS::S3::S3Object.instance_eval do
|
38
|
+
class << self
|
39
|
+
add_method_tracer :about, 'AWS-S3/S3Object/about'
|
40
|
+
add_method_tracer :copy, 'AWS-S3/S3Object/copy'
|
41
|
+
add_method_tracer :delete, 'AWS-S3/S3Object/delete'
|
42
|
+
add_method_tracer :rename, 'AWS-S3/S3Object/rename'
|
43
|
+
add_method_tracer :store, 'AWS-S3/S3Object/store'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Instrument methods on S3Object instances
|
48
|
+
# Metric names are aggregated across all S3Objects since having a metric for
|
49
|
+
# every single S3Object instance and method pair would be fairly useless
|
50
|
+
::AWS::S3::S3Object.class_eval do
|
51
|
+
add_method_tracer :value, 'AWS-S3/S3Objects/value'
|
52
|
+
add_method_tracer :about, 'AWS-S3/S3Objects/about'
|
53
|
+
add_method_tracer :metadata, 'AWS-S3/S3Objects/metadata'
|
54
|
+
add_method_tracer :store, 'AWS-S3/S3Objects/store'
|
55
|
+
add_method_tracer :delete, 'AWS-S3/S3Objects/delete'
|
56
|
+
add_method_tracer :copy, 'AWS-S3/S3Objects/copy'
|
57
|
+
add_method_tracer :rename, 'AWS-S3/S3Objects/rename'
|
58
|
+
add_method_tracer :etag, 'AWS-S3/S3Objects/etag'
|
59
|
+
add_method_tracer :owner, 'AWS-S3/S3Objects/owner'
|
4
60
|
end
|
5
61
|
end
|
6
62
|
end
|
63
|
+
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'new_relic/agent/instrumentation/controller_instrumentation'
|
2
|
-
|
3
1
|
module RPMContrib
|
4
2
|
module Instrumentation
|
5
3
|
# == Instrumentation for Camping
|
@@ -20,23 +18,22 @@ module RPMContrib
|
|
20
18
|
# Camping code example:
|
21
19
|
# -------------------------------------------------------------------------------------
|
22
20
|
#
|
23
|
-
# require "
|
21
|
+
# require "rpm_contrib"
|
24
22
|
#
|
25
23
|
# Camping.goes :NewRelicCampingTest
|
26
24
|
#
|
27
25
|
# module NewRelicCampingTest
|
28
26
|
# # your code
|
29
27
|
#
|
30
|
-
# include
|
28
|
+
# include RPMContrib::Instrumentation::Camping
|
31
29
|
#
|
32
30
|
# end
|
33
31
|
#
|
34
32
|
#
|
35
|
-
|
36
33
|
module Camping
|
37
34
|
|
38
35
|
def self.included(mod)
|
39
|
-
|
36
|
+
require 'new_relic/agent/instrumentation/controller_instrumentation'
|
40
37
|
# Since the Camping::Base module is essentially copied
|
41
38
|
# into the main module (the mod passed in) of a Camping app
|
42
39
|
# using the Camping.goes :NewRelicCampingTest syntax
|
@@ -1,29 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
add_method_tracer :get_range, 'Database/Cassandra/get_range'
|
22
|
-
add_method_tracer :count_range, 'Database/Cassandra/count_range'
|
23
|
-
add_method_tracer :batch, 'Database/Cassandra/batch'
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
1
|
+
DependencyDetection.defer do
|
2
|
+
depends_on do
|
3
|
+
defined?(::Cassandra) && !NewRelic::Control.instance['disable_cassandra_instrumentation']
|
4
|
+
end
|
5
|
+
executes do
|
6
|
+
::Cassandra.class_eval do
|
7
|
+
add_method_tracer :insert, 'Database/Cassandra/insert'
|
8
|
+
add_method_tracer :remove, 'Database/Cassandra/remove'
|
9
|
+
add_method_tracer :clear_column_family!, 'Database/Cassandra/clear_column_family!'
|
10
|
+
add_method_tracer :clear_keyspace!, 'Database/Cassandra/clear_keyspace!'
|
11
|
+
add_method_tracer :count_columns, 'Database/Cassandra/count_columns'
|
12
|
+
add_method_tracer :multi_count_columns, 'Database/Cassandra/multi_count_columns'
|
13
|
+
add_method_tracer :get_columns, 'Database/Cassandra/get_columns'
|
14
|
+
add_method_tracer :multi_get_columns, 'Database/Cassandra/multi_get_columns'
|
15
|
+
add_method_tracer :get, 'Database/Cassandra/get'
|
16
|
+
add_method_tracer :multi_get, 'Database/Cassandra/multi_get'
|
17
|
+
add_method_tracer :exists?, 'Database/Cassandra/exists?'
|
18
|
+
add_method_tracer :get_range, 'Database/Cassandra/get_range'
|
19
|
+
add_method_tracer :count_range, 'Database/Cassandra/count_range'
|
20
|
+
add_method_tracer :batch, 'Database/Cassandra/batch'
|
27
21
|
end
|
28
22
|
end
|
29
23
|
end
|
@@ -1,25 +1,28 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
DependencyDetection.defer do
|
2
|
+
depends_on do
|
3
|
+
defined?(::Crack::JSON) && !NewRelic::Control.instance['disable_crack']
|
4
|
+
end
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
executes do
|
7
|
+
::Crack::JSON.class_eval do
|
8
|
+
class << self
|
9
|
+
include NewRelic::Agent::MethodTracer
|
10
|
+
add_method_tracer :parse, 'Parser/#{self.name}/parse'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
DependencyDetection.defer do
|
17
|
+
depends_on do
|
18
|
+
defined?(::Crack::XML) && !NewRelic::Control.instance['disable_crack']
|
19
|
+
end
|
14
20
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
21
|
+
executes do
|
22
|
+
::Crack::XML.class_eval do
|
23
|
+
class << self
|
24
|
+
include NewRelic::Agent::MethodTracer
|
25
|
+
add_method_tracer :parse, 'Parser/#{self.name}/parse'
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
@@ -1,45 +1,47 @@
|
|
1
|
-
|
2
|
-
module Instrumentation
|
3
|
-
module Curl
|
4
|
-
if defined?(::Curl) and not NewRelic::Control.instance['disable_curb']
|
5
|
-
::Curl::Easy.class_eval do
|
6
|
-
def host
|
7
|
-
URI.parse(self.url).host
|
8
|
-
end
|
1
|
+
DependencyDetection.defer do
|
9
2
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
3
|
+
depends_on do
|
4
|
+
defined?(::Curl) and not NewRelic::Control.instance['disable_curb']
|
5
|
+
end
|
6
|
+
|
7
|
+
executes do
|
8
|
+
::Curl::Easy.class_eval do
|
9
|
+
def host
|
10
|
+
URI.parse(self.url).host
|
11
|
+
end
|
12
|
+
|
13
|
+
# TODO: http, http_delete, http_get, http_post, http_head, http_put
|
14
|
+
def perform_with_newrelic_trace(*args, &block)
|
15
|
+
metrics = ["External/#{host}/Curl::Easy","External/#{host}/all"]
|
16
|
+
if NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction?
|
17
|
+
metrics << "External/allWeb"
|
18
|
+
else
|
19
|
+
metrics << "External/allOther"
|
20
|
+
end
|
21
|
+
self.class.trace_execution_scoped metrics do
|
22
|
+
perform_without_newrelic_trace(*args, &block)
|
24
23
|
end
|
24
|
+
end
|
25
|
+
alias perform_without_newrelic_trace perform
|
26
|
+
alias perform perform_with_newrelic_trace
|
27
|
+
end
|
25
28
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
39
|
-
alias perform_without_newrelic_trace perform
|
40
|
-
alias perform perform_with_newrelic_trace
|
29
|
+
::Curl::Multi.class_eval do
|
30
|
+
# TODO: http
|
31
|
+
def perform_with_newrelic_trace(*args, &block)
|
32
|
+
metrics = ["External/Curl::Multi"]
|
33
|
+
if NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction?
|
34
|
+
metrics << "External/allWeb"
|
35
|
+
else
|
36
|
+
metrics << "External/allOther"
|
37
|
+
end
|
38
|
+
self.class.trace_execution_scoped metrics do
|
39
|
+
perform_without_newrelic_trace(*args, &block)
|
41
40
|
end
|
42
41
|
end
|
42
|
+
alias perform_without_newrelic_trace perform
|
43
|
+
alias perform perform_with_newrelic_trace
|
43
44
|
end
|
44
45
|
end
|
45
46
|
end
|
47
|
+
|
@@ -1,23 +1,19 @@
|
|
1
1
|
# == Elastic Search Instrumentation
|
2
2
|
#
|
3
|
+
DependencyDetection.defer do
|
4
|
+
depends_on do
|
5
|
+
defined?(::ElasticSearch::Client) && !NewRelic::Control.instance['disable_elastic_search_instrumentation']
|
6
|
+
end
|
3
7
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
add_method_tracer :delete, 'ActiveRecord/ElasticSearch/delete'
|
14
|
-
add_method_tracer :search, 'ActiveRecord/ElasticSearch/search'
|
15
|
-
add_method_tracer :scroll, 'ActiveRecord/ElasticSearch/scroll'
|
16
|
-
add_method_tracer :count, 'ActiveRecord/ElasticSearch/count'
|
17
|
-
add_method_tracer :bulk, 'ActiveRecord/ElasticSearch/bulk'
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
8
|
+
executes do
|
9
|
+
::ElasticSearch::Client.class_eval do
|
10
|
+
add_method_tracer :index, 'ActiveRecord/ElasticSearch/index'
|
11
|
+
add_method_tracer :get, 'ActiveRecord/ElasticSearch/get'
|
12
|
+
add_method_tracer :delete, 'ActiveRecord/ElasticSearch/delete'
|
13
|
+
add_method_tracer :search, 'ActiveRecord/ElasticSearch/search'
|
14
|
+
add_method_tracer :scroll, 'ActiveRecord/ElasticSearch/scroll'
|
15
|
+
add_method_tracer :count, 'ActiveRecord/ElasticSearch/count'
|
16
|
+
add_method_tracer :bulk, 'ActiveRecord/ElasticSearch/bulk'
|
21
17
|
end
|
22
18
|
end
|
23
19
|
end
|
@@ -1,47 +1,47 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
trace_execution_scoped("Database/#{collection}/#{name}") do
|
18
|
-
t0 = Time.now
|
19
|
-
res = instrument_without_newrelic_trace(name, payload, &blk)
|
20
|
-
NewRelic::Agent.instance.transaction_sampler.notice_sql(payload.inspect, nil, (Time.now - t0).to_f)
|
21
|
-
res
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
alias_method :instrument_without_newrelic_trace, :instrument
|
26
|
-
alias_method :instrument, :instrument_with_newrelic_trace
|
1
|
+
# Mongo Instrumentation contributed by Alexey Palazhchenko
|
2
|
+
DependencyDetection.defer do
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Mongo) and not NewRelic::Control.instance['disable_mongodb']
|
6
|
+
end
|
7
|
+
|
8
|
+
executes do
|
9
|
+
::Mongo::Connection.class_eval do
|
10
|
+
include NewRelic::Agent::MethodTracer
|
11
|
+
|
12
|
+
def instrument_with_newrelic_trace(name, payload = {}, &blk)
|
13
|
+
collection = payload[:collection]
|
14
|
+
if collection == '$cmd'
|
15
|
+
f = payload[:selector].first
|
16
|
+
name, collection = f if f
|
27
17
|
end
|
28
18
|
|
29
|
-
|
30
|
-
|
19
|
+
trace_execution_scoped("Database/#{collection}/#{name}") do
|
20
|
+
t0 = Time.now
|
21
|
+
res = instrument_without_newrelic_trace(name, payload, &blk)
|
22
|
+
NewRelic::Agent.instance.transaction_sampler.notice_sql(payload.inspect, nil, (Time.now - t0).to_f)
|
23
|
+
res
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :instrument_without_newrelic_trace, :instrument
|
28
|
+
alias_method :instrument, :instrument_with_newrelic_trace
|
29
|
+
end
|
31
30
|
|
32
|
-
|
33
|
-
|
31
|
+
::Mongo::Cursor.class_eval do
|
32
|
+
include NewRelic::Agent::MethodTracer
|
34
33
|
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
34
|
+
def refresh_with_newrelic_trace
|
35
|
+
return if send_initial_query || @cursor_id.zero? # don't double report the initial query
|
39
36
|
|
40
|
-
|
41
|
-
|
42
|
-
add_method_tracer :close, 'Database/#{collection.name}/close'
|
37
|
+
trace_execution_scoped("Database/#{collection.name}/refresh") do
|
38
|
+
refresh_without_newrelic_trace
|
43
39
|
end
|
44
40
|
end
|
41
|
+
alias_method :refresh_without_newrelic_trace, :refresh
|
42
|
+
alias_method :refresh, :refresh_with_newrelic_trace
|
43
|
+
add_method_tracer :close, 'Database/#{collection.name}/close'
|
45
44
|
end
|
46
45
|
end
|
46
|
+
|
47
47
|
end
|
@@ -1,28 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
if defined?(::Paperclip) && !NewRelic::Control.instance['disable_paperclip']
|
7
|
-
|
8
|
-
::Paperclip::Attachment.class_eval do
|
9
|
-
add_method_tracer :save, 'Paperclip/#{name}/save'
|
10
|
-
add_method_tracer :assign, 'Paperclip/#{name}/assign'
|
11
|
-
add_method_tracer :post_process, 'Paperclip/#{name}/post_process'
|
12
|
-
end
|
13
|
-
|
14
|
-
::Paperclip::Storage::Filesystem.class_eval do
|
15
|
-
add_method_tracer :flush_deletes, 'Paperclip/Storage/flush_deletes'
|
16
|
-
add_method_tracer :flush_writes, 'Paperclip/Storage/flush_writes'
|
17
|
-
end
|
1
|
+
DependencyDetection.defer do
|
2
|
+
depends_on do
|
3
|
+
defined?(::Paperclip) && !NewRelic::Control.instance['disable_paperclip']
|
4
|
+
end
|
18
5
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
6
|
+
executes do
|
7
|
+
::Paperclip::Attachment.class_eval do
|
8
|
+
add_method_tracer :save, 'Paperclip/#{name}/save'
|
9
|
+
add_method_tracer :assign, 'Paperclip/#{name}/assign'
|
10
|
+
add_method_tracer :post_process, 'Paperclip/#{name}/post_process'
|
11
|
+
end
|
23
12
|
|
24
|
-
|
13
|
+
::Paperclip::Storage::Filesystem.class_eval do
|
14
|
+
add_method_tracer :flush_deletes, 'Paperclip/Storage/flush_deletes'
|
15
|
+
add_method_tracer :flush_writes, 'Paperclip/Storage/flush_writes'
|
16
|
+
end
|
25
17
|
|
18
|
+
::Paperclip::Storage::S3.class_eval do
|
19
|
+
add_method_tracer :flush_deletes, 'Paperclip/Storage/flush_deletes'
|
20
|
+
add_method_tracer :flush_writes, 'Paperclip/Storage/flush_writes'
|
26
21
|
end
|
27
22
|
end
|
28
23
|
end
|
@@ -1,39 +1,37 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# Redis instrumentation contributed by Ashley Martens of ngmoco
|
5
|
-
#
|
1
|
+
# Redis instrumentation contributed by Ashley Martens of ngmoco
|
2
|
+
#
|
3
|
+
DependencyDetection.defer do
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
::Redis::Client.class_eval do
|
11
|
-
|
12
|
-
include NewRelic::Agent::MethodTracer
|
5
|
+
depends_on do
|
6
|
+
defined?(::Redis) && !NewRelic::Control.instance['disable_redis']
|
7
|
+
end
|
13
8
|
|
14
|
-
|
15
|
-
|
16
|
-
end
|
9
|
+
executes do
|
10
|
+
::Redis::Client.class_eval do
|
17
11
|
|
12
|
+
include NewRelic::Agent::MethodTracer
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
(NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction? ? 'Database/Redis/allWeb' : 'Database/Redis/allOther')]
|
23
|
-
self.class.trace_execution_scoped(metrics) do
|
24
|
-
# NewRelic::Control.instance.log.debug("Instrumenting Redis Call[#{method_name}]: #{args[0].inspect}")
|
25
|
-
raw_call_command_without_newrelic_trace(*args)
|
26
|
-
end
|
27
|
-
end
|
14
|
+
def self.redis_call_method
|
15
|
+
::Redis::Client.new.respond_to?(:call) ? :call : :raw_call_command
|
16
|
+
end
|
28
17
|
|
29
|
-
alias_method :raw_call_command_without_newrelic_trace, redis_call_method
|
30
|
-
alias_method redis_call_method, :raw_call_command_with_newrelic_trace
|
31
18
|
|
19
|
+
def raw_call_command_with_newrelic_trace *args
|
20
|
+
method_name = args[0].is_a?(Array) ? args[0][0] : args[0]
|
21
|
+
metrics = ["Database/Redis/#{method_name}",
|
22
|
+
(NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction? ? 'Database/Redis/allWeb' : 'Database/Redis/allOther')]
|
23
|
+
self.class.trace_execution_scoped(metrics) do
|
24
|
+
# NewRelic::Control.instance.log.debug("Instrumenting Redis Call[#{method_name}]: #{args[0].inspect}")
|
25
|
+
raw_call_command_without_newrelic_trace(*args)
|
32
26
|
end
|
27
|
+
end
|
33
28
|
|
29
|
+
alias_method :raw_call_command_without_newrelic_trace, redis_call_method
|
30
|
+
alias_method redis_call_method, :raw_call_command_with_newrelic_trace
|
34
31
|
|
35
|
-
|
36
|
-
end
|
37
32
|
end
|
38
33
|
end
|
39
34
|
end
|
35
|
+
|
36
|
+
|
37
|
+
|
@@ -1,34 +1,64 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
1
|
+
DependencyDetection.defer do
|
2
|
+
depends_on do
|
3
|
+
defined?(::Resque)
|
4
|
+
end
|
5
|
+
executes do
|
6
|
+
module Resque::Plugins
|
7
|
+
# The plugin definition is a no-op but left in empty for backward compatibility.
|
8
|
+
# We were using the plugin to install instrumentation but it required you either
|
9
|
+
# extend Resque::Job or extend this module. Using the method chaining approach
|
10
|
+
# means you don't have to make any modifications to your job classes.
|
11
|
+
module NewRelicInstrumentation; end
|
13
12
|
end
|
14
13
|
end
|
15
14
|
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
DependencyDetection.defer do
|
17
|
+
depends_on do
|
18
|
+
defined?(::Resque::Job) and not NewRelic::Control.instance['disable_resque']
|
19
|
+
end
|
20
|
+
|
21
|
+
executes do
|
22
|
+
# == Resque Instrumentation
|
23
|
+
#
|
24
|
+
# Installs a hook to ensure the agent starts manually when the worker
|
25
|
+
# starts and also adds the tracer to the process method which executes
|
26
|
+
# in the forked task.
|
23
27
|
|
24
|
-
|
25
|
-
|
28
|
+
# Resque also works in a non forking mode when fork is not supported
|
29
|
+
begin
|
30
|
+
# IronRuby/JRuby don't support `Kernel.fork` yet
|
31
|
+
if Kernel.respond_to?(:fork)
|
32
|
+
Kernel.fork{exit!}
|
33
|
+
else
|
34
|
+
raise NotImplementedError
|
26
35
|
end
|
36
|
+
rescue NotImplementedError
|
37
|
+
$rpm_cant_fork = true
|
38
|
+
end
|
27
39
|
|
28
|
-
|
29
|
-
|
40
|
+
::Resque::Job.class_eval do
|
41
|
+
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
42
|
+
old_perform_method = instance_method(:perform)
|
43
|
+
define_method(:perform) do
|
44
|
+
class_name = (payload_class ||self.class).name
|
45
|
+
perform_action_with_newrelic_trace(:name => 'perform', :class_name => class_name,
|
46
|
+
:category => 'OtherTransaction/ResqueJob') do
|
47
|
+
old_perform_method.bind(self).call
|
48
|
+
end
|
49
|
+
# If we aren't doing true forks, then the shutdown message would end up
|
50
|
+
# shutting down the agent in the parent which would cause us to stop sending
|
51
|
+
# data. Data is not sent from the child.
|
52
|
+
NewRelic::Agent.shutdown unless $rpm_cant_fork
|
30
53
|
end
|
31
54
|
end
|
32
|
-
end
|
33
|
-
end if defined?(::Resque) and not NewRelic::Control.instance['disable_resque']
|
34
55
|
|
56
|
+
::Resque.before_first_fork do
|
57
|
+
NewRelic::Agent.manual_start(:dispatcher => :resque)
|
58
|
+
end
|
59
|
+
|
60
|
+
::Resque.after_fork do
|
61
|
+
NewRelic::Agent.after_fork(:force_reconnect => false)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -1,27 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
module ::Sinatra
|
6
|
-
Base.class_eval do
|
7
|
-
def render_with_newrelic_trace(*args, &block)
|
8
|
-
engine, file = *args
|
9
|
-
return render_without_newrelic_trace(*args, &block) if file == "= yield"
|
1
|
+
DependencyDetection.defer do
|
2
|
+
depends_on do
|
3
|
+
defined?(::Sinatra::Base) and not NewRelic::Control.instance['disable_sinatra_template']
|
4
|
+
end
|
10
5
|
|
11
|
-
|
12
|
-
|
6
|
+
executes do
|
7
|
+
::Sinatra::Base.class_eval do
|
8
|
+
def render_with_newrelic_trace(*args, &block)
|
9
|
+
engine, file = *args
|
10
|
+
return render_without_newrelic_trace(*args, &block) if file == "= yield"
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
12
|
+
file = "Proc" if file.is_a?(Proc)
|
13
|
+
metrics = ["Sinatra/#{engine}/#{file}"]
|
18
14
|
|
19
|
-
|
20
|
-
|
21
|
-
end
|
15
|
+
self.class.trace_execution_scoped metrics do
|
16
|
+
render_without_newrelic_trace(*args, &block)
|
22
17
|
end
|
23
18
|
end
|
19
|
+
|
20
|
+
alias render_without_newrelic_trace render
|
21
|
+
alias render render_with_newrelic_trace
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
27
|
-
|
@@ -1,28 +1,28 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
alias get_without_newrelic_trace get
|
21
|
-
alias get get_with_newrelic_trace
|
22
|
-
end
|
1
|
+
DependencyDetection.defer do
|
2
|
+
|
3
|
+
depends_on do
|
4
|
+
defined?(::Typhoeus) and not ::NewRelic::Control.instance['disable_typhoeus']
|
5
|
+
end
|
6
|
+
|
7
|
+
executes do
|
8
|
+
require 'uri'
|
9
|
+
::Typhoeus::Request.instance_eval do
|
10
|
+
def get_with_newrelic_trace(*args, &block)
|
11
|
+
uri = URI.parse(args.first)
|
12
|
+
metrics = ["External/#{uri.host}/Typhoeus/GET","External/#{uri.host}/all"]
|
13
|
+
if NewRelic::Agent::Instrumentation::MetricFrame.recording_web_transaction?
|
14
|
+
metrics << "External/allWeb"
|
15
|
+
else
|
16
|
+
metrics << "External/allOther"
|
17
|
+
end
|
18
|
+
self.class.trace_execution_scoped metrics do
|
19
|
+
get_without_newrelic_trace(*args, &block)
|
23
20
|
end
|
24
21
|
end
|
22
|
+
alias get_without_newrelic_trace get
|
23
|
+
alias get get_with_newrelic_trace
|
25
24
|
end
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
28
|
+
|
@@ -1,18 +1,17 @@
|
|
1
|
-
|
1
|
+
DependencyDetection.defer do
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
depends_on do
|
4
|
+
defined?(::UltraSphinx) and not ::NewRelic::Control.instance['disable_ultrasphinx']
|
5
|
+
end
|
6
|
+
|
7
|
+
executes do
|
8
|
+
class ::Ultrasphinx::Search
|
9
|
+
include NewRelic::Agent::MethodTracer
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
11
|
+
add_method_tracer :run
|
12
|
+
add_method_tracer :results
|
16
13
|
end
|
17
14
|
end
|
18
15
|
end
|
16
|
+
|
17
|
+
|
@@ -1,21 +1,23 @@
|
|
1
1
|
# Workling instrumentation contributed by Chad Ingram of Aurora Feint
|
2
2
|
#
|
3
|
-
|
4
|
-
module Instrumentation
|
5
|
-
module Workling
|
6
|
-
if defined?(::Workling) and not ::NewRelic::Control.instance['disable_workling']
|
7
|
-
::Workling::Base.class_eval do
|
8
|
-
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
9
|
-
end
|
3
|
+
DependencyDetection.defer do
|
10
4
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
5
|
+
depends_on do
|
6
|
+
defined?(::Workling) and not ::NewRelic::Control.instance['disable_workling']
|
7
|
+
end
|
8
|
+
|
9
|
+
executes do
|
10
|
+
|
11
|
+
::Workling::Base.class_eval do
|
12
|
+
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
13
|
+
end
|
14
|
+
|
15
|
+
::Workling::Discovery.discovered.each do |clazz|
|
16
|
+
(clazz.public_instance_methods - ::Workling::Base.public_instance_methods).each do |method|
|
17
|
+
puts "added method tracer Workling/#{clazz.name}/#{method}"
|
18
|
+
clazz.send(:add_method_tracer, method, "Workling/#{clazz.name}/#{method}", :category => :task)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
20
|
-
end
|
21
22
|
|
23
|
+
end
|
@@ -1,15 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
DependencyDetection.defer do
|
2
|
+
depends_on do
|
3
|
+
defined?(::Yajl::Encoder) and not ::NewRelic::Control.instance['disable_yajl_instrumentation']
|
4
|
+
end
|
5
|
+
|
6
|
+
executes do
|
7
|
+
::Yajl::Encoder.class_eval do
|
8
|
+
class << self
|
9
|
+
include ::NewRelic::Agent::MethodTracer
|
10
|
+
add_method_tracer :parse, 'Encoder/Yajl/encode'
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
@@ -1,22 +1,16 @@
|
|
1
|
-
require '
|
2
|
-
require 'rpm_contrib/instrumentation/aws'
|
3
|
-
require 'rpm_contrib/instrumentation/camping'
|
4
|
-
require 'rpm_contrib/instrumentation/cassandra'
|
5
|
-
require 'rpm_contrib/instrumentation/crack'
|
6
|
-
require 'rpm_contrib/instrumentation/curb'
|
7
|
-
require 'rpm_contrib/instrumentation/elastic_search'
|
8
|
-
require 'rpm_contrib/instrumentation/mongo'
|
9
|
-
require 'rpm_contrib/instrumentation/paperclip'
|
10
|
-
require 'rpm_contrib/instrumentation/redis'
|
11
|
-
require 'rpm_contrib/instrumentation/resque'
|
12
|
-
require 'rpm_contrib/instrumentation/sinatra'
|
13
|
-
require 'rpm_contrib/instrumentation/typhoeus'
|
14
|
-
require 'rpm_contrib/instrumentation/ultrasphinx'
|
15
|
-
require 'rpm_contrib/instrumentation/workling'
|
16
|
-
require 'rpm_contrib/instrumentation/yajl'
|
17
|
-
|
18
|
-
|
1
|
+
require 'newrelic_rpm'
|
19
2
|
module RpmContrib
|
3
|
+
# Contributed instrumentation files for use with newrelic_rpm gem
|
20
4
|
module Instrumentation
|
21
5
|
end
|
22
6
|
end
|
7
|
+
|
8
|
+
pattern = File.expand_path "../instrumentation/**/*.rb", __FILE__
|
9
|
+
Dir.glob pattern do |file|
|
10
|
+
begin
|
11
|
+
require file.to_s
|
12
|
+
rescue Exception => e
|
13
|
+
NewRelic::Agent.logger.error "Skipping instrumentation file '#{file}': #{e}"
|
14
|
+
NewRelic::Agent.logger.debug e.backtrace.join("\n")
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module RpmContrib
|
2
|
+
# Samplers are subclasses of NewRelic::Agent::Sampler which periodically collect metric data in a
|
3
|
+
# background thread. Sampler classes belong in the sampler subdirectory and must be loaded before
|
4
|
+
# the agent starts.
|
5
|
+
module Samplers
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
pattern = File.expand_path "../samplers/**/*.rb", __FILE__
|
10
|
+
Dir.glob pattern do |file|
|
11
|
+
begin
|
12
|
+
require file.to_s
|
13
|
+
rescue Exception => e
|
14
|
+
NewRelic::Agent.logger.error "Skipping instrumentation file '#{file}': #{e}"
|
15
|
+
NewRelic::Agent.logger.debug e.backtrace.join("\n")
|
16
|
+
end
|
17
|
+
end
|
data/lib/rpm_contrib.rb
CHANGED
@@ -1,39 +1,40 @@
|
|
1
1
|
RPM_CONTRIB_LIB = File.dirname(__FILE__)
|
2
2
|
|
3
|
-
module RPMContrib
|
4
|
-
VERSION = File.read(RPM_CONTRIB_LIB+"/../CHANGELOG")[/Version ([\d\.]+)$/, 1]
|
3
|
+
module RPMContrib; end
|
5
4
|
|
6
|
-
def self.init_sequence
|
7
|
-
Proc.new do
|
8
|
-
# Tell the agent to load all the files in the
|
9
|
-
# rpm_contrib/instrumentation directory.
|
10
|
-
NewRelic::Agent.add_instrumentation(RPM_CONTRIB_LIB+"/rpm_contrib/instrumentation/**/*.rb")
|
11
|
-
|
12
|
-
# Load all the Sampler class definitions. These will register
|
13
|
-
# automatically with the agent.
|
14
|
-
Dir.glob(RPM_CONTRIB_LIB + "/rpm_contrib/samplers/**/*.rb") { |file| require file }
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
5
|
# Perform any framework/dispatcher detection before loading the rpm gem.
|
20
6
|
require 'rpm_contrib/detection'
|
21
|
-
|
7
|
+
if defined?(::NewRelic) && defined?(::NewRelic::Control)
|
8
|
+
puts "Warning! The rpm_contrib gem should be loaded before the newrelic_rpm gem if you are using Resque or Camping."
|
9
|
+
end
|
10
|
+
|
22
11
|
require 'newrelic_rpm'
|
12
|
+
require 'rpm_contrib/instrumentation'
|
13
|
+
|
14
|
+
# Load all the Sampler class definitions. These will register
|
15
|
+
# automatically with the agent.
|
16
|
+
require 'rpm_contrib/samplers'
|
17
|
+
|
23
18
|
if defined? Rails
|
24
19
|
# Rails 3.x+
|
25
20
|
if Rails.respond_to?(:version) && Rails.version =~ /^3/
|
26
21
|
module NewRelic
|
27
22
|
class Railtie < Rails::Railtie
|
28
|
-
initializer("rpm_contrib.start_plugin"
|
23
|
+
initializer("rpm_contrib.start_plugin"){ NewRelic::Control.instance.init_plugin }
|
29
24
|
end
|
30
25
|
end
|
31
26
|
# Rails 2.x
|
32
27
|
elsif defined?(Rails) && Rails.respond_to?(:configuration)
|
33
|
-
|
28
|
+
|
29
|
+
Rails.configuration.after_initialize { NewRelic::Control.instance.init_plugin }
|
34
30
|
else
|
35
31
|
raise "The rpm_contrib gem supports Rails 2.2+ only."
|
36
32
|
end
|
37
33
|
else
|
38
|
-
|
34
|
+
# If not running Rails, it is important that you load the contrib gem as late
|
35
|
+
# as possible so the agent initializes after everything else. Either that
|
36
|
+
# or make the following call yourself at the end of your startup sequence
|
37
|
+
# (it is idempotent).
|
38
|
+
NewRelic::Control.instance.init_plugin
|
39
39
|
end
|
40
|
+
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rpm_contrib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 31098233
|
5
|
+
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
|
9
|
+
- 4
|
10
|
+
- beta
|
11
|
+
version: 2.1.4.beta
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- Bill Kayser
|
@@ -15,7 +16,7 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date: 2011-
|
19
|
+
date: 2011-08-01 00:00:00 -07:00
|
19
20
|
default_executable:
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
@@ -26,12 +27,12 @@ dependencies:
|
|
26
27
|
requirements:
|
27
28
|
- - ">="
|
28
29
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
30
|
+
hash: 1
|
30
31
|
segments:
|
31
32
|
- 3
|
32
|
-
-
|
33
|
-
-
|
34
|
-
version: 3.
|
33
|
+
- 1
|
34
|
+
- 1
|
35
|
+
version: 3.1.1
|
35
36
|
type: :runtime
|
36
37
|
version_requirements: *id001
|
37
38
|
description: |
|
@@ -60,7 +61,6 @@ files:
|
|
60
61
|
- lib/rpm_contrib/instrumentation.rb
|
61
62
|
- lib/rpm_contrib/instrumentation/active_mq.rb
|
62
63
|
- lib/rpm_contrib/instrumentation/aws.rb
|
63
|
-
- lib/rpm_contrib/instrumentation/aws/s3.rb
|
64
64
|
- lib/rpm_contrib/instrumentation/camping.rb
|
65
65
|
- lib/rpm_contrib/instrumentation/cassandra.rb
|
66
66
|
- lib/rpm_contrib/instrumentation/crack.rb
|
@@ -75,6 +75,7 @@ files:
|
|
75
75
|
- lib/rpm_contrib/instrumentation/ultrasphinx.rb
|
76
76
|
- lib/rpm_contrib/instrumentation/workling.rb
|
77
77
|
- lib/rpm_contrib/instrumentation/yajl.rb
|
78
|
+
- lib/rpm_contrib/samplers.rb
|
78
79
|
- test/helper.rb
|
79
80
|
- test/schema.rb
|
80
81
|
- test/test_curb.rb
|
@@ -106,22 +107,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
107
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
108
|
none: false
|
108
109
|
requirements:
|
109
|
-
- - "
|
110
|
+
- - ">"
|
110
111
|
- !ruby/object:Gem::Version
|
111
|
-
hash:
|
112
|
+
hash: 25
|
112
113
|
segments:
|
113
|
-
-
|
114
|
-
|
114
|
+
- 1
|
115
|
+
- 3
|
116
|
+
- 1
|
117
|
+
version: 1.3.1
|
115
118
|
requirements: []
|
116
119
|
|
117
120
|
rubyforge_project:
|
118
|
-
rubygems_version: 1.
|
121
|
+
rubygems_version: 1.6.2
|
119
122
|
signing_key:
|
120
123
|
specification_version: 3
|
121
124
|
summary: Contributed Instrumentation for New Relic RPM
|
122
|
-
test_files:
|
123
|
-
|
124
|
-
- test/schema.rb
|
125
|
-
- test/test_curb.rb
|
126
|
-
- test/test_redis.rb
|
127
|
-
- test/test_workling.rb
|
125
|
+
test_files: []
|
126
|
+
|
@@ -1,64 +0,0 @@
|
|
1
|
-
module RpmContrib
|
2
|
-
module Instrumentation
|
3
|
-
module Aws
|
4
|
-
module S3
|
5
|
-
# Instrumentation for the AWS-S3 gem for New Relic RPM by Brian Doll
|
6
|
-
if defined?(::AWS::S3) && !NewRelic::Control.instance['disable_aws-s3']
|
7
|
-
|
8
|
-
# Instrument connections to the AWS-S3 service
|
9
|
-
::AWS::S3::Connection::Management::ClassMethods.module_eval do
|
10
|
-
add_method_tracer :establish_connection!, 'AWS-S3/establish_connection!'
|
11
|
-
end
|
12
|
-
|
13
|
-
# Instrument methods on Bucket
|
14
|
-
::AWS::S3::Bucket.instance_eval do
|
15
|
-
class << self
|
16
|
-
add_method_tracer :create, 'AWS-S3/Bucket/create'
|
17
|
-
add_method_tracer :find, 'AWS-S3/Bucket/find'
|
18
|
-
add_method_tracer :objects, 'AWS-S3/Bucket/objects'
|
19
|
-
add_method_tracer :delete, 'AWS-S3/Bucket/delete'
|
20
|
-
add_method_tracer :list, 'AWS-S3/Bucket/list'
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# Instrument methods on Bucket instances
|
25
|
-
::AWS::S3::Bucket.class_eval do
|
26
|
-
add_method_tracer :[], 'AWS-S3/Bucket/#{self.name}/[]'
|
27
|
-
add_method_tracer :new_object,'AWS-S3/Bucket/#{self.name}/new_objects'
|
28
|
-
add_method_tracer :objects, 'AWS-S3/Bucket/#{self.name}/objects'
|
29
|
-
add_method_tracer :delete, 'AWS-S3/Bucket/#{self.name}/delete'
|
30
|
-
add_method_tracer :delete_all,'AWS-S3/Bucket/#{self.name}/delete_all'
|
31
|
-
add_method_tracer :update, 'AWS-S3/Bucket/#{self.name}/update'
|
32
|
-
end
|
33
|
-
|
34
|
-
# Instrument methods on S3Object
|
35
|
-
::AWS::S3::S3Object.instance_eval do
|
36
|
-
class << self
|
37
|
-
add_method_tracer :about, 'AWS-S3/S3Object/about'
|
38
|
-
add_method_tracer :copy, 'AWS-S3/S3Object/copy'
|
39
|
-
add_method_tracer :delete, 'AWS-S3/S3Object/delete'
|
40
|
-
add_method_tracer :rename, 'AWS-S3/S3Object/rename'
|
41
|
-
add_method_tracer :store, 'AWS-S3/S3Object/store'
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# Instrument methods on S3Object instances
|
46
|
-
# Metric names are aggregated across all S3Objects since having a metric for
|
47
|
-
# every single S3Object instance and method pair would be fairly useless
|
48
|
-
::AWS::S3::S3Object.class_eval do
|
49
|
-
add_method_tracer :value, 'AWS-S3/S3Objects/value'
|
50
|
-
add_method_tracer :about, 'AWS-S3/S3Objects/about'
|
51
|
-
add_method_tracer :metadata, 'AWS-S3/S3Objects/metadata'
|
52
|
-
add_method_tracer :store, 'AWS-S3/S3Objects/store'
|
53
|
-
add_method_tracer :delete, 'AWS-S3/S3Objects/delete'
|
54
|
-
add_method_tracer :copy, 'AWS-S3/S3Objects/copy'
|
55
|
-
add_method_tracer :rename, 'AWS-S3/S3Objects/rename'
|
56
|
-
add_method_tracer :etag, 'AWS-S3/S3Objects/etag'
|
57
|
-
add_method_tracer :owner, 'AWS-S3/S3Objects/owner'
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|