appsignal 0.11.5 → 0.11.6.beta.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ # 0.11.6
2
+ * Use `APPSIGNAL_APP_NAME` and `APPSIGNAL_ACTIVE` env vars in config
3
+ * Better Sinatra support: Use route as action and set session data for Sinatra
4
+
1
5
  # 0.11.5
2
6
  * Add Sequel gem support (https://github.com/jeremyevans/sequel)
3
7
 
@@ -194,6 +194,7 @@ require 'appsignal/config'
194
194
  require 'appsignal/marker'
195
195
  require 'appsignal/rack/listener'
196
196
  require 'appsignal/rack/instrumentation'
197
+ require 'appsignal/rack/sinatra_instrumentation'
197
198
  require 'appsignal/params_sanitizer'
198
199
  require 'appsignal/transaction'
199
200
  require 'appsignal/transaction/formatter'
@@ -27,11 +27,11 @@ module Appsignal
27
27
  if File.exists?(config_file)
28
28
  load_config_from_disk
29
29
  elsif ENV['APPSIGNAL_PUSH_API_KEY']
30
- load_default_config_with_push_api_key(
30
+ load_default_config_with_push_api_key_and_name_from_env(
31
31
  ENV['APPSIGNAL_PUSH_API_KEY']
32
32
  )
33
33
  elsif ENV['APPSIGNAL_API_KEY']
34
- load_default_config_with_push_api_key(
34
+ load_default_config_with_push_api_key_and_name_from_env(
35
35
  ENV['APPSIGNAL_API_KEY']
36
36
  )
37
37
  @logger.info(
@@ -46,7 +46,7 @@ module Appsignal
46
46
  end
47
47
  if config_hash && !config_hash[:name]
48
48
  @logger.debug(
49
- "There's no application name set in your config file. " \
49
+ "There's no application name set in your config file or in the APPSIGNAL_APP_NAME env var. " \
50
50
  "You should set one unless your app runs on Heroku."
51
51
  )
52
52
  end
@@ -91,11 +91,14 @@ module Appsignal
91
91
  end
92
92
  end
93
93
 
94
- def load_default_config_with_push_api_key(key)
94
+ def load_default_config_with_push_api_key_and_name_from_env(key)
95
+ # Get base config by doing the default merge and adding the push api key.
95
96
  @config_hash = merge_config(
96
97
  :push_api_key => key,
97
98
  :active => true
98
99
  )
100
+ @config_hash[:name] = ENV['APPSIGNAL_APP_NAME'] if ENV['APPSIGNAL_APP_NAME']
101
+ @config_hash[:active] = ENV['APPSIGNAL_ACTIVE'] == 'true' if ENV['APPSIGNAL_ACTIVE']
99
102
  end
100
103
 
101
104
  def merge_config(config)
@@ -14,5 +14,5 @@ Appsignal.start
14
14
 
15
15
  if Appsignal.active?
16
16
  ::Sinatra::Application.use(Appsignal::Rack::Listener)
17
- ::Sinatra::Application.use(Appsignal::Rack::Instrumentation)
17
+ ::Sinatra::Application.use(Appsignal::Rack::SinatraInstrumentation)
18
18
  end
@@ -0,0 +1,36 @@
1
+ module Appsignal
2
+ module Rack
3
+ class SinatraInstrumentation
4
+ def initialize(app, options = {})
5
+ Appsignal.logger.debug 'Initializing Appsignal::Rack::SinatraInstrumentation'
6
+ @app, @options = app, options
7
+ end
8
+
9
+ def call(env)
10
+ ActiveSupport::Notifications.instrument(
11
+ 'process_action.sinatra',
12
+ raw_payload(env)
13
+ ) do |payload|
14
+ begin
15
+ @app.call(env)
16
+ ensure
17
+ # This information is available only after the
18
+ # request has been processed by Sinatra.
19
+ payload[:action] = env['sinatra.route']
20
+ end
21
+ end
22
+ end
23
+
24
+ def raw_payload(env)
25
+ request = @options.fetch(:request_class, ::Sinatra::Request).new(env)
26
+ params = request.public_send(@options.fetch(:params_method, :params))
27
+ {
28
+ :params => params,
29
+ :session => request.session,
30
+ :method => request.request_method,
31
+ :path => request.path
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -71,7 +71,11 @@ module Appsignal
71
71
  def set_process_action_event(event)
72
72
  return unless event && event.payload
73
73
  @process_action_event = event.dup
74
- @action = "#{@process_action_event.payload[:controller]}##{@process_action_event.payload[:action]}"
74
+ if @process_action_event.payload[:controller]
75
+ @action = "#{@process_action_event.payload[:controller]}##{@process_action_event.payload[:action]}"
76
+ else
77
+ @action = @process_action_event.payload[:action]
78
+ end
75
79
  @kind = 'http_request'
76
80
  set_http_queue_start
77
81
  end
@@ -1,3 +1,3 @@
1
1
  module Appsignal
2
- VERSION = '0.11.5'
2
+ VERSION = '0.11.6.beta.0'
3
3
  end
@@ -123,7 +123,7 @@ describe Appsignal::Config do
123
123
 
124
124
  it "should merge with the default config, fill the config hash and log about the missing name" do
125
125
  Appsignal.logger.should_receive(:debug).with(
126
- "There's no application name set in your config file. You should set one unless your app runs on Heroku."
126
+ "There's no application name set in your config file or in the APPSIGNAL_APP_NAME env var. You should set one unless your app runs on Heroku."
127
127
  )
128
128
 
129
129
  subject.config_hash.should == {
@@ -148,6 +148,51 @@ describe Appsignal::Config do
148
148
  end
149
149
  end
150
150
 
151
+ context "more config in environment" do
152
+ context "APPSIGNAL_APP_NAME is set" do
153
+ before do
154
+ ENV['APPSIGNAL_APP_NAME'] = 'Name from env'
155
+ end
156
+
157
+ it "should set the name" do
158
+ Appsignal.logger.should_not_receive(:debug)
159
+ subject[:name].should == 'Name from env'
160
+ end
161
+ end
162
+
163
+ context "APPSIGNAL_ACTIVE" do
164
+ context "not present" do
165
+ before do
166
+ ENV.delete('APPSIGNAL_ACTIVE')
167
+ end
168
+
169
+ it "should still set active to true" do
170
+ subject[:active].should be_true
171
+ end
172
+ end
173
+
174
+ context "true" do
175
+ before do
176
+ ENV['APPSIGNAL_ACTIVE'] = 'true'
177
+ end
178
+
179
+ it "should set active to true" do
180
+ subject[:active].should be_true
181
+ end
182
+ end
183
+
184
+ context "false" do
185
+ before do
186
+ ENV['APPSIGNAL_ACTIVE'] = 'false'
187
+ end
188
+
189
+ it "should set active to false" do
190
+ subject[:active].should be_false
191
+ end
192
+ end
193
+ end
194
+ end
195
+
151
196
  context "with only APPSIGNAL_API_KEY" do
152
197
  before do
153
198
  ENV.delete('APPSIGNAL_PUSH_API_KEY')
@@ -36,7 +36,7 @@ if defined?(::Sinatra)
36
36
 
37
37
  it "should have added the instrumentation middleware" do
38
38
  Sinatra::Application.middleware.to_a.should include(
39
- [Appsignal::Rack::Instrumentation, [], nil]
39
+ [Appsignal::Rack::SinatraInstrumentation, [], nil]
40
40
  )
41
41
  end
42
42
  end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ begin
4
+ require 'sinatra'
5
+ rescue LoadError
6
+ end
7
+
8
+ if defined?(::Sinatra)
9
+ describe Appsignal::Rack::SinatraInstrumentation do
10
+ before :all do
11
+ start_agent
12
+ @events = []
13
+ @subscriber = ActiveSupport::Notifications.subscribe do |*args|
14
+ @events << ActiveSupport::Notifications::Event.new(*args)
15
+ end
16
+ end
17
+ after :all do
18
+ ActiveSupport::Notifications.unsubscribe(@subscriber)
19
+ end
20
+
21
+ let(:app) { double(:call => true) }
22
+ let(:env) { {} }
23
+ let(:middleware) { Appsignal::Rack::SinatraInstrumentation.new(app, {}) }
24
+
25
+ describe "#call" do
26
+ before do
27
+ middleware.stub(:raw_payload => {})
28
+ env['sinatra.route'] = 'GET /'
29
+ end
30
+
31
+ it "should instrument the call" do
32
+ app.should_receive(:call).with(env)
33
+
34
+ middleware.call(env)
35
+
36
+ process_action_event = @events.last
37
+ process_action_event.name.should == 'process_action.sinatra'
38
+ process_action_event.payload[:action].should == 'GET /'
39
+ end
40
+
41
+ it "should still set the action if there was an exception" do
42
+ app.should_receive(:call).with(env).and_raise('the roof')
43
+
44
+ lambda {
45
+ middleware.call(env)
46
+ }.should raise_error
47
+
48
+ process_action_event = @events.last
49
+ process_action_event.name.should == 'process_action.sinatra'
50
+ process_action_event.payload[:action].should == 'GET /'
51
+ end
52
+ end
53
+
54
+ describe "raw_payload" do
55
+ let(:env) do
56
+ {
57
+ 'rack.input' => StringIO.new,
58
+ 'REQUEST_METHOD' => 'GET',
59
+ 'PATH_INFO' => '/homepage',
60
+ 'QUERY_STRING' => 'param=something'
61
+ }
62
+ end
63
+ subject { middleware.raw_payload(env) }
64
+
65
+ it { should == {
66
+ :params => {'param' => 'something'},
67
+ :session => {},
68
+ :method => 'GET',
69
+ :path => '/homepage'
70
+ } }
71
+ end
72
+
73
+ describe "use a custom request class and parameters method" do
74
+ let(:request_class) do
75
+ double(
76
+ new: double(
77
+ request_method: 'POST',
78
+ path: '/somewhere',
79
+ filtered_params: {'param' => 'changed_something'}
80
+ )
81
+ )
82
+ end
83
+ let(:options) do
84
+ { request_class: request_class, params_method: :filtered_params }
85
+ end
86
+ let(:middleware) { Appsignal::Rack::Instrumentation.new(app, options) }
87
+ subject { middleware.raw_payload(env) }
88
+
89
+ it { should == {
90
+ :action => 'POST:/somewhere',
91
+ :params => {'param' => 'changed_something'},
92
+ :method => 'POST',
93
+ :path => '/somewhere'
94
+ } }
95
+ end
96
+ end
97
+ end
@@ -100,6 +100,18 @@ describe Appsignal::Transaction do
100
100
  it "should call set_http_queue_start" do
101
101
  transaction.queue_start.should_not be_nil
102
102
  end
103
+
104
+ context "if there is no controller" do
105
+ before do
106
+ process_action_event.payload[:action] = 'GET /items/:id'
107
+ process_action_event.payload.delete(:controller)
108
+ transaction.set_process_action_event(process_action_event)
109
+ end
110
+
111
+ it "should set the action without a #" do
112
+ transaction.action.should == 'GET /items/:id'
113
+ end
114
+ end
103
115
  end
104
116
 
105
117
  describe "set_perform_job_event" do
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appsignal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.5
4
+ version: 0.11.6.beta.0
5
+ prerelease: 7
5
6
  platform: ruby
6
7
  authors:
7
8
  - Robert Beekman
@@ -12,104 +13,118 @@ authors:
12
13
  autorequire:
13
14
  bindir: bin
14
15
  cert_chain: []
15
- date: 2015-02-13 00:00:00.000000000 Z
16
+ date: 2015-02-16 00:00:00.000000000 Z
16
17
  dependencies:
17
18
  - !ruby/object:Gem::Dependency
18
19
  name: rack
19
20
  requirement: !ruby/object:Gem::Requirement
21
+ none: false
20
22
  requirements:
21
- - - ">="
23
+ - - ! '>='
22
24
  - !ruby/object:Gem::Version
23
25
  version: '0'
24
26
  type: :runtime
25
27
  prerelease: false
26
28
  version_requirements: !ruby/object:Gem::Requirement
29
+ none: false
27
30
  requirements:
28
- - - ">="
31
+ - - ! '>='
29
32
  - !ruby/object:Gem::Version
30
33
  version: '0'
31
34
  - !ruby/object:Gem::Dependency
32
35
  name: thread_safe
33
36
  requirement: !ruby/object:Gem::Requirement
37
+ none: false
34
38
  requirements:
35
- - - ">="
39
+ - - ! '>='
36
40
  - !ruby/object:Gem::Version
37
41
  version: '0'
38
42
  type: :runtime
39
43
  prerelease: false
40
44
  version_requirements: !ruby/object:Gem::Requirement
45
+ none: false
41
46
  requirements:
42
- - - ">="
47
+ - - ! '>='
43
48
  - !ruby/object:Gem::Version
44
49
  version: '0'
45
50
  - !ruby/object:Gem::Dependency
46
51
  name: rake
47
52
  requirement: !ruby/object:Gem::Requirement
53
+ none: false
48
54
  requirements:
49
- - - ">="
55
+ - - ! '>='
50
56
  - !ruby/object:Gem::Version
51
57
  version: '0'
52
58
  type: :development
53
59
  prerelease: false
54
60
  version_requirements: !ruby/object:Gem::Requirement
61
+ none: false
55
62
  requirements:
56
- - - ">="
63
+ - - ! '>='
57
64
  - !ruby/object:Gem::Version
58
65
  version: '0'
59
66
  - !ruby/object:Gem::Dependency
60
67
  name: rspec
61
68
  requirement: !ruby/object:Gem::Requirement
69
+ none: false
62
70
  requirements:
63
- - - "~>"
71
+ - - ~>
64
72
  - !ruby/object:Gem::Version
65
73
  version: 2.14.1
66
74
  type: :development
67
75
  prerelease: false
68
76
  version_requirements: !ruby/object:Gem::Requirement
77
+ none: false
69
78
  requirements:
70
- - - "~>"
79
+ - - ~>
71
80
  - !ruby/object:Gem::Version
72
81
  version: 2.14.1
73
82
  - !ruby/object:Gem::Dependency
74
83
  name: pry
75
84
  requirement: !ruby/object:Gem::Requirement
85
+ none: false
76
86
  requirements:
77
- - - ">="
87
+ - - ! '>='
78
88
  - !ruby/object:Gem::Version
79
89
  version: '0'
80
90
  type: :development
81
91
  prerelease: false
82
92
  version_requirements: !ruby/object:Gem::Requirement
93
+ none: false
83
94
  requirements:
84
- - - ">="
95
+ - - ! '>='
85
96
  - !ruby/object:Gem::Version
86
97
  version: '0'
87
98
  - !ruby/object:Gem::Dependency
88
99
  name: timecop
89
100
  requirement: !ruby/object:Gem::Requirement
101
+ none: false
90
102
  requirements:
91
- - - ">="
103
+ - - ! '>='
92
104
  - !ruby/object:Gem::Version
93
105
  version: '0'
94
106
  type: :development
95
107
  prerelease: false
96
108
  version_requirements: !ruby/object:Gem::Requirement
109
+ none: false
97
110
  requirements:
98
- - - ">="
111
+ - - ! '>='
99
112
  - !ruby/object:Gem::Version
100
113
  version: '0'
101
114
  - !ruby/object:Gem::Dependency
102
115
  name: webmock
103
116
  requirement: !ruby/object:Gem::Requirement
117
+ none: false
104
118
  requirements:
105
- - - ">="
119
+ - - ! '>='
106
120
  - !ruby/object:Gem::Version
107
121
  version: '0'
108
122
  type: :development
109
123
  prerelease: false
110
124
  version_requirements: !ruby/object:Gem::Requirement
125
+ none: false
111
126
  requirements:
112
- - - ">="
127
+ - - ! '>='
113
128
  - !ruby/object:Gem::Version
114
129
  version: '0'
115
130
  description: The official appsignal.com gem
@@ -120,9 +135,9 @@ executables:
120
135
  extensions: []
121
136
  extra_rdoc_files: []
122
137
  files:
123
- - ".gitignore"
124
- - ".rspec"
125
- - ".travis.yml"
138
+ - .gitignore
139
+ - .rspec
140
+ - .travis.yml
126
141
  - CHANGELOG.md
127
142
  - Gemfile
128
143
  - LICENSE
@@ -174,6 +189,7 @@ files:
174
189
  - lib/appsignal/params_sanitizer.rb
175
190
  - lib/appsignal/rack/instrumentation.rb
176
191
  - lib/appsignal/rack/listener.rb
192
+ - lib/appsignal/rack/sinatra_instrumentation.rb
177
193
  - lib/appsignal/transaction.rb
178
194
  - lib/appsignal/transaction/formatter.rb
179
195
  - lib/appsignal/transaction/params_sanitizer.rb
@@ -216,6 +232,7 @@ files:
216
232
  - spec/lib/appsignal/params_sanitizer_spec.rb
217
233
  - spec/lib/appsignal/rack/instrumentation_spec.rb
218
234
  - spec/lib/appsignal/rack/listener_spec.rb
235
+ - spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb
219
236
  - spec/lib/appsignal/transaction/formatter_spec.rb
220
237
  - spec/lib/appsignal/transaction_spec.rb
221
238
  - spec/lib/appsignal/transmitter_spec.rb
@@ -236,26 +253,27 @@ files:
236
253
  homepage: https://github.com/appsignal/appsignal
237
254
  licenses:
238
255
  - MIT
239
- metadata: {}
240
256
  post_install_message:
241
257
  rdoc_options: []
242
258
  require_paths:
243
259
  - lib
244
260
  required_ruby_version: !ruby/object:Gem::Requirement
261
+ none: false
245
262
  requirements:
246
- - - ">="
263
+ - - ! '>='
247
264
  - !ruby/object:Gem::Version
248
265
  version: '1.9'
249
266
  required_rubygems_version: !ruby/object:Gem::Requirement
267
+ none: false
250
268
  requirements:
251
- - - ">="
269
+ - - ! '>'
252
270
  - !ruby/object:Gem::Version
253
- version: '0'
271
+ version: 1.3.1
254
272
  requirements: []
255
273
  rubyforge_project:
256
- rubygems_version: 2.2.2
274
+ rubygems_version: 1.8.23
257
275
  signing_key:
258
- specification_version: 4
276
+ specification_version: 3
259
277
  summary: Logs performance and exception data from your app to appsignal.com
260
278
  test_files:
261
279
  - spec/lib/appsignal/agent_spec.rb
@@ -286,6 +304,7 @@ test_files:
286
304
  - spec/lib/appsignal/params_sanitizer_spec.rb
287
305
  - spec/lib/appsignal/rack/instrumentation_spec.rb
288
306
  - spec/lib/appsignal/rack/listener_spec.rb
307
+ - spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb
289
308
  - spec/lib/appsignal/transaction/formatter_spec.rb
290
309
  - spec/lib/appsignal/transaction_spec.rb
291
310
  - spec/lib/appsignal/transmitter_spec.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 28b9ade66f02b2901ab65933aa6eb993e32000ad
4
- data.tar.gz: 1eb565d3a57c0a62c2e261728dcec8a38f55f141
5
- SHA512:
6
- metadata.gz: 8fe9c09d3c7cb5f2fef232220a1acdd45e09a1b1691a939eba00c00de6299b3cb58c78c6be531ae3bc99d2023bab35ffbc1445cc0d1d9c91acbd79290682fe0e
7
- data.tar.gz: 2b166f952ea4f0428ff5e54a4aecb7f2835aa70c19dcfc2c9c315a78a6b694e52a3f1dc9f43e09ef50658c929fd0c063fc61e60f64379c6d5c53ff3616c80db7