appsignal 1.2.5 → 1.3.0.beta.1
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 +14 -0
- data/circle.yml +4 -0
- data/ext/agent.yml +11 -11
- data/ext/appsignal_extension.c +105 -40
- data/lib/appsignal.rb +18 -6
- data/lib/appsignal/cli/install.rb +3 -3
- data/lib/appsignal/config.rb +19 -5
- data/lib/appsignal/event_formatter.rb +3 -2
- data/lib/appsignal/event_formatter/elastic_search/search_formatter.rb +1 -1
- data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +1 -1
- data/lib/appsignal/event_formatter/moped/query_formatter.rb +13 -6
- data/lib/appsignal/hooks/mongo_ruby_driver.rb +0 -1
- data/lib/appsignal/hooks/net_http.rb +2 -5
- data/lib/appsignal/hooks/redis.rb +1 -1
- data/lib/appsignal/hooks/sequel.rb +8 -4
- data/lib/appsignal/integrations/mongo_ruby_driver.rb +1 -1
- data/lib/appsignal/integrations/object.rb +35 -0
- data/lib/appsignal/integrations/resque.rb +5 -0
- data/lib/appsignal/integrations/sinatra.rb +2 -2
- data/lib/appsignal/minutely.rb +41 -0
- data/lib/appsignal/params_sanitizer.rb +4 -105
- data/lib/appsignal/rack/sinatra_instrumentation.rb +25 -2
- data/lib/appsignal/transaction.rb +41 -15
- data/lib/appsignal/transmitter.rb +1 -1
- data/lib/appsignal/utils.rb +42 -47
- data/lib/appsignal/utils/params_sanitizer.rb +58 -0
- data/lib/appsignal/utils/query_params_sanitizer.rb +54 -0
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/config_spec.rb +12 -2
- data/spec/lib/appsignal/extension_spec.rb +4 -0
- data/spec/lib/appsignal/hooks/net_http_spec.rb +20 -28
- data/spec/lib/appsignal/hooks/redis_spec.rb +9 -11
- data/spec/lib/appsignal/integrations/object_spec.rb +211 -0
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +2 -2
- data/spec/lib/appsignal/minutely_spec.rb +54 -0
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +50 -10
- data/spec/lib/appsignal/subscriber_spec.rb +5 -6
- data/spec/lib/appsignal/transaction_spec.rb +102 -23
- data/spec/lib/appsignal/transmitter_spec.rb +1 -1
- data/spec/lib/appsignal/utils/params_sanitizer_spec.rb +122 -0
- data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +194 -0
- data/spec/lib/appsignal/utils_spec.rb +13 -76
- data/spec/lib/appsignal_spec.rb +82 -13
- metadata +15 -11
- data/lib/appsignal/event_formatter/net_http/request_formatter.rb +0 -13
- data/lib/appsignal/event_formatter/sequel/sql_formatter.rb +0 -13
- data/spec/lib/appsignal/event_formatter/net_http/request_formatter_spec.rb +0 -26
- data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -22
- data/spec/lib/appsignal/params_sanitizer_spec.rb +0 -200
@@ -2,7 +2,28 @@ require 'rack'
|
|
2
2
|
|
3
3
|
module Appsignal
|
4
4
|
module Rack
|
5
|
+
# Stub old middleware. Prevents Sinatra middleware being loaded twice.
|
6
|
+
# This can happen when users use the old method of including
|
7
|
+
# `use Appsignal::Rack::SinatraInstrumentation` in their modular Sinatra
|
8
|
+
# applications. This is no longer needed. Instead Appsignal now includes
|
9
|
+
# `use Appsignal::Rack::SinatraBaseInstrumentation` automatically.
|
5
10
|
class SinatraInstrumentation
|
11
|
+
def initialize(app, options = {})
|
12
|
+
@app, @options = app, options
|
13
|
+
Appsignal.logger.warn 'Please remove Appsignal::Rack::SinatraInstrumentation '\
|
14
|
+
'from your Sinatra::Base class. This is no longer needed.'
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
@app.call(env)
|
19
|
+
end
|
20
|
+
|
21
|
+
def settings
|
22
|
+
@app.settings
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class SinatraBaseInstrumentation
|
6
27
|
attr_reader :raise_errors_on
|
7
28
|
|
8
29
|
def initialize(app, options = {})
|
@@ -51,11 +72,13 @@ module Appsignal
|
|
51
72
|
end
|
52
73
|
end
|
53
74
|
|
54
|
-
|
55
75
|
def action_name(env)
|
56
76
|
if @options.fetch(:mounted_at, nil)
|
57
77
|
method, route = env['sinatra.route'].split(" ")
|
58
|
-
"#{method} #{@options
|
78
|
+
"#{method} #{@options[:mounted_at]}#{route}"
|
79
|
+
elsif env['SCRIPT_NAME']
|
80
|
+
method, route = env['sinatra.route'].split(" ")
|
81
|
+
"#{method} #{env['SCRIPT_NAME']}#{route}"
|
59
82
|
else
|
60
83
|
env['sinatra.route']
|
61
84
|
end
|
@@ -181,15 +181,32 @@ module Appsignal
|
|
181
181
|
@ext.start_event
|
182
182
|
end
|
183
183
|
|
184
|
-
def finish_event(name, title, body, body_format)
|
184
|
+
def finish_event(name, title, body, body_format=Appsignal::EventFormatter::DEFAULT)
|
185
185
|
@ext.finish_event(
|
186
186
|
name,
|
187
187
|
title || BLANK,
|
188
188
|
body || BLANK,
|
189
|
-
body_format ||
|
189
|
+
body_format || Appsignal::EventFormatter::DEFAULT
|
190
190
|
)
|
191
191
|
end
|
192
192
|
|
193
|
+
def record_event(name, title, body, duration, body_format=Appsignal::EventFormatter::DEFAULT)
|
194
|
+
@ext.record_event(
|
195
|
+
name,
|
196
|
+
title || BLANK,
|
197
|
+
body || BLANK,
|
198
|
+
duration,
|
199
|
+
body_format || Appsignal::EventFormatter::DEFAULT
|
200
|
+
)
|
201
|
+
end
|
202
|
+
|
203
|
+
def instrument(name, title=nil, body=nil, body_format=Appsignal::EventFormatter::DEFAULT)
|
204
|
+
start_event
|
205
|
+
r = yield
|
206
|
+
finish_event(name, title, body, body_format)
|
207
|
+
r
|
208
|
+
end
|
209
|
+
|
193
210
|
class GenericRequest
|
194
211
|
attr_reader :env
|
195
212
|
|
@@ -231,18 +248,22 @@ module Appsignal
|
|
231
248
|
def sanitized_params
|
232
249
|
return unless Appsignal.config[:send_params]
|
233
250
|
return unless request.respond_to?(options[:params_method])
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
251
|
+
|
252
|
+
params =
|
253
|
+
begin
|
254
|
+
request.send options[:params_method]
|
255
|
+
rescue Exception => ex
|
256
|
+
# Getting params from the request has been know to fail.
|
257
|
+
Appsignal.logger.debug "Exception while getting params: #{ex}"
|
258
|
+
nil
|
259
|
+
end
|
260
|
+
return unless params
|
261
|
+
|
262
|
+
options = {}
|
263
|
+
if Appsignal.config[:filter_parameters]
|
264
|
+
options[:filter_parameters] = Appsignal.config[:filter_parameters]
|
245
265
|
end
|
266
|
+
Appsignal::Utils::ParamsSanitizer.sanitize params, options
|
246
267
|
end
|
247
268
|
|
248
269
|
def sanitized_environment
|
@@ -257,7 +278,7 @@ module Appsignal
|
|
257
278
|
def sanitized_session_data
|
258
279
|
return if Appsignal.config[:skip_session_data] || !request.respond_to?(:session)
|
259
280
|
return unless session = request.session
|
260
|
-
Appsignal::ParamsSanitizer.sanitize(session.to_hash)
|
281
|
+
Appsignal::Utils::ParamsSanitizer.sanitize(session.to_hash)
|
261
282
|
end
|
262
283
|
|
263
284
|
def metadata
|
@@ -272,7 +293,7 @@ module Appsignal
|
|
272
293
|
def sanitized_tags
|
273
294
|
@tags.select do |k, v|
|
274
295
|
(k.is_a?(Symbol) || k.is_a?(String) && k.length <= 100) &&
|
275
|
-
|
296
|
+
(((v.is_a?(Symbol) || v.is_a?(String)) && v.length <= 100) || (v.is_a?(Integer)))
|
276
297
|
end
|
277
298
|
end
|
278
299
|
|
@@ -290,6 +311,11 @@ module Appsignal
|
|
290
311
|
def method_missing(m, *args, &block)
|
291
312
|
end
|
292
313
|
|
314
|
+
# Instrument should still yield
|
315
|
+
def instrument(*args)
|
316
|
+
yield
|
317
|
+
end
|
318
|
+
|
293
319
|
def nil_transaction?
|
294
320
|
true
|
295
321
|
end
|
data/lib/appsignal/utils.rb
CHANGED
@@ -1,61 +1,56 @@
|
|
1
|
+
require 'appsignal/utils/params_sanitizer'
|
2
|
+
require 'appsignal/utils/query_params_sanitizer'
|
3
|
+
|
1
4
|
module Appsignal
|
2
5
|
module Utils
|
3
|
-
|
4
|
-
|
5
|
-
{}.tap do |hsh|
|
6
|
-
params.each do |key, val|
|
7
|
-
hsh[self.sanitize_key(key, key_sanitizer)] = if only_top_level
|
8
|
-
'?'
|
9
|
-
else
|
10
|
-
sanitize(val, only_top_level, key_sanitizer=nil)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
elsif params.is_a?(Array)
|
15
|
-
if only_top_level
|
16
|
-
sanitize(params[0], only_top_level, key_sanitizer=nil)
|
17
|
-
else
|
18
|
-
params.map do |item|
|
19
|
-
sanitize(item, only_top_level, key_sanitizer=nil)
|
20
|
-
end.uniq
|
21
|
-
end
|
22
|
-
else
|
23
|
-
'?'
|
24
|
-
end
|
25
|
-
end
|
6
|
+
module ClassMethods
|
7
|
+
extend Gem::Deprecate
|
26
8
|
|
27
|
-
|
28
|
-
|
29
|
-
when :mongodb then key.to_s.gsub(/(\..+)/, '.?')
|
30
|
-
else key
|
9
|
+
def sanitize(params, only_top_level = false, key_sanitizer = nil)
|
10
|
+
QueryParamsSanitizer.sanitize(params, only_top_level, key_sanitizer)
|
31
11
|
end
|
12
|
+
|
13
|
+
deprecate :sanitize, "AppSignal::Utils::QueryParamsSanitizer.sanitize", 2016, 9
|
32
14
|
end
|
15
|
+
extend ClassMethods
|
33
16
|
|
34
17
|
def self.json_generate(body)
|
35
|
-
JSON.generate(
|
18
|
+
JSON.generate(body)
|
36
19
|
end
|
37
20
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
21
|
+
class JSON
|
22
|
+
module ClassMethods
|
23
|
+
def generate(body)
|
24
|
+
::JSON.generate(jsonify(body))
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def jsonify(value)
|
30
|
+
case value
|
31
|
+
when String
|
32
|
+
encode_utf8(value)
|
33
|
+
when Numeric, NilClass, TrueClass, FalseClass
|
34
|
+
value
|
35
|
+
when Hash
|
36
|
+
Hash[value.map { |k, v| [jsonify(k), jsonify(v)] }]
|
37
|
+
when Array
|
38
|
+
value.map { |v| jsonify(v) }
|
39
|
+
else
|
40
|
+
jsonify(value.to_s)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def encode_utf8(value)
|
45
|
+
value.encode(
|
46
|
+
'utf-8'.freeze,
|
47
|
+
:invalid => :replace,
|
48
|
+
:undef => :replace
|
49
|
+
)
|
50
|
+
end
|
50
51
|
end
|
51
|
-
end
|
52
52
|
|
53
|
-
|
54
|
-
value.encode(
|
55
|
-
'utf-8'.freeze,
|
56
|
-
:invalid => :replace,
|
57
|
-
:undef => :replace
|
58
|
-
)
|
53
|
+
extend ClassMethods
|
59
54
|
end
|
60
55
|
end
|
61
56
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Appsignal
|
2
|
+
module Utils
|
3
|
+
class ParamsSanitizer
|
4
|
+
FILTERED = '[FILTERED]'.freeze
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def sanitize(params, options = {})
|
8
|
+
sanitize_value(params, options)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def sanitize_value(value, options = {})
|
14
|
+
case value
|
15
|
+
when Hash
|
16
|
+
sanitize_hash(value, options)
|
17
|
+
when Array
|
18
|
+
sanitize_array(value, options)
|
19
|
+
when TrueClass, FalseClass, NilClass, Fixnum, String, Symbol, Float
|
20
|
+
unmodified(value)
|
21
|
+
else
|
22
|
+
inspected(value)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def sanitize_hash(source, options)
|
27
|
+
filter_keys = options.fetch(:filter_parameters, [])
|
28
|
+
{}.tap do |hash|
|
29
|
+
source.each_pair do |key, value|
|
30
|
+
hash[key] =
|
31
|
+
if filter_keys.include?(key.to_s)
|
32
|
+
FILTERED
|
33
|
+
else
|
34
|
+
sanitize_value(value, options)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def sanitize_array(source, options)
|
41
|
+
[].tap do |array|
|
42
|
+
source.each_with_index do |item, index|
|
43
|
+
array[index] = sanitize_value(item, options)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def unmodified(value)
|
49
|
+
value
|
50
|
+
end
|
51
|
+
|
52
|
+
def inspected(value)
|
53
|
+
"#<#{value.class}>"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Appsignal
|
2
|
+
module Utils
|
3
|
+
class QueryParamsSanitizer
|
4
|
+
REPLACEMENT_KEY = '?'.freeze
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def sanitize(params, only_top_level = false, key_sanitizer = nil)
|
8
|
+
case params
|
9
|
+
when Hash
|
10
|
+
sanitize_hash params, only_top_level, key_sanitizer
|
11
|
+
when Array
|
12
|
+
sanitize_array params, only_top_level, key_sanitizer
|
13
|
+
else
|
14
|
+
REPLACEMENT_KEY
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def sanitize_hash(hash, only_top_level, key_sanitizer)
|
21
|
+
{}.tap do |h|
|
22
|
+
hash.each do |key, value|
|
23
|
+
h[sanitize_key(key, key_sanitizer)] =
|
24
|
+
if only_top_level
|
25
|
+
REPLACEMENT_KEY
|
26
|
+
else
|
27
|
+
sanitize(value, only_top_level, key_sanitizer)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def sanitize_array(array, only_top_level, key_sanitizer)
|
34
|
+
if only_top_level
|
35
|
+
sanitize(array[0], only_top_level, key_sanitizer)
|
36
|
+
else
|
37
|
+
array.map do |value|
|
38
|
+
sanitize(value, only_top_level, key_sanitizer)
|
39
|
+
end.uniq
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def sanitize_key(key, sanitizer)
|
44
|
+
case sanitizer
|
45
|
+
when :mongodb then key.to_s.gsub(/(\..+)/, ".#{REPLACEMENT_KEY}")
|
46
|
+
else key
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
extend ClassMethods
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/appsignal/version.rb
CHANGED
@@ -20,6 +20,7 @@ describe Appsignal::Config do
|
|
20
20
|
:debug => false,
|
21
21
|
:ignore_errors => [],
|
22
22
|
:ignore_actions => [],
|
23
|
+
:filter_parameters => [],
|
23
24
|
:instrument_net_http => true,
|
24
25
|
:instrument_redis => true,
|
25
26
|
:instrument_sequel => true,
|
@@ -34,7 +35,9 @@ describe Appsignal::Config do
|
|
34
35
|
:enable_allocation_tracking => true,
|
35
36
|
:enable_gc_instrumentation => false,
|
36
37
|
:running_in_container => false,
|
37
|
-
:enable_host_metrics =>
|
38
|
+
:enable_host_metrics => true,
|
39
|
+
:enable_minutely_probes => false,
|
40
|
+
:hostname => Socket.gethostname
|
38
41
|
}
|
39
42
|
end
|
40
43
|
|
@@ -102,6 +105,8 @@ describe Appsignal::Config do
|
|
102
105
|
subject.config_hash[:http_proxy] = 'http://localhost'
|
103
106
|
subject.config_hash[:ignore_actions] = ['action1', 'action2']
|
104
107
|
subject.config_hash[:log_path] = '/tmp'
|
108
|
+
subject.config_hash[:hostname] = 'app1.local'
|
109
|
+
subject.config_hash[:filter_parameters] = %w(password confirm_password)
|
105
110
|
subject.write_to_environment
|
106
111
|
end
|
107
112
|
|
@@ -119,9 +124,14 @@ describe Appsignal::Config do
|
|
119
124
|
ENV['APPSIGNAL_LANGUAGE_INTEGRATION_VERSION'].should == Appsignal::VERSION
|
120
125
|
ENV['APPSIGNAL_HTTP_PROXY'].should == 'http://localhost'
|
121
126
|
ENV['APPSIGNAL_IGNORE_ACTIONS'].should == 'action1,action2'
|
127
|
+
ENV['APPSIGNAL_FILTER_PARAMETERS'].should == 'password,confirm_password'
|
128
|
+
ENV['APPSIGNAL_SEND_PARAMS'].should == 'true'
|
122
129
|
ENV['APPSIGNAL_RUNNING_IN_CONTAINER'].should == 'false'
|
123
130
|
ENV['APPSIGNAL_WORKING_DIR_PATH'].should be_nil
|
124
|
-
ENV['APPSIGNAL_ENABLE_HOST_METRICS'].should == '
|
131
|
+
ENV['APPSIGNAL_ENABLE_HOST_METRICS'].should == 'true'
|
132
|
+
ENV['APPSIGNAL_ENABLE_MINUTELY_PROBES'].should == 'false'
|
133
|
+
ENV['APPSIGNAL_HOSTNAME'].should == 'app1.local'
|
134
|
+
ENV['APPSIGNAL_PROCESS_NAME'].should include 'rspec'
|
125
135
|
end
|
126
136
|
|
127
137
|
context "if working_dir_path is set" do
|
@@ -48,6 +48,10 @@ describe "extension loading and operation" do
|
|
48
48
|
subject.finish_event('name', 'title', 'body', 0)
|
49
49
|
end
|
50
50
|
|
51
|
+
it "should have a record_event method" do
|
52
|
+
subject.record_event('name', 'title', 'body', 0, 1000)
|
53
|
+
end
|
54
|
+
|
51
55
|
it "should have a set_error method" do
|
52
56
|
subject.set_error('name', 'message', '[backtrace]')
|
53
57
|
end
|
@@ -2,54 +2,46 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Appsignal::Hooks::NetHttpHook do
|
4
4
|
before :all do
|
5
|
-
|
5
|
+
start_agent
|
6
6
|
end
|
7
7
|
|
8
8
|
context "with Net::HTTP instrumentation enabled" do
|
9
|
-
let(:events) { [] }
|
10
|
-
before :all do
|
11
|
-
Appsignal.config.config_hash[:instrument_net_http] = true
|
12
|
-
end
|
13
|
-
before do
|
14
|
-
ActiveSupport::Notifications.subscribe(/^[^!]/) do |*args|
|
15
|
-
events << ActiveSupport::Notifications::Event.new(*args)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
after(:all) { Appsignal.config.config_hash[:instrument_net_http] = false }
|
19
|
-
|
20
9
|
its(:dependencies_present?) { should be_true }
|
21
10
|
|
22
|
-
it "should
|
11
|
+
it "should instrument a http request" do
|
12
|
+
Appsignal::Transaction.create('uuid', Appsignal::Transaction::HTTP_REQUEST, 'test')
|
13
|
+
expect( Appsignal::Transaction.current ).to receive(:start_event)
|
14
|
+
.at_least(:once)
|
15
|
+
expect( Appsignal::Transaction.current ).to receive(:finish_event)
|
16
|
+
.at_least(:once)
|
17
|
+
.with("request.net_http", "GET http://www.google.com", nil, 0)
|
18
|
+
|
23
19
|
stub_request(:any, 'http://www.google.com/')
|
24
20
|
|
25
21
|
Net::HTTP.get_response(URI.parse('http://www.google.com'))
|
26
|
-
|
27
|
-
event = events.last
|
28
|
-
event.name.should == 'request.net_http'
|
29
|
-
event.payload[:protocol].should == 'http'
|
30
|
-
event.payload[:domain].should == 'www.google.com'
|
31
|
-
event.payload[:path].should == '/'
|
32
|
-
event.payload[:method].should == 'GET'
|
33
22
|
end
|
34
23
|
|
35
|
-
it "should
|
24
|
+
it "should instrument a https request" do
|
25
|
+
Appsignal::Transaction.create('uuid', Appsignal::Transaction::HTTP_REQUEST, 'test')
|
26
|
+
expect( Appsignal::Transaction.current ).to receive(:start_event)
|
27
|
+
.at_least(:once)
|
28
|
+
expect( Appsignal::Transaction.current ).to receive(:finish_event)
|
29
|
+
.at_least(:once)
|
30
|
+
.with("request.net_http", "GET https://www.google.com", nil, 0)
|
31
|
+
|
36
32
|
stub_request(:any, 'https://www.google.com/')
|
37
33
|
|
38
34
|
uri = URI.parse('https://www.google.com')
|
39
35
|
http = Net::HTTP.new(uri.host, uri.port)
|
40
36
|
http.use_ssl = true
|
41
37
|
http.get(uri.request_uri)
|
42
|
-
|
43
|
-
event = events.last
|
44
|
-
event.name.should == 'request.net_http'
|
45
|
-
event.payload[:protocol].should == 'https'
|
46
|
-
event.payload[:domain].should == 'www.google.com'
|
47
|
-
event.payload[:path].should == '/'
|
48
|
-
event.payload[:method].should == 'GET'
|
49
38
|
end
|
50
39
|
end
|
51
40
|
|
52
41
|
context "with Net::HTTP instrumentation disabled" do
|
42
|
+
before { Appsignal.config.config_hash[:instrument_net_http] = false }
|
43
|
+
after { Appsignal.config.config_hash[:instrument_net_http] = true }
|
44
|
+
|
53
45
|
its(:dependencies_present?) { should be_false }
|
54
46
|
end
|
55
47
|
end
|