newrelic_rpm 6.15.0 → 7.0.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +96 -22
- data/README.md +2 -2
- data/lib/new_relic/agent.rb +0 -6
- data/lib/new_relic/agent/autostart.rb +1 -2
- data/lib/new_relic/agent/configuration/default_source.rb +270 -104
- data/lib/new_relic/agent/configuration/manager.rb +2 -2
- data/lib/new_relic/agent/datastores/redis.rb +0 -4
- data/lib/new_relic/agent/distributed_tracing.rb +0 -66
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +0 -16
- data/lib/new_relic/agent/instrumentation/bunny.rb +10 -152
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +152 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +9 -241
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +93 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +222 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +63 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +53 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +34 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +8 -50
- data/lib/new_relic/agent/instrumentation/excon.rb +2 -1
- data/lib/new_relic/agent/instrumentation/grape.rb +13 -113
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +8 -30
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +25 -0
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +38 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +54 -69
- data/lib/new_relic/agent/instrumentation/memcache/chain.rb +16 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +38 -121
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +56 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +88 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +88 -0
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +2 -0
- data/lib/new_relic/agent/instrumentation/mongo.rb +7 -0
- data/lib/new_relic/agent/instrumentation/net_http.rb +39 -0
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +25 -0
- data/lib/new_relic/agent/instrumentation/{net_prepend.rb → net_http/instrumentation.rb} +3 -3
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +18 -53
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +34 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +27 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +29 -139
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +57 -0
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +32 -0
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +73 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +36 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +13 -154
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +25 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +144 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +10 -109
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +34 -0
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +65 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +24 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +8 -28
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +33 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +16 -0
- data/lib/new_relic/agent/instrumentation/sinatra.rb +20 -158
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +29 -34
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +118 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +10 -89
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +82 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/new_relic_service.rb +3 -12
- data/lib/new_relic/agent/sql_sampler.rb +1 -1
- data/lib/new_relic/agent/transaction.rb +1 -4
- data/lib/new_relic/control/frameworks/rails.rb +11 -9
- data/lib/new_relic/control/instance_methods.rb +1 -0
- data/lib/new_relic/dependency_detection.rb +116 -10
- data/lib/new_relic/noticed_error.rb +1 -5
- data/lib/new_relic/supportability_helper.rb +1 -2
- data/lib/new_relic/version.rb +2 -2
- data/newrelic_rpm.gemspec +1 -1
- metadata +53 -8
- data/cert/cacert.pem +0 -1177
- data/lib/new_relic/agent/instrumentation/http.rb +0 -49
- data/lib/new_relic/agent/instrumentation/net.rb +0 -70
@@ -0,0 +1,100 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require 'new_relic/agent/parameter_filtering'
|
6
|
+
|
7
|
+
module NewRelic::Agent::Instrumentation
|
8
|
+
module Grape
|
9
|
+
module Instrumentation
|
10
|
+
|
11
|
+
extend self
|
12
|
+
|
13
|
+
# Since 1.2.0, the class `Grape::API` no longer refers to an API instance, rather, what used to be `Grape::API` is `Grape::API::Instance`
|
14
|
+
# https://github.com/ruby-grape/grape/blob/c20a73ac1e3f3ba1082005ed61bf69452373ba87/UPGRADING.md#upgrading-to--120
|
15
|
+
def instrumented_class
|
16
|
+
defined?(::Grape::API::Instance) ? ::Grape::API::Instance : ::Grape::API
|
17
|
+
end
|
18
|
+
|
19
|
+
def capture_transaction env, context
|
20
|
+
begin
|
21
|
+
endpoint = env[API_ENDPOINT]
|
22
|
+
version = env[API_VERSION]
|
23
|
+
|
24
|
+
api_class = (context.class.respond_to?(:base) && context.class.base) || context.class
|
25
|
+
handle_transaction(endpoint, api_class.name, version)
|
26
|
+
rescue => e
|
27
|
+
::NewRelic::Agent.logger.warn("Error in Grape instrumentation", e)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def prepare!
|
32
|
+
if defined?(::Grape::VERSION) && Gem::Version.new(::Grape::VERSION) >= Gem::Version.new("0.16.0")
|
33
|
+
send :remove_method, :name_for_transaction_deprecated
|
34
|
+
else
|
35
|
+
send :remove_method, :name_for_transaction
|
36
|
+
send :alias_method, :name_for_transaction, :name_for_transaction_deprecated
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
API_ENDPOINT = 'api.endpoint'.freeze
|
41
|
+
API_VERSION = 'api.version'.freeze
|
42
|
+
FORMAT_REGEX = /\(\/?\.[\:\w]*\)/.freeze # either :format (< 0.12.0) or .ext (>= 0.12.0)
|
43
|
+
VERSION_REGEX = /:version(\/|$)/.freeze
|
44
|
+
MIN_VERSION = Gem::Version.new("0.2.0")
|
45
|
+
PIPE_STRING = '|'.freeze
|
46
|
+
|
47
|
+
def handle_transaction(endpoint, class_name, version)
|
48
|
+
return unless endpoint && route = endpoint.route
|
49
|
+
name_transaction(route, class_name, version)
|
50
|
+
capture_params(endpoint)
|
51
|
+
end
|
52
|
+
|
53
|
+
def name_transaction(route, class_name, version)
|
54
|
+
txn_name = name_for_transaction(route, class_name, version)
|
55
|
+
segment_name = "Middleware/Grape/#{class_name}/call"
|
56
|
+
NewRelic::Agent::Transaction.set_default_transaction_name(txn_name, :grape)
|
57
|
+
txn = NewRelic::Agent::Transaction.tl_current
|
58
|
+
txn.segments.last.name = segment_name
|
59
|
+
end
|
60
|
+
|
61
|
+
def name_for_transaction(route, class_name, version)
|
62
|
+
action_name = route.path.sub(FORMAT_REGEX, NewRelic::EMPTY_STR)
|
63
|
+
method_name = route.request_method
|
64
|
+
version ||= route.version
|
65
|
+
|
66
|
+
# defaulting does not set rack.env['api.version'] and route.version may return Array
|
67
|
+
#
|
68
|
+
version = version.join(PIPE_STRING) if Array === version
|
69
|
+
|
70
|
+
if version
|
71
|
+
action_name = action_name.sub(VERSION_REGEX, NewRelic::EMPTY_STR)
|
72
|
+
"#{class_name}-#{version}#{action_name} (#{method_name})"
|
73
|
+
else
|
74
|
+
"#{class_name}#{action_name} (#{method_name})"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def name_for_transaction_deprecated(route, class_name, version)
|
79
|
+
action_name = route.route_path.sub(FORMAT_REGEX, NewRelic::EMPTY_STR)
|
80
|
+
method_name = route.route_method
|
81
|
+
version ||= route.route_version
|
82
|
+
if version
|
83
|
+
action_name = action_name.sub(VERSION_REGEX, NewRelic::EMPTY_STR)
|
84
|
+
"#{class_name}-#{version}#{action_name} (#{method_name})"
|
85
|
+
else
|
86
|
+
"#{class_name}#{action_name} (#{method_name})"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def capture_params(endpoint)
|
91
|
+
txn = ::NewRelic::Agent::Transaction.tl_current
|
92
|
+
env = endpoint.request.env
|
93
|
+
params = ::NewRelic::Agent::ParameterFiltering::apply_filters(env, endpoint.params)
|
94
|
+
params.delete("route_info")
|
95
|
+
txn.filtered_params = params
|
96
|
+
txn.merge_request_parameters(params)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module Grape
|
7
|
+
module Prepend
|
8
|
+
def call env
|
9
|
+
begin
|
10
|
+
super env
|
11
|
+
ensure
|
12
|
+
Grape::Instrumentation.capture_transaction env, self
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -2,6 +2,10 @@
|
|
2
2
|
# This file is distributed under New Relic's license terms.
|
3
3
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
4
|
|
5
|
+
require_relative 'httpclient/instrumentation'
|
6
|
+
require_relative 'httpclient/chain'
|
7
|
+
require_relative 'httpclient/prepend'
|
8
|
+
|
5
9
|
DependencyDetection.defer do
|
6
10
|
named :httpclient
|
7
11
|
|
@@ -25,36 +29,10 @@ DependencyDetection.defer do
|
|
25
29
|
end
|
26
30
|
|
27
31
|
executes do
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
library: wrapped_request.type,
|
33
|
-
uri: wrapped_request.uri,
|
34
|
-
procedure: wrapped_request.method
|
35
|
-
)
|
36
|
-
|
37
|
-
begin
|
38
|
-
response = nil
|
39
|
-
segment.add_request_headers wrapped_request
|
40
|
-
|
41
|
-
NewRelic::Agent::Tracer.capture_segment_error segment do
|
42
|
-
do_get_block_without_newrelic(req, proxy, conn, &block)
|
43
|
-
end
|
44
|
-
response = conn.pop
|
45
|
-
conn.push response
|
46
|
-
|
47
|
-
wrapped_response = ::NewRelic::Agent::HTTPClients::HTTPClientResponse.new(response)
|
48
|
-
segment.process_response_headers wrapped_response
|
49
|
-
|
50
|
-
response
|
51
|
-
ensure
|
52
|
-
segment.finish if segment
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
alias do_get_block_without_newrelic do_get_block
|
57
|
-
alias do_get_block do_get_block_with_newrelic
|
32
|
+
if use_prepend?
|
33
|
+
prepend_instrument ::HTTPClient, NewRelic::Agent::Instrumentation::HTTPClient::Prepend
|
34
|
+
else
|
35
|
+
chain_instrument NewRelic::Agent::Instrumentation::HTTPClient::Chain
|
58
36
|
end
|
59
37
|
end
|
60
38
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module HTTPClient
|
7
|
+
module Chain
|
8
|
+
def self.instrument!
|
9
|
+
::HTTPClient.class_eval do
|
10
|
+
include NewRelic::Agent::Instrumentation::HTTPClient::Instrumentation
|
11
|
+
|
12
|
+
def do_get_block_with_newrelic(req, proxy, conn, &block)
|
13
|
+
with_tracing(req, conn) do
|
14
|
+
do_get_block_without_newrelic(req, proxy, conn, &block)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
alias :do_get_block_without_newrelic :do_get_block
|
19
|
+
alias :do_get_block :do_get_block_with_newrelic
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module HTTPClient
|
7
|
+
module Instrumentation
|
8
|
+
def with_tracing request, connection
|
9
|
+
wrapped_request = NewRelic::Agent::HTTPClients::HTTPClientRequest.new(request)
|
10
|
+
segment = NewRelic::Agent::Tracer.start_external_request_segment(
|
11
|
+
library: wrapped_request.type,
|
12
|
+
uri: wrapped_request.uri,
|
13
|
+
procedure: wrapped_request.method
|
14
|
+
)
|
15
|
+
|
16
|
+
begin
|
17
|
+
response = nil
|
18
|
+
segment.add_request_headers wrapped_request
|
19
|
+
|
20
|
+
NewRelic::Agent::Tracer.capture_segment_error segment do
|
21
|
+
yield
|
22
|
+
end
|
23
|
+
|
24
|
+
response = connection.pop
|
25
|
+
connection.push response
|
26
|
+
|
27
|
+
wrapped_response = ::NewRelic::Agent::HTTPClients::HTTPClientResponse.new(response)
|
28
|
+
segment.process_response_headers wrapped_response
|
29
|
+
|
30
|
+
response
|
31
|
+
ensure
|
32
|
+
segment.finish if segment
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
|
6
|
+
module NewRelic::Agent::Instrumentation
|
7
|
+
module HTTPClient
|
8
|
+
module Prepend
|
9
|
+
include NewRelic::Agent::Instrumentation::HTTPClient::Instrumentation
|
10
|
+
|
11
|
+
def do_get_block(req, proxy, conn, &block)
|
12
|
+
with_tracing(req, conn) { super }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative 'httprb/instrumentation'
|
6
|
+
require_relative 'httprb/chain'
|
7
|
+
require_relative 'httprb/prepend'
|
8
|
+
|
9
|
+
DependencyDetection.defer do
|
10
|
+
named :httprb
|
11
|
+
|
12
|
+
depends_on do
|
13
|
+
defined?(HTTP) && defined?(HTTP::Client)
|
14
|
+
end
|
15
|
+
|
16
|
+
executes do
|
17
|
+
::NewRelic::Agent.logger.info "Installing http.rb Wrappers"
|
18
|
+
require 'new_relic/agent/distributed_tracing/cross_app_tracing'
|
19
|
+
require 'new_relic/agent/http_clients/http_rb_wrappers'
|
20
|
+
end
|
21
|
+
|
22
|
+
executes do
|
23
|
+
if use_prepend?
|
24
|
+
prepend_instrument HTTP::Client, ::NewRelic::Agent::Instrumentation::HTTPrb::Prepend
|
25
|
+
else
|
26
|
+
chain_instrument ::NewRelic::Agent::Instrumentation::HTTPrb::Chain
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module HTTPrb
|
7
|
+
module Chain
|
8
|
+
def self.instrument!
|
9
|
+
::HTTP::Client.class_eval do
|
10
|
+
include NewRelic::Agent::Instrumentation::HTTPrb
|
11
|
+
|
12
|
+
def perform_with_newrelic_trace(request, options)
|
13
|
+
with_tracing(request) { perform_without_newrelic_trace(request, options) }
|
14
|
+
end
|
15
|
+
|
16
|
+
alias perform_without_newrelic_trace perform
|
17
|
+
alias perform perform_with_newrelic_trace
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module HTTPrb
|
7
|
+
def with_tracing(request)
|
8
|
+
wrapped_request = ::NewRelic::Agent::HTTPClients::HTTPRequest.new(request)
|
9
|
+
|
10
|
+
begin
|
11
|
+
segment = NewRelic::Agent::Tracer.start_external_request_segment(
|
12
|
+
library: wrapped_request.type,
|
13
|
+
uri: wrapped_request.uri,
|
14
|
+
procedure: wrapped_request.method
|
15
|
+
)
|
16
|
+
|
17
|
+
segment.add_request_headers wrapped_request
|
18
|
+
|
19
|
+
response = NewRelic::Agent::Tracer.capture_segment_error(segment) { yield }
|
20
|
+
|
21
|
+
wrapped_response = ::NewRelic::Agent::HTTPClients::HTTPResponse.new response
|
22
|
+
segment.process_response_headers wrapped_response
|
23
|
+
|
24
|
+
response
|
25
|
+
ensure
|
26
|
+
segment.finish if segment
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module HTTPrb
|
7
|
+
module Prepend
|
8
|
+
include NewRelic::Agent::Instrumentation::HTTPrb
|
9
|
+
|
10
|
+
def perform(request, options)
|
11
|
+
with_tracing(request) { super }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# This file is distributed under New Relic's license terms.
|
3
3
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
# frozen_string_literal: true
|
4
5
|
|
5
6
|
# NOTE there are multiple implementations of the MemCache client in Ruby,
|
6
7
|
# each with slightly different API's and semantics.
|
@@ -9,95 +10,79 @@
|
|
9
10
|
# http://seattlerb.rubyforge.org/memcache-client/ (Gem: memcache-client)
|
10
11
|
# https://github.com/mperham/dalli (Gem: dalli)
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
require_relative 'memcache/helper'
|
14
|
+
require_relative 'memcache/instrumentation'
|
15
|
+
require_relative 'memcache/dalli'
|
16
|
+
require_relative 'memcache/chain'
|
17
|
+
require_relative 'memcache/prepend'
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
module Instrumentation
|
18
|
-
module Memcache
|
19
|
-
module_function
|
20
|
-
|
21
|
-
def enabled?
|
22
|
-
!::NewRelic::Agent.config[:disable_memcache_instrumentation]
|
23
|
-
end
|
24
|
-
|
25
|
-
METHODS = [:get, :get_multi, :set, :add, :incr, :decr, :delete, :replace, :append,
|
26
|
-
:prepend, :cas, :single_get, :multi_get, :single_cas, :multi_cas]
|
27
|
-
|
28
|
-
def supported_methods_for(client_class, methods)
|
29
|
-
methods.select do |method_name|
|
30
|
-
client_class.method_defined?(method_name) || client_class.private_method_defined?(method_name)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def instrument_methods(client_class, requested_methods = METHODS)
|
35
|
-
supported_methods_for(client_class, requested_methods).each do |method_name|
|
19
|
+
DependencyDetection.defer do
|
20
|
+
named :memcache_client
|
36
21
|
|
37
|
-
|
38
|
-
method_name_without = :"#{method_name}_without_newrelic_trace"
|
22
|
+
depends_on { defined? ::MemCache }
|
39
23
|
|
40
|
-
|
41
|
-
|
24
|
+
executes do
|
25
|
+
if use_prepend?
|
26
|
+
prepend_module = ::NewRelic::Agent::Instrumentation::Memcache::Prepend.client_prepender(::MemCache)
|
27
|
+
prepend_instrument ::MemCache, prepend_module, "MemcacheClient"
|
28
|
+
else
|
29
|
+
chain_instrument_target ::MemCache, ::NewRelic::Agent::Instrumentation::Memcache::Chain, "MemcacheClient"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
42
33
|
|
43
|
-
|
44
|
-
|
45
|
-
product: "Memcached",
|
46
|
-
operation: method_name
|
47
|
-
)
|
48
|
-
begin
|
49
|
-
NewRelic::Agent::Tracer.capture_segment_error segment do
|
50
|
-
send method_name_without, *args, &block
|
51
|
-
end
|
52
|
-
ensure
|
53
|
-
if NewRelic::Agent.config[:capture_memcache_keys]
|
54
|
-
segment.notice_nosql_statement "#{method_name} #{args.first.inspect}"
|
55
|
-
end
|
56
|
-
segment.finish if segment
|
57
|
-
end
|
58
|
-
end
|
34
|
+
DependencyDetection.defer do
|
35
|
+
named :memcached
|
59
36
|
|
60
|
-
|
61
|
-
send visibility, method_name_without
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
37
|
+
depends_on { defined? ::Memcached }
|
65
38
|
|
66
|
-
|
39
|
+
executes do
|
40
|
+
if use_prepend?
|
41
|
+
prepend_module = ::NewRelic::Agent::Instrumentation::Memcache::Prepend.client_prepender(::Memcached)
|
42
|
+
prepend_instrument ::Memcached, prepend_module, "Memcached"
|
43
|
+
else
|
44
|
+
chain_instrument_target ::Memcached, ::NewRelic::Agent::Instrumentation::Memcache::Chain, "Memcached"
|
67
45
|
end
|
68
46
|
end
|
69
47
|
end
|
70
48
|
|
71
49
|
DependencyDetection.defer do
|
72
|
-
named :
|
50
|
+
named :dalli
|
51
|
+
configure_with :memcache
|
73
52
|
|
74
|
-
depends_on
|
75
|
-
NewRelic::Agent::Instrumentation::Memcache.enabled?
|
76
|
-
end
|
77
|
-
|
78
|
-
depends_on do
|
79
|
-
defined?(::MemCache)
|
80
|
-
end
|
53
|
+
depends_on { defined? ::Dalli::Client }
|
81
54
|
|
82
55
|
executes do
|
83
|
-
|
84
|
-
|
56
|
+
if use_prepend?
|
57
|
+
prepend_module = ::NewRelic::Agent::Instrumentation::Memcache::Prepend
|
58
|
+
prepend_module.dalli_prependers do |client_class, instrumenting_module|
|
59
|
+
prepend_instrument client_class, instrumenting_module, "MemecacheDalli"
|
60
|
+
end
|
61
|
+
else
|
62
|
+
chain_instrument ::NewRelic::Agent::Instrumentation::Memcache::Dalli
|
63
|
+
end
|
85
64
|
end
|
86
65
|
end
|
87
66
|
|
67
|
+
# These CAS client methods are only optionally defined if users require
|
68
|
+
# dalli/cas/client. Use a separate dependency block so it can potentially
|
69
|
+
# re-evaluate after they've done that require.
|
88
70
|
DependencyDetection.defer do
|
89
|
-
named :
|
90
|
-
|
91
|
-
depends_on do
|
92
|
-
NewRelic::Agent::Instrumentation::Memcache.enabled?
|
93
|
-
end
|
71
|
+
named :dalli_cas_client
|
72
|
+
configure_with :memcache
|
94
73
|
|
95
|
-
depends_on
|
96
|
-
|
97
|
-
end
|
74
|
+
depends_on { defined? ::Dalli::Client }
|
75
|
+
depends_on { ::NewRelic::Agent::Instrumentation::Memcache::DalliCAS.should_instrument? }
|
98
76
|
|
99
77
|
executes do
|
100
|
-
::NewRelic::Agent.logger.info 'Installing
|
101
|
-
|
78
|
+
::NewRelic::Agent.logger.info 'Installing Dalli CAS Client Memcache instrumentation'
|
79
|
+
if use_prepend?
|
80
|
+
prepend_module = ::NewRelic::Agent::Instrumentation::Memcache::Prepend
|
81
|
+
prepend_module.dalli_cas_prependers do |client_class, instrumenting_module|
|
82
|
+
prepend_instrument client_class, instrumenting_module, "MemecacheDalliCAS"
|
83
|
+
end
|
84
|
+
else
|
85
|
+
chain_instrument ::NewRelic::Agent::Instrumentation::Memcache::DalliCAS
|
86
|
+
end
|
102
87
|
end
|
103
88
|
end
|