appsignal 1.1.0.beta.6 → 1.1.0.beta.7

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/ext/agent.yml +7 -7
  4. data/ext/appsignal_extension.c +7 -5
  5. data/ext/extconf.rb +9 -2
  6. data/lib/appsignal/config.rb +5 -2
  7. data/lib/appsignal/event_formatter.rb +2 -0
  8. data/lib/appsignal/event_formatter/active_record/sql_formatter.rb +1 -47
  9. data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +88 -0
  10. data/lib/appsignal/event_formatter/moped/query_formatter.rb +6 -7
  11. data/lib/appsignal/event_formatter/sequel/sql_formatter.rb +13 -0
  12. data/lib/appsignal/hooks/sequel.rb +4 -7
  13. data/lib/appsignal/integrations/capistrano/appsignal.cap +1 -1
  14. data/lib/appsignal/integrations/mongo_ruby_driver.rb +9 -5
  15. data/lib/appsignal/js_exception_transaction.rb +2 -2
  16. data/lib/appsignal/subscriber.rb +3 -2
  17. data/lib/appsignal/transaction.rb +8 -2
  18. data/lib/appsignal/transmitter.rb +1 -1
  19. data/lib/appsignal/utils.rb +38 -4
  20. data/lib/appsignal/version.rb +1 -1
  21. data/spec/lib/appsignal/capistrano3_spec.rb +21 -1
  22. data/spec/lib/appsignal/config_spec.rb +12 -0
  23. data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +1 -1
  24. data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +14 -186
  25. data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +115 -0
  26. data/spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb +4 -4
  27. data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +22 -0
  28. data/spec/lib/appsignal/extension_spec.rb +1 -1
  29. data/spec/lib/appsignal/hooks/sequel_spec.rb +1 -1
  30. data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +8 -5
  31. data/spec/lib/appsignal/subscriber_spec.rb +23 -5
  32. data/spec/lib/appsignal/transaction_spec.rb +21 -0
  33. data/spec/lib/appsignal/utils_spec.rb +48 -0
  34. data/spec/support/helpers/env_helpers.rb +1 -0
  35. metadata +8 -2
@@ -22,12 +22,12 @@ describe Appsignal::EventFormatter::Moped::QueryFormatter do
22
22
  let(:op) do
23
23
  double(
24
24
  :full_collection_name => 'database.collection',
25
- :selector => {'_id' => 'abc'},
25
+ :selector => {'query' => {'_id' => 'abc'}},
26
26
  :class => double(:to_s => 'Moped::Protocol::Command')
27
27
  )
28
28
  end
29
29
 
30
- it { should == ['Command', '{:database=>"database.collection", :selector=>{"_id"=>"?"}}'] }
30
+ it { should == ['Command', '{:database=>"database.collection", :selector=>{"query"=>"?"}}'] }
31
31
  end
32
32
 
33
33
  context "Moped::Protocol::Query" do
@@ -80,13 +80,13 @@ describe Appsignal::EventFormatter::Moped::QueryFormatter do
80
80
  double(
81
81
  :full_collection_name => 'database.collection',
82
82
  :selector => {'_id' => 'abc'},
83
- :update => {'name' => 'James Bond'},
83
+ :update => {'user.name' => 'James Bond'},
84
84
  :flags => [],
85
85
  :class => double(:to_s => 'Moped::Protocol::Update')
86
86
  )
87
87
  end
88
88
 
89
- it { should == ['Update', '{:database=>"database.collection", :selector=>{"_id"=>"?"}, :update=>{"name"=>"?"}, :flags=>[]}'] }
89
+ it { should == ['Update', '{:database=>"database.collection", :selector=>{"_id"=>"?"}, :update=>{"user.?"=>"?"}, :flags=>[]}'] }
90
90
  end
91
91
 
92
92
  context "Moped::Protocol::KillCursors" do
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Appsignal::EventFormatter::Sequel::SqlFormatter do
4
+ let(:klass) { Appsignal::EventFormatter::Sequel::SqlFormatter }
5
+ let(:formatter) { klass.new }
6
+
7
+ it "should register sql.sequel" do
8
+ Appsignal::EventFormatter.registered?('sql.sequel', klass).should be_true
9
+ end
10
+
11
+ describe "#format" do
12
+ let(:payload) do
13
+ {
14
+ sql: 'SELECT * FROM users'
15
+ }
16
+ end
17
+
18
+ subject { formatter.format(payload) }
19
+
20
+ it { should == [nil, 'SELECT * FROM users', 1] }
21
+ end
22
+ end
@@ -46,7 +46,7 @@ describe "extension loading and operation" do
46
46
  end
47
47
 
48
48
  it "should have a finish_event method" do
49
- subject.finish_event(1, 'name', 'title', 'body')
49
+ subject.finish_event(1, 'name', 'title', 'body', 0)
50
50
  end
51
51
 
52
52
  it "should have a set_transaction_error method" do
@@ -15,7 +15,7 @@ describe "Sequel integration", if: sequel_present? do
15
15
  .at_least(:once)
16
16
  expect( Appsignal::Extension ).to receive(:finish_event)
17
17
  .at_least(:once)
18
- .with(kind_of(Integer), "sql.sequel", "", "")
18
+ .with(kind_of(Integer), "sql.sequel", "", kind_of(String), 1)
19
19
 
20
20
  db['SELECT 1'].all
21
21
  end
@@ -11,13 +11,15 @@ describe Appsignal::Hooks::MongoMonitorSubscriber do
11
11
  describe "#started" do
12
12
  let(:event) do
13
13
  double(
14
- :request_id => 1,
15
- :command => {'foo' => 'bar'}
14
+ :request_id => 1,
15
+ :command_name => 'find',
16
+ :command => {'foo' => 'bar'}
16
17
  )
17
18
  end
18
19
 
19
20
  it "should sanitize command" do
20
- Appsignal::Utils.should receive(:sanitize).with({'foo' => 'bar'} )
21
+ Appsignal::EventFormatter::MongoRubyDriver::QueryFormatter
22
+ .should receive(:format).with('find', {'foo' => 'bar'})
21
23
 
22
24
  subscriber.started(event)
23
25
  end
@@ -81,8 +83,9 @@ describe Appsignal::Hooks::MongoMonitorSubscriber do
81
83
  Appsignal::Extension.should receive(:finish_event).with(
82
84
  transaction.transaction_index,
83
85
  'query.mongodb',
84
- 'find',
85
- "test | SUCCEEDED | {\"foo\"=>\"?\"}"
86
+ 'find | test | SUCCEEDED',
87
+ "{\"foo\":\"?\"}",
88
+ 0
86
89
  )
87
90
 
88
91
  subscriber.finish('SUCCEEDED', event)
@@ -98,10 +98,10 @@ describe Appsignal::Subscriber do
98
98
 
99
99
  it "should call native start and finish event for every event" do
100
100
  Appsignal::Extension.should_receive(:start_event).exactly(4).times
101
- Appsignal::Extension.should_receive(:finish_event).with(kind_of(Integer), 'one', '', '').once
102
- Appsignal::Extension.should_receive(:finish_event).with(kind_of(Integer), 'two', '', '').once
103
- Appsignal::Extension.should_receive(:finish_event).with(kind_of(Integer), 'two.three', '', '').once
104
- Appsignal::Extension.should_receive(:finish_event).with(kind_of(Integer), 'one.three', '', '').once
101
+ Appsignal::Extension.should_receive(:finish_event).with(kind_of(Integer), 'one', '', '', 0).once
102
+ Appsignal::Extension.should_receive(:finish_event).with(kind_of(Integer), 'two', '', '', 0).once
103
+ Appsignal::Extension.should_receive(:finish_event).with(kind_of(Integer), 'two.three', '', '', 0).once
104
+ Appsignal::Extension.should_receive(:finish_event).with(kind_of(Integer), 'one.three', '', '', 0).once
105
105
 
106
106
  ActiveSupport::Notifications.instrument('one') do
107
107
  ActiveSupport::Notifications.instrument('two') do
@@ -119,7 +119,8 @@ describe Appsignal::Subscriber do
119
119
  kind_of(Integer),
120
120
  'request.net_http',
121
121
  'GET http://www.google.com',
122
- ''
122
+ '',
123
+ 0
123
124
  ).once
124
125
 
125
126
  ActiveSupport::Notifications.instrument(
@@ -130,6 +131,23 @@ describe Appsignal::Subscriber do
130
131
  )
131
132
  end
132
133
 
134
+ it "should call finish with title, body and body format if there is a formatter that returns it" do
135
+ Appsignal::Extension.should_receive(:start_event).once
136
+ Appsignal::Extension.should_receive(:finish_event).with(
137
+ kind_of(Integer),
138
+ 'sql.active_record',
139
+ 'Something load',
140
+ 'SELECT * FROM something',
141
+ 1
142
+ ).once
143
+
144
+ ActiveSupport::Notifications.instrument(
145
+ 'sql.active_record',
146
+ :name => 'Something load',
147
+ :sql => 'SELECT * FROM something'
148
+ )
149
+ end
150
+
133
151
  context "when paused" do
134
152
  before { transaction.pause! }
135
153
 
@@ -331,6 +331,11 @@ describe Appsignal::Transaction do
331
331
  'params',
332
332
  '{"controller":"blog_posts","action":"show","id":"1"}'
333
333
  ).once
334
+ Appsignal::Extension.should_receive(:set_transaction_sample_data).with(
335
+ kind_of(Integer),
336
+ 'metadata',
337
+ '{"key":"value"}'
338
+ ).once
334
339
  Appsignal::Extension.should_receive(:set_transaction_sample_data).with(
335
340
  kind_of(Integer),
336
341
  'tags',
@@ -616,6 +621,22 @@ describe Appsignal::Transaction do
616
621
  end
617
622
  end
618
623
 
624
+ describe "#metadata" do
625
+ subject { transaction.send(:metadata) }
626
+
627
+ context "when env is nil" do
628
+ before { transaction.request.stub(:env => nil) }
629
+
630
+ it { should be_nil }
631
+ end
632
+
633
+ context "when env is present" do
634
+ let(:env) { {:metadata => {:key => 'value'}} }
635
+
636
+ it { should == env[:metadata] }
637
+ end
638
+ end
639
+
619
640
  describe '#sanitized_tags' do
620
641
  before do
621
642
  transaction.set_tags(
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Appsignal::Utils do
@@ -33,4 +35,50 @@ describe Appsignal::Utils do
33
35
  end
34
36
  end
35
37
  end
38
+
39
+ describe ".sanitize_key" do
40
+ it "should not sanitize key when no key_sanitizer is given" do
41
+ expect( Appsignal::Utils.sanitize_key('foo', nil) ).to eql('foo')
42
+ end
43
+
44
+ context "with mongodb sanitizer" do
45
+ it "should not sanitize key when no dots are in the key" do
46
+ expect( Appsignal::Utils.sanitize_key('foo', :mongodb) ).to eql('foo')
47
+ end
48
+
49
+ it "should sanitize key when dots are in the key" do
50
+ expect( Appsignal::Utils.sanitize_key('foo.bar', :mongodb) ).to eql('foo.?')
51
+ end
52
+
53
+ it "should sanitize a symbol" do
54
+ expect( Appsignal::Utils.sanitize_key(:ismaster, :mongodb) ).to eql('ismaster')
55
+ end
56
+ end
57
+ end
58
+
59
+ describe ".json_generate" do
60
+ subject { Appsignal::Utils.json_generate(body) }
61
+
62
+ context "with a valid body" do
63
+ let(:body) { {'the' => 'payload'} }
64
+
65
+ it { should == "{\"the\":\"payload\"}" }
66
+ end
67
+
68
+ context "with a body that contains strings with invalid utf-8 content" do
69
+ let(:string_with_invalid_utf8) { [0x61, 0x61, 0x85].pack('c*') }
70
+ let(:body) { {
71
+ 'field_one' => [0x61, 0x61].pack('c*'),
72
+ 'field_two' => string_with_invalid_utf8,
73
+ 'field_three' => [
74
+ 'one', string_with_invalid_utf8
75
+ ],
76
+ 'field_four' => {
77
+ 'one' => string_with_invalid_utf8
78
+ }
79
+ } }
80
+
81
+ it { should == "{\"field_one\":\"aa\",\"field_two\":\"aa�\",\"field_three\":[\"one\",\"aa�\"],\"field_four\":{\"one\":\"aa�\"}}" }
82
+ end
83
+ end
36
84
  end
@@ -15,6 +15,7 @@ module EnvHelpers
15
15
  :status => '200',
16
16
  :view_runtime => 500,
17
17
  :db_runtime => 500,
18
+ :metadata => {:key => 'value'}
18
19
  ).merge(args)
19
20
  end
20
21
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appsignal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.beta.6
4
+ version: 1.1.0.beta.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Beekman
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-02-15 00:00:00.000000000 Z
12
+ date: 2016-03-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -156,8 +156,10 @@ files:
156
156
  - lib/appsignal/event_formatter/active_record/instantiation_formatter.rb
157
157
  - lib/appsignal/event_formatter/active_record/sql_formatter.rb
158
158
  - lib/appsignal/event_formatter/elastic_search/search_formatter.rb
159
+ - lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb
159
160
  - lib/appsignal/event_formatter/moped/query_formatter.rb
160
161
  - lib/appsignal/event_formatter/net_http/request_formatter.rb
162
+ - lib/appsignal/event_formatter/sequel/sql_formatter.rb
161
163
  - lib/appsignal/extension.rb
162
164
  - lib/appsignal/hooks.rb
163
165
  - lib/appsignal/hooks/celluloid.rb
@@ -214,8 +216,10 @@ files:
214
216
  - spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb
215
217
  - spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb
216
218
  - spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb
219
+ - spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb
217
220
  - spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb
218
221
  - spec/lib/appsignal/event_formatter/net_http/request_formatter_spec.rb
222
+ - spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb
219
223
  - spec/lib/appsignal/event_formatter_spec.rb
220
224
  - spec/lib/appsignal/extension_spec.rb
221
225
  - spec/lib/appsignal/hooks/celluloid_spec.rb
@@ -300,8 +304,10 @@ test_files:
300
304
  - spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb
301
305
  - spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb
302
306
  - spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb
307
+ - spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb
303
308
  - spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb
304
309
  - spec/lib/appsignal/event_formatter/net_http/request_formatter_spec.rb
310
+ - spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb
305
311
  - spec/lib/appsignal/event_formatter_spec.rb
306
312
  - spec/lib/appsignal/extension_spec.rb
307
313
  - spec/lib/appsignal/hooks/celluloid_spec.rb