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,16 @@
|
|
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
|
+
# frozen_string_literal: true
|
5
|
+
|
6
|
+
module NewRelic::Agent::Instrumentation
|
7
|
+
module Memcache
|
8
|
+
module Chain
|
9
|
+
extend Helper
|
10
|
+
|
11
|
+
def self.instrument! target_class
|
12
|
+
instrument_methods target_class, client_methods
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,166 +1,83 @@
|
|
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
|
module NewRelic
|
6
7
|
module Agent
|
7
8
|
module Instrumentation
|
8
9
|
module Memcache
|
9
10
|
module Dalli
|
10
|
-
extend
|
11
|
+
extend Helper
|
12
|
+
module_function
|
11
13
|
|
12
|
-
|
13
|
-
METHODS = [:get, :set, :add, :incr, :decr, :delete, :replace, :append, :prepend, :cas]
|
14
|
-
SEND_MULTIGET_METRIC_NAME = "get_multi_request".freeze
|
15
|
-
DATASTORE_INSTANCES_SUPPORTED_VERSION = Gem::Version.new '2.6.4'
|
16
|
-
SLASH = '/'.freeze
|
17
|
-
UNKNOWN = 'unknown'.freeze
|
18
|
-
LOCALHOST = 'localhost'.freeze
|
19
|
-
|
20
|
-
def supports_datastore_instances?
|
21
|
-
DATASTORE_INSTANCES_SUPPORTED_VERSION <= Gem::Version.new(::Dalli::VERSION)
|
22
|
-
end
|
23
|
-
|
24
|
-
def instrument_methods
|
14
|
+
def instrument!
|
25
15
|
if supports_datastore_instances?
|
26
|
-
|
16
|
+
instrument_methods(::Dalli::Client, dalli_methods)
|
27
17
|
instrument_multi_method :get_multi
|
28
18
|
instrument_send_multiget
|
29
19
|
instrument_server_for_key
|
30
20
|
else
|
31
|
-
|
32
|
-
|
21
|
+
instrument_methods(::Dalli::Client, client_methods)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def instrument_multi_method method_name
|
26
|
+
visibility = NewRelic::Helper.instance_method_visibility ::Dalli::Client, method_name
|
27
|
+
method_name_without = :"#{method_name}_without_newrelic_trace"
|
28
|
+
|
29
|
+
::Dalli::Client.class_eval do
|
30
|
+
alias_method method_name_without, method_name
|
31
|
+
|
32
|
+
define_method method_name do |*args, &block|
|
33
|
+
get_multi_with_newrelic_tracing(method_name) { __send__ method_name_without, *args, &block }
|
34
|
+
end
|
35
|
+
|
36
|
+
__send__ visibility, method_name
|
37
|
+
__send__ visibility, method_name_without
|
33
38
|
end
|
34
39
|
end
|
35
40
|
|
36
41
|
def instrument_server_for_key
|
37
42
|
::Dalli::Ring.class_eval do
|
43
|
+
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
44
|
+
|
38
45
|
alias_method :server_for_key_without_newrelic_trace, :server_for_key
|
39
46
|
|
40
47
|
def server_for_key key
|
41
|
-
|
42
|
-
begin
|
43
|
-
if txn = ::NewRelic::Agent::Tracer.current_transaction
|
44
|
-
segment = txn.current_segment
|
45
|
-
if ::NewRelic::Agent::Transaction::DatastoreSegment === segment
|
46
|
-
::NewRelic::Agent::Instrumentation::Memcache::Dalli.assign_instance_to(segment, server)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
rescue => e
|
50
|
-
::NewRelic::Agent.logger.warn "Unable to set instance info on datastore segment: #{e.message}"
|
51
|
-
end
|
52
|
-
server
|
48
|
+
server_for_key_with_newrelic_tracing { server_for_key_without_newrelic_trace key }
|
53
49
|
end
|
54
50
|
end
|
55
51
|
end
|
56
52
|
|
57
53
|
def instrument_send_multiget
|
58
54
|
::Dalli::Server.class_eval do
|
55
|
+
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
59
56
|
alias_method :send_multiget_without_newrelic_trace, :send_multiget
|
60
57
|
|
61
|
-
def send_multiget
|
62
|
-
|
63
|
-
product: MEMCACHED,
|
64
|
-
operation: SEND_MULTIGET_METRIC_NAME
|
65
|
-
)
|
66
|
-
::NewRelic::Agent::Instrumentation::Memcache::Dalli.assign_instance_to(segment, self)
|
67
|
-
|
68
|
-
begin
|
69
|
-
NewRelic::Agent::Tracer.capture_segment_error segment do
|
70
|
-
send_multiget_without_newrelic_trace(keys)
|
71
|
-
end
|
72
|
-
ensure
|
73
|
-
if ::NewRelic::Agent.config[:capture_memcache_keys]
|
74
|
-
segment.notice_nosql_statement "#{SEND_MULTIGET_METRIC_NAME} #{keys.inspect}"
|
75
|
-
end
|
76
|
-
segment.finish if segment
|
77
|
-
end
|
58
|
+
def send_multiget keys
|
59
|
+
send_multiget_with_newrelic_tracing(keys) { send_multiget_without_newrelic_trace keys }
|
78
60
|
end
|
79
61
|
end
|
80
62
|
end
|
63
|
+
end
|
81
64
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
::Dalli::Client.class_eval do
|
87
|
-
alias_method method_name_without, method_name
|
88
|
-
|
89
|
-
define_method method_name do |*args, &block|
|
90
|
-
segment = NewRelic::Agent::Tracer.start_segment name: "Ruby/Memcached/Dalli/#{method_name}"
|
91
|
-
begin
|
92
|
-
NewRelic::Agent::Tracer.capture_segment_error segment do
|
93
|
-
__send__ method_name_without, *args, &block
|
94
|
-
end
|
95
|
-
ensure
|
96
|
-
segment.finish if segment
|
97
|
-
end
|
98
|
-
end
|
65
|
+
module DalliCAS
|
66
|
+
extend Dalli
|
67
|
+
extend Helper
|
68
|
+
module_function
|
99
69
|
|
100
|
-
|
101
|
-
|
102
|
-
end
|
70
|
+
def should_instrument?
|
71
|
+
supported_methods_for(::Dalli::Client, dalli_cas_methods).any?
|
103
72
|
end
|
104
73
|
|
105
|
-
def
|
106
|
-
|
107
|
-
|
108
|
-
host = LOCALHOST
|
109
|
-
port_path_or_id = server.hostname
|
110
|
-
else
|
111
|
-
host = server.hostname
|
112
|
-
port_path_or_id = server.port
|
113
|
-
end
|
114
|
-
segment.set_instance_info host, port_path_or_id
|
115
|
-
rescue => e
|
116
|
-
::NewRelic::Agent.logger.debug "Failed to retrieve memcached instance info: #{e.message}"
|
117
|
-
segment.set_instance_info UNKNOWN, UNKNOWN
|
74
|
+
def instrument!
|
75
|
+
instrument_methods ::Dalli::Client, dalli_cas_methods
|
76
|
+
instrument_multi_method :get_multi_cas
|
118
77
|
end
|
119
|
-
|
120
78
|
end
|
121
79
|
end
|
122
80
|
end
|
123
81
|
end
|
124
82
|
end
|
125
83
|
|
126
|
-
DependencyDetection.defer do
|
127
|
-
named :dalli
|
128
|
-
|
129
|
-
depends_on do
|
130
|
-
NewRelic::Agent::Instrumentation::Memcache.enabled?
|
131
|
-
end
|
132
|
-
|
133
|
-
depends_on do
|
134
|
-
defined?(::Dalli::Client)
|
135
|
-
end
|
136
|
-
|
137
|
-
executes do
|
138
|
-
::NewRelic::Agent.logger.info 'Installing Memcache instrumentation for dalli gem'
|
139
|
-
::NewRelic::Agent::Instrumentation::Memcache::Dalli.instrument_methods
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
DependencyDetection.defer do
|
144
|
-
named :dalli_cas_client
|
145
|
-
|
146
|
-
depends_on do
|
147
|
-
NewRelic::Agent::Instrumentation::Memcache.enabled?
|
148
|
-
end
|
149
|
-
|
150
|
-
depends_on do
|
151
|
-
# These CAS client methods are only optionally defined if users require
|
152
|
-
# dalli/cas/client. Use a separate dependency block so it can potentially
|
153
|
-
# re-evaluate after they've done that require.
|
154
|
-
defined?(::Dalli::Client) &&
|
155
|
-
::NewRelic::Agent::Instrumentation::Memcache.supported_methods_for(::Dalli::Client,
|
156
|
-
CAS_CLIENT_METHODS).any?
|
157
|
-
end
|
158
|
-
|
159
|
-
CAS_CLIENT_METHODS = [:get_cas, :set_cas, :replace_cas, :delete_cas]
|
160
|
-
|
161
|
-
executes do
|
162
|
-
::NewRelic::Agent.logger.info 'Installing Dalli CAS Client Memcache instrumentation'
|
163
|
-
::NewRelic::Agent::Instrumentation::Memcache.instrument_methods(::Dalli::Client, CAS_CLIENT_METHODS)
|
164
|
-
::NewRelic::Agent::Instrumentation::Memcache::Dalli.instrument_multi_method(:get_multi_cas)
|
165
|
-
end
|
166
|
-
end
|
@@ -0,0 +1,56 @@
|
|
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
|
+
# frozen_string_literal: true
|
5
|
+
|
6
|
+
module NewRelic::Agent::Instrumentation
|
7
|
+
module Memcache
|
8
|
+
module Helper
|
9
|
+
DATASTORE_INSTANCES_SUPPORTED_VERSION = Gem::Version.new '2.6.4'
|
10
|
+
|
11
|
+
def supports_datastore_instances?
|
12
|
+
DATASTORE_INSTANCES_SUPPORTED_VERSION <= Gem::Version.new(::Dalli::VERSION)
|
13
|
+
end
|
14
|
+
|
15
|
+
def client_methods
|
16
|
+
[:get, :get_multi, :set, :add, :incr, :decr, :delete, :replace, :append,
|
17
|
+
:prepend, :cas, :single_get, :multi_get, :single_cas, :multi_cas]
|
18
|
+
end
|
19
|
+
|
20
|
+
def dalli_methods
|
21
|
+
[:get, :set, :add, :incr, :decr, :delete, :replace, :append, :prepend, :cas]
|
22
|
+
end
|
23
|
+
|
24
|
+
def dalli_cas_methods
|
25
|
+
[:get_cas, :set_cas, :replace_cas, :delete_cas]
|
26
|
+
end
|
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|
|
36
|
+
visibility = NewRelic::Helper.instance_method_visibility client_class, method_name
|
37
|
+
method_name_without = :"#{method_name}_without_newrelic_trace"
|
38
|
+
|
39
|
+
client_class.class_eval do
|
40
|
+
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
41
|
+
|
42
|
+
alias_method method_name_without, method_name
|
43
|
+
|
44
|
+
define_method method_name do |*args, &block|
|
45
|
+
with_newrelic_tracing(method_name, *args) { __send__ method_name_without, *args, &block }
|
46
|
+
end
|
47
|
+
|
48
|
+
__send__ visibility, method_name
|
49
|
+
__send__ visibility, method_name_without
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,88 @@
|
|
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
|
+
# frozen_string_literal: true
|
5
|
+
|
6
|
+
module NewRelic::Agent::Instrumentation
|
7
|
+
module Memcache
|
8
|
+
module Tracer
|
9
|
+
SLASH = '/'
|
10
|
+
UNKNOWN = 'unknown'
|
11
|
+
LOCALHOST = 'localhost'
|
12
|
+
MULTIGET_METRIC_NAME = "get_multi_request"
|
13
|
+
MEMCACHED = "Memcached"
|
14
|
+
|
15
|
+
def with_newrelic_tracing operation, *args
|
16
|
+
segment = NewRelic::Agent::Tracer.start_datastore_segment \
|
17
|
+
product: MEMCACHED,
|
18
|
+
operation: operation
|
19
|
+
|
20
|
+
begin
|
21
|
+
NewRelic::Agent::Tracer.capture_segment_error(segment) { yield }
|
22
|
+
ensure
|
23
|
+
if NewRelic::Agent.config[:capture_memcache_keys]
|
24
|
+
segment.notice_nosql_statement "#{operation} #{args.first.inspect}"
|
25
|
+
end
|
26
|
+
segment.finish if segment
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def server_for_key_with_newrelic_tracing
|
31
|
+
yield.tap do |server|
|
32
|
+
begin
|
33
|
+
if txn = ::NewRelic::Agent::Tracer.current_transaction
|
34
|
+
segment = txn.current_segment
|
35
|
+
if ::NewRelic::Agent::Transaction::DatastoreSegment === segment
|
36
|
+
assign_instance_to(segment, server)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
rescue => e
|
40
|
+
::NewRelic::Agent.logger.warn "Unable to set instance info on datastore segment: #{e.message}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_multi_with_newrelic_tracing method_name
|
46
|
+
segment = NewRelic::Agent::Tracer.start_segment \
|
47
|
+
name: "Ruby/Memcached/Dalli/#{method_name}"
|
48
|
+
|
49
|
+
begin
|
50
|
+
NewRelic::Agent::Tracer.capture_segment_error(segment) { yield }
|
51
|
+
ensure
|
52
|
+
segment.finish if segment
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def send_multiget_with_newrelic_tracing keys
|
57
|
+
segment = ::NewRelic::Agent::Tracer.start_datastore_segment \
|
58
|
+
product: MEMCACHED,
|
59
|
+
operation: MULTIGET_METRIC_NAME
|
60
|
+
|
61
|
+
begin
|
62
|
+
assign_instance_to(segment, self)
|
63
|
+
NewRelic::Agent::Tracer.capture_segment_error(segment) { yield }
|
64
|
+
ensure
|
65
|
+
if ::NewRelic::Agent.config[:capture_memcache_keys]
|
66
|
+
segment.notice_nosql_statement "#{MULTIGET_METRIC_NAME} #{keys.inspect}"
|
67
|
+
end
|
68
|
+
segment.finish if segment
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def assign_instance_to segment, server
|
73
|
+
host = port_path_or_id = nil
|
74
|
+
if server.hostname.start_with? SLASH
|
75
|
+
host = LOCALHOST
|
76
|
+
port_path_or_id = server.hostname
|
77
|
+
else
|
78
|
+
host = server.hostname
|
79
|
+
port_path_or_id = server.port
|
80
|
+
end
|
81
|
+
segment.set_instance_info host, port_path_or_id
|
82
|
+
rescue => e
|
83
|
+
::NewRelic::Agent.logger.debug "Failed to retrieve memcached instance info: #{e.message}"
|
84
|
+
segment.set_instance_info UNKNOWN, UNKNOWN
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,88 @@
|
|
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
|
+
# frozen_string_literal: true
|
5
|
+
|
6
|
+
module NewRelic::Agent::Instrumentation
|
7
|
+
module Memcache
|
8
|
+
module Prepend
|
9
|
+
extend Helper
|
10
|
+
module_function
|
11
|
+
|
12
|
+
def client_prepender client_class
|
13
|
+
Module.new do
|
14
|
+
extend Helper
|
15
|
+
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
16
|
+
|
17
|
+
supported_methods_for(client_class, client_methods).each do |method_name|
|
18
|
+
define_method method_name do |*args, &block|
|
19
|
+
with_newrelic_tracing(method_name, *args) { super(*args, &block) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def dalli_cas_prependers
|
26
|
+
yield ::Dalli::Client, dalli_client_prepender(dalli_cas_methods)
|
27
|
+
yield ::Dalli::Client, dalli_get_multi_prepender(:get_multi_cas)
|
28
|
+
end
|
29
|
+
|
30
|
+
def dalli_prependers
|
31
|
+
if supports_datastore_instances?
|
32
|
+
yield ::Dalli::Client, dalli_client_prepender(dalli_methods)
|
33
|
+
yield ::Dalli::Client, dalli_get_multi_prepender(:get_multi)
|
34
|
+
yield ::Dalli::Server, dalli_server_prepender
|
35
|
+
yield ::Dalli::Ring, dalli_ring_prepender
|
36
|
+
else
|
37
|
+
yield ::Dalli::Client, dalli_client_prepender(client_methods)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def dalli_client_prepender supported_methods
|
42
|
+
Module.new do
|
43
|
+
extend Helper
|
44
|
+
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
45
|
+
|
46
|
+
supported_methods.each do |method_name|
|
47
|
+
define_method method_name do |*args, &block|
|
48
|
+
with_newrelic_tracing(method_name, *args) { super(*args, &block) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def dalli_get_multi_prepender method_name
|
55
|
+
Module.new do
|
56
|
+
extend Helper
|
57
|
+
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
58
|
+
|
59
|
+
define_method method_name do |*args, &block|
|
60
|
+
get_multi_with_newrelic_tracing(method_name) { super(*args, &block) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def dalli_ring_prepender
|
66
|
+
Module.new do
|
67
|
+
extend Helper
|
68
|
+
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
69
|
+
|
70
|
+
def server_for_key key
|
71
|
+
server_for_key_with_newrelic_tracing { super }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def dalli_server_prepender
|
77
|
+
Module.new do
|
78
|
+
extend Helper
|
79
|
+
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
80
|
+
|
81
|
+
def send_multiget keys
|
82
|
+
send_multiget_with_newrelic_tracing(keys) { super }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|