appsignal 0.12.rc.14 → 1.0.0.rc.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d5d48a39d924257facf894b4a9c2e636936db173
4
- data.tar.gz: 959db33de85929f774e51c1ac25120a5cfef3d12
3
+ metadata.gz: dfb150bcd1300dfd0f72554fcfb79432a20d1c37
4
+ data.tar.gz: a4a4b0c5dea4885c6aabc140a4e31bf7090bda07
5
5
  SHA512:
6
- metadata.gz: 8908e5a4de9c5edb13d923e57c32358dca86e7582ce976dc046ccb62e6183c237a8d4c0469d66afd0852d08be1e162a633bc21af787c1b9783e8e965c6846655
7
- data.tar.gz: 9c2b984abd3d0734885560f9bb8a94dfa8a5fc6bdd6edb7756bace964efff1265f6f6f17d494cff61a586ecd87713a2dab25cf51075fd2a0db578e8c598a2d3c
6
+ metadata.gz: 01f13f11bd5f14d9db6a35440cbf981acadef9861feb31d99f9a775ac3d39e6490eb8fd6c8cf2bf4119326205e91f9d6c3fbf14f7fc4edc4f705c2d3daf34506
7
+ data.tar.gz: a70a256d58b07fcd17ff8943ce8c182bc1f00c1d767f2b7819b7ea0accdf57b0db02a1592087db5ec2e5454ea55329d7d8cfc2ca385b5da6dc8657b40c181ec5
@@ -1,30 +1,43 @@
1
+ sudo: false
2
+
1
3
  language: ruby
2
4
 
3
5
  rvm:
4
- - "1.9.2"
5
6
  - "1.9.3"
6
7
  - "2.0.0"
7
- - "2.1.1"
8
+ - "2.1.8"
9
+ - "2.2.4"
10
+ - "2.3.0"
8
11
  - "jruby-19mode"
9
- - "rbx"
10
12
 
11
13
  gemfile:
12
14
  - "gemfiles/capistrano2.gemfile"
13
15
  - "gemfiles/capistrano3.gemfile"
14
16
  - "gemfiles/no_dependencies.gemfile"
15
- - "gemfiles/rails-3.0.gemfile"
16
- - "gemfiles/rails-3.1.gemfile"
17
+ - "gemfiles/padrino.gemfile"
17
18
  - "gemfiles/rails-3.2.gemfile"
18
19
  - "gemfiles/rails-4.0.gemfile"
19
20
  - "gemfiles/rails-4.1.gemfile"
21
+ - "gemfiles/rails-4.2.gemfile"
22
+ - "gemfiles/rails-5.0.gemfile"
23
+ - "gemfiles/resque.gemfile"
20
24
  - "gemfiles/sequel.gemfile"
21
25
  - "gemfiles/sinatra.gemfile"
22
26
 
23
27
  matrix:
28
+ exclude:
29
+ - rvm: "1.9.3"
30
+ gemfile: "gemfiles/rails-5.0.gemfile"
31
+ - rvm: "2.0.0"
32
+ gemfile: "gemfiles/rails-5.0.gemfile"
33
+ - rvm: "2.1.8"
34
+ gemfile: "gemfiles/rails-5.0.gemfile"
35
+ - rvm: "jruby-19mode"
36
+ gemfile: "gemfiles/rails-5.0.gemfile"
24
37
  allow_failures:
25
- - rvm: "rbx"
38
+ - rvm: "jruby-19mode"
26
39
 
27
40
  env:
28
41
  global: "RAILS_ENV=test"
29
42
 
30
- script: "bundle exec rspec"
43
+ script: "bundle exec rake travis"
@@ -1,8 +1,10 @@
1
- # 0.12.0
1
+ # 1.0.0
2
2
  * New version of event formatting and collection
3
3
  * Use native library and agent
4
4
  * Use API V2
5
5
  * Support for Mongoid 5
6
+ * Integration into other gems with a hooks system
7
+ * Lots of minor bug fixes and improvements
6
8
 
7
9
  # 0.11.15
8
10
  * Improve Sinatra support
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ require 'rspec/core/rake_task'
2
+
1
3
  GEMFILES = %w(
2
4
  capistrano2
3
5
  capistrano3
@@ -7,17 +9,24 @@ GEMFILES = %w(
7
9
  rails-4.0
8
10
  rails-4.1
9
11
  rails-4.2
12
+ rails-5.0
13
+ resque
10
14
  sequel
11
15
  sinatra
12
16
  )
13
17
 
14
18
  RUBY_VERSIONS = %w(
15
- 1.9.3-p429
16
- 2.0.0-p451
17
- 2.1.2
18
- 2.2.0
19
+ 1.9.3-p551
20
+ 2.0.0-p648
21
+ 2.1.8
22
+ 2.2.4
23
+ 2.3.0
19
24
  )
20
25
 
26
+ EXCLUSIONS = {
27
+ 'rails-5.0' => %w( 1.9.3-p551 2.0.0-p648 2.1.8)
28
+ }
29
+
21
30
  VERSION_MANAGERS = {
22
31
  :rbenv => 'rbenv local',
23
32
  :rvm => 'rvm use'
@@ -44,10 +53,10 @@ task :publish do
44
53
  puts `git commit -am 'Bump to #{version} [ci skip]'`
45
54
  puts "# Creating tag #{version}"
46
55
  puts `git tag #{version}`
47
- puts `git push origin #{version}`
48
- puts `git push appsignal #{version}`
49
- puts `git push origin #{branch}`
50
- puts `git push appsignal #{branch}`
56
+ puts `git push public #{version}`
57
+ puts `git push private #{version}`
58
+ puts `git push public #{branch}`
59
+ puts `git push private #{branch}`
51
60
  rescue
52
61
  raise "Tag: '#{version}' already exists"
53
62
  end
@@ -100,7 +109,7 @@ task :install do
100
109
  end
101
110
  end
102
111
 
103
- task :spec do
112
+ task :spec_all_gemfiles do
104
113
  GEMFILES.each do |gemfile|
105
114
  puts "Running #{gemfile}"
106
115
  raise 'Not successful' unless system("env BUNDLE_GEMFILE=gemfiles/#{gemfile}.gemfile bundle exec rspec")
@@ -122,13 +131,15 @@ task :generate_bundle_and_spec_all do
122
131
  out << "#{switch_command} #{version} || { echo 'Switching Ruby failed'; exit 1; }"
123
132
  out << 'cd ext && rm -f libappsignal.a && ruby extconf.rb && make clean && make && cd ..'
124
133
  GEMFILES.each do |gemfile|
125
- out << "echo 'Bundling #{gemfile} in #{version}'"
126
- out << "bundle --quiet --gemfile gemfiles/#{gemfile}.gemfile || { echo 'Bundling failed'; exit 1; }"
127
- out << "echo 'Running #{gemfile} in #{version}'"
128
- out << "env BUNDLE_GEMFILE=gemfiles/#{gemfile}.gemfile bundle exec rspec || { echo 'Running specs failed'; exit 1; }"
134
+ unless EXCLUSIONS[gemfile] && EXCLUSIONS[gemfile].include?(version)
135
+ out << "echo 'Bundling #{gemfile} in #{version}'"
136
+ out << "bundle --quiet --gemfile gemfiles/#{gemfile}.gemfile || { echo 'Bundling failed'; exit 1; }"
137
+ out << "echo 'Running #{gemfile} in #{version}'"
138
+ out << "env BUNDLE_GEMFILE=gemfiles/#{gemfile}.gemfile bundle exec rspec || { echo 'Running specs failed'; exit 1; }"
139
+ end
129
140
  end
130
141
  end
131
- out << 'rm .ruby-version'
142
+ out << 'rm -f .ruby-version'
132
143
  out << "echo 'Successfully ran specs for all environments'"
133
144
 
134
145
  script = "bundle_and_spec_all_#{version_manager}.sh"
@@ -151,4 +162,14 @@ task :console do
151
162
  IRB.start
152
163
  end
153
164
 
154
- task :default => [:generate_bundle_and_spec_all, :spec]
165
+ task :install_extension do
166
+ `cd ext && rm -f libappsignal.a && ruby extconf.rb && make clean && make`
167
+ end
168
+
169
+ RSpec::Core::RakeTask.new(:rspec) do |t|
170
+ t.pattern = Dir.glob('spec/**/*_spec.rb')
171
+ end
172
+
173
+ task :travis => [:install_extension, :rspec]
174
+
175
+ task :default => [:generate_bundle_and_spec_all, :spec_all_gemfiles]
@@ -1,15 +1,15 @@
1
1
  ---
2
- :version: 198f4fc
2
+ :version: 9e5359a
3
3
  :triples:
4
4
  x86_64-linux:
5
- :checksum: 0519f250f1442c02c69e6bda52b1b3cac852e7d9a6e8da6365344d6009588727
6
- :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/198f4fc/appsignal-agent-x86_64-linux-static.tar.gz
5
+ :checksum: cafe3e12730619db156edc7d36ce4c6e7a367fba94dcb509c0373e46beeacc00
6
+ :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/9e5359a/appsignal-agent-x86_64-linux-static.tar.gz
7
7
  :lib_filename: libappsignal.a
8
8
  i686-linux:
9
- :checksum: f38faad12bf0f452c85776c2a882a600186237334970b21b691c6671ac661401
10
- :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/198f4fc/appsignal-agent-i686-linux-static.tar.gz
9
+ :checksum: 4f5453174877e5bbc61e686eadfd741870eb5ed7713a405440ba8cfa77a884d8
10
+ :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/9e5359a/appsignal-agent-i686-linux-static.tar.gz
11
11
  :lib_filename: libappsignal.a
12
12
  x86_64-darwin:
13
- :checksum: 53a59e437366aedc339ef25dbbb9aa70b3ccc353faa6cac2b1777a72fd211cd4
14
- :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/198f4fc/appsignal-agent-x86_64-darwin-static.tar.gz
13
+ :checksum: 19d974f0ce1c8e1e296f631876f050992b2de055e0f835c07a811da6513c621d
14
+ :download_url: https://appsignal-agent-releases.global.ssl.fastly.net/9e5359a/appsignal-agent-x86_64-darwin-static.tar.gz
15
15
  :lib_filename: libappsignal.a
@@ -105,9 +105,11 @@ static VALUE set_transaction_metadata(VALUE self, VALUE transaction_index, VALUE
105
105
  }
106
106
 
107
107
  static VALUE finish_transaction(VALUE self, VALUE transaction_index) {
108
+ int sample;
109
+
108
110
  Check_Type(transaction_index, T_FIXNUM);
109
111
 
110
- int sample = appsignal_finish_transaction(FIX2INT(transaction_index));
112
+ sample = appsignal_finish_transaction(FIX2INT(transaction_index));
111
113
  return sample == 1 ? Qtrue : Qfalse;
112
114
  }
113
115
 
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'rails', '~> 4.2.0.rc'
3
+ gem 'rails', '~> 4.2.0'
4
4
 
5
5
  gem 'generator_spec'
6
6
 
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 5.0.0.beta'
4
+
5
+ gem 'generator_spec'
6
+
7
+ gemspec :path => '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'resque'
4
+
5
+ gemspec :path => '../'
@@ -1,11 +1,15 @@
1
1
  require 'logger'
2
2
  require 'securerandom'
3
3
 
4
+ # Make sure we have the notification system
4
5
  begin
5
6
  require 'active_support/notifications'
6
7
  ActiveSupport::Notifications::Fanout::Subscribers::Timed # See it it's recent enough
7
- rescue LoadError, NameError
8
+ rescue LoadError
8
9
  require 'vendor/active_support/notifications'
10
+ rescue NameError
11
+ require 'appsignal/update_active_support'
12
+ Appsignal::UpdateActiveSupport.run
9
13
  end
10
14
 
11
15
  module Appsignal
@@ -250,6 +254,7 @@ require 'appsignal/hooks'
250
254
  require 'appsignal/marker'
251
255
  require 'appsignal/params_sanitizer'
252
256
  require 'appsignal/integrations/railtie' if defined?(::Rails)
257
+ require 'appsignal/integrations/resque'
253
258
  require 'appsignal/subscriber'
254
259
  require 'appsignal/transaction'
255
260
  require 'appsignal/version'
@@ -6,7 +6,7 @@ module Appsignal
6
6
 
7
7
  SINGLE_QUOTED_STRING = /'(.?|[^']).*'/.freeze
8
8
  DOUBLE_QUOTED_STRING = /"(.?|[^"]).*"/.freeze
9
- IN_OPERATOR_CONTENT = /(IN \()[^\)]+(\))/.freeze
9
+ IN_OPERATOR_CONTENT = /(IN \()[^SELECT][^\)]+(\))/.freeze
10
10
  NUMERIC = /\d*\.?\d+/.freeze
11
11
  REPLACEMENT = '?'.freeze
12
12
  IN_REPLACEMENT = '\1?\2'.freeze
@@ -55,7 +55,6 @@ require 'appsignal/hooks/passenger'
55
55
  require 'appsignal/hooks/puma'
56
56
  require 'appsignal/hooks/rake'
57
57
  require 'appsignal/hooks/redis'
58
- require 'appsignal/hooks/resque'
59
58
  require 'appsignal/hooks/sequel'
60
59
  require 'appsignal/hooks/sidekiq'
61
60
  require 'appsignal/hooks/unicorn'
@@ -9,18 +9,10 @@ module Appsignal
9
9
 
10
10
  def install
11
11
  ::Rake::Task.class_eval do
12
- alias :invoke_without_appsignal :invoke
12
+ alias :execute_without_appsignal :execute
13
13
 
14
- def invoke(*args)
15
- if Appsignal.active?
16
- invoke_with_appsignal(*args)
17
- else
18
- invoke_without_appsignal(*args)
19
- end
20
- end
21
-
22
- def invoke_with_appsignal(*args)
23
- invoke_without_appsignal(*args)
14
+ def execute(*args)
15
+ execute_without_appsignal(*args)
24
16
  rescue => error
25
17
  transaction = Appsignal::Transaction.create(
26
18
  SecureRandom.uuid,
@@ -31,7 +23,7 @@ module Appsignal
31
23
  )
32
24
  transaction.set_action(name)
33
25
  transaction.set_error(error)
34
- transaction.complete!
26
+ transaction.complete
35
27
  Appsignal.stop
36
28
  raise error
37
29
  end
@@ -0,0 +1,15 @@
1
+ module Appsignal
2
+ module Integrations
3
+ module ResquePlugin
4
+ def around_perform_resque_plugin(*args)
5
+ Appsignal.monitor_transaction(
6
+ 'perform_job.resque',
7
+ :class => self.to_s,
8
+ :method => 'perform'
9
+ ) do
10
+ yield
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -31,14 +31,14 @@ module Appsignal
31
31
 
32
32
  def start(name, id, payload)
33
33
  return unless transaction = Appsignal::Transaction.current
34
- return if transaction.paused?
34
+ return if transaction.nil_transaction? || transaction.paused?
35
35
 
36
36
  Appsignal::Extension.start_event(transaction.transaction_index)
37
37
  end
38
38
 
39
39
  def finish(name, id, payload)
40
40
  return unless transaction = Appsignal::Transaction.current
41
- return if transaction.paused?
41
+ return if transaction.nil_transaction? || transaction.paused?
42
42
 
43
43
  title, body = Appsignal::EventFormatter.format(name, payload)
44
44
  Appsignal::Extension.finish_event(
@@ -21,16 +21,12 @@ module Appsignal
21
21
  end
22
22
 
23
23
  def current
24
- Thread.current[:appsignal_transaction]
24
+ Thread.current[:appsignal_transaction] || NilTransaction.new
25
25
  end
26
26
 
27
27
  def complete_current!
28
- if current
29
- current.complete
30
- Thread.current[:appsignal_transaction] = nil
31
- else
32
- Appsignal.logger.error('Trying to complete current, but no transaction present')
33
- end
28
+ current.complete
29
+ Thread.current[:appsignal_transaction] = nil
34
30
  end
35
31
  end
36
32
 
@@ -49,6 +45,10 @@ module Appsignal
49
45
  @transaction_index = Appsignal::Extension.start_transaction(@transaction_id, @namespace)
50
46
  end
51
47
 
48
+ def nil_transaction?
49
+ false
50
+ end
51
+
52
52
  def complete
53
53
  if Appsignal::Extension.finish_transaction(transaction_index)
54
54
  sample_data
@@ -230,5 +230,16 @@ module Appsignal
230
230
  backtrace
231
231
  end
232
232
  end
233
+
234
+ # Stub that is returned by `Transaction.current` if there is no current transaction, so
235
+ # that it's still safe to call methods on it if there is none.
236
+ class NilTransaction
237
+ def method_missing(m, *args, &block)
238
+ end
239
+
240
+ def nil_transaction?
241
+ true
242
+ end
243
+ end
233
244
  end
234
245
  end
@@ -0,0 +1,20 @@
1
+ module Appsignal
2
+ module UpdateActiveSupport
3
+ def self.run
4
+ # Get the old subscribers if present
5
+ old_notifier = ActiveSupport::Notifications.notifier
6
+ subscribers = old_notifier.instance_variable_get('@subscribers') || []
7
+
8
+ # Require the newer notifications
9
+ require 'vendor/active_support/notifications'
10
+
11
+ # Re-subscribe the old subscribers
12
+ subscribers.each do |sub|
13
+ pattern = sub.instance_variable_get('@pattern')
14
+ delegate = sub.instance_variable_get('@delegate')
15
+ next unless pattern && delegate
16
+ ActiveSupport::Notifications.subscribe(pattern, delegate)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,5 +1,5 @@
1
1
  require 'yaml'
2
2
 
3
3
  module Appsignal
4
- VERSION = '0.12.rc.14'
4
+ VERSION = '1.0.0.rc.1'
5
5
  end
@@ -90,11 +90,17 @@ if active_record_present?
90
90
  end
91
91
  end
92
92
 
93
- context "in operator with params" do
93
+ context "in operator with values" do
94
94
  let(:sql) { 'SELECT `table`.* FROM `table` WHERE `id` IN (1, 2)' }
95
95
 
96
96
  it { should == ['Model load', 'SELECT `table`.* FROM `table` WHERE `id` IN (?)'] }
97
97
  end
98
+
99
+ context "in operator with inner query" do
100
+ let(:sql) { 'SELECT `table`.* FROM `table` WHERE `id` IN (SELECT `id` from `other_table` WHERE `value` = 10.0)' }
101
+
102
+ it { should == ['Model load', 'SELECT `table`.* FROM `table` WHERE `id` IN (SELECT `id` from `other_table` WHERE `value` = ?)'] }
103
+ end
98
104
  end
99
105
 
100
106
  context "with double quote style table names" do
@@ -6,51 +6,29 @@ describe Appsignal::Hooks::RakeHook do
6
6
  let(:task) { Rake::Task.new('task', app) }
7
7
  before do
8
8
  task.stub(
9
- :name => 'task:name',
10
- :invoke_without_appsignal => true
9
+ :name => 'task:name',
10
+ :execute_without_appsignal => true
11
11
  )
12
12
  end
13
13
  before :all do
14
14
  Appsignal::Hooks::RakeHook.new.install
15
15
  end
16
16
 
17
- describe "#invoke" do
18
- before { Appsignal.stub(:active? => true) }
19
-
20
- it "should call with appsignal monitoring" do
21
- expect( task ).to receive(:invoke_with_appsignal).with(['foo'])
22
- end
23
-
24
- context "when not active" do
25
- before { Appsignal.stub(:active? => false) }
26
-
27
- it "should NOT call with appsignal monitoring" do
28
- expect( task ).to_not receive(:invoke_with_appsignal).with(['foo'])
29
- end
30
-
31
- it "should call the original task" do
32
- expect( task ).to receive(:invoke_without_appsignal).with(['foo'])
33
- end
34
- end
35
-
36
- after { task.invoke(['foo']) }
37
- end
38
-
39
- describe "#invoke_with_appsignal" do
17
+ describe "#execute" do
40
18
  context "with transaction" do
41
19
  let!(:transaction) { regular_transaction }
42
20
  let!(:agent) { double('Agent', :send_queue => true) }
43
21
  before do
44
22
  transaction.stub(:set_action)
45
23
  transaction.stub(:set_error)
46
- transaction.stub(:complete!)
24
+ transaction.stub(:complete)
47
25
  SecureRandom.stub(:uuid => '123')
48
26
  Appsignal::Transaction.stub(:create => transaction)
49
27
  Appsignal.stub(:active? => true)
50
28
  end
51
29
 
52
30
  it "should call the original task" do
53
- expect( task ).to receive(:invoke_without_appsignal).with('foo')
31
+ expect( task ).to receive(:execute_without_appsignal).with('foo')
54
32
  end
55
33
 
56
34
  it "should not create a transaction" do
@@ -61,7 +39,7 @@ describe Appsignal::Hooks::RakeHook do
61
39
  let(:exception) { VerySpecificError.new }
62
40
 
63
41
  before do
64
- task.stub(:invoke_without_appsignal).and_raise(exception)
42
+ task.stub(:execute_without_appsignal).and_raise(exception)
65
43
  end
66
44
 
67
45
  it "should create a transaction" do
@@ -81,7 +59,7 @@ describe Appsignal::Hooks::RakeHook do
81
59
  end
82
60
 
83
61
  it "should call complete! on the transaction" do
84
- expect( transaction ).to receive(:complete!)
62
+ expect( transaction ).to receive(:complete)
85
63
  end
86
64
 
87
65
  it "should stop appsignal" do
@@ -90,6 +68,6 @@ describe Appsignal::Hooks::RakeHook do
90
68
  end
91
69
  end
92
70
 
93
- after { task.invoke_with_appsignal('foo') rescue VerySpecificError }
71
+ after { task.execute('foo') rescue VerySpecificError }
94
72
  end
95
73
  end
@@ -8,7 +8,7 @@ describe Appsignal::Hooks::RedisHook do
8
8
  context "with redis" do
9
9
  context "with redis" do
10
10
  before :all do
11
- module Redis
11
+ class Redis
12
12
  class Client
13
13
  def process(commands, &block)
14
14
  1
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ if resque_present?
4
+ describe "Resque integration" do
5
+ let(:file) { File.expand_path('lib/appsignal/integrations/resque.rb') }
6
+
7
+ context "with resque" do
8
+ before do
9
+ load file
10
+ start_agent
11
+
12
+ class TestJob
13
+ extend Appsignal::Integrations::ResquePlugin
14
+
15
+ def self.perform
16
+ end
17
+ end
18
+
19
+ class BrokenTestJob
20
+ extend Appsignal::Integrations::ResquePlugin
21
+
22
+ def self.perform
23
+ raise VerySpecificError.new('broken')
24
+ end
25
+ end
26
+ end
27
+
28
+ describe :around_perform_resque_plugin do
29
+ let(:transaction) { Appsignal::Transaction.new('1', 'background', {}, {}) }
30
+ let(:job) { Resque::Job.new('default', {'class' => 'TestJob'}) }
31
+ before do
32
+ transaction.stub(:complete => true)
33
+ Appsignal::Transaction.stub(:current => transaction)
34
+ end
35
+
36
+ context "without exception" do
37
+ it "should create a new transaction" do
38
+ Appsignal::Transaction.should_receive(:create).and_return(transaction)
39
+ end
40
+
41
+ it "should wrap in a transaction with the correct params" do
42
+ Appsignal.should_receive(:monitor_transaction).with(
43
+ 'perform_job.resque',
44
+ :class => 'TestJob',
45
+ :method => 'perform'
46
+ )
47
+ end
48
+
49
+ it "should close the transaction" do
50
+ transaction.should_receive(:complete)
51
+ end
52
+
53
+ after { job.perform }
54
+ end
55
+
56
+ context "with exception" do
57
+ let(:job) { Resque::Job.new('default', {'class' => 'BrokenTestJob'}) }
58
+
59
+ it "should set the exception" do
60
+ Appsignal::Transaction.any_instance.should_receive(:set_error)
61
+ end
62
+
63
+ after do
64
+ begin
65
+ job.perform
66
+ rescue VerySpecificError
67
+ # Do nothing
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ context "without resque" do
75
+ before(:all) { Object.send(:remove_const, :Resque) }
76
+
77
+ specify { expect { ::Resque }.to raise_error(NameError) }
78
+ specify { expect { load file }.to_not raise_error }
79
+ end
80
+ end
81
+ end
@@ -40,33 +40,44 @@ describe Appsignal::Transaction do
40
40
  end
41
41
 
42
42
  describe '.current' do
43
- before { transaction }
44
43
  subject { Appsignal::Transaction.current }
45
44
 
46
- it 'should return the correct transaction' do
47
- should == transaction
48
- end
49
- end
45
+ context "if there is a transaction" do
46
+ before { transaction }
50
47
 
51
- describe "complete_current!" do
52
- before { Thread.current[:appsignal_transaction] = nil }
48
+ it "should return the correct transaction" do
49
+ should == transaction
50
+ end
53
51
 
54
- context "with a current transaction" do
55
- before { Appsignal::Transaction.create('2', Appsignal::Transaction::HTTP_REQUEST, {}) }
52
+ it "should indicate it's not a nil transaction" do
53
+ subject.nil_transaction?.should be_false
54
+ end
55
+ end
56
56
 
57
- it "should complete the current transaction and set the thread appsignal_transaction to nil" do
58
- Appsignal::Extension.should_receive(:finish_transaction).with(kind_of(Integer))
57
+ context "if there is no transaction" do
58
+ before do
59
+ Thread.current[:appsignal_transaction] = nil
60
+ end
59
61
 
60
- Appsignal::Transaction.complete_current!
62
+ it "should return a nil transaction stub" do
63
+ should be_a Appsignal::Transaction::NilTransaction
64
+ end
61
65
 
62
- Thread.current[:appsignal_transaction].should be_nil
66
+ it "should indicate it's a nil transaction" do
67
+ subject.nil_transaction?.should be_true
63
68
  end
64
69
  end
70
+ end
65
71
 
66
- context "without a current transaction" do
67
- it "should not raise an error" do
68
- Appsignal::Transaction.complete_current!
69
- end
72
+ describe "complete_current!" do
73
+ before { Appsignal::Transaction.create('2', Appsignal::Transaction::HTTP_REQUEST, {}) }
74
+
75
+ it "should complete the current transaction and set the thread appsignal_transaction to nil" do
76
+ Appsignal::Extension.should_receive(:finish_transaction).with(kind_of(Integer))
77
+
78
+ Appsignal::Transaction.complete_current!
79
+
80
+ Thread.current[:appsignal_transaction].should be_nil
70
81
  end
71
82
  end
72
83
  end
@@ -587,7 +598,7 @@ describe Appsignal::Transaction do
587
598
  def load_session(env); [1, {:foo => :bar}]; end
588
599
  def session_exists?(env); true; end
589
600
  }.new
590
- ActionDispatch::Request::Session.create(store, {}, {})
601
+ ActionDispatch::Request::Session.create(store, ActionDispatch::Request.new('rack.input' => StringIO.new), {})
591
602
  end
592
603
  end
593
604
  end
@@ -641,4 +652,27 @@ describe Appsignal::Transaction do
641
652
  pending "calls Rails backtrace cleaner if Rails is present"
642
653
  end
643
654
  end
655
+
656
+ describe Appsignal::Transaction::NilTransaction do
657
+ subject { Appsignal::Transaction::NilTransaction.new }
658
+
659
+ it "should have method stubs" do
660
+ lambda {
661
+ subject.complete
662
+ subject.pause!
663
+ subject.resume!
664
+ subject.paused?
665
+ subject.store(:key)
666
+ subject.set_tags(:tag => 1)
667
+ subject.set_action('action')
668
+ subject.set_http_or_background_action
669
+ subject.set_queue_start(1)
670
+ subject.set_http_or_background_queue_start
671
+ subject.set_metadata('key', 'value')
672
+ subject.set_sample_data('key', 'data')
673
+ subject.sample_data
674
+ subject.set_error('a')
675
+ }.should_not raise_error
676
+ end
677
+ end
644
678
  end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Appsignal::UpdateActiveSupport', :if => (
4
+ Gem.loaded_specs['rails'] &&
5
+ Gem.loaded_specs['rails'].version < Gem::Version.create('4.0')
6
+ ) do
7
+ require 'appsignal/update_active_support'
8
+ let(:pattern) { 'foo' }
9
+ let(:delegate) { double }
10
+ before { ActiveSupport::Notifications.subscribe(pattern, delegate) }
11
+
12
+ it "should transfer old subscriptions to the new version" do
13
+ expect( ActiveSupport::Notifications ).to receive(:subscribe).with(pattern, delegate)
14
+ end
15
+
16
+ after { Appsignal::UpdateActiveSupport.run }
17
+ end
@@ -53,6 +53,13 @@ rescue LoadError
53
53
  false
54
54
  end
55
55
 
56
+ def resque_present?
57
+ require 'resque'
58
+ true
59
+ rescue LoadError
60
+ false
61
+ end
62
+
56
63
  def padrino_present?
57
64
  require 'padrino'
58
65
  true
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.rc.14
4
+ version: 1.0.0.rc.1
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: 2016-01-06 00:00:00.000000000 Z
12
+ date: 2016-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -140,6 +140,8 @@ files:
140
140
  - gemfiles/rails-4.0.gemfile
141
141
  - gemfiles/rails-4.1.gemfile
142
142
  - gemfiles/rails-4.2.gemfile
143
+ - gemfiles/rails-5.0.gemfile
144
+ - gemfiles/resque.gemfile
143
145
  - gemfiles/sequel.gemfile
144
146
  - gemfiles/sinatra.gemfile
145
147
  - lib/appsignal.rb
@@ -162,7 +164,6 @@ files:
162
164
  - lib/appsignal/hooks/puma.rb
163
165
  - lib/appsignal/hooks/rake.rb
164
166
  - lib/appsignal/hooks/redis.rb
165
- - lib/appsignal/hooks/resque.rb
166
167
  - lib/appsignal/hooks/sequel.rb
167
168
  - lib/appsignal/hooks/sidekiq.rb
168
169
  - lib/appsignal/hooks/unicorn.rb
@@ -173,6 +174,7 @@ files:
173
174
  - lib/appsignal/integrations/mongo_ruby_driver.rb
174
175
  - lib/appsignal/integrations/padrino.rb
175
176
  - lib/appsignal/integrations/railtie.rb
177
+ - lib/appsignal/integrations/resque.rb
176
178
  - lib/appsignal/integrations/sinatra.rb
177
179
  - lib/appsignal/js_exception_transaction.rb
178
180
  - lib/appsignal/marker.rb
@@ -184,6 +186,7 @@ files:
184
186
  - lib/appsignal/subscriber.rb
185
187
  - lib/appsignal/transaction.rb
186
188
  - lib/appsignal/transmitter.rb
189
+ - lib/appsignal/update_active_support.rb
187
190
  - lib/appsignal/utils.rb
188
191
  - lib/appsignal/version.rb
189
192
  - lib/generators/appsignal/USAGE
@@ -214,7 +217,6 @@ files:
214
217
  - spec/lib/appsignal/hooks/puma_spec.rb
215
218
  - spec/lib/appsignal/hooks/rake_spec.rb
216
219
  - spec/lib/appsignal/hooks/redis_spec.rb
217
- - spec/lib/appsignal/hooks/resque_spec.rb
218
220
  - spec/lib/appsignal/hooks/sequel_spec.rb
219
221
  - spec/lib/appsignal/hooks/sidekiq_spec.rb
220
222
  - spec/lib/appsignal/hooks/unicorn_spec.rb
@@ -222,6 +224,7 @@ files:
222
224
  - spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb
223
225
  - spec/lib/appsignal/integrations/padrino_spec.rb
224
226
  - spec/lib/appsignal/integrations/railtie_spec.rb
227
+ - spec/lib/appsignal/integrations/resque_spec.rb
225
228
  - spec/lib/appsignal/integrations/sinatra_spec.rb
226
229
  - spec/lib/appsignal/js_exception_transaction_spec.rb
227
230
  - spec/lib/appsignal/marker_spec.rb
@@ -233,6 +236,7 @@ files:
233
236
  - spec/lib/appsignal/subscriber_spec.rb
234
237
  - spec/lib/appsignal/transaction_spec.rb
235
238
  - spec/lib/appsignal/transmitter_spec.rb
239
+ - spec/lib/appsignal/update_active_support_spec.rb
236
240
  - spec/lib/appsignal/utils_spec.rb
237
241
  - spec/lib/appsignal_spec.rb
238
242
  - spec/lib/generators/appsignal/appsignal_generator_spec.rb
@@ -271,7 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
271
275
  version: 1.3.1
272
276
  requirements: []
273
277
  rubyforge_project:
274
- rubygems_version: 2.4.5
278
+ rubygems_version: 2.2.5
275
279
  signing_key:
276
280
  specification_version: 4
277
281
  summary: Logs performance and exception data from your app to appsignal.com
@@ -295,7 +299,6 @@ test_files:
295
299
  - spec/lib/appsignal/hooks/puma_spec.rb
296
300
  - spec/lib/appsignal/hooks/rake_spec.rb
297
301
  - spec/lib/appsignal/hooks/redis_spec.rb
298
- - spec/lib/appsignal/hooks/resque_spec.rb
299
302
  - spec/lib/appsignal/hooks/sequel_spec.rb
300
303
  - spec/lib/appsignal/hooks/sidekiq_spec.rb
301
304
  - spec/lib/appsignal/hooks/unicorn_spec.rb
@@ -303,6 +306,7 @@ test_files:
303
306
  - spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb
304
307
  - spec/lib/appsignal/integrations/padrino_spec.rb
305
308
  - spec/lib/appsignal/integrations/railtie_spec.rb
309
+ - spec/lib/appsignal/integrations/resque_spec.rb
306
310
  - spec/lib/appsignal/integrations/sinatra_spec.rb
307
311
  - spec/lib/appsignal/js_exception_transaction_spec.rb
308
312
  - spec/lib/appsignal/marker_spec.rb
@@ -314,6 +318,7 @@ test_files:
314
318
  - spec/lib/appsignal/subscriber_spec.rb
315
319
  - spec/lib/appsignal/transaction_spec.rb
316
320
  - spec/lib/appsignal/transmitter_spec.rb
321
+ - spec/lib/appsignal/update_active_support_spec.rb
317
322
  - spec/lib/appsignal/utils_spec.rb
318
323
  - spec/lib/appsignal_spec.rb
319
324
  - spec/lib/generators/appsignal/appsignal_generator_spec.rb
@@ -1,28 +0,0 @@
1
- module Appsignal
2
- class Hooks
3
- module ResquePlugin
4
- def around_perform_resque_plugin(*args)
5
- Appsignal.monitor_single_transaction(
6
- 'perform_job.resque',
7
- :class => self.to_s,
8
- :method => 'perform'
9
- ) do
10
- yield
11
- end
12
- end
13
- end
14
-
15
- class ResqueHook < Appsignal::Hooks::Hook
16
- register :resque
17
-
18
- def dependencies_present?
19
- defined?(::Resque)
20
- end
21
-
22
- def install
23
- # Extend the default job class with AppSignal instrumentation
24
- ::Resque::Job.send(:extend, Appsignal::Hooks::ResquePlugin)
25
- end
26
- end
27
- end
28
- end
@@ -1,72 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Appsignal::Hooks::ResqueHook do
4
- context "with resque" do
5
- before :all do
6
- module Resque
7
- def self.before_first_fork
8
- end
9
-
10
- def self.after_fork
11
- end
12
-
13
- class Job
14
- end
15
-
16
- class TestError < StandardError
17
- end
18
- end
19
- Appsignal::Hooks::ResqueHook.new.install
20
- start_agent
21
- end
22
- after(:all) { Object.send(:remove_const, :Resque) }
23
-
24
- describe :around_perform_resque_plugin do
25
- let(:transaction) { background_job_transaction }
26
- let(:job) { Resque::Job }
27
- let(:invoked_job) { nil }
28
- before do
29
- transaction.stub(:complete! => true)
30
- Appsignal::Transaction.stub(:current => transaction)
31
- end
32
-
33
- context "without exception" do
34
- it "should create a new transaction" do
35
- Appsignal::Transaction.should_receive(:create).and_return(transaction)
36
- end
37
-
38
- it "should wrap in a transaction with the correct params" do
39
- Appsignal.should_receive(:monitor_single_transaction).with(
40
- 'perform_job.resque',
41
- :class => 'Resque::Job',
42
- :method => 'perform'
43
- )
44
- end
45
-
46
- it "should close the transaction" do
47
- Appsignal::Transaction.should_receive(:complete_current!)
48
- end
49
-
50
- after { job.around_perform_resque_plugin { invoked_job } }
51
- end
52
-
53
- context "with exception" do
54
- it "should set the exception" do
55
- Appsignal::Transaction.any_instance.should_receive(:set_error)
56
- end
57
-
58
- after do
59
- begin
60
- job.around_perform_resque_plugin { raise(Resque::TestError.new('the roof')) }
61
- rescue Resque::TestError
62
- # Do nothing
63
- end
64
- end
65
- end
66
- end
67
- end
68
-
69
- context "without resque" do
70
- its(:dependencies_present?) { should be_false }
71
- end
72
- end