appsignal 0.12.beta.49 → 0.12.beta.50

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ba38ca170b1385aefc5ef72f6f6b69ecbaea0eb
4
- data.tar.gz: b7fc6bcacff3e39f9b4114cee172761cb6245ca1
3
+ metadata.gz: 6f4983934fcdf39da6dede5551dda1a8caa25db3
4
+ data.tar.gz: 2ffafd503a9951363ffe07e3a968700b39bd740e
5
5
  SHA512:
6
- metadata.gz: dc66819c470b6fa19620ec87330598086263818f6e33dd8db324dc7867d64fe36ecf8f16a38f9ba45f0bcba3b5c4f49459a0ae95200250bd38b01e12bee9ae6f
7
- data.tar.gz: 4a7597a8342206fe2bdf032cf271db37700ef10cf7dc04312dc897d579c9bff41d1755526f71e28ff3f34db6e26c4c850c1be916287c6db20942592845c08707
6
+ metadata.gz: 84e1091639bd740344c69121064d3a5fc91e7023cf2bb9e21f5ef4c970840830e3c92f3406dd6b46c8c1608423ae0b919415907ab39844fca6d9c8e8a6adef37
7
+ data.tar.gz: 8cecfffc66f3c8d2815a85b39ff3d5d36a87e640db8f454d49e2b73abd592225ffacca0693229e642536e4bdd5733146b57c1ed9e94a37ff1965375dc01c66c0
@@ -1,11 +1,11 @@
1
1
  ---
2
- :version: e380f28
2
+ :version: ac7fefc
3
3
  :triples:
4
4
  x86_64-linux:
5
- :checksum: d099130d22f0accfaa6e56ceaf136c646ddb3fc6f89ec01023996697cd010ce9
6
- :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/e380f28/appsignal-agent-x86_64-linux-static.tar.gz
5
+ :checksum: 04dbd6009135c3f023cf879bb31947a0991cef3d8e39bd592564df40915f0ee9
6
+ :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/ac7fefc/appsignal-agent-x86_64-linux-static.tar.gz
7
7
  :lib_filename: libappsignal.a
8
8
  x86_64-darwin:
9
- :checksum: 8a570b881d688858ad615f3b740dad80dc18d0e818b1f5594688d14aa97490dc
10
- :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/e380f28/appsignal-agent-x86_64-darwin-static.tar.gz
9
+ :checksum: 3028676f73537b03b6afccc0d027519559053450369d16a798bdb9904ea43d2a
10
+ :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/ac7fefc/appsignal-agent-x86_64-darwin-static.tar.gz
11
11
  :lib_filename: libappsignal.a
@@ -0,0 +1,70 @@
1
+ # Appsignal module that tracks exceptions in Streaming rack responses.
2
+ module Appsignal
3
+ module Rack
4
+ class StreamingListener
5
+ def initialize(app, options = {})
6
+ Appsignal.logger.debug 'Initializing Appsignal::Rack::StreamingListener'
7
+ @app, @options = app, options
8
+ end
9
+
10
+ def call(env)
11
+ if Appsignal.active?
12
+ call_with_appsignal_monitoring(env)
13
+ else
14
+ @app.call(env)
15
+ end
16
+ end
17
+
18
+ def call_with_appsignal_monitoring(env)
19
+ transaction = Appsignal::Transaction.create(SecureRandom.uuid, env)
20
+ streaming = false
21
+
22
+ # Instrument a `process_action`, to set params/action name
23
+ status, headers, body = ActiveSupport::Notifications
24
+ .instrument('process_action.rack', raw_payload(env)) do |payload|
25
+ begin
26
+ @app.call(env)
27
+ rescue Exception => e
28
+ transaction.add_exception(e); raise e;
29
+ ensure
30
+ payload[:action] = env['appsignal.action']
31
+ end
32
+ end
33
+
34
+ # Wrap the result body with our StreamWrapper
35
+ [status, headers, StreamWrapper.new(body, transaction)]
36
+ end
37
+
38
+ def raw_payload(env)
39
+ request = ::Rack::Request.new(env)
40
+ {
41
+ :params => request.params,
42
+ :session => request.session,
43
+ :method => request.request_method,
44
+ :path => request.path
45
+ }
46
+ end
47
+ end
48
+ end
49
+
50
+ class StreamWrapper
51
+ def initialize(stream, transaction)
52
+ @stream = stream
53
+ @transaction = transaction
54
+ end
55
+
56
+ def each
57
+ @stream.each { |c| yield(c) }
58
+ rescue Exception => e
59
+ @transaction.add_exception(e); raise e
60
+ end
61
+
62
+ def close
63
+ @stream.close if @stream.respond_to?(:close)
64
+ rescue Exception => e
65
+ @transaction.add_exception(e); raise e
66
+ ensure
67
+ @transaction.complete!
68
+ end
69
+ end
70
+ end
@@ -1,5 +1,5 @@
1
1
  require 'yaml'
2
2
 
3
3
  module Appsignal
4
- VERSION = '0.12.beta.49'
4
+ VERSION = '0.12.beta.50'
5
5
  end
@@ -0,0 +1,153 @@
1
+ require 'spec_helper'
2
+ require 'appsignal/rack/streaming_listener'
3
+
4
+ describe Appsignal::Rack::StreamingListener do
5
+ let(:headers) { {} }
6
+ let(:env) { {} }
7
+ let(:app) { double(:call => [200, headers, 'body']) }
8
+ let(:listener) { Appsignal::Rack::StreamingListener.new(app, {}) }
9
+
10
+ describe "#call" do
11
+ context "when Appsignal is active" do
12
+ before { Appsignal.stub(:active? => true) }
13
+
14
+ it "should call `call_with_appsignal_monitoring`" do
15
+ expect( listener ).to receive(:call_with_appsignal_monitoring)
16
+ end
17
+ end
18
+
19
+ context "when Appsignal is not active" do
20
+ before { Appsignal.stub(:active? => false) }
21
+
22
+ it "should not call `call_with_appsignal_monitoring`" do
23
+ expect( listener ).to_not receive(:call_with_appsignal_monitoring)
24
+ end
25
+ end
26
+
27
+ after { listener.call(env) }
28
+ end
29
+
30
+ describe "#call_with_appsignal_monitoring" do
31
+ let!(:transaction) { Appsignal::Transaction.create(SecureRandom.uuid, env) }
32
+ let(:wrapper) { Appsignal::StreamWrapper.new('body', transaction) }
33
+ let(:raw_payload) { {:foo => :bar} }
34
+
35
+ before do
36
+ SecureRandom.stub(:uuid => '123')
37
+ listener.stub(:raw_payload => raw_payload)
38
+ Appsignal::Transaction.stub(:create => transaction)
39
+ end
40
+
41
+ it "should create a transaction" do
42
+ expect( Appsignal::Transaction ).to receive(:create)
43
+ .with('123', env)
44
+ .and_return(transaction)
45
+
46
+ listener.call_with_appsignal_monitoring(env)
47
+ end
48
+
49
+ it "should instrument the call" do
50
+ expect( ActiveSupport::Notifications ).to receive(:instrument)
51
+ .with('process_action.rack', raw_payload)
52
+ .and_yield(raw_payload)
53
+
54
+ listener.call_with_appsignal_monitoring(env)
55
+ end
56
+
57
+ it "should add `appsignal.action` to the payload" do
58
+ allow( ActiveSupport::Notifications ).to receive(:instrument)
59
+ .and_yield(raw_payload)
60
+
61
+ env['appsignal.action'] = 'Action'
62
+ listener.call_with_appsignal_monitoring(env)
63
+
64
+ expect( raw_payload ).to eql({:foo => :bar, :action => 'Action'})
65
+ end
66
+
67
+ context "with an exception in the instrumentation call" do
68
+ it "should add the exception to the transaction" do
69
+ allow( app ).to receive(:call).and_raise(VerySpecificError.new('broken'))
70
+
71
+ expect( transaction ).to receive(:add_exception)
72
+
73
+ listener.call_with_appsignal_monitoring(env) rescue VerySpecificError
74
+ end
75
+ end
76
+
77
+ it "should wrap the body in a wrapper" do
78
+ expect( Appsignal::StreamWrapper ).to receive(:new)
79
+ .with('body', transaction)
80
+ .and_return(wrapper)
81
+
82
+ status, headers, body = listener.call_with_appsignal_monitoring(env)
83
+
84
+ expect( body ).to be_a(Appsignal::StreamWrapper)
85
+ end
86
+ end
87
+
88
+ describe "#raw_payload" do
89
+ let(:env) do
90
+ {
91
+ 'rack.input' => StringIO.new,
92
+ 'REQUEST_METHOD' => 'GET',
93
+ 'PATH_INFO' => '/homepage',
94
+ 'QUERY_STRING' => 'param=something'
95
+ }
96
+ end
97
+
98
+ it "should return an Appsignal compatible playload" do
99
+ expect( listener.raw_payload(env) ).to eql({
100
+ :params => {'param' => 'something'},
101
+ :session => {},
102
+ :method => 'GET',
103
+ :path => '/homepage'
104
+ })
105
+ end
106
+ end
107
+ end
108
+
109
+ describe Appsignal::StreamWrapper do
110
+ let(:stream) { double }
111
+ let(:transaction) { Appsignal::Transaction.create(SecureRandom.uuid, {}) }
112
+ let(:wrapper) { Appsignal::StreamWrapper.new(stream, transaction) }
113
+
114
+ describe "#each" do
115
+ it "should call the original stream" do
116
+ expect( stream ).to receive(:each)
117
+
118
+ wrapper.each
119
+ end
120
+
121
+ context "when each raises an error" do
122
+ it "should add the exception to the transaction" do
123
+ allow( stream ).to receive(:each)
124
+ .and_raise(VerySpecificError.new('broken'))
125
+
126
+ expect( transaction ).to receive(:add_exception)
127
+
128
+ wrapper.send(:each) rescue VerySpecificError
129
+ end
130
+ end
131
+ end
132
+
133
+ describe "#close" do
134
+ it "should call the original stream and close the transaction" do
135
+ expect( stream ).to receive(:close)
136
+ expect( transaction ).to receive(:complete!)
137
+
138
+ wrapper.close
139
+ end
140
+
141
+ context "when each raises an error" do
142
+ it "should add the exception to the transaction and close it" do
143
+ allow( stream ).to receive(:close)
144
+ .and_raise(VerySpecificError.new('broken'))
145
+
146
+ expect( transaction ).to receive(:add_exception)
147
+ expect( transaction ).to receive(:complete!)
148
+
149
+ wrapper.send(:close) rescue VerySpecificError
150
+ end
151
+ end
152
+ end
153
+ end
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: 0.12.beta.49
4
+ version: 0.12.beta.50
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: 2015-10-19 00:00:00.000000000 Z
12
+ date: 2015-10-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -177,6 +177,7 @@ files:
177
177
  - lib/appsignal/rack/js_exception_catcher.rb
178
178
  - lib/appsignal/rack/rails_instrumentation.rb
179
179
  - lib/appsignal/rack/sinatra_instrumentation.rb
180
+ - lib/appsignal/rack/streaming_listener.rb
180
181
  - lib/appsignal/subscriber.rb
181
182
  - lib/appsignal/transaction.rb
182
183
  - lib/appsignal/transmitter.rb
@@ -220,6 +221,7 @@ files:
220
221
  - spec/lib/appsignal/rack/js_exception_catcher_spec.rb
221
222
  - spec/lib/appsignal/rack/rails_instrumentation_spec.rb
222
223
  - spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb
224
+ - spec/lib/appsignal/rack/streaming_listener_spec.rb
223
225
  - spec/lib/appsignal/subscriber_spec.rb
224
226
  - spec/lib/appsignal/transaction_spec.rb
225
227
  - spec/lib/appsignal/transmitter_spec.rb
@@ -295,6 +297,7 @@ test_files:
295
297
  - spec/lib/appsignal/rack/js_exception_catcher_spec.rb
296
298
  - spec/lib/appsignal/rack/rails_instrumentation_spec.rb
297
299
  - spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb
300
+ - spec/lib/appsignal/rack/streaming_listener_spec.rb
298
301
  - spec/lib/appsignal/subscriber_spec.rb
299
302
  - spec/lib/appsignal/transaction_spec.rb
300
303
  - spec/lib/appsignal/transmitter_spec.rb