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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/circle.yml +4 -0
  4. data/ext/agent.yml +11 -11
  5. data/ext/appsignal_extension.c +105 -40
  6. data/lib/appsignal.rb +18 -6
  7. data/lib/appsignal/cli/install.rb +3 -3
  8. data/lib/appsignal/config.rb +19 -5
  9. data/lib/appsignal/event_formatter.rb +3 -2
  10. data/lib/appsignal/event_formatter/elastic_search/search_formatter.rb +1 -1
  11. data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +1 -1
  12. data/lib/appsignal/event_formatter/moped/query_formatter.rb +13 -6
  13. data/lib/appsignal/hooks/mongo_ruby_driver.rb +0 -1
  14. data/lib/appsignal/hooks/net_http.rb +2 -5
  15. data/lib/appsignal/hooks/redis.rb +1 -1
  16. data/lib/appsignal/hooks/sequel.rb +8 -4
  17. data/lib/appsignal/integrations/mongo_ruby_driver.rb +1 -1
  18. data/lib/appsignal/integrations/object.rb +35 -0
  19. data/lib/appsignal/integrations/resque.rb +5 -0
  20. data/lib/appsignal/integrations/sinatra.rb +2 -2
  21. data/lib/appsignal/minutely.rb +41 -0
  22. data/lib/appsignal/params_sanitizer.rb +4 -105
  23. data/lib/appsignal/rack/sinatra_instrumentation.rb +25 -2
  24. data/lib/appsignal/transaction.rb +41 -15
  25. data/lib/appsignal/transmitter.rb +1 -1
  26. data/lib/appsignal/utils.rb +42 -47
  27. data/lib/appsignal/utils/params_sanitizer.rb +58 -0
  28. data/lib/appsignal/utils/query_params_sanitizer.rb +54 -0
  29. data/lib/appsignal/version.rb +1 -1
  30. data/spec/lib/appsignal/config_spec.rb +12 -2
  31. data/spec/lib/appsignal/extension_spec.rb +4 -0
  32. data/spec/lib/appsignal/hooks/net_http_spec.rb +20 -28
  33. data/spec/lib/appsignal/hooks/redis_spec.rb +9 -11
  34. data/spec/lib/appsignal/integrations/object_spec.rb +211 -0
  35. data/spec/lib/appsignal/integrations/sinatra_spec.rb +2 -2
  36. data/spec/lib/appsignal/minutely_spec.rb +54 -0
  37. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +50 -10
  38. data/spec/lib/appsignal/subscriber_spec.rb +5 -6
  39. data/spec/lib/appsignal/transaction_spec.rb +102 -23
  40. data/spec/lib/appsignal/transmitter_spec.rb +1 -1
  41. data/spec/lib/appsignal/utils/params_sanitizer_spec.rb +122 -0
  42. data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +194 -0
  43. data/spec/lib/appsignal/utils_spec.rb +13 -76
  44. data/spec/lib/appsignal_spec.rb +82 -13
  45. metadata +15 -11
  46. data/lib/appsignal/event_formatter/net_http/request_formatter.rb +0 -13
  47. data/lib/appsignal/event_formatter/sequel/sql_formatter.rb +0 -13
  48. data/spec/lib/appsignal/event_formatter/net_http/request_formatter_spec.rb +0 -26
  49. data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -22
  50. data/spec/lib/appsignal/params_sanitizer_spec.rb +0 -200
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Appsignal::Hooks::RedisHook do
4
4
  before :all do
5
- Appsignal.config = project_fixture_config
5
+ start_agent
6
6
  end
7
7
 
8
8
  context "with redis" do
@@ -19,27 +19,25 @@ describe Appsignal::Hooks::RedisHook do
19
19
  end
20
20
 
21
21
  context "and redis instrumentation enabled" do
22
- let(:events) { [] }
23
22
  before :all do
24
23
  Appsignal.config.config_hash[:instrument_redis] = true
25
24
  Appsignal::Hooks::RedisHook.new.install
26
25
  end
27
- before do
28
- ActiveSupport::Notifications.subscribe(/^[^!]/) do |*args|
29
- events << ActiveSupport::Notifications::Event.new(*args)
30
- end
31
- end
32
26
  after(:all) { Object.send(:remove_const, :Redis) }
33
27
 
34
28
  its(:dependencies_present?) { should be_true }
35
29
 
36
- it "should generate an event for a redis call" do
30
+ it "should instrument a redis call" do
31
+ Appsignal::Transaction.create('uuid', Appsignal::Transaction::HTTP_REQUEST, 'test')
32
+ expect( Appsignal::Transaction.current ).to receive(:start_event)
33
+ .at_least(:once)
34
+ expect( Appsignal::Transaction.current ).to receive(:finish_event)
35
+ .at_least(:once)
36
+ .with('query.redis', nil, nil, 0)
37
+
37
38
  client = Redis::Client.new
38
39
 
39
40
  client.process([]).should == 1
40
-
41
- event = events.last
42
- event.name.should == 'query.redis'
43
41
  end
44
42
  end
45
43
  end
@@ -0,0 +1,211 @@
1
+ require 'spec_helper'
2
+ require 'appsignal/integrations/object'
3
+
4
+ describe Object do
5
+ describe "#instrument_method" do
6
+ context "with instance method" do
7
+ let(:klass) do
8
+ Class.new do
9
+ def foo
10
+ 1
11
+ end
12
+ appsignal_instrument_method :foo
13
+ end
14
+ end
15
+ let(:instance) { klass.new }
16
+
17
+ context "when active" do
18
+ let(:transaction) { regular_transaction }
19
+ before { Appsignal.config = project_fixture_config }
20
+ after { Appsignal.config = nil }
21
+
22
+ context "with anonymous class" do
23
+ it "instruments the method and calls it" do
24
+ expect(Appsignal.active?).to be_true
25
+ transaction.should_receive(:start_event)
26
+ transaction.should_receive(:finish_event).with \
27
+ "foo.AnonymousClass.other", nil, nil, 0
28
+ expect(instance.foo).to eq(1)
29
+ end
30
+ end
31
+
32
+ context "with named class" do
33
+ before do
34
+ class NamedClass
35
+ def foo
36
+ 1
37
+ end
38
+ appsignal_instrument_method :foo
39
+ end
40
+ end
41
+ after { Object.send(:remove_const, :NamedClass) }
42
+ let(:klass) { NamedClass }
43
+
44
+ it "instruments the method and calls it" do
45
+ expect(Appsignal.active?).to be_true
46
+ transaction.should_receive(:start_event)
47
+ transaction.should_receive(:finish_event).with \
48
+ "foo.NamedClass.other", nil, nil, 0
49
+ expect(instance.foo).to eq(1)
50
+ end
51
+ end
52
+
53
+ context "with nested named class" do
54
+ before do
55
+ module MyModule
56
+ module NestedModule
57
+ class NamedClass
58
+ def bar
59
+ 2
60
+ end
61
+ appsignal_instrument_method :bar
62
+ end
63
+ end
64
+ end
65
+ end
66
+ after { Object.send(:remove_const, :MyModule) }
67
+ let(:klass) { MyModule::NestedModule::NamedClass }
68
+
69
+ it "instruments the method and calls it" do
70
+ expect(Appsignal.active?).to be_true
71
+ transaction.should_receive(:start_event)
72
+ transaction.should_receive(:finish_event).with \
73
+ "bar.NamedClass.NestedModule.MyModule.other", nil, nil, 0
74
+ expect(instance.bar).to eq(2)
75
+ end
76
+ end
77
+
78
+ context "with custom name" do
79
+ let(:klass) do
80
+ Class.new do
81
+ def foo
82
+ 1
83
+ end
84
+ appsignal_instrument_method :foo, name: "my_method.group"
85
+ end
86
+ end
87
+
88
+ it "instruments with custom name" do
89
+ expect(Appsignal.active?).to be_true
90
+ transaction.should_receive(:start_event)
91
+ transaction.should_receive(:finish_event).with \
92
+ "my_method.group", nil, nil, 0
93
+ expect(instance.foo).to eq(1)
94
+ end
95
+ end
96
+ end
97
+
98
+ context "when not active" do
99
+ let(:transaction) { Appsignal::Transaction.current }
100
+
101
+ it "should not instrument, but still call the method" do
102
+ expect(Appsignal.active?).to be_false
103
+ expect(transaction).to_not receive(:start_event)
104
+ expect(instance.foo).to eq(1)
105
+ end
106
+ end
107
+ end
108
+
109
+ context "with class method" do
110
+ let(:klass) do
111
+ Class.new do
112
+ def self.bar
113
+ 2
114
+ end
115
+ appsignal_instrument_class_method :bar
116
+ end
117
+ end
118
+
119
+ context "when active" do
120
+ let(:transaction) { regular_transaction }
121
+ before { Appsignal.config = project_fixture_config }
122
+ after { Appsignal.config = nil }
123
+
124
+ context "with anonymous class" do
125
+ it "instruments the method and calls it" do
126
+ expect(Appsignal.active?).to be_true
127
+ transaction.should_receive(:start_event)
128
+ transaction.should_receive(:finish_event).with \
129
+ "bar.class_method.AnonymousClass.other", nil, nil, 0
130
+ expect(klass.bar).to eq(2)
131
+ end
132
+ end
133
+
134
+ context "with named class" do
135
+ before do
136
+ class NamedClass
137
+ def self.bar
138
+ 2
139
+ end
140
+ appsignal_instrument_class_method :bar
141
+ end
142
+ end
143
+ after { Object.send(:remove_const, :NamedClass) }
144
+ let(:klass) { NamedClass }
145
+
146
+ it "instruments the method and calls it" do
147
+ expect(Appsignal.active?).to be_true
148
+ transaction.should_receive(:start_event)
149
+ transaction.should_receive(:finish_event).with \
150
+ "bar.class_method.NamedClass.other", nil, nil, 0
151
+ expect(klass.bar).to eq(2)
152
+ end
153
+
154
+ context "with nested named class" do
155
+ before do
156
+ module MyModule
157
+ module NestedModule
158
+ class NamedClass
159
+ def self.bar
160
+ 2
161
+ end
162
+ appsignal_instrument_class_method :bar
163
+ end
164
+ end
165
+ end
166
+ end
167
+ after { Object.send(:remove_const, :MyModule) }
168
+ let(:klass) { MyModule::NestedModule::NamedClass }
169
+
170
+ it "instruments the method and calls it" do
171
+ expect(Appsignal.active?).to be_true
172
+ transaction.should_receive(:start_event)
173
+ transaction.should_receive(:finish_event).with \
174
+ "bar.class_method.NamedClass.NestedModule.MyModule.other", nil, nil, 0
175
+ expect(klass.bar).to eq(2)
176
+ end
177
+ end
178
+ end
179
+
180
+ context "with custom name" do
181
+ let(:klass) do
182
+ Class.new do
183
+ def self.bar
184
+ 2
185
+ end
186
+ appsignal_instrument_class_method :bar, name: "my_method.group"
187
+ end
188
+ end
189
+
190
+ it "instruments with custom name" do
191
+ expect(Appsignal.active?).to be_true
192
+ transaction.should_receive(:start_event)
193
+ transaction.should_receive(:finish_event).with \
194
+ "my_method.group", nil, nil, 0
195
+ expect(klass.bar).to eq(2)
196
+ end
197
+ end
198
+ end
199
+
200
+ context "when not active" do
201
+ let(:transaction) { Appsignal::Transaction.current }
202
+
203
+ it "should not instrument, but still call the method" do
204
+ expect(Appsignal.active?).to be_false
205
+ expect(transaction).to_not receive(:start_event)
206
+ expect(klass.bar).to eq(2)
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
@@ -12,8 +12,8 @@ if sinatra_present? && !padrino_present?
12
12
  end
13
13
 
14
14
  it "should have added the instrumentation middleware" do
15
- Sinatra::Application.middleware.to_a.should include(
16
- [Appsignal::Rack::SinatraInstrumentation, [], nil]
15
+ Sinatra::Base.middleware.to_a.should include(
16
+ [Appsignal::Rack::SinatraBaseInstrumentation, [], nil]
17
17
  )
18
18
  end
19
19
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Appsignal::Minutely do
4
+ before do
5
+ Appsignal::Minutely.probes.clear
6
+ end
7
+
8
+ it "should have a list of probes" do
9
+ expect( Appsignal::Minutely.probes ).to be_instance_of(Array)
10
+ end
11
+
12
+ describe ".start" do
13
+ it "should call the probes periodically" do
14
+ probe = double
15
+ expect( probe ).to receive(:call).at_least(:twice)
16
+ Appsignal::Minutely.probes << probe
17
+ Appsignal::Minutely.stub(:wait_time => 0.1)
18
+
19
+ Appsignal::Minutely.start
20
+
21
+ sleep 0.5
22
+ end
23
+ end
24
+
25
+ describe ".wait_time" do
26
+ it "should get the time to the next minute" do
27
+ Time.any_instance.stub(:sec => 30)
28
+ expect( Appsignal::Minutely.wait_time ).to eq 30
29
+ end
30
+ end
31
+
32
+ describe ".add_gc_probe" do
33
+ it "should add the gc probe to the list" do
34
+ expect( Appsignal::Minutely.probes ).to be_empty
35
+
36
+ Appsignal::Minutely.add_gc_probe
37
+
38
+ expect( Appsignal::Minutely.probes ).to have(1).item
39
+ expect( Appsignal::Minutely.probes[0] ).to be_instance_of(Appsignal::Minutely::GCProbe)
40
+ end
41
+ end
42
+
43
+ describe Appsignal::Minutely::GCProbe do
44
+ describe "#call" do
45
+ it "should collect GC metrics" do
46
+ expect(Appsignal).to receive(:set_process_gauge).with('gc.count', kind_of(Integer)).once
47
+ expect(Appsignal).to receive(:set_process_gauge).with('gc.heap_allocated_pages', kind_of(Integer)).once
48
+ expect(Appsignal).to receive(:set_process_gauge).at_least(10).times
49
+
50
+ Appsignal::Minutely::GCProbe.new.call
51
+ end
52
+ end
53
+ end
54
+ end
@@ -8,6 +8,35 @@ end
8
8
 
9
9
  if defined?(::Sinatra)
10
10
  describe Appsignal::Rack::SinatraInstrumentation do
11
+ let(:settings) { double(:raise_errors => false) }
12
+ let(:app) { double(:call => true, :settings => settings) }
13
+ let(:env) { {'sinatra.route' => 'GET /', :path => '/', :method => 'GET'} }
14
+ let(:middleware) { Appsignal::Rack::SinatraInstrumentation.new(app) }
15
+
16
+ describe "#call" do
17
+ before do
18
+ start_agent
19
+ middleware.stub(:raw_payload => {})
20
+ Appsignal.stub(:active? => true)
21
+ end
22
+
23
+ it "should call without monitoring" do
24
+ expect(Appsignal::Transaction).to_not receive(:create)
25
+ end
26
+
27
+ after { middleware.call(env) }
28
+ end
29
+
30
+ describe ".settings" do
31
+ subject { middleware.settings }
32
+
33
+ it "should return the app's settings" do
34
+ expect(subject).to eq(app.settings)
35
+ end
36
+ end
37
+ end
38
+
39
+ describe Appsignal::Rack::SinatraBaseInstrumentation do
11
40
  before :all do
12
41
  start_agent
13
42
  end
@@ -16,7 +45,7 @@ if defined?(::Sinatra)
16
45
  let(:app) { double(:call => true, :settings => settings) }
17
46
  let(:env) { {'sinatra.route' => 'GET /', :path => '/', :method => 'GET'} }
18
47
  let(:options) { {} }
19
- let(:middleware) { Appsignal::Rack::SinatraInstrumentation.new(app, options) }
48
+ let(:middleware) { Appsignal::Rack::SinatraBaseInstrumentation.new(app, options) }
20
49
 
21
50
  describe "#call" do
22
51
  before do
@@ -99,8 +128,26 @@ if defined?(::Sinatra)
99
128
  end
100
129
  end
101
130
 
102
- it "should set the action" do
103
- Appsignal::Transaction.any_instance.should_receive(:set_action).with('GET /')
131
+ describe "action name" do
132
+ it "should set the action" do
133
+ Appsignal::Transaction.any_instance.should_receive(:set_action).with('GET /')
134
+ end
135
+
136
+ context "with option to set path a mounted_at prefix" do
137
+ let(:options) {{ :mounted_at => "/api/v2" }}
138
+
139
+ it "should call set_action with a prefix path" do
140
+ Appsignal::Transaction.any_instance.should_receive(:set_action).with("GET /api/v2/")
141
+ end
142
+ end
143
+
144
+ context "with mounted modular application" do
145
+ before { env['SCRIPT_NAME'] = '/api' }
146
+
147
+ it "should call set_action with an application prefix path" do
148
+ Appsignal::Transaction.any_instance.should_receive(:set_action).with("GET /api/")
149
+ end
150
+ end
104
151
  end
105
152
 
106
153
  it "should set metadata" do
@@ -123,13 +170,6 @@ if defined?(::Sinatra)
123
170
  end
124
171
  end
125
172
 
126
- context "with option to set path prefix" do
127
- let(:options) {{ :mounted_at => "/api/v2" }}
128
- it "should call set_action with a prefix path" do
129
- Appsignal::Transaction.any_instance.should_receive(:set_action).with("GET /api/v2/")
130
- end
131
- end
132
-
133
173
  after { middleware.call(env) rescue VerySpecificError }
134
174
  end
135
175
  end
@@ -116,17 +116,16 @@ describe Appsignal::Subscriber do
116
116
  it "should call finish with title and body if there is a formatter" do
117
117
  transaction.should_receive(:start_event).once
118
118
  transaction.should_receive(:finish_event).with(
119
- 'request.net_http',
119
+ 'request.faraday',
120
+ 'GET http://www.google.com',
120
121
  'GET http://www.google.com',
121
- nil,
122
122
  nil
123
123
  ).once
124
124
 
125
125
  ActiveSupport::Notifications.instrument(
126
- 'request.net_http',
127
- :protocol => 'http',
128
- :domain => 'www.google.com',
129
- :method => 'GET'
126
+ 'request.faraday',
127
+ :method => 'get',
128
+ :url => URI('http://www.google.com')
130
129
  )
131
130
  end
132
131
 
@@ -24,7 +24,6 @@ describe Appsignal::Transaction do
24
24
 
25
25
  context "class methods" do
26
26
  describe ".create" do
27
-
28
27
  it "should add the transaction to thread local" do
29
28
  Appsignal::Extension.should_receive(:start_transaction).with('1', 'http_request')
30
29
 
@@ -447,7 +446,7 @@ describe Appsignal::Transaction do
447
446
  end
448
447
  end
449
448
 
450
- describe "finish_event" do
449
+ describe "#finish_event" do
451
450
  it "should finish the event in the extension" do
452
451
  transaction.ext.should_receive(:finish_event).with(
453
452
  'name',
@@ -481,6 +480,63 @@ describe Appsignal::Transaction do
481
480
  end
482
481
  end
483
482
 
483
+ describe "#record_event" do
484
+ it "should record the event in the extension" do
485
+ transaction.ext.should_receive(:record_event).with(
486
+ 'name',
487
+ 'title',
488
+ 'body',
489
+ 1000,
490
+ 1
491
+ )
492
+
493
+ transaction.record_event(
494
+ 'name',
495
+ 'title',
496
+ 'body',
497
+ 1000,
498
+ 1
499
+ )
500
+ end
501
+
502
+ it "should finish the event in the extension with nil arguments" do
503
+ transaction.ext.should_receive(:record_event).with(
504
+ 'name',
505
+ '',
506
+ '',
507
+ 1000,
508
+ 0
509
+ )
510
+
511
+ transaction.record_event(
512
+ 'name',
513
+ nil,
514
+ nil,
515
+ 1000,
516
+ nil
517
+ )
518
+ end
519
+ end
520
+
521
+ describe "#instrument" do
522
+ it "should start and finish an event around the given block" do
523
+ stub = double
524
+ stub.should_receive(:method_call).and_return('return value')
525
+
526
+ transaction.should_receive(:start_event)
527
+ transaction.should_receive(:finish_event).with(
528
+ 'name',
529
+ 'title',
530
+ 'body',
531
+ 0
532
+ )
533
+
534
+ transaction.instrument 'name', 'title', 'body' do
535
+ stub.method_call
536
+ end.should eq 'return value'
537
+ end
538
+ end
539
+
484
540
  context "generic request" do
485
541
  let(:env) { {} }
486
542
  subject { Appsignal::Transaction::GenericRequest.new(env) }
@@ -595,38 +651,61 @@ describe Appsignal::Transaction do
595
651
  it { should be_nil }
596
652
  end
597
653
 
598
- context "when not sending params" do
599
- before { Appsignal.config.config_hash[:send_params] = false }
600
- after { Appsignal.config.config_hash[:send_params] = true }
654
+ context "when params method does not exist" do
655
+ let(:options) { {:params_method => :nonsense} }
601
656
 
602
657
  it { should be_nil }
603
658
  end
604
659
 
605
- context "when params method does not exist" do
606
- let(:options) { {:params_method => :nonsense} }
660
+ context "when not sending params" do
661
+ before { Appsignal.config.config_hash[:send_params] = false }
662
+ after { Appsignal.config.config_hash[:send_params] = true }
607
663
 
608
664
  it { should be_nil }
609
665
  end
610
666
 
611
667
  context "with an array" do
612
- let(:request) { Appsignal::Transaction::GenericRequest.new(background_env_with_data(:params => ['arg1', 'arg2'])) }
668
+ let(:request) do
669
+ Appsignal::Transaction::GenericRequest.new(background_env_with_data(:params => ['arg1', 'arg2']))
670
+ end
613
671
 
614
672
  it { should == ['arg1', 'arg2'] }
673
+
674
+ context "with AppSignal filtering" do
675
+ before { Appsignal.config.config_hash[:filter_parameters] = %w(foo) }
676
+ after { Appsignal.config.config_hash[:filter_parameters] = [] }
677
+
678
+ it { should == ['arg1', 'arg2'] }
679
+ end
615
680
  end
616
681
 
617
682
  context "with env" do
618
- it "should call the params sanitizer" do
619
- Appsignal::ParamsSanitizer.should_receive(:sanitize).with(kind_of(Hash)).and_return({
620
- 'controller' => 'blog_posts',
621
- 'action' => 'show',
622
- 'id' => '1'
623
- })
624
-
625
- subject.should == {
626
- 'controller' => 'blog_posts',
627
- 'action' => 'show',
628
- 'id' => '1'
629
- }
683
+ context "with sanitization" do
684
+ let(:request) do
685
+ Appsignal::Transaction::GenericRequest.new \
686
+ http_request_env_with_data(:params => { :foo => :bar })
687
+ end
688
+
689
+ it "should call the params sanitizer" do
690
+ puts Appsignal.config.config_hash[:filter_parameters].inspect
691
+ subject.should == { :foo => :bar }
692
+ end
693
+ end
694
+
695
+ context "with AppSignal filtering" do
696
+ let(:request) do
697
+ Appsignal::Transaction::GenericRequest.new \
698
+ http_request_env_with_data(:params => { :foo => :bar, :baz => :bat })
699
+ end
700
+ before { Appsignal.config.config_hash[:filter_parameters] = %w(foo) }
701
+ after { Appsignal.config.config_hash[:filter_parameters] = [] }
702
+
703
+ it "should call the params sanitizer with filtering" do
704
+ subject.should == {
705
+ :foo => '[FILTERED]',
706
+ :baz => :bat
707
+ }
708
+ end
630
709
  end
631
710
  end
632
711
  end
@@ -684,7 +763,7 @@ describe Appsignal::Transaction do
684
763
  end
685
764
 
686
765
  it "passes the session data into the params sanitizer" do
687
- Appsignal::ParamsSanitizer.should_receive(:sanitize).with({:foo => :bar}).
766
+ Appsignal::Utils::ParamsSanitizer.should_receive(:sanitize).with({:foo => :bar}).
688
767
  and_return(:sanitized_foo)
689
768
  subject.should == :sanitized_foo
690
769
  end
@@ -698,7 +777,7 @@ describe Appsignal::Transaction do
698
777
  end
699
778
 
700
779
  it "should return an session hash" do
701
- Appsignal::ParamsSanitizer.should_receive(:sanitize).with({'foo' => :bar}).
780
+ Appsignal::Utils::ParamsSanitizer.should_receive(:sanitize).with({'foo' => :bar}).
702
781
  and_return(:sanitized_foo)
703
782
  subject
704
783
  end
@@ -719,7 +798,7 @@ describe Appsignal::Transaction do
719
798
  end
720
799
 
721
800
  it "does not pass the session data into the params sanitizer" do
722
- Appsignal::ParamsSanitizer.should_not_receive(:sanitize)
801
+ Appsignal::Utils::ParamsSanitizer.should_not_receive(:sanitize)
723
802
  subject.should be_nil
724
803
  end
725
804
  end