appsignal 0.11.9 → 0.11.10.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6a30600b4b012173c320662d41ae079891c0cfc2
4
+ data.tar.gz: bd7eb17b8bea68b32f91b6a7d7eb0b6e23fa6208
5
+ SHA512:
6
+ metadata.gz: 6b84d295eecb0fa909d4831c4009564592deebc7f9cd25cbbd41526e288ff1502bc880d69a8aff38fa175e5bb8ae937b255d558e5a69a7f6446b50b2ca5b93d9
7
+ data.tar.gz: 3643403fb62be693d355a31d93fdc574a83a6d84154aaefc9cb0a8ca878f7defb0b8e191ea9f59f6074df3fc59ffb9749e969eceeb988c0c68a1142ca038f250
@@ -1,3 +1,7 @@
1
+ # 0.11.10
2
+ * Fix for binding bug in exceptions in Resque
3
+ * Handle invalidly encoded characters in payload
4
+
1
5
  # 0.11.9
2
6
  * Fix for infinite attempts to transmit if there is no valid api key
3
7
 
@@ -38,7 +38,7 @@ module Appsignal
38
38
  @request_id = request_id
39
39
  @events = []
40
40
  @process_action_event = nil
41
- @exception = nil
41
+ @exception = {}
42
42
  @env = env
43
43
  @tags = {}
44
44
  @paused = false
@@ -92,13 +92,27 @@ module Appsignal
92
92
  @events << event unless @paused == true
93
93
  end
94
94
 
95
- def add_exception(ex)
95
+ def add_exception(ex=nil)
96
+ return unless ex
96
97
  @time = Time.now.utc.to_f
97
- @exception = ex
98
+ @exception = {
99
+ :exception => ex.class.name,
100
+ :message => ex.message,
101
+ :backtrace => clean_backtrace(ex)
102
+ }
98
103
  end
99
104
 
100
105
  def exception?
101
- !! exception
106
+ exception.any?
107
+ end
108
+
109
+ def clean_backtrace(exception)
110
+ return [] unless exception.backtrace.is_a?(Array)
111
+ if defined?(::Rails)
112
+ ::Rails.backtrace_cleaner.clean(exception.backtrace, nil)
113
+ else
114
+ exception.backtrace
115
+ end
102
116
  end
103
117
 
104
118
  def slow_request?
@@ -60,20 +60,7 @@ module Appsignal
60
60
  end
61
61
 
62
62
  def add_exception_to_hash!
63
- hash[:exception] = {
64
- :exception => exception.class.name,
65
- :message => exception.message,
66
- :backtrace => clean_backtrace(exception)
67
- }
68
- end
69
-
70
- def clean_backtrace(exception)
71
- return [] unless exception.backtrace.is_a?(Array)
72
- if defined?(::Rails)
73
- ::Rails.backtrace_cleaner.clean(exception.backtrace, nil)
74
- else
75
- exception.backtrace
76
- end
63
+ hash[:exception] = exception
77
64
  end
78
65
 
79
66
  def add_events_to_hash!
@@ -1,3 +1,3 @@
1
1
  module Appsignal
2
- VERSION = '0.11.9'
2
+ VERSION = '0.11.10.beta.1'
3
3
  end
@@ -4,10 +4,34 @@ module Appsignal
4
4
 
5
5
  def initialize(given_body)
6
6
  @body = Zlib::Deflate.deflate(
7
- JSON.generate(given_body, :quirks_mode => true),
7
+ Appsignal::ZippedPayload.json_generate(given_body),
8
8
  Zlib::BEST_SPEED
9
9
  )
10
10
  end
11
11
 
12
+ protected
13
+
14
+ def self.json_generate(given_body)
15
+ JSON.generate(jsonify(given_body))
16
+ end
17
+
18
+ def self.jsonify(value)
19
+ case value
20
+ when String
21
+ begin
22
+ value.encode('utf-8')
23
+ rescue Encoding::UndefinedConversionError
24
+ '[invalid-utf8]'
25
+ end
26
+ when Numeric, NilClass, TrueClass, FalseClass
27
+ value
28
+ when Hash
29
+ Hash[value.map { |k, v| [jsonify(k), jsonify(v)] }]
30
+ when Array
31
+ value.map { |v| jsonify(v) }
32
+ else
33
+ jsonify value.to_s
34
+ end
35
+ end
12
36
  end
13
37
  end
@@ -83,21 +83,12 @@ describe Appsignal::Transaction::Formatter do
83
83
  context "exception content" do
84
84
  subject { formatter.to_hash[:exception] }
85
85
 
86
+ it "should set the exception" do
87
+ subject.should eql(transaction_with_exception.exception)
88
+ end
86
89
  its(:keys) { should =~ [:exception, :message, :backtrace] }
87
90
  its([:exception]) { should == 'ArgumentError' }
88
91
  its([:message]) { should == 'oh no' }
89
-
90
- if rails_present?
91
- its([:backtrace]) { should == [
92
- 'app/controllers/somethings_controller.rb:10',
93
- '/user/local/ruby/path.rb:8'
94
- ] }
95
- else
96
- its([:backtrace]) { should == [
97
- File.join(project_fixture_path, 'app/controllers/somethings_controller.rb:10'),
98
- '/user/local/ruby/path.rb:8'
99
- ] }
100
- end
101
92
  end
102
93
  end
103
94
 
@@ -190,13 +190,56 @@ describe Appsignal::Transaction do
190
190
  end
191
191
 
192
192
  context "using exceptions" do
193
- let(:exception) { double(:exception, :name => 'test') }
193
+ let(:exception) do
194
+ double(
195
+ :exception,
196
+ :class => double(:name => 'test'),
197
+ :message => 'Broken',
198
+ :backtrace => [
199
+ File.join(project_fixture_path, 'app/controllers/somethings_controller.rb:10').to_s,
200
+ '/user/local/ruby/path.rb:8'
201
+ ]
202
+ )
203
+ end
194
204
 
195
205
  describe '#add_exception' do
196
- it 'should add an exception' do
206
+ it 'should add an exception', :if => rails_present? do
207
+ if Gem::Version.new(Rails.version) >= Gem::Version.new('4.2.1')
208
+ expect {
209
+ transaction.add_exception(exception)
210
+ }.to change(transaction, :exception).to({
211
+ :exception => 'test',
212
+ :message => 'Broken',
213
+ :backtrace => [
214
+ 'spec/support/project_fixture/app/controllers/somethings_controller.rb:10',
215
+ '/user/local/ruby/path.rb:8'
216
+ ]
217
+ })
218
+ else
219
+ expect {
220
+ transaction.add_exception(exception)
221
+ }.to change(transaction, :exception).to({
222
+ :exception => 'test',
223
+ :message => 'Broken',
224
+ :backtrace => [
225
+ 'app/controllers/somethings_controller.rb:10',
226
+ '/user/local/ruby/path.rb:8'
227
+ ]
228
+ })
229
+ end
230
+ end
231
+
232
+ it 'should add an exception', :if => !rails_present? do
197
233
  expect {
198
234
  transaction.add_exception(exception)
199
- }.to change(transaction, :exception).to(exception)
235
+ }.to change(transaction, :exception).to({
236
+ :exception => 'test',
237
+ :message => 'Broken',
238
+ :backtrace => [
239
+ File.join(project_fixture_path, 'app/controllers/somethings_controller.rb:10'),
240
+ '/user/local/ruby/path.rb:8'
241
+ ]
242
+ })
200
243
  end
201
244
  end
202
245
 
@@ -397,6 +440,17 @@ describe Appsignal::Transaction do
397
440
 
398
441
  describe '#complete!' do
399
442
  let(:event) { double(:event) }
443
+ let(:exception) do
444
+ double(
445
+ :exception,
446
+ :class => double(:name => 'test'),
447
+ :message => 'Broken',
448
+ :backtrace => [
449
+ 'app/controllers/somethings_controller.rb:10',
450
+ '/user/local/ruby/path.rb:8'
451
+ ]
452
+ )
453
+ end
400
454
  before do
401
455
  Appsignal::IPC.stub(:current => nil)
402
456
  transaction.set_process_action_event(notification_event)
@@ -427,7 +481,7 @@ describe Appsignal::Transaction do
427
481
  end
428
482
 
429
483
  context 'with exception' do
430
- before { transaction.add_exception(event) }
484
+ before { transaction.add_exception(exception) }
431
485
 
432
486
  it 'should add transaction to the agent' do
433
487
  Appsignal.should_receive(:enqueue).with(transaction)
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Appsignal::ZippedPayload do
4
-
5
4
  describe "#initialize" do
6
5
  it "should initialize a new `Appsignal::ZippedPayload` and zip the body" do
7
6
  payload = Appsignal::ZippedPayload.new({'the' => 'payload'})
@@ -13,4 +12,29 @@ describe Appsignal::ZippedPayload do
13
12
  end
14
13
  end
15
14
 
15
+ describe ".json_generate" do
16
+ subject { Appsignal::ZippedPayload.send(:json_generate, body) }
17
+
18
+ context "with a valid body" do
19
+ let(:body) { {'the' => 'payload'} }
20
+
21
+ it { should == "{\"the\":\"payload\"}" }
22
+ end
23
+
24
+ context "with a body that contains strings with invalid utf-8 content" do
25
+ let(:string_with_invalid_utf8) { [0x61, 0x61, 0x85].pack('c*') }
26
+ let(:body) { {
27
+ 'field_one' => [0x61, 0x61].pack('c*'),
28
+ 'field_two' => string_with_invalid_utf8,
29
+ 'field_three' => [
30
+ 'one', string_with_invalid_utf8
31
+ ],
32
+ 'field_four' => {
33
+ 'one' => string_with_invalid_utf8
34
+ }
35
+ } }
36
+
37
+ it { should == "{\"field_one\":\"aa\",\"field_two\":\"[invalid-utf8]\",\"field_three\":[\"one\",\"[invalid-utf8]\"],\"field_four\":{\"one\":\"[invalid-utf8]\"}}" }
38
+ end
39
+ end
16
40
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appsignal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.9
5
- prerelease:
4
+ version: 0.11.10.beta.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Robert Beekman
@@ -13,118 +12,104 @@ authors:
13
12
  autorequire:
14
13
  bindir: bin
15
14
  cert_chain: []
16
- date: 2015-04-20 00:00:00.000000000 Z
15
+ date: 2015-05-18 00:00:00.000000000 Z
17
16
  dependencies:
18
17
  - !ruby/object:Gem::Dependency
19
18
  name: rack
20
19
  requirement: !ruby/object:Gem::Requirement
21
- none: false
22
20
  requirements:
23
- - - ! '>='
21
+ - - ">="
24
22
  - !ruby/object:Gem::Version
25
23
  version: '0'
26
24
  type: :runtime
27
25
  prerelease: false
28
26
  version_requirements: !ruby/object:Gem::Requirement
29
- none: false
30
27
  requirements:
31
- - - ! '>='
28
+ - - ">="
32
29
  - !ruby/object:Gem::Version
33
30
  version: '0'
34
31
  - !ruby/object:Gem::Dependency
35
32
  name: thread_safe
36
33
  requirement: !ruby/object:Gem::Requirement
37
- none: false
38
34
  requirements:
39
- - - ! '>='
35
+ - - ">="
40
36
  - !ruby/object:Gem::Version
41
37
  version: '0'
42
38
  type: :runtime
43
39
  prerelease: false
44
40
  version_requirements: !ruby/object:Gem::Requirement
45
- none: false
46
41
  requirements:
47
- - - ! '>='
42
+ - - ">="
48
43
  - !ruby/object:Gem::Version
49
44
  version: '0'
50
45
  - !ruby/object:Gem::Dependency
51
46
  name: rake
52
47
  requirement: !ruby/object:Gem::Requirement
53
- none: false
54
48
  requirements:
55
- - - ! '>='
49
+ - - ">="
56
50
  - !ruby/object:Gem::Version
57
51
  version: '0'
58
52
  type: :development
59
53
  prerelease: false
60
54
  version_requirements: !ruby/object:Gem::Requirement
61
- none: false
62
55
  requirements:
63
- - - ! '>='
56
+ - - ">="
64
57
  - !ruby/object:Gem::Version
65
58
  version: '0'
66
59
  - !ruby/object:Gem::Dependency
67
60
  name: rspec
68
61
  requirement: !ruby/object:Gem::Requirement
69
- none: false
70
62
  requirements:
71
- - - ~>
63
+ - - "~>"
72
64
  - !ruby/object:Gem::Version
73
65
  version: 2.14.1
74
66
  type: :development
75
67
  prerelease: false
76
68
  version_requirements: !ruby/object:Gem::Requirement
77
- none: false
78
69
  requirements:
79
- - - ~>
70
+ - - "~>"
80
71
  - !ruby/object:Gem::Version
81
72
  version: 2.14.1
82
73
  - !ruby/object:Gem::Dependency
83
74
  name: pry
84
75
  requirement: !ruby/object:Gem::Requirement
85
- none: false
86
76
  requirements:
87
- - - ! '>='
77
+ - - ">="
88
78
  - !ruby/object:Gem::Version
89
79
  version: '0'
90
80
  type: :development
91
81
  prerelease: false
92
82
  version_requirements: !ruby/object:Gem::Requirement
93
- none: false
94
83
  requirements:
95
- - - ! '>='
84
+ - - ">="
96
85
  - !ruby/object:Gem::Version
97
86
  version: '0'
98
87
  - !ruby/object:Gem::Dependency
99
88
  name: timecop
100
89
  requirement: !ruby/object:Gem::Requirement
101
- none: false
102
90
  requirements:
103
- - - ! '>='
91
+ - - ">="
104
92
  - !ruby/object:Gem::Version
105
93
  version: '0'
106
94
  type: :development
107
95
  prerelease: false
108
96
  version_requirements: !ruby/object:Gem::Requirement
109
- none: false
110
97
  requirements:
111
- - - ! '>='
98
+ - - ">="
112
99
  - !ruby/object:Gem::Version
113
100
  version: '0'
114
101
  - !ruby/object:Gem::Dependency
115
102
  name: webmock
116
103
  requirement: !ruby/object:Gem::Requirement
117
- none: false
118
104
  requirements:
119
- - - ! '>='
105
+ - - ">="
120
106
  - !ruby/object:Gem::Version
121
107
  version: '0'
122
108
  type: :development
123
109
  prerelease: false
124
110
  version_requirements: !ruby/object:Gem::Requirement
125
- none: false
126
111
  requirements:
127
- - - ! '>='
112
+ - - ">="
128
113
  - !ruby/object:Gem::Version
129
114
  version: '0'
130
115
  description: The official appsignal.com gem
@@ -135,9 +120,9 @@ executables:
135
120
  extensions: []
136
121
  extra_rdoc_files: []
137
122
  files:
138
- - .gitignore
139
- - .rspec
140
- - .travis.yml
123
+ - ".gitignore"
124
+ - ".rspec"
125
+ - ".travis.yml"
141
126
  - CHANGELOG.md
142
127
  - Gemfile
143
128
  - LICENSE
@@ -259,27 +244,26 @@ files:
259
244
  homepage: https://github.com/appsignal/appsignal
260
245
  licenses:
261
246
  - MIT
247
+ metadata: {}
262
248
  post_install_message:
263
249
  rdoc_options: []
264
250
  require_paths:
265
251
  - lib
266
252
  required_ruby_version: !ruby/object:Gem::Requirement
267
- none: false
268
253
  requirements:
269
- - - ! '>='
254
+ - - ">="
270
255
  - !ruby/object:Gem::Version
271
256
  version: '1.9'
272
257
  required_rubygems_version: !ruby/object:Gem::Requirement
273
- none: false
274
258
  requirements:
275
- - - ! '>='
259
+ - - ">"
276
260
  - !ruby/object:Gem::Version
277
- version: '0'
261
+ version: 1.3.1
278
262
  requirements: []
279
263
  rubyforge_project:
280
- rubygems_version: 1.8.23
264
+ rubygems_version: 2.4.5
281
265
  signing_key:
282
- specification_version: 3
266
+ specification_version: 4
283
267
  summary: Logs performance and exception data from your app to appsignal.com
284
268
  test_files:
285
269
  - spec/lib/appsignal/agent_spec.rb