appsignal 0.8.15 → 0.9.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -2
- data/README.md +4 -0
- data/Rakefile +8 -0
- data/appsignal.gemspec +0 -1
- data/gemfiles/capistrano2.gemfile +5 -0
- data/gemfiles/capistrano3.gemfile +5 -0
- data/lib/appsignal.rb +10 -4
- data/lib/appsignal/agent.rb +5 -10
- data/lib/appsignal/capistrano.rb +8 -1
- data/lib/appsignal/config.rb +2 -1
- data/lib/appsignal/instrumentations/net_http.rb +15 -0
- data/lib/appsignal/integrations/capistrano/appsignal.cap +27 -0
- data/lib/appsignal/integrations/{capistrano.rb → capistrano/capistrano_2_tasks.rb} +2 -4
- data/lib/appsignal/integrations/capistrano/careful_logger.rb +1 -1
- data/lib/appsignal/integrations/delayed_job.rb +2 -4
- data/lib/appsignal/integrations/resque.rb +2 -4
- data/lib/appsignal/integrations/sidekiq.rb +2 -4
- data/lib/appsignal/marker.rb +1 -1
- data/lib/appsignal/rack/instrumentation.rb +1 -0
- data/lib/appsignal/rack/listener.rb +3 -4
- data/lib/appsignal/transaction.rb +16 -4
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/agent_spec.rb +1 -23
- data/spec/lib/appsignal/config_spec.rb +2 -0
- data/spec/lib/appsignal/instrumentations/net_http_spec.rb +26 -0
- data/spec/lib/appsignal/integrations/capistrano2_spec.rb +178 -0
- data/spec/lib/appsignal/integrations/capistrano3_spec.rb +169 -0
- data/spec/lib/appsignal/integrations/resque_spec.rb +1 -1
- data/spec/lib/appsignal/marker_spec.rb +13 -10
- data/spec/lib/appsignal/transaction_spec.rb +34 -13
- data/spec/lib/appsignal_spec.rb +35 -0
- data/spec/lib/generators/appsignal/appsignal_generator_spec.rb +13 -14
- data/spec/spec_helper.rb +14 -0
- metadata +15 -21
- data/spec/lib/appsignal/integrations/capistrano_spec.rb +0 -151
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5027037bb3729ff0670c601fbe27fc5d84382ef4
|
4
|
+
data.tar.gz: 886a06cd1a10ca255c4b40d7f302a2e364e8f07e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db483be432d3e87ebfb4152806d17c0452e5d90e213f390a15a4c68df70fab1df9e002784e0d524180b047a8832f98f68e95bc76164e36cefebf14b765bdf1a6
|
7
|
+
data.tar.gz: e63378b1777d0681bce0bc304bb455dbc97722ebecc97f5be122945f6ebdb8d68f5ff819f98cdde8e8215ffc386d2a67bf553c590e86cfe3ca191e30051a7d53
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
-
# 0.
|
2
|
-
*
|
1
|
+
# 0.9.0
|
2
|
+
* Add option to override Capistrano revision
|
3
|
+
* Expanded deploy message in Capistrano
|
4
|
+
* Refactor of usage of Thread.local
|
5
|
+
* Net::HTTP instrumentation
|
6
|
+
* Capistrano 3 support
|
3
7
|
|
4
8
|
# 0.8.14
|
5
9
|
* Few tweaks in logging
|
data/README.md
CHANGED
@@ -59,6 +59,8 @@ end
|
|
59
59
|
Run rake bundle or, or run bundle install for all Gemfiles:
|
60
60
|
|
61
61
|
```
|
62
|
+
bundle --gemfile gemfiles/capistrano2.gemfile
|
63
|
+
bundle --gemfile gemfiles/capistrano3.gemfile
|
62
64
|
bundle --gemfile gemfiles/no_dependencies.gemfile
|
63
65
|
bundle --gemfile gemfiles/rails-3.0.gemfile
|
64
66
|
bundle --gemfile gemfiles/rails-3.1.gemfile
|
@@ -71,6 +73,8 @@ bundle --gemfile gemfiles/sinatra.gemfile
|
|
71
73
|
To run the spec suite with a specific Gemfile:
|
72
74
|
|
73
75
|
```
|
76
|
+
BUNDLE_GEMFILE=gemfiles/capistrano2.gemfile bundle exec rspec
|
77
|
+
BUNDLE_GEMFILE=gemfiles/capistrano3.gemfile bundle exec rspec
|
74
78
|
BUNDLE_GEMFILE=gemfiles/no_dependencies.gemfile bundle exec rspec
|
75
79
|
BUNDLE_GEMFILE=gemfiles/rails-3.0.gemfile bundle exec rspec
|
76
80
|
BUNDLE_GEMFILE=gemfiles/rails-3.1.gemfile bundle exec rspec
|
data/Rakefile
CHANGED
@@ -59,6 +59,8 @@ task :publish do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
task :bundle do
|
62
|
+
system 'bundle --gemfile gemfiles/capistrano2.gemfile'
|
63
|
+
system 'bundle --gemfile gemfiles/capistrano3.gemfile'
|
62
64
|
system 'bundle --gemfile gemfiles/no_dependencies.gemfile'
|
63
65
|
system 'bundle --gemfile gemfiles/rails-3.0.gemfile'
|
64
66
|
system 'bundle --gemfile gemfiles/rails-3.1.gemfile'
|
@@ -69,6 +71,12 @@ task :bundle do
|
|
69
71
|
end
|
70
72
|
|
71
73
|
task :spec do
|
74
|
+
puts 'Running capistrano2'
|
75
|
+
system 'env BUNDLE_GEMFILE=gemfiles/capistrano2.gemfile bundle exec rspec'
|
76
|
+
|
77
|
+
puts 'Running capistrano3'
|
78
|
+
system 'env BUNDLE_GEMFILE=gemfiles/capistrano3.gemfile bundle exec rspec'
|
79
|
+
|
72
80
|
puts 'Running no dependencies'
|
73
81
|
system 'env BUNDLE_GEMFILE=gemfiles/no_dependencies.gemfile bundle exec rspec'
|
74
82
|
|
data/appsignal.gemspec
CHANGED
data/lib/appsignal.rb
CHANGED
@@ -17,6 +17,10 @@ module Appsignal
|
|
17
17
|
require 'appsignal/integrations/resque'
|
18
18
|
end
|
19
19
|
|
20
|
+
def load_instrumentations
|
21
|
+
require 'appsignal/instrumentations/net_http' if config[:instrument_net_http]
|
22
|
+
end
|
23
|
+
|
20
24
|
def extensions
|
21
25
|
@extensions ||= []
|
22
26
|
end
|
@@ -38,6 +42,7 @@ module Appsignal
|
|
38
42
|
end
|
39
43
|
logger.info("Starting appsignal-#{Appsignal::VERSION}")
|
40
44
|
load_integrations
|
45
|
+
load_instrumentations
|
41
46
|
initialize_extensions
|
42
47
|
@agent = Appsignal::Agent.new
|
43
48
|
at_exit { @agent.shutdown(true) }
|
@@ -74,10 +79,11 @@ module Appsignal
|
|
74
79
|
end
|
75
80
|
|
76
81
|
def add_exception(exception)
|
77
|
-
return if !active? ||
|
78
|
-
|
79
|
-
|
80
|
-
|
82
|
+
return if !active? ||
|
83
|
+
Appsignal::Transaction.current.nil? ||
|
84
|
+
exception.nil? ||
|
85
|
+
is_ignored_exception?(exception)
|
86
|
+
Appsignal::Transaction.current.add_exception(exception)
|
81
87
|
end
|
82
88
|
|
83
89
|
def tag_request(params={})
|
data/lib/appsignal/agent.rb
CHANGED
@@ -24,16 +24,11 @@ module Appsignal
|
|
24
24
|
def start_thread
|
25
25
|
Appsignal.logger.debug('Starting agent thread')
|
26
26
|
@thread = Thread.new do
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
sleep(sleep_time)
|
33
|
-
end
|
34
|
-
rescue Exception=>ex
|
35
|
-
Appsignal.logger.error "#{ex.class} in agent thread: '#{ex.message}'"
|
36
|
-
Appsignal.logger.error ex.backtrace.join('\n')
|
27
|
+
sleep(rand(sleep_time))
|
28
|
+
loop do
|
29
|
+
send_queue if aggregator.has_transactions?
|
30
|
+
Appsignal.logger.debug("Sleeping #{sleep_time}")
|
31
|
+
sleep(sleep_time)
|
37
32
|
end
|
38
33
|
end
|
39
34
|
end
|
data/lib/appsignal/capistrano.rb
CHANGED
@@ -1,2 +1,9 @@
|
|
1
1
|
require 'appsignal'
|
2
|
-
|
2
|
+
|
3
|
+
if defined?(Capistrano::VERSION)
|
4
|
+
# Capistrano 3+
|
5
|
+
load File.expand_path('../integrations/capistrano/appsignal.cap', __FILE__)
|
6
|
+
else
|
7
|
+
# Capistrano 2
|
8
|
+
require 'appsignal/integrations/capistrano/capistrano_2_tasks'
|
9
|
+
end
|
data/lib/appsignal/config.rb
CHANGED
@@ -10,7 +10,8 @@ module Appsignal
|
|
10
10
|
:ignore_exceptions => [],
|
11
11
|
:send_params => true,
|
12
12
|
:endpoint => 'https://push.appsignal.com/1',
|
13
|
-
:slow_request_threshold => 200
|
13
|
+
:slow_request_threshold => 200,
|
14
|
+
:instrument_net_http => true
|
14
15
|
}.freeze
|
15
16
|
|
16
17
|
attr_reader :root_path, :env, :initial_config, :config_hash
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Net::HTTP.class_eval do
|
2
|
+
alias request_without_appsignal request
|
3
|
+
|
4
|
+
def request(request, body=nil, &block)
|
5
|
+
ActiveSupport::Notifications.instrument(
|
6
|
+
'request.net_http',
|
7
|
+
:host => request['host'],
|
8
|
+
:scheme => use_ssl? ? 'https' : 'http',
|
9
|
+
:path => request.path,
|
10
|
+
:method => request.method
|
11
|
+
) do
|
12
|
+
request_without_appsignal(request, body, &block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
namespace :appsignal do
|
2
|
+
task :deploy do
|
3
|
+
env = fetch(:rails_env, fetch(:rack_env, 'production'))
|
4
|
+
user = ENV['USER'] || ENV['USERNAME']
|
5
|
+
revision = fetch(:appsignal_revision, fetch(:current_revision))
|
6
|
+
logger = fetch(:logger, Logger.new($stdout))
|
7
|
+
|
8
|
+
appsignal_config = Appsignal::Config.new(
|
9
|
+
ENV['PWD'],
|
10
|
+
env,
|
11
|
+
fetch(:appsignal_config, {}),
|
12
|
+
logger
|
13
|
+
)
|
14
|
+
|
15
|
+
if appsignal_config && appsignal_config.active?
|
16
|
+
marker_data = {
|
17
|
+
:revision => revision,
|
18
|
+
:user => user
|
19
|
+
}
|
20
|
+
|
21
|
+
marker = Appsignal::Marker.new(marker_data, appsignal_config, logger)
|
22
|
+
marker.transmit
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
after 'deploy:finished', 'appsignal:deploy'
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'capistrano'
|
2
|
-
|
3
1
|
module Appsignal
|
4
2
|
module Integrations
|
5
3
|
class Capistrano
|
@@ -12,6 +10,7 @@ module Appsignal
|
|
12
10
|
task :deploy do
|
13
11
|
env = fetch(:rails_env, fetch(:rack_env, 'production'))
|
14
12
|
user = ENV['USER'] || ENV['USERNAME']
|
13
|
+
revision = fetch(:appsignal_revision, fetch(:current_revision))
|
15
14
|
|
16
15
|
appsignal_config = Appsignal::Config.new(
|
17
16
|
ENV['PWD'],
|
@@ -22,8 +21,7 @@ module Appsignal
|
|
22
21
|
|
23
22
|
if appsignal_config && appsignal_config.active?
|
24
23
|
marker_data = {
|
25
|
-
:revision =>
|
26
|
-
:repository => repository,
|
24
|
+
:revision => revision,
|
27
25
|
:user => user
|
28
26
|
}
|
29
27
|
|
@@ -26,12 +26,10 @@ if defined?(::Delayed::Plugin)
|
|
26
26
|
block.call(job)
|
27
27
|
end
|
28
28
|
rescue Exception => exception
|
29
|
-
|
30
|
-
Appsignal::Transaction.current.add_exception(exception)
|
31
|
-
end
|
29
|
+
Appsignal.add_exception(exception)
|
32
30
|
raise exception
|
33
31
|
ensure
|
34
|
-
Appsignal::Transaction.
|
32
|
+
Appsignal::Transaction.complete_current!
|
35
33
|
end
|
36
34
|
end
|
37
35
|
end
|
@@ -15,12 +15,10 @@ if defined?(::Resque)
|
|
15
15
|
yield
|
16
16
|
end
|
17
17
|
rescue Exception => exception
|
18
|
-
|
19
|
-
Appsignal::Transaction.current.add_exception(exception)
|
20
|
-
end
|
18
|
+
Appsignal.add_exception(exception)
|
21
19
|
raise exception
|
22
20
|
ensure
|
23
|
-
Appsignal::Transaction.
|
21
|
+
Appsignal::Transaction.complete_current!
|
24
22
|
end
|
25
23
|
|
26
24
|
end
|
@@ -17,12 +17,10 @@ if defined?(::Sidekiq)
|
|
17
17
|
yield
|
18
18
|
end
|
19
19
|
rescue Exception => exception
|
20
|
-
|
21
|
-
Appsignal::Transaction.current.add_exception(exception)
|
22
|
-
end
|
20
|
+
Appsignal.add_exception(exception)
|
23
21
|
raise exception
|
24
22
|
ensure
|
25
|
-
Appsignal::Transaction.
|
23
|
+
Appsignal::Transaction.complete_current!
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
data/lib/appsignal/marker.rb
CHANGED
@@ -16,7 +16,7 @@ module Appsignal
|
|
16
16
|
def transmit
|
17
17
|
begin
|
18
18
|
transmitter = Transmitter.new(ACTION, config)
|
19
|
-
logger.info(
|
19
|
+
logger.info("Notifying Appsignal of deploy with: revision: #{marker_data[:revision]}, user: #{marker_data[:user]}")
|
20
20
|
result = transmitter.transmit(marker_data)
|
21
21
|
if result == '200'
|
22
22
|
logger.info('Appsignal has been notified of this deploy!')
|
@@ -2,6 +2,7 @@ module Appsignal
|
|
2
2
|
module Rack
|
3
3
|
class Listener
|
4
4
|
def initialize(app, options = {})
|
5
|
+
Appsignal.logger.debug 'Initializing Appsignal::Rack::Listener'
|
5
6
|
@app, @options = app, options
|
6
7
|
end
|
7
8
|
|
@@ -17,12 +18,10 @@ module Appsignal
|
|
17
18
|
Appsignal::Transaction.create(request_id(env), env)
|
18
19
|
@app.call(env)
|
19
20
|
rescue Exception => exception
|
20
|
-
|
21
|
-
Appsignal::Transaction.current.add_exception(exception)
|
22
|
-
end
|
21
|
+
Appsignal.add_exception(exception)
|
23
22
|
raise exception
|
24
23
|
ensure
|
25
|
-
Appsignal::Transaction.
|
24
|
+
Appsignal::Transaction.complete_current!
|
26
25
|
end
|
27
26
|
|
28
27
|
def request_id(env)
|
@@ -11,20 +11,30 @@
|
|
11
11
|
HTTP_CACHE_CONTROL HTTP_CONNECTION HTTP_USER_AGENT HTTP_FROM HTTP_NEGOTIATE
|
12
12
|
HTTP_PRAGMA HTTP_REFERER HTTP_X_FORWARDED_FOR).freeze
|
13
13
|
|
14
|
-
def self.create(
|
15
|
-
Appsignal.logger.debug("Creating transaction: #{
|
16
|
-
Thread.current[:appsignal_transaction_id] =
|
17
|
-
Appsignal
|
14
|
+
def self.create(request_id, env)
|
15
|
+
Appsignal.logger.debug("Creating transaction: #{request_id}")
|
16
|
+
Thread.current[:appsignal_transaction_id] = request_id
|
17
|
+
Appsignal::Transaction.new(request_id, env)
|
18
18
|
end
|
19
19
|
|
20
20
|
def self.current
|
21
21
|
Appsignal.transactions[Thread.current[:appsignal_transaction_id]]
|
22
22
|
end
|
23
23
|
|
24
|
+
def self.complete_current!
|
25
|
+
if current
|
26
|
+
current.complete!
|
27
|
+
Thread.current[:appsignal_transaction_id] = nil
|
28
|
+
else
|
29
|
+
Appsignal.logger.error('Trying to complete current, but no transaction present')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
24
33
|
attr_reader :request_id, :events, :process_action_event, :action, :exception,
|
25
34
|
:env, :fullpath, :time, :tags, :kind, :queue_start
|
26
35
|
|
27
36
|
def initialize(request_id, env)
|
37
|
+
Appsignal.transactions[request_id] = self
|
28
38
|
@request_id = request_id
|
29
39
|
@events = []
|
30
40
|
@process_action_event = nil
|
@@ -128,6 +138,8 @@
|
|
128
138
|
else
|
129
139
|
Appsignal.logger.debug("Not processing transaction: #{@request_id}")
|
130
140
|
end
|
141
|
+
ensure
|
142
|
+
Appsignal.transactions.delete(@request_id)
|
131
143
|
end
|
132
144
|
|
133
145
|
def set_background_queue_start
|
data/lib/appsignal/version.rb
CHANGED
@@ -47,7 +47,7 @@ describe Appsignal::Agent do
|
|
47
47
|
before do
|
48
48
|
subject.stub(
|
49
49
|
:aggregator => double(:has_transactions? => true),
|
50
|
-
:sleep_time => 0.
|
50
|
+
:sleep_time => 0.01
|
51
51
|
)
|
52
52
|
end
|
53
53
|
|
@@ -58,28 +58,6 @@ describe Appsignal::Agent do
|
|
58
58
|
sleep 1
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
62
|
-
context "when an exception occurs in the thread" do
|
63
|
-
before do
|
64
|
-
aggregator = double
|
65
|
-
aggregator.stub(:has_transactions?).and_raise(
|
66
|
-
RuntimeError.new('error')
|
67
|
-
)
|
68
|
-
subject.stub(
|
69
|
-
:aggregator => aggregator,
|
70
|
-
:sleep_time => 0.1
|
71
|
-
)
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should log the error" do
|
75
|
-
Appsignal.logger.should_receive(:error).
|
76
|
-
with("RuntimeError in agent thread: 'error'").
|
77
|
-
once
|
78
|
-
|
79
|
-
subject.start_thread
|
80
|
-
sleep 1
|
81
|
-
end
|
82
|
-
end
|
83
61
|
end
|
84
62
|
|
85
63
|
describe "#restart_thread" do
|
@@ -17,6 +17,7 @@ describe Appsignal::Config do
|
|
17
17
|
it "should merge with the default config and fill the config hash" do
|
18
18
|
subject.config_hash.should == {
|
19
19
|
:ignore_exceptions => [],
|
20
|
+
:instrument_net_http => true,
|
20
21
|
:send_params => true,
|
21
22
|
:endpoint => 'https://push.appsignal.com/1',
|
22
23
|
:slow_request_threshold => 200,
|
@@ -123,6 +124,7 @@ describe Appsignal::Config do
|
|
123
124
|
:push_api_key => 'push_api_key',
|
124
125
|
:ignore_exceptions => [],
|
125
126
|
:send_params => true,
|
127
|
+
:instrument_net_http => true,
|
126
128
|
:endpoint => 'https://push.appsignal.com/1',
|
127
129
|
:slow_request_threshold => 200,
|
128
130
|
:active => true
|