appsignal 0.6.3.beta.2 → 0.6.3.beta.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTIwYTY1MmE4MzdlYTk3ZDA1NzBhOWQzNGNiNWZjYjBlZWYwNmY3MQ==
4
+ MjhhMGUxYTk4NTgyYmUyZTlhNmU5OTQ5YTA5YjI1MjI1NmRiZjFkZA==
5
5
  data.tar.gz: !binary |-
6
- ZmMzNzg2YTA1MTg4Mjc5ZDcwMGU5MGJiN2JkYjI1MmFlMjNjNDhhNA==
6
+ MzdkMmI2NDJhNTU4NDliZWJjYmQwNTQ3NGZkYWRkZTFhZmIzYjdiMQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MjZmMjcwNWQ0MGY1MGRhMjU3ZTllYzk3YzFmMTc4OWMzMDMxNjE1ZDAyYTky
10
- MDhhYmNhNTgyMmFkMWY3YTYwMzU0M2QwYTU4OTlkOTQ1MjA4MTc5MDYyMGE4
11
- NjIxNzNkMWM5ZGNmMDgwNzNlYzBiZTY2NWIxODE3NzU1MTJmYmY=
9
+ YzRkMWNhMjFlNzEzNjZlZTFjYTU5YWI0NmZhM2ViMDllZjg2Y2NkOWMwZmFm
10
+ M2VlYTExYjJjY2E3ZTFkYjJjMjg5ZjMyMGQ4NGIwZWYwNjliNTE0MTNjZGI2
11
+ NDE2OTRmMDE2ZTBlOGQ4MWIyNjgyMWM0MzVlMjgzNzI5MGI4ZDg=
12
12
  data.tar.gz: !binary |-
13
- M2VhMjFkNzQyNDBhODlmYjk3ZDRiYWVlMTMwNTU5OGViNjk2MGE3OTU0MzA3
14
- MTA4YzU2OWFlMjc2YWZjNDc5Y2Q3OTE2ZDViYWE5NWU0NTJkNmQ4Y2RkNDc5
15
- Mzc3MDU4MjFmOGYxNzgxZmJlMzY5ODcxMGYxMjQ5MGEzY2Y1ZTA=
13
+ ZDJkZWM1MTc5OTA3MjZhZjFjZjMzOTMxZWM2NTIyYWI1NDAyYzZlODZiMzJh
14
+ ZjY0ODg1MDEwZTllYzA2MzFjZTg1NGUwMTUyOGQxNTNiNDEyMmE5MTNkNzQw
15
+ MDk3MWEwN2Y1ZjNlMjZjMGM3MjQ1ZTg1YWMwNGNlOGE5MTEwNWE=
@@ -1,6 +1,7 @@
1
1
  # 0.6.3
2
2
  * Use a mutex around access to the aggregator
3
3
  * Bugfix for accessing connection config in Rails 3.0
4
+ * Add Appsignal.tag_request
4
5
 
5
6
  # 0.6.2
6
7
  * Bugfix in backtrace cleaner usage for Rails 4
@@ -32,14 +32,18 @@ module Appsignal
32
32
  env = ENV.to_hash
33
33
 
34
34
  transaction = Appsignal::Transaction.create(SecureRandom.uuid, env)
35
- transaction.add_exception(
36
- Appsignal::ExceptionNotification.new(env, exception, false)
37
- )
35
+ transaction.add_exception(exception)
38
36
  transaction.complete!
39
37
  Appsignal.agent.send_queue
40
38
  end
41
39
  end
42
40
 
41
+ def tag_request(params={})
42
+ transaction = Appsignal::Transaction.current
43
+ return false unless transaction
44
+ transaction.set_tags(params)
45
+ end
46
+
43
47
  def transactions
44
48
  @transactions ||= {}
45
49
  end
@@ -93,7 +97,6 @@ require 'appsignal/agent'
93
97
  require 'appsignal/aggregator'
94
98
  require 'appsignal/auth_check'
95
99
  require 'appsignal/config'
96
- require 'appsignal/exception_notification'
97
100
  require 'appsignal/integrations/passenger'
98
101
  require 'appsignal/listener'
99
102
  require 'appsignal/marker'
@@ -11,9 +11,7 @@ module Appsignal
11
11
  @app.call(env)
12
12
  rescue Exception => exception
13
13
  unless Appsignal.is_ignored_exception?(exception)
14
- Appsignal::Transaction.current.add_exception(
15
- Appsignal::ExceptionNotification.new(env, exception)
16
- )
14
+ Appsignal::Transaction.current.add_exception(exception)
17
15
  end
18
16
  raise exception
19
17
  ensure
@@ -1,6 +1,5 @@
1
1
  module Appsignal
2
2
  class Railtie < Rails::Railtie
3
-
4
3
  initializer "appsignal.configure_rails_initialization" do |app|
5
4
  # Some apps when run from the console do not have Rails.root set, there's
6
5
  # currently no way to spec this.
@@ -25,7 +25,7 @@ module Appsignal
25
25
  end
26
26
 
27
27
  attr_reader :request_id, :events, :process_action_event, :action, :exception,
28
- :env, :fullpath, :time
28
+ :env, :fullpath, :time, :tags
29
29
 
30
30
  def initialize(request_id, env)
31
31
  @request_id = request_id
@@ -33,6 +33,7 @@ module Appsignal
33
33
  @process_action_event = nil
34
34
  @exception = nil
35
35
  @env = env
36
+ @tags = {}
36
37
  end
37
38
 
38
39
  def sanitized_environment
@@ -47,6 +48,10 @@ module Appsignal
47
48
  ActionDispatch::Request.new(@env)
48
49
  end
49
50
 
51
+ def set_tags(given_tags={})
52
+ @tags.merge!(given_tags)
53
+ end
54
+
50
55
  def set_process_action_event(event)
51
56
  @process_action_event = event
52
57
  if event && event.payload
@@ -80,6 +85,7 @@ module Appsignal
80
85
  def truncate!
81
86
  process_action_event.payload.clear
82
87
  events.clear
88
+ tags.clear
83
89
  sanitized_environment.clear
84
90
  sanitized_session_data.clear
85
91
  @env = nil
@@ -114,9 +120,21 @@ module Appsignal
114
120
  def add_sanitized_context!
115
121
  sanitize_environment!
116
122
  sanitize_session_data!
123
+ sanitize_tags!
117
124
  @env = nil
118
125
  end
119
126
 
127
+ # Only keep tags if they meet the following criteria:
128
+ # * Key is a symbol or string with less then 100 chars
129
+ # * Value is a symbol or string with less then 100 chars
130
+ # * Value is an integer
131
+ def sanitize_tags!
132
+ @tags.keep_if do |k,v|
133
+ (k.is_a?(Symbol) || k.is_a?(String) && k.length <= 100) &&
134
+ (((v.is_a?(Symbol) || v.is_a?(String)) && v.length <= 100) || (v.is_a?(Integer)))
135
+ end
136
+ end
137
+
120
138
  def sanitize_environment!
121
139
  env.each do |key, value|
122
140
  sanitized_environment[key] = value if ENV_METHODS.include?(key)
@@ -13,7 +13,10 @@ module Appsignal
13
13
 
14
14
  def to_hash
15
15
  merge_process_action_event_with_log_entry! if process_action_event
16
- add_exception_to_hash! if exception?
16
+ if exception?
17
+ add_exception_to_hash!
18
+ add_tags_to_hash!
19
+ end
17
20
  add_events_to_hash! if slow_request?
18
21
  hash
19
22
  end
@@ -43,11 +46,15 @@ module Appsignal
43
46
  end
44
47
  end
45
48
 
49
+ def add_tags_to_hash!
50
+ hash[:log_entry][:tags] = tags
51
+ end
52
+
46
53
  def add_exception_to_hash!
47
54
  hash[:exception] = {
48
- :backtrace => exception.backtrace,
49
- :exception => exception.name,
50
- :message => exception.message
55
+ :exception => exception.class.name,
56
+ :message => exception.message,
57
+ :backtrace => Rails.backtrace_cleaner.clean(exception.backtrace, nil)
51
58
  }
52
59
  end
53
60
 
@@ -1,3 +1,3 @@
1
1
  module Appsignal
2
- VERSION = '0.6.3.beta.2'
2
+ VERSION = '0.6.3.beta.3'
3
3
  end
@@ -40,7 +40,6 @@ describe Appsignal::Listener do
40
40
  end
41
41
 
42
42
  it 'should catch the exception and notify the transaction of it' do
43
- Appsignal::ExceptionNotification.should_receive(:new)
44
43
  current.should_receive(:add_exception)
45
44
  middleware.call(env) rescue nil
46
45
  end
@@ -55,7 +54,6 @@ describe Appsignal::Listener do
55
54
  end
56
55
 
57
56
  it 'should ignore the error' do
58
- Appsignal::ExceptionNotification.should_not_receive(:new)
59
57
  current.should_not_receive(:add_exception)
60
58
  middleware.call(env) rescue nil
61
59
  end
@@ -40,13 +40,22 @@ describe Appsignal::TransactionFormatter do
40
40
  its([:request_id]) { should == '1' }
41
41
  its([:failed]) { should be_true }
42
42
 
43
+ context "log_entry content" do
44
+ subject { formatter.hash[:log_entry] }
45
+
46
+ its([:tags]) { should == {'user_id' => 123} }
47
+ end
48
+
43
49
  context "exception content" do
44
50
  subject { formatter.hash[:exception] }
45
51
 
46
- its(:keys) { should =~ [:backtrace, :exception, :message] }
47
- its([:backtrace]) { should be_instance_of Array }
52
+ its(:keys) { should =~ [:exception, :message, :backtrace] }
48
53
  its([:exception]) { should == 'ArgumentError' }
49
54
  its([:message]) { should == 'oh no' }
55
+ its([:backtrace]) { should == [
56
+ 'app/controllers/somethings_controller.rb:10',
57
+ '/user/local/ruby/path.rb:8'
58
+ ] }
50
59
  end
51
60
  end
52
61
 
@@ -48,6 +48,14 @@ describe Appsignal::Transaction do
48
48
  end
49
49
  end
50
50
 
51
+ describe "#set_tags" do
52
+ it "should add tags to transaction" do
53
+ expect {
54
+ transaction.set_tags({'a' => 'b'})
55
+ }.to change(transaction, :tags).to({'a' => 'b'})
56
+ end
57
+ end
58
+
51
59
  describe '#add_event' do
52
60
  let(:event) { double(:event, :name => 'test') }
53
61
 
@@ -141,12 +149,14 @@ describe Appsignal::Transaction do
141
149
 
142
150
  describe "#truncate!" do
143
151
  subject { slow_transaction }
152
+ before { subject.set_tags('a' => 'b') }
144
153
 
145
154
  it "should clear the process action payload and events" do
146
155
  subject.truncate!
147
156
 
148
157
  subject.process_action_event.payload.should be_empty
149
158
  subject.events.should be_empty
159
+ subject.tags.should be_empty
150
160
  end
151
161
  end
152
162
 
@@ -280,6 +290,7 @@ describe Appsignal::Transaction do
280
290
  it "delegates to sanitize_environment! and sanitize_session_data!" do
281
291
  transaction.should_receive(:sanitize_environment!)
282
292
  transaction.should_receive(:sanitize_session_data!)
293
+ transaction.should_receive(:sanitize_tags!)
283
294
  subject
284
295
  end
285
296
 
@@ -301,6 +312,36 @@ describe Appsignal::Transaction do
301
312
  its(:keys) { should =~ whitelisted_keys }
302
313
  end
303
314
 
315
+ describe '#sanitize_tags!' do
316
+ let(:transaction) { Appsignal::Transaction.create('1', {}) }
317
+ before do
318
+ transaction.set_tags(
319
+ {
320
+ :valid_key => 'valid_value',
321
+ 'valid_string_key' => 'valid_value',
322
+ :both_symbols => :valid_value,
323
+ :integer_value => 1,
324
+ :hash_value => {'invalid' => 'hash'},
325
+ :array_value => ['invalid', 'array'],
326
+ :to_long_value => SecureRandom.urlsafe_base64(101),
327
+ :object => Object.new,
328
+ SecureRandom.urlsafe_base64(101) => 'to_long_key'
329
+ }
330
+ )
331
+ transaction.send(:sanitize_tags!)
332
+ end
333
+ subject { transaction.tags.keys }
334
+
335
+ it "should only return whitelisted data" do
336
+ should =~ [
337
+ :valid_key,
338
+ 'valid_string_key',
339
+ :both_symbols,
340
+ :integer_value
341
+ ]
342
+ end
343
+ end
344
+
304
345
  describe '#sanitize_session_data!' do
305
346
  subject { transaction.send(:sanitize_session_data!) }
306
347
  before do
@@ -334,7 +375,6 @@ describe Appsignal::Transaction do
334
375
  subject
335
376
  end
336
377
 
337
-
338
378
  def action_dispatch_session
339
379
  store = Class.new {
340
380
  def load_session(env); [1, {:foo => :bar}]; end
@@ -14,6 +14,28 @@ describe Appsignal do
14
14
  end
15
15
  end
16
16
 
17
+ describe ".tag_request" do
18
+ before { Appsignal::Transaction.stub(:current => transaction) }
19
+
20
+ context "with transaction" do
21
+ let(:transaction) { double }
22
+
23
+ it "should call set_tags on transaction" do
24
+ transaction.should_receive(:set_tags).with({'a' => 'b'})
25
+ end
26
+
27
+ after { Appsignal.tag_request({'a' => 'b'}) }
28
+ end
29
+
30
+ context "without transaction" do
31
+ let(:transaction) { nil }
32
+
33
+ it "should call set_tags on transaction" do
34
+ Appsignal.tag_request.should be_false
35
+ end
36
+ end
37
+ end
38
+
17
39
  describe ".transactions" do
18
40
  subject { Appsignal.transactions }
19
41
 
@@ -6,13 +6,15 @@ module TransactionHelpers
6
6
 
7
7
  def transaction_with_exception
8
8
  appsignal_transaction.tap do |o|
9
+ o.set_tags('user_id' => 123)
9
10
  begin
10
11
  raise ArgumentError, 'oh no'
11
12
  rescue ArgumentError => exception
12
- env = {}
13
- o.add_exception(
14
- Appsignal::ExceptionNotification.new(env, exception)
15
- )
13
+ exception.stub(:backtrace => [
14
+ Rails.root.join('app/controllers/somethings_controller.rb:10').to_s,
15
+ '/user/local/ruby/path.rb:8'
16
+ ])
17
+ o.add_exception(exception)
16
18
  end
17
19
  end
18
20
  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.6.3.beta.2
4
+ version: 0.6.3.beta.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Beekman
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2013-09-11 00:00:00.000000000 Z
15
+ date: 2013-09-23 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rails
@@ -144,7 +144,6 @@ files:
144
144
  - lib/appsignal/careful_logger.rb
145
145
  - lib/appsignal/cli.rb
146
146
  - lib/appsignal/config.rb
147
- - lib/appsignal/exception_notification.rb
148
147
  - lib/appsignal/integrations/passenger.rb
149
148
  - lib/appsignal/listener.rb
150
149
  - lib/appsignal/marker.rb
@@ -172,7 +171,6 @@ files:
172
171
  - spec/appsignal/capistrano_spec.rb
173
172
  - spec/appsignal/cli_spec.rb
174
173
  - spec/appsignal/config_spec.rb
175
- - spec/appsignal/exception_notification_spec.rb
176
174
  - spec/appsignal/inactive_railtie_spec.rb
177
175
  - spec/appsignal/integrations/passenger_spec.rb
178
176
  - spec/appsignal/listener_spec.rb
@@ -224,7 +222,6 @@ test_files:
224
222
  - spec/appsignal/capistrano_spec.rb
225
223
  - spec/appsignal/cli_spec.rb
226
224
  - spec/appsignal/config_spec.rb
227
- - spec/appsignal/exception_notification_spec.rb
228
225
  - spec/appsignal/inactive_railtie_spec.rb
229
226
  - spec/appsignal/integrations/passenger_spec.rb
230
227
  - spec/appsignal/listener_spec.rb
@@ -1,28 +0,0 @@
1
- module Appsignal
2
- class MissingController
3
- def method_missing(*args, &block)
4
- end
5
- end
6
-
7
- class ExceptionNotification
8
- attr_reader :env, :exception, :backtrace
9
-
10
- def initialize(env, exception, run_rails_cleaner=true)
11
- @env = env
12
- @exception = exception
13
- if run_rails_cleaner && Rails.respond_to?(:backtrace_cleaner)
14
- @backtrace = Rails.backtrace_cleaner.clean(@exception.backtrace, nil)
15
- else
16
- @backtrace = @exception.backtrace
17
- end
18
- end
19
-
20
- def name
21
- @exception.class.name
22
- end
23
-
24
- def message
25
- @exception.message
26
- end
27
- end
28
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Appsignal::ExceptionNotification do
4
- let(:error) { StandardError.new('moo') }
5
- let(:notification) { Appsignal::ExceptionNotification.new({}, error, false) }
6
- subject { notification }
7
- before do
8
- Rails.stub(:root => '/home/app/current')
9
- end
10
-
11
- its(:env) { should == {} }
12
- its(:exception) { should == error }
13
- its(:name) { should == 'StandardError' }
14
- its(:message) { should == 'moo' }
15
-
16
- context "backtrace" do
17
- let(:backtrace) do
18
- [
19
- '/home/app/current/app/controllers/somethings_controller.rb:10',
20
- '/user/local/ruby/path.rb:8'
21
- ]
22
- end
23
- before { error.stub(:backtrace => backtrace) }
24
-
25
- subject { notification.backtrace }
26
-
27
- it { should == backtrace }
28
-
29
- context "when running the backtrace cleaner" do
30
- let(:notification) { Appsignal::ExceptionNotification.new({}, error) }
31
-
32
- it { should == [
33
- 'app/controllers/somethings_controller.rb:10',
34
- '/user/local/ruby/path.rb:8'
35
- ] }
36
- end
37
- end
38
- end