scout_apm 5.1.1 → 5.3.5
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/.github/workflows/test.yml +22 -5
- data/CHANGELOG.markdown +32 -0
- data/gems/instruments.gemfile +6 -0
- data/gems/sidekiq.gemfile +4 -0
- data/lib/scout_apm/background_job_integrations/sidekiq.rb +2 -8
- data/lib/scout_apm/config.rb +16 -1
- data/lib/scout_apm/instrument_manager.rb +19 -1
- data/lib/scout_apm/instruments/action_controller_rails_2.rb +1 -1
- data/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb +1 -1
- data/lib/scout_apm/instruments/action_view.rb +1 -1
- data/lib/scout_apm/instruments/active_record.rb +2 -2
- data/lib/scout_apm/instruments/elasticsearch.rb +91 -42
- data/lib/scout_apm/instruments/grape.rb +1 -1
- data/lib/scout_apm/instruments/http.rb +36 -16
- data/lib/scout_apm/instruments/http_client.rb +33 -14
- data/lib/scout_apm/instruments/influxdb.rb +2 -2
- data/lib/scout_apm/instruments/memcached.rb +26 -11
- data/lib/scout_apm/instruments/middleware_detailed.rb +1 -1
- data/lib/scout_apm/instruments/middleware_summary.rb +1 -1
- data/lib/scout_apm/instruments/mongoid.rb +1 -1
- data/lib/scout_apm/instruments/moped.rb +44 -19
- data/lib/scout_apm/instruments/net_http.rb +49 -21
- data/lib/scout_apm/instruments/rails_router.rb +1 -1
- data/lib/scout_apm/instruments/redis.rb +27 -12
- data/lib/scout_apm/instruments/redis5.rb +59 -0
- data/lib/scout_apm/instruments/sinatra.rb +1 -1
- data/lib/scout_apm/instruments/typhoeus.rb +1 -1
- data/lib/scout_apm/layer_converters/external_service_converter.rb +1 -1
- data/lib/scout_apm/server_integrations/puma.rb +29 -1
- data/lib/scout_apm/slow_request_policy.rb +1 -1
- data/lib/scout_apm/store.rb +6 -0
- data/lib/scout_apm/version.rb +1 -1
- data/lib/scout_apm.rb +1 -0
- data/test/test_helper.rb +26 -0
- data/test/unit/background_job_integrations/sidekiq_test.rb +17 -0
- data/test/unit/environment_test.rb +0 -28
- data/test/unit/instruments/active_record_test.rb +31 -1
- data/test/unit/instruments/http_client_test.rb +24 -0
- data/test/unit/instruments/http_test.rb +24 -0
- data/test/unit/instruments/moped_test.rb +24 -0
- data/test/unit/instruments/net_http_test.rb +11 -1
- data/test/unit/instruments/redis_test.rb +24 -0
- data/test/unit/instruments/typhoeus_test.rb +1 -1
- metadata +78 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 656e36a7b9a11b5870058c46b31e8227c628691f8ab7f7d4de991c3e89b5f13d
|
4
|
+
data.tar.gz: 5f27c0af5b3f864a96ea65944c6655106a86aa96dbf489083b1c3a178322d827
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b805ac798aa0f430182e31e9d4b3d924d20624a59406d333f8d8d02ead0d30bece36bf0b127b4b9e04a5cf149cc9e67621ab72f2143f7fcd5c03f70790fedf09
|
7
|
+
data.tar.gz: 6883c955de7003baeb2685c369f63532b45e1c25b5859067fdfb2112e31abae6f57e2dc44dd5b06f55d66f3a6b9b778904de864c45905a63cdd9516719d59367
|
data/.github/workflows/test.yml
CHANGED
@@ -7,7 +7,7 @@ jobs:
|
|
7
7
|
runs-on: ubuntu-latest
|
8
8
|
|
9
9
|
steps:
|
10
|
-
- uses: actions/checkout@
|
10
|
+
- uses: actions/checkout@v3
|
11
11
|
- uses: ruby/setup-ruby@v1
|
12
12
|
with:
|
13
13
|
bundler-cache: true
|
@@ -35,16 +35,33 @@ jobs:
|
|
35
35
|
gemfile: gems/rails3.gemfile
|
36
36
|
bundler: 1.17.3
|
37
37
|
- ruby: 2.7
|
38
|
-
- ruby:
|
39
|
-
|
38
|
+
- ruby: 2.7
|
39
|
+
prepend: true
|
40
|
+
- ruby: "3.0"
|
41
|
+
- ruby: "3.0"
|
42
|
+
prepend: true
|
43
|
+
- ruby: "3.0"
|
44
|
+
gemfile: gems/instruments.gemfile
|
45
|
+
test_features: "instruments"
|
46
|
+
- ruby: "3.0"
|
47
|
+
gemfile: gems/instruments.gemfile
|
48
|
+
prepend: true
|
49
|
+
test_features: "instruments"
|
50
|
+
- ruby: "3.0"
|
51
|
+
gemfile: gems/sidekiq.gemfile
|
52
|
+
test_features: "sidekiq_install"
|
53
|
+
- ruby: 3.1
|
54
|
+
- ruby: 3.2
|
40
55
|
env:
|
41
56
|
BUNDLE_GEMFILE: ${{ matrix.gemfile }}
|
42
57
|
SCOUT_TEST_FEATURES: ${{ matrix.test_features }}
|
58
|
+
SCOUT_USE_PREPEND: ${{ matrix.prepend }}
|
43
59
|
|
44
|
-
|
60
|
+
# https://github.com/ruby/setup-ruby/issues/496
|
61
|
+
runs-on: ${{ matrix.ruby == '2.2' && 'ubuntu-20.04' || 'ubuntu-latest' }}
|
45
62
|
|
46
63
|
steps:
|
47
|
-
- uses: actions/checkout@
|
64
|
+
- uses: actions/checkout@v3
|
48
65
|
- uses: ruby/setup-ruby@v1
|
49
66
|
with:
|
50
67
|
bundler-cache: true
|
data/CHANGELOG.markdown
CHANGED
@@ -1,5 +1,37 @@
|
|
1
1
|
# Unreleased
|
2
2
|
|
3
|
+
# 5.3.5
|
4
|
+
* Fix adding instrumentation of ActiveRecord after configuration has initialized for Rails versions greater than 3. (#465)
|
5
|
+
* Fix typo with double use of PercentilePolicy, instead of PercentPolicy, for scoring. (#468)
|
6
|
+
* Fix span annotations/desc for external service requests with the use of prepend. (#471)
|
7
|
+
* Fix ActiveSupport methods and replace them with non ActiveSupport methods. (#474)
|
8
|
+
|
9
|
+
# 5.3.4
|
10
|
+
Unused.
|
11
|
+
|
12
|
+
# 5.3.3
|
13
|
+
|
14
|
+
* Fix double firing of Puma `on_worker_boot` when preloading. (#463)
|
15
|
+
|
16
|
+
# 5.3.2
|
17
|
+
|
18
|
+
* Update redis instruments to support redis v5.0+ (#458)
|
19
|
+
# 5.3.1
|
20
|
+
|
21
|
+
* Fix typo in HTTPClient prepend instrumentation (#457)
|
22
|
+
|
23
|
+
# 5.3.0
|
24
|
+
|
25
|
+
* Add configuraiton option to use `Module#prepend` instead of `Module#alias_method` (default)
|
26
|
+
for instrumentation (#448). The default method for instrumentation has not changed, but
|
27
|
+
configuration options were added to allow switching to `Module#prepend` for most
|
28
|
+
instrumentation. Refer to the documentation for more information:
|
29
|
+
[Library Instrumentation Method](https://scoutapm.com/docs/ruby/configuration#library-instrumentation-method)
|
30
|
+
|
31
|
+
# 5.2.0
|
32
|
+
|
33
|
+
* Use Sidekiq lifecycle hooks to start Scout agent on Sidekiq start. (#449)
|
34
|
+
|
3
35
|
# 5.1.1
|
4
36
|
|
5
37
|
* Improvements to SqlServer scrubbing in SqlSanitizer (#422)
|
@@ -37,17 +37,11 @@ module ScoutApm
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def install_processor
|
40
|
-
|
41
|
-
|
42
|
-
::Sidekiq::Processor.class_eval do
|
43
|
-
def initialize_with_scout(*args)
|
40
|
+
::Sidekiq.configure_server do |config|
|
41
|
+
config.on(:startup) do
|
44
42
|
agent = ::ScoutApm::Agent.instance
|
45
43
|
agent.start
|
46
|
-
initialize_without_scout(*args)
|
47
44
|
end
|
48
|
-
|
49
|
-
alias_method :initialize_without_scout, :initialize
|
50
|
-
alias_method :initialize, :initialize_with_scout
|
51
45
|
end
|
52
46
|
end
|
53
47
|
end
|
data/lib/scout_apm/config.rb
CHANGED
@@ -35,7 +35,13 @@ require 'scout_apm/environment'
|
|
35
35
|
# start_resque_server_instrument - Used in special situations with certain Resque installs
|
36
36
|
# timeline_traces - true/false to enable sending of of the timeline trace format.
|
37
37
|
# auto_instruments - true/false whether to install autoinstruments. Only installed if on a supported Ruby version.
|
38
|
-
# auto_instruments_ignore
|
38
|
+
# auto_instruments_ignore - An array of file names to exclude from autoinstruments (Ex: ['application_controller']).
|
39
|
+
# use_prepend - Whether to apply instrumentation using Module#Prepend instead
|
40
|
+
# of Module#alias_method (Default: false)
|
41
|
+
# alias_method_instruments - If `use_prepend` is true, continue to use Module#alias_method for
|
42
|
+
# any instruments listed in this array. Default: []
|
43
|
+
# prepend_instruments - If `use_prepend` is false, force using Module#prepend for any
|
44
|
+
# instruments listed in this array. Default: []
|
39
45
|
#
|
40
46
|
# Any of these config settings can be set with an environment variable prefixed
|
41
47
|
# by SCOUT_ and uppercasing the key: SCOUT_LOG_LEVEL for instance.
|
@@ -85,6 +91,9 @@ module ScoutApm
|
|
85
91
|
'timeline_traces',
|
86
92
|
'auto_instruments',
|
87
93
|
'auto_instruments_ignore',
|
94
|
+
'use_prepend',
|
95
|
+
'alias_method_instruments',
|
96
|
+
'prepend_instruments',
|
88
97
|
|
89
98
|
# Error Service Related Configuration
|
90
99
|
'errors_enabled',
|
@@ -189,6 +198,9 @@ module ScoutApm
|
|
189
198
|
'timeline_traces' => BooleanCoercion.new,
|
190
199
|
'auto_instruments' => BooleanCoercion.new,
|
191
200
|
'auto_instruments_ignore' => JsonCoercion.new,
|
201
|
+
'use_prepend' => BooleanCoercion.new,
|
202
|
+
'alias_method_instruments' => JsonCoercion.new,
|
203
|
+
'prepend_instruments' => JsonCoercion.new,
|
192
204
|
'errors_enabled' => BooleanCoercion.new,
|
193
205
|
'errors_ignored_exceptions' => JsonCoercion.new,
|
194
206
|
'errors_filtered_params' => JsonCoercion.new,
|
@@ -305,6 +317,9 @@ module ScoutApm
|
|
305
317
|
'timeline_traces' => true,
|
306
318
|
'auto_instruments' => false,
|
307
319
|
'auto_instruments_ignore' => [],
|
320
|
+
'use_prepend' => false,
|
321
|
+
'alias_method_instruments' => [],
|
322
|
+
'prepend_instruments' => [],
|
308
323
|
'ssl_cert_file' => File.join( File.dirname(__FILE__), *%w[.. .. data cacert.pem] ),
|
309
324
|
'errors_enabled' => false,
|
310
325
|
'errors_ignored_exceptions' => %w(ActiveRecord::RecordNotFound ActionController::RoutingError),
|
@@ -35,6 +35,7 @@ module ScoutApm
|
|
35
35
|
install_instrument(ScoutApm::Instruments::HTTP)
|
36
36
|
install_instrument(ScoutApm::Instruments::Memcached)
|
37
37
|
install_instrument(ScoutApm::Instruments::Redis)
|
38
|
+
install_instrument(ScoutApm::Instruments::Redis5)
|
38
39
|
install_instrument(ScoutApm::Instruments::InfluxDB)
|
39
40
|
install_instrument(ScoutApm::Instruments::Elasticsearch)
|
40
41
|
install_instrument(ScoutApm::Instruments::Grape)
|
@@ -50,6 +51,23 @@ module ScoutApm
|
|
50
51
|
(config.value("disabled_instruments") || []).include?(instrument_short_name)
|
51
52
|
end
|
52
53
|
|
54
|
+
def prepend_for_instrument?(instrument_klass)
|
55
|
+
instrument_short_name = instrument_klass.name.split("::").last
|
56
|
+
|
57
|
+
# `use_prepend` defaults to false, which means we use `alias_method` by default.
|
58
|
+
# If `use_prepend` is `true`, then we should default to using `prepend` unless
|
59
|
+
# the instrument is explicitly listed in the `alias_method_instruments` config array.
|
60
|
+
if config.value("use_prepend")
|
61
|
+
return false if (config.value("alias_method_instruments") || []).include?(instrument_short_name)
|
62
|
+
return true
|
63
|
+
else
|
64
|
+
# `use_prepend` is false, but we should use `prepend` if the instrument is
|
65
|
+
# explicitly listed in the `prepend_instruments` array.
|
66
|
+
return true if (config.value("prepend_instruments") || []).include?(instrument_short_name)
|
67
|
+
return false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
53
71
|
private
|
54
72
|
|
55
73
|
def install_instrument(instrument_klass)
|
@@ -62,7 +80,7 @@ module ScoutApm
|
|
62
80
|
|
63
81
|
instance = instrument_klass.new(context)
|
64
82
|
@installed_instruments << instance
|
65
|
-
instance.install
|
83
|
+
instance.install(prepend: prepend_for_instrument?(instrument_klass))
|
66
84
|
end
|
67
85
|
|
68
86
|
def already_installed?(instrument_klass)
|
@@ -50,7 +50,7 @@ module ScoutApm
|
|
50
50
|
@installed
|
51
51
|
end
|
52
52
|
|
53
|
-
def install
|
53
|
+
def install(prepend:)
|
54
54
|
if install_via_after_initialize?
|
55
55
|
Rails.configuration.after_initialize do
|
56
56
|
add_instruments
|
@@ -66,7 +66,7 @@ module ScoutApm
|
|
66
66
|
defined?(::Rails) &&
|
67
67
|
defined?(::Rails::VERSION) &&
|
68
68
|
defined?(::Rails::VERSION::MAJOR) &&
|
69
|
-
::Rails::VERSION::MAJOR.to_i
|
69
|
+
::Rails::VERSION::MAJOR.to_i >= 3 &&
|
70
70
|
::Rails.respond_to?(:configuration)
|
71
71
|
end
|
72
72
|
|
@@ -18,66 +18,115 @@ module ScoutApm
|
|
18
18
|
@installed
|
19
19
|
end
|
20
20
|
|
21
|
-
def install
|
21
|
+
def install(prepend:)
|
22
22
|
if defined?(::Elasticsearch) &&
|
23
23
|
defined?(::Elasticsearch::Transport) &&
|
24
24
|
defined?(::Elasticsearch::Transport::Client)
|
25
25
|
|
26
26
|
@installed = true
|
27
27
|
|
28
|
-
logger.info "Instrumenting Elasticsearch"
|
28
|
+
logger.info "Instrumenting Elasticsearch. Prepend: #{prepend}"
|
29
29
|
|
30
|
-
|
31
|
-
include ScoutApm::Tracer
|
30
|
+
if prepend
|
31
|
+
::Elasticsearch::Transport::Client.send(:include, ScoutApm::Tracer)
|
32
|
+
::Elasticsearch::Transport::Client.send(:prepend, ElasticsearchTransportClientInstrumentationPrepend)
|
33
|
+
else
|
34
|
+
::Elasticsearch::Transport::Client.class_eval do
|
35
|
+
include ScoutApm::Tracer
|
32
36
|
|
33
|
-
|
34
|
-
|
37
|
+
def perform_request_with_scout_instruments(*args, &block)
|
38
|
+
name = _sanitize_name(args[1])
|
35
39
|
|
36
|
-
|
37
|
-
|
40
|
+
self.class.instrument("Elasticsearch", name, :ignore_children => true) do
|
41
|
+
perform_request_without_scout_instruments(*args, &block)
|
42
|
+
end
|
38
43
|
end
|
39
|
-
end
|
40
44
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
45
|
+
alias_method :perform_request_without_scout_instruments, :perform_request
|
46
|
+
alias_method :perform_request, :perform_request_with_scout_instruments
|
47
|
+
|
48
|
+
def _sanitize_name(name)
|
49
|
+
name = name.split("/").last.gsub(/^_/, '')
|
50
|
+
allowed_names = ["bench",
|
51
|
+
"bulk",
|
52
|
+
"count",
|
53
|
+
"exists",
|
54
|
+
"explain",
|
55
|
+
"field_stats",
|
56
|
+
"health",
|
57
|
+
"mget",
|
58
|
+
"mlt",
|
59
|
+
"mpercolate",
|
60
|
+
"msearch",
|
61
|
+
"mtermvectors",
|
62
|
+
"percolate",
|
63
|
+
"query",
|
64
|
+
"scroll",
|
65
|
+
"search_shards",
|
66
|
+
"source",
|
67
|
+
"suggest",
|
68
|
+
"template",
|
69
|
+
"termvectors",
|
70
|
+
"update",
|
71
|
+
"search", ]
|
72
|
+
|
73
|
+
if allowed_names.include?(name)
|
74
|
+
name
|
75
|
+
else
|
76
|
+
"Unknown"
|
77
|
+
end
|
78
|
+
rescue
|
72
79
|
"Unknown"
|
73
80
|
end
|
74
|
-
rescue
|
75
|
-
"Unknown"
|
76
81
|
end
|
77
82
|
end
|
78
83
|
end
|
79
84
|
end
|
80
85
|
end
|
86
|
+
|
87
|
+
module ElasticsearchTransportClientInstrumentationPrepend
|
88
|
+
def perform_request(*args, &block)
|
89
|
+
name = _sanitize_name(args[1])
|
90
|
+
|
91
|
+
self.class.instrument("Elasticsearch", name, :ignore_children => true) do
|
92
|
+
super(*args, &block)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def _sanitize_name(name)
|
97
|
+
name = name.split("/").last.gsub(/^_/, '')
|
98
|
+
allowed_names = ["bench",
|
99
|
+
"bulk",
|
100
|
+
"count",
|
101
|
+
"exists",
|
102
|
+
"explain",
|
103
|
+
"field_stats",
|
104
|
+
"health",
|
105
|
+
"mget",
|
106
|
+
"mlt",
|
107
|
+
"mpercolate",
|
108
|
+
"msearch",
|
109
|
+
"mtermvectors",
|
110
|
+
"percolate",
|
111
|
+
"query",
|
112
|
+
"scroll",
|
113
|
+
"search_shards",
|
114
|
+
"source",
|
115
|
+
"suggest",
|
116
|
+
"template",
|
117
|
+
"termvectors",
|
118
|
+
"update",
|
119
|
+
"search", ]
|
120
|
+
|
121
|
+
if allowed_names.include?(name)
|
122
|
+
name
|
123
|
+
else
|
124
|
+
"Unknown"
|
125
|
+
end
|
126
|
+
rescue
|
127
|
+
"Unknown"
|
128
|
+
end
|
129
|
+
end
|
81
130
|
end
|
82
131
|
end
|
83
132
|
|
@@ -16,33 +16,53 @@ module ScoutApm
|
|
16
16
|
@installed
|
17
17
|
end
|
18
18
|
|
19
|
-
def install
|
19
|
+
def install(prepend:)
|
20
20
|
if defined?(::HTTP) && defined?(::HTTP::Client)
|
21
21
|
@installed = true
|
22
22
|
|
23
|
-
logger.info "Instrumenting HTTP::Client"
|
23
|
+
logger.info "Instrumenting HTTP::Client. Prepend: #{prepend}"
|
24
24
|
|
25
|
-
|
26
|
-
include ScoutApm::Tracer
|
25
|
+
if prepend
|
26
|
+
::HTTP::Client.send(:include, ScoutApm::Tracer)
|
27
|
+
::HTTP::Client.send(:prepend, HTTPInstrumentationPrepend)
|
28
|
+
else
|
29
|
+
::HTTP::Client.class_eval do
|
30
|
+
include ScoutApm::Tracer
|
27
31
|
|
28
|
-
|
29
|
-
|
30
|
-
|
32
|
+
def request_with_scout_instruments(verb, uri, opts = {})
|
33
|
+
self.class.instrument("HTTP", verb, :ignore_children => true, :desc => request_scout_description(verb, uri)) do
|
34
|
+
request_without_scout_instruments(verb, uri, opts)
|
35
|
+
end
|
31
36
|
end
|
32
|
-
end
|
33
37
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
def request_scout_description(verb, uri)
|
39
|
+
max_length = ScoutApm::Agent.instance.context.config.value('instrument_http_url_length')
|
40
|
+
(String(uri).split('?').first)[0..(max_length - 1)]
|
41
|
+
rescue
|
42
|
+
""
|
43
|
+
end
|
40
44
|
|
41
|
-
|
42
|
-
|
45
|
+
alias request_without_scout_instruments request
|
46
|
+
alias request request_with_scout_instruments
|
47
|
+
end
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
46
51
|
end
|
52
|
+
|
53
|
+
module HTTPInstrumentationPrepend
|
54
|
+
def request(verb, uri, opts = {})
|
55
|
+
self.class.instrument("HTTP", verb, :ignore_children => true, :desc => request_scout_description(verb, uri)) do
|
56
|
+
super(verb, uri, opts)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def request_scout_description(verb, uri)
|
61
|
+
max_length = ScoutApm::Agent.instance.context.config.value('instrument_http_url_length')
|
62
|
+
(String(uri).split('?').first)[0..(max_length - 1)]
|
63
|
+
rescue
|
64
|
+
""
|
65
|
+
end
|
66
|
+
end
|
47
67
|
end
|
48
68
|
end
|
@@ -16,33 +16,52 @@ module ScoutApm
|
|
16
16
|
@installed
|
17
17
|
end
|
18
18
|
|
19
|
-
def install
|
19
|
+
def install(prepend:)
|
20
20
|
if defined?(::HTTPClient)
|
21
21
|
@installed = true
|
22
22
|
|
23
|
-
logger.info "Instrumenting HTTPClient"
|
23
|
+
logger.info "Instrumenting HTTPClient. Prepend: #{prepend}"
|
24
24
|
|
25
|
-
|
26
|
-
include ScoutApm::Tracer
|
25
|
+
if prepend
|
26
|
+
::HTTPClient.send(:include, ScoutApm::Tracer)
|
27
|
+
::HTTPClient.send(:prepend, HttpClientInstrumentationPrepend)
|
28
|
+
else
|
29
|
+
::HTTPClient.class_eval do
|
30
|
+
include ScoutApm::Tracer
|
27
31
|
|
28
|
-
|
32
|
+
def request_with_scout_instruments(*args, &block)
|
29
33
|
|
30
|
-
|
31
|
-
|
34
|
+
method = args[0].to_s
|
35
|
+
url = args[1]
|
32
36
|
|
33
|
-
|
34
|
-
|
37
|
+
max_length = ScoutApm::Agent.instance.context.config.value('instrument_http_url_length')
|
38
|
+
url = url && url.to_s[0..(max_length - 1)]
|
35
39
|
|
36
|
-
|
37
|
-
|
40
|
+
self.class.instrument("HTTP", method, :desc => url) do
|
41
|
+
request_without_scout_instruments(*args, &block)
|
42
|
+
end
|
38
43
|
end
|
39
|
-
end
|
40
44
|
|
41
|
-
|
42
|
-
|
45
|
+
alias request_without_scout_instruments request
|
46
|
+
alias request request_with_scout_instruments
|
47
|
+
end
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
46
51
|
end
|
52
|
+
|
53
|
+
module HttpClientInstrumentationPrepend
|
54
|
+
def request(*args, &block)
|
55
|
+
method = args[0].to_s
|
56
|
+
url = args[1]
|
57
|
+
|
58
|
+
max_length = ScoutApm::Agent.instance.context.config.value('instrument_http_url_length')
|
59
|
+
url = url && url.to_s[0..(max_length - 1)]
|
60
|
+
|
61
|
+
self.class.instrument("HTTP", method, :desc => url) do
|
62
|
+
super(*args, &block)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
47
66
|
end
|
48
67
|
end
|
@@ -16,11 +16,11 @@ module ScoutApm
|
|
16
16
|
@installed
|
17
17
|
end
|
18
18
|
|
19
|
-
def install
|
19
|
+
def install(prepend:)
|
20
20
|
if defined?(::InfluxDB)
|
21
21
|
@installed = true
|
22
22
|
|
23
|
-
logger.debug "Instrumenting InfluxDB"
|
23
|
+
logger.debug "Instrumenting InfluxDB."
|
24
24
|
|
25
25
|
::InfluxDB::Client.class_eval do
|
26
26
|
include ScoutApm::Tracer
|
@@ -16,28 +16,43 @@ module ScoutApm
|
|
16
16
|
@installed
|
17
17
|
end
|
18
18
|
|
19
|
-
def install
|
19
|
+
def install(prepend:)
|
20
20
|
if defined?(::Dalli) && defined?(::Dalli::Client)
|
21
21
|
@installed = true
|
22
22
|
|
23
|
-
logger.info "Instrumenting Memcached"
|
23
|
+
logger.info "Instrumenting Memcached. Prepend: #{prepend}"
|
24
24
|
|
25
|
-
|
26
|
-
include ScoutApm::Tracer
|
25
|
+
if prepend
|
26
|
+
::Dalli::Client.send(:include, ScoutApm::Tracer)
|
27
|
+
::Dalli::Client.send(:prepend, MemcachedInstrumentationPrepend)
|
28
|
+
else
|
29
|
+
::Dalli::Client.class_eval do
|
30
|
+
include ScoutApm::Tracer
|
27
31
|
|
28
|
-
|
29
|
-
|
32
|
+
def perform_with_scout_instruments(*args, &block)
|
33
|
+
command = args.first rescue "Unknown"
|
30
34
|
|
31
|
-
|
32
|
-
|
35
|
+
self.class.instrument("Memcached", command) do
|
36
|
+
perform_without_scout_instruments(*args, &block)
|
37
|
+
end
|
33
38
|
end
|
34
|
-
end
|
35
39
|
|
36
|
-
|
37
|
-
|
40
|
+
alias_method :perform_without_scout_instruments, :perform
|
41
|
+
alias_method :perform, :perform_with_scout_instruments
|
42
|
+
end
|
38
43
|
end
|
39
44
|
end
|
40
45
|
end
|
41
46
|
end
|
47
|
+
|
48
|
+
module MemcachedInstrumentationPrepend
|
49
|
+
def perform(*args, &block)
|
50
|
+
command = args.first rescue "Unknown"
|
51
|
+
|
52
|
+
self.class.instrument("Memcached", command) do
|
53
|
+
super(*args, &block)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
42
57
|
end
|
43
58
|
end
|