appsignal 0.11.5 → 0.11.6.beta.0

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.
@@ -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