newrelic_rpm 6.15.0 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
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