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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +96 -22
  3. data/README.md +2 -2
  4. data/lib/new_relic/agent.rb +0 -6
  5. data/lib/new_relic/agent/autostart.rb +1 -2
  6. data/lib/new_relic/agent/configuration/default_source.rb +270 -104
  7. data/lib/new_relic/agent/configuration/manager.rb +2 -2
  8. data/lib/new_relic/agent/datastores/redis.rb +0 -4
  9. data/lib/new_relic/agent/distributed_tracing.rb +0 -66
  10. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +0 -16
  11. data/lib/new_relic/agent/instrumentation/bunny.rb +10 -152
  12. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
  13. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +152 -0
  14. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
  15. data/lib/new_relic/agent/instrumentation/curb.rb +9 -241
  16. data/lib/new_relic/agent/instrumentation/curb/chain.rb +93 -0
  17. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +222 -0
  18. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +63 -0
  19. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +38 -0
  20. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +53 -0
  21. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +34 -0
  22. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +8 -50
  23. data/lib/new_relic/agent/instrumentation/excon.rb +2 -1
  24. data/lib/new_relic/agent/instrumentation/grape.rb +13 -113
  25. data/lib/new_relic/agent/instrumentation/grape/chain.rb +25 -0
  26. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
  27. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
  28. data/lib/new_relic/agent/instrumentation/httpclient.rb +8 -30
  29. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +25 -0
  30. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +38 -0
  31. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +17 -0
  32. data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
  33. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
  34. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
  35. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
  36. data/lib/new_relic/agent/instrumentation/memcache.rb +54 -69
  37. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +16 -0
  38. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +38 -121
  39. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +56 -0
  40. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +88 -0
  41. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +88 -0
  42. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +2 -0
  43. data/lib/new_relic/agent/instrumentation/mongo.rb +7 -0
  44. data/lib/new_relic/agent/instrumentation/net_http.rb +39 -0
  45. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +25 -0
  46. data/lib/new_relic/agent/instrumentation/{net_prepend.rb → net_http/instrumentation.rb} +3 -3
  47. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
  48. data/lib/new_relic/agent/instrumentation/padrino.rb +18 -53
  49. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +34 -0
  50. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +27 -0
  51. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
  52. data/lib/new_relic/agent/instrumentation/rack.rb +29 -139
  53. data/lib/new_relic/agent/instrumentation/rack/chain.rb +57 -0
  54. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +32 -0
  55. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +73 -0
  56. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +36 -0
  57. data/lib/new_relic/agent/instrumentation/rake.rb +13 -154
  58. data/lib/new_relic/agent/instrumentation/rake/chain.rb +25 -0
  59. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +144 -0
  60. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
  61. data/lib/new_relic/agent/instrumentation/redis.rb +10 -109
  62. data/lib/new_relic/agent/instrumentation/redis/chain.rb +34 -0
  63. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +65 -0
  64. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +24 -0
  65. data/lib/new_relic/agent/instrumentation/resque.rb +8 -28
  66. data/lib/new_relic/agent/instrumentation/resque/chain.rb +22 -0
  67. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +33 -0
  68. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +16 -0
  69. data/lib/new_relic/agent/instrumentation/sinatra.rb +20 -158
  70. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
  71. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +29 -34
  72. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +118 -0
  73. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
  74. data/lib/new_relic/agent/instrumentation/typhoeus.rb +10 -89
  75. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
  76. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +82 -0
  77. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
  78. data/lib/new_relic/agent/new_relic_service.rb +3 -12
  79. data/lib/new_relic/agent/sql_sampler.rb +1 -1
  80. data/lib/new_relic/agent/transaction.rb +1 -4
  81. data/lib/new_relic/control/frameworks/rails.rb +11 -9
  82. data/lib/new_relic/control/instance_methods.rb +1 -0
  83. data/lib/new_relic/dependency_detection.rb +116 -10
  84. data/lib/new_relic/noticed_error.rb +1 -5
  85. data/lib/new_relic/supportability_helper.rb +1 -2
  86. data/lib/new_relic/version.rb +2 -2
  87. data/newrelic_rpm.gemspec +1 -1
  88. metadata +53 -8
  89. data/cert/cacert.pem +0 -1177
  90. data/lib/new_relic/agent/instrumentation/http.rb +0 -49
  91. 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
- class HTTPClient
29
- def do_get_block_with_newrelic(req, proxy, conn, &block)
30
- wrapped_request = NewRelic::Agent::HTTPClients::HTTPClientRequest.new(req)
31
- segment = NewRelic::Agent::Tracer.start_external_request_segment(
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
- require 'new_relic/agent/datastores/metric_helper'
13
- require 'new_relic/agent/instrumentation/memcache/dalli'
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
- module NewRelic
16
- module Agent
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
- visibility = NewRelic::Helper.instance_method_visibility client_class, method_name
38
- method_name_without = :"#{method_name}_without_newrelic_trace"
22
+ depends_on { defined? ::MemCache }
39
23
 
40
- client_class.class_eval do
41
- alias_method method_name_without, method_name
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
- define_method method_name do |*args, &block|
44
- segment = NewRelic::Agent::Tracer.start_datastore_segment(
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
- send visibility, method_name
61
- send visibility, method_name_without
62
- end
63
- end
64
- end
37
+ depends_on { defined? ::Memcached }
65
38
 
66
- end
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 :memcache_client
50
+ named :dalli
51
+ configure_with :memcache
73
52
 
74
- depends_on do
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
- ::NewRelic::Agent.logger.info 'Installing Memcached instrumentation for memcache-client gem'
84
- NewRelic::Agent::Instrumentation::Memcache.instrument_methods(::MemCache)
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 :memcached
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 do
96
- defined?(::Memcached)
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 Memcached instrumentation for memcached gem'
101
- ::NewRelic::Agent::Instrumentation::Memcache.instrument_methods(::Memcached)
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