rollbar 2.8.3 → 3.6.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.
- checksums.yaml +5 -5
- data/.codeclimate.yml +18 -0
- data/.github/pull_request_template.md +34 -0
- data/.github/workflows/ci.yml +67 -0
- data/.gitignore +3 -1
- data/.rubocop.yml +206 -7
- data/Appraisals +10 -10
- data/CHANGELOG.md +257 -3
- data/Gemfile +74 -13
- data/README.md +38 -833
- data/Rakefile +0 -0
- data/THANKS.md +1 -0
- data/data/rollbar.snippet.js +1 -1
- data/docs/configuration.md +64 -3
- data/docs/plugins.md +46 -0
- data/gemfiles/rails50.gemfile +56 -0
- data/gemfiles/rails51.gemfile +57 -0
- data/gemfiles/rails52.gemfile +56 -0
- data/gemfiles/rails60.gemfile +52 -0
- data/gemfiles/rails61.gemfile +52 -0
- data/gemfiles/rails70.gemfile +52 -0
- data/gemfiles/rails71.gemfile +52 -0
- data/lib/generators/rollbar/rollbar_generator.rb +24 -20
- data/lib/generators/rollbar/templates/{initializer.rb → initializer.erb} +19 -5
- data/lib/rails/rollbar_runner.rb +26 -22
- data/lib/rollbar/capistrano.rb +78 -38
- data/lib/rollbar/capistrano3.rb +62 -1
- data/lib/rollbar/capistrano_tasks.rb +166 -0
- data/lib/rollbar/configuration.rb +291 -71
- data/lib/rollbar/delay/active_job.rb +17 -0
- data/lib/rollbar/delay/delayed_job.rb +23 -0
- data/lib/rollbar/delay/girl_friday.rb +4 -9
- data/lib/rollbar/delay/resque.rb +3 -6
- data/lib/rollbar/delay/shoryuken.rb +36 -0
- data/lib/rollbar/delay/sidekiq.rb +6 -8
- data/lib/rollbar/delay/sucker_punch.rb +17 -22
- data/lib/rollbar/delay/thread.rb +74 -3
- data/lib/rollbar/deploy.rb +91 -0
- data/lib/rollbar/encoding/encoder.rb +22 -11
- data/lib/rollbar/encoding.rb +2 -7
- data/lib/rollbar/exception_reporter.rb +36 -12
- data/lib/rollbar/item/backtrace.rb +118 -0
- data/lib/rollbar/item/frame.rb +121 -0
- data/lib/rollbar/item/locals.rb +103 -0
- data/lib/rollbar/item.rb +314 -0
- data/lib/rollbar/js.rb +0 -28
- data/lib/rollbar/json.rb +7 -55
- data/lib/rollbar/language_support.rb +7 -19
- data/lib/rollbar/lazy_store.rb +8 -12
- data/lib/rollbar/logger.rb +71 -0
- data/lib/rollbar/logger_proxy.rb +18 -1
- data/lib/rollbar/middleware/js/json_value.rb +36 -0
- data/lib/rollbar/middleware/js.rb +297 -0
- data/lib/rollbar/middleware/rack/builder.rb +4 -4
- data/lib/rollbar/middleware/rack/test_session.rb +4 -4
- data/lib/rollbar/middleware/rack.rb +52 -0
- data/lib/rollbar/middleware/rails/rollbar.rb +19 -7
- data/lib/rollbar/middleware/rails/show_exceptions.rb +21 -9
- data/lib/rollbar/middleware/sinatra.rb +2 -40
- data/lib/rollbar/notifier/trace_with_bindings.rb +75 -0
- data/lib/rollbar/notifier.rb +913 -0
- data/lib/rollbar/plugin.rb +126 -0
- data/lib/rollbar/plugins/active_job.rb +54 -0
- data/lib/rollbar/plugins/basic_socket.rb +31 -0
- data/lib/rollbar/plugins/delayed_job/job_data.rb +50 -0
- data/lib/rollbar/plugins/delayed_job/plugin.rb +88 -0
- data/lib/rollbar/plugins/delayed_job.rb +12 -0
- data/lib/rollbar/plugins/error_context.rb +11 -0
- data/lib/rollbar/plugins/goalie.rb +65 -0
- data/lib/rollbar/plugins/rack.rb +18 -0
- data/lib/rollbar/plugins/rails/controller_methods.rb +56 -0
- data/lib/rollbar/plugins/rails/error_subscriber.rb +12 -0
- data/lib/rollbar/plugins/rails/railtie30.rb +18 -0
- data/lib/rollbar/plugins/rails/railtie32.rb +18 -0
- data/lib/rollbar/plugins/rails/railtie_mixin.rb +37 -0
- data/lib/rollbar/plugins/rails.rb +89 -0
- data/lib/rollbar/plugins/rake.rb +73 -0
- data/lib/rollbar/plugins/resque/failure.rb +39 -0
- data/lib/rollbar/plugins/resque.rb +11 -0
- data/lib/rollbar/plugins/sidekiq/plugin.rb +77 -0
- data/lib/rollbar/plugins/sidekiq.rb +37 -0
- data/lib/rollbar/plugins/thread.rb +14 -0
- data/lib/rollbar/plugins/validations.rb +45 -0
- data/lib/rollbar/plugins.rb +47 -0
- data/lib/rollbar/rails.rb +0 -1
- data/lib/rollbar/rake_tasks.rb +4 -66
- data/lib/rollbar/request_data_extractor.rb +157 -117
- data/lib/rollbar/rollbar_test.rb +38 -0
- data/lib/rollbar/scrubbers/params.rb +133 -0
- data/lib/rollbar/scrubbers/url.rb +90 -35
- data/lib/rollbar/scrubbers.rb +13 -0
- data/lib/rollbar/truncation/frames_strategy.rb +2 -1
- data/lib/rollbar/truncation/min_body_strategy.rb +3 -4
- data/lib/rollbar/truncation/mixin.rb +1 -1
- data/lib/rollbar/truncation/remove_any_key_strategy.rb +126 -0
- data/lib/rollbar/truncation/remove_extra_strategy.rb +37 -0
- data/lib/rollbar/truncation/remove_request_strategy.rb +21 -0
- data/lib/rollbar/truncation/strings_strategy.rb +6 -5
- data/lib/rollbar/truncation.rb +10 -4
- data/lib/rollbar/util/hash.rb +37 -6
- data/lib/rollbar/util/ip_anonymizer.rb +33 -0
- data/lib/rollbar/util/ip_obfuscator.rb +1 -1
- data/lib/rollbar/util.rb +101 -55
- data/lib/rollbar/version.rb +1 -1
- data/lib/rollbar.rb +91 -879
- data/lib/tasks/benchmark.rake +104 -0
- data/lib/tasks/tasks.rake +3 -3
- data/rollbar.gemspec +21 -32
- data/spec/support/rollbar_api.rb +67 -0
- metadata +78 -439
- data/.travis.yml +0 -155
- data/gemfiles/rails30.gemfile +0 -20
- data/gemfiles/rails31.gemfile +0 -16
- data/gemfiles/rails32.gemfile +0 -17
- data/gemfiles/rails40.gemfile +0 -17
- data/gemfiles/rails41.gemfile +0 -15
- data/gemfiles/rails42.gemfile +0 -15
- data/lib/rollbar/active_job.rb +0 -11
- data/lib/rollbar/active_record_extension.rb +0 -14
- data/lib/rollbar/core_ext/basic_socket.rb +0 -7
- data/lib/rollbar/core_ext/thread.rb +0 -9
- data/lib/rollbar/delayed_job.rb +0 -78
- data/lib/rollbar/encoding/legacy_encoder.rb +0 -20
- data/lib/rollbar/goalie.rb +0 -33
- data/lib/rollbar/js/frameworks/rails.rb +0 -29
- data/lib/rollbar/js/frameworks.rb +0 -6
- data/lib/rollbar/js/middleware.rb +0 -129
- data/lib/rollbar/js/version.rb +0 -5
- data/lib/rollbar/json/default.rb +0 -11
- data/lib/rollbar/json/oj.rb +0 -15
- data/lib/rollbar/rack.rb +0 -9
- data/lib/rollbar/rails/controller_methods.rb +0 -40
- data/lib/rollbar/railtie.rb +0 -46
- data/lib/rollbar/rake.rb +0 -38
- data/lib/rollbar/sidekiq.rb +0 -40
- data/lib/rollbar/tasks/rollbar.cap +0 -45
- data/spec/cacert.pem +0 -3988
- data/spec/controllers/home_controller_spec.rb +0 -455
- data/spec/delay/sidekiq_spec.rb +0 -61
- data/spec/delay/sucker_punch_spec.rb +0 -25
- data/spec/delayed/backend/test.rb +0 -139
- data/spec/delayed/serialization/test.rb +0 -0
- data/spec/dummyapp/.gitignore +0 -73
- data/spec/dummyapp/Rakefile +0 -7
- data/spec/dummyapp/app/assets/javascripts/application.js +0 -3
- data/spec/dummyapp/app/assets/stylesheets/application.css.scss +0 -37
- data/spec/dummyapp/app/controllers/application_controller.rb +0 -3
- data/spec/dummyapp/app/controllers/home_controller.rb +0 -60
- data/spec/dummyapp/app/controllers/users_controller.rb +0 -17
- data/spec/dummyapp/app/helpers/.gitkeep +0 -0
- data/spec/dummyapp/app/mailers/.gitkeep +0 -0
- data/spec/dummyapp/app/models/.gitkeep +0 -0
- data/spec/dummyapp/app/models/user.rb +0 -7
- data/spec/dummyapp/app/views/devise/registrations/edit.html.erb +0 -27
- data/spec/dummyapp/app/views/devise/registrations/new.html.erb +0 -20
- data/spec/dummyapp/app/views/devise/shared/_links.html.erb +0 -25
- data/spec/dummyapp/app/views/home/cause_exception.html.erb +0 -1
- data/spec/dummyapp/app/views/home/index.html.erb +0 -4
- data/spec/dummyapp/app/views/home/report_exception.html.erb +0 -1
- data/spec/dummyapp/app/views/js/test.html.erb +0 -1
- data/spec/dummyapp/app/views/layouts/_messages.html.erb +0 -5
- data/spec/dummyapp/app/views/layouts/_navigation.html.erb +0 -21
- data/spec/dummyapp/app/views/layouts/application.html.erb +0 -25
- data/spec/dummyapp/app/views/layouts/simple.html.erb +0 -18
- data/spec/dummyapp/app/views/users/index.html.erb +0 -8
- data/spec/dummyapp/app/views/users/show.html.erb +0 -3
- data/spec/dummyapp/config/application.rb +0 -59
- data/spec/dummyapp/config/boot.rb +0 -10
- data/spec/dummyapp/config/database.yml +0 -25
- data/spec/dummyapp/config/environment.rb +0 -5
- data/spec/dummyapp/config/environments/development.rb +0 -37
- data/spec/dummyapp/config/environments/production.rb +0 -67
- data/spec/dummyapp/config/environments/test.rb +0 -37
- data/spec/dummyapp/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummyapp/config/initializers/inflections.rb +0 -15
- data/spec/dummyapp/config/initializers/mime_types.rb +0 -5
- data/spec/dummyapp/config/initializers/rollbar.rb +0 -23
- data/spec/dummyapp/config/initializers/secret_token.rb +0 -7
- data/spec/dummyapp/config/initializers/session_store.rb +0 -8
- data/spec/dummyapp/config/initializers/wrap_parameters.rb +0 -16
- data/spec/dummyapp/config/locales/devise.en.yml +0 -58
- data/spec/dummyapp/config/locales/en.yml +0 -5
- data/spec/dummyapp/config/routes.rb +0 -17
- data/spec/dummyapp/config.ru +0 -4
- data/spec/dummyapp/db/migrate/20121121184652_devise_create_users.rb +0 -46
- data/spec/dummyapp/db/migrate/20121121184654_add_name_to_users.rb +0 -5
- data/spec/dummyapp/db/schema.rb +0 -35
- data/spec/dummyapp/db/seeds.rb +0 -12
- data/spec/dummyapp/lib/assets/.gitkeep +0 -0
- data/spec/dummyapp/public/404.html +0 -26
- data/spec/dummyapp/public/422.html +0 -26
- data/spec/dummyapp/public/500.html +0 -25
- data/spec/dummyapp/public/favicon.ico +0 -0
- data/spec/dummyapp/script/rails +0 -6
- data/spec/fixtures/file1 +0 -1
- data/spec/fixtures/file2 +0 -1
- data/spec/fixtures/payloads/message.json +0 -25
- data/spec/fixtures/payloads/sample.trace.json +0 -275
- data/spec/fixtures/payloads/sample.trace_chain.json +0 -530
- data/spec/generators/rollbar/rollbar_generator_spec.rb +0 -24
- data/spec/requests/home_spec.rb +0 -49
- data/spec/rollbar/active_job_spec.rb +0 -33
- data/spec/rollbar/configuration_spec.rb +0 -24
- data/spec/rollbar/delay/girl_friday_spec.rb +0 -41
- data/spec/rollbar/delay/resque_spec.rb +0 -37
- data/spec/rollbar/delay/thread_spec.rb +0 -27
- data/spec/rollbar/delayed_job/job_data.rb +0 -35
- data/spec/rollbar/delayed_job_spec.rb +0 -90
- data/spec/rollbar/encoding/encoder_spec.rb +0 -63
- data/spec/rollbar/js/frameworks/rails_spec.rb +0 -19
- data/spec/rollbar/js/middleware_spec.rb +0 -162
- data/spec/rollbar/json/oj_spec.rb +0 -18
- data/spec/rollbar/json_spec.rb +0 -110
- data/spec/rollbar/lazy_store_spec.rb +0 -99
- data/spec/rollbar/logger_proxy_spec.rb +0 -34
- data/spec/rollbar/middleware/rack/builder_spec.rb +0 -151
- data/spec/rollbar/middleware/sinatra_spec.rb +0 -197
- data/spec/rollbar/rake_spec.rb +0 -34
- data/spec/rollbar/request_data_extractor_spec.rb +0 -82
- data/spec/rollbar/scrubbers/url_spec.rb +0 -111
- data/spec/rollbar/sidekiq_spec.rb +0 -90
- data/spec/rollbar/truncation/frames_strategy_spec.rb +0 -70
- data/spec/rollbar/truncation/min_body_strategy_spec.rb +0 -57
- data/spec/rollbar/truncation/strings_strategy_spec.rb +0 -89
- data/spec/rollbar/truncation_spec.rb +0 -27
- data/spec/rollbar/util/hash_spec.rb +0 -22
- data/spec/rollbar/util_spec.rb +0 -19
- data/spec/rollbar_bc_spec.rb +0 -380
- data/spec/rollbar_spec.rb +0 -2067
- data/spec/spec_helper.rb +0 -49
- data/spec/support/cause_exception.rb +0 -1
- data/spec/support/encoding_helpers.rb +0 -8
- data/spec/support/encodings/iso_8859_9 +0 -1
- data/spec/support/fixture_helpers.rb +0 -10
- data/spec/support/get_ip_raising.rb +0 -7
- data/spec/support/helpers.rb +0 -5
- data/spec/support/notifier_helpers.rb +0 -36
- data/spec/support/shared_contexts.rb +0 -12
@@ -1,46 +1,50 @@
|
|
1
1
|
require 'rails/generators'
|
2
2
|
require 'rails/generators/named_base'
|
3
|
+
require 'generators/rollbar/rollbar_generator'
|
3
4
|
|
4
5
|
module Rollbar
|
5
6
|
module Generators
|
6
7
|
class RollbarGenerator < ::Rails::Generators::Base
|
7
|
-
argument :access_token, :type => :string, :banner => 'access_token',
|
8
|
+
argument :access_token, :type => :string, :banner => 'access_token',
|
9
|
+
:default => :use_env_sentinel
|
8
10
|
|
9
11
|
source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
10
12
|
|
11
13
|
def create_initializer
|
12
|
-
say
|
14
|
+
say 'creating initializer...'
|
13
15
|
if access_token_configured?
|
14
16
|
say "It looks like you've already configured Rollbar."
|
15
|
-
say
|
17
|
+
say 'To re-create the config file, remove it first: ' \
|
18
|
+
'config/initializers/rollbar.rb'
|
16
19
|
exit
|
17
20
|
end
|
18
21
|
|
19
22
|
begin
|
20
23
|
require 'ey_config'
|
21
24
|
rescue LoadError
|
25
|
+
# Skip loading
|
22
26
|
end
|
23
|
-
|
27
|
+
|
24
28
|
if defined? EY::Config
|
25
|
-
|
29
|
+
say 'Access token will be read from Engine Yard configuration'
|
30
|
+
elsif access_token === :use_env_sentinel
|
31
|
+
say 'Generator run without an access token; assuming you want to ' \
|
32
|
+
'configure using an environment variable.'
|
33
|
+
say "You'll need to add an environment variable ROLLBAR_ACCESS_TOKEN " \
|
34
|
+
'with your access token:'
|
35
|
+
say "\n$ export ROLLBAR_ACCESS_TOKEN=yourtokenhere"
|
36
|
+
say "\nIf that's not what you wanted to do:"
|
37
|
+
say "\n$ rm config/initializers/rollbar.rb"
|
38
|
+
say '$ rails generate rollbar yourtokenhere'
|
39
|
+
say "\n"
|
26
40
|
else
|
27
|
-
|
28
|
-
say "Generator run without an access token; assuming you want to configure using an environment variable."
|
29
|
-
say "You'll need to add an environment variable ROLLBAR_ACCESS_TOKEN with your access token:"
|
30
|
-
say "\n$ export ROLLBAR_ACCESS_TOKEN=yourtokenhere"
|
31
|
-
say "\nIf that's not what you wanted to do:"
|
32
|
-
say "\n$ rm config/initializers/rollbar.rb"
|
33
|
-
say "$ rails generate rollbar yourtokenhere"
|
34
|
-
say "\n"
|
35
|
-
else
|
36
|
-
say "access token: " << access_token
|
37
|
-
end
|
41
|
+
say 'access token: ' << access_token
|
38
42
|
end
|
39
43
|
|
40
|
-
template 'initializer.
|
41
|
-
|
44
|
+
template 'initializer.erb', 'config/initializers/rollbar.rb',
|
45
|
+
:assigns => { :access_token => access_token_expr }
|
42
46
|
|
43
|
-
# TODO run rake test task
|
47
|
+
# TODO: run rake test task
|
44
48
|
end
|
45
49
|
|
46
50
|
def access_token_expr
|
@@ -52,7 +56,7 @@ module Rollbar
|
|
52
56
|
end
|
53
57
|
|
54
58
|
def access_token_configured?
|
55
|
-
File.
|
59
|
+
File.exist?('config/initializers/rollbar.rb')
|
56
60
|
end
|
57
61
|
end
|
58
62
|
end
|
@@ -19,12 +19,14 @@ Rollbar.configure do |config|
|
|
19
19
|
<%- end -%>
|
20
20
|
|
21
21
|
# By default, Rollbar will try to call the `current_user` controller method
|
22
|
-
# to fetch the logged-in user object, and then call that object's `id
|
23
|
-
#
|
22
|
+
# to fetch the logged-in user object, and then call that object's `id`
|
23
|
+
# method to fetch this property. To customize:
|
24
24
|
# config.person_method = "my_current_user"
|
25
25
|
# config.person_id_method = "my_id"
|
26
|
-
|
27
|
-
#
|
26
|
+
|
27
|
+
# Additionally, you may specify the following:
|
28
|
+
# config.person_username_method = "username"
|
29
|
+
# config.person_email_method = "email"
|
28
30
|
|
29
31
|
# If you want to attach custom data to all exception and message reports,
|
30
32
|
# provide a lambda like the following. It should return a hash.
|
@@ -57,10 +59,22 @@ Rollbar.configure do |config|
|
|
57
59
|
# You can supply custom Sidekiq options:
|
58
60
|
# config.use_sidekiq 'queue' => 'default'
|
59
61
|
|
62
|
+
# If your application runs behind a proxy server, you can set proxy parameters here.
|
63
|
+
# If https_proxy is set in your environment, that will be used. Settings here have precedence.
|
64
|
+
# The :host key is mandatory and must include the URL scheme (e.g. 'http://'), all other fields
|
65
|
+
# are optional.
|
66
|
+
#
|
67
|
+
# config.proxy = {
|
68
|
+
# host: 'http://some.proxy.server',
|
69
|
+
# port: 80,
|
70
|
+
# user: 'username_if_auth_required',
|
71
|
+
# password: 'password_if_auth_required'
|
72
|
+
# }
|
73
|
+
|
60
74
|
# If you run your staging application instance in production environment then
|
61
75
|
# you'll want to override the environment reported by `Rails.env` with an
|
62
76
|
# environment variable like this: `ROLLBAR_ENV=staging`. This is a recommended
|
63
77
|
# setup for Heroku. See:
|
64
78
|
# https://devcenter.heroku.com/articles/deploying-to-a-custom-rails-environment
|
65
|
-
config.environment = ENV['ROLLBAR_ENV'] || Rails.env
|
79
|
+
config.environment = ENV['ROLLBAR_ENV'].presence || Rails.env
|
66
80
|
end
|
data/lib/rails/rollbar_runner.rb
CHANGED
@@ -1,23 +1,16 @@
|
|
1
1
|
require 'rails'
|
2
2
|
require 'rollbar'
|
3
3
|
|
4
|
-
|
4
|
+
# Rails.root is not present here.
|
5
|
+
# RSpec needs ENV['DUMMYAPP_PATH'] in order to have a valid path.
|
6
|
+
# Dir.pwd is used in normal operation.
|
7
|
+
APP_PATH = File.expand_path(
|
8
|
+
'config/application',
|
9
|
+
(ENV['DUMMYAPP_PATH'] || Dir.pwd)
|
10
|
+
)
|
5
11
|
|
6
12
|
module Rails
|
7
13
|
class RollbarRunner
|
8
|
-
class GemResolver
|
9
|
-
def railties_gem
|
10
|
-
Gem::Specification.find_by_name('railties')
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
class LegacyGemResolver
|
15
|
-
def railties_gem
|
16
|
-
searcher = Gem::GemPathSearcher.new
|
17
|
-
searcher.find('rails')
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
14
|
attr_reader :command
|
22
15
|
|
23
16
|
def initialize
|
@@ -36,27 +29,40 @@ module Rails
|
|
36
29
|
end
|
37
30
|
|
38
31
|
def eval_runner
|
32
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new('5.1.0')
|
33
|
+
rails5_runner
|
34
|
+
else
|
35
|
+
legacy_runner
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def legacy_runner
|
39
40
|
string_to_eval = File.read(runner_path)
|
40
41
|
|
41
|
-
::Rails.module_eval(<<-
|
42
|
+
::Rails.module_eval(<<-FILE, __FILE__, __LINE__ + 1)
|
42
43
|
#{string_to_eval}
|
43
|
-
|
44
|
+
FILE
|
45
|
+
end
|
46
|
+
|
47
|
+
def rails5_runner
|
48
|
+
require 'rails/command'
|
49
|
+
|
50
|
+
Rails::Command.invoke 'runner', ARGV
|
44
51
|
end
|
45
52
|
|
46
53
|
def rollbar_managed
|
47
54
|
yield
|
48
|
-
rescue => e
|
55
|
+
rescue StandardError => e
|
49
56
|
Rollbar.scope(:custom => { :command => command }).error(e)
|
50
57
|
raise
|
51
58
|
end
|
52
59
|
|
53
60
|
def runner_path
|
54
|
-
railties_gem_dir
|
61
|
+
"#{railties_gem_dir}/lib/rails/commands/runner.rb"
|
55
62
|
end
|
56
63
|
|
57
64
|
def railties_gem
|
58
|
-
|
59
|
-
gem = resolver_class.new.railties_gem
|
65
|
+
gem = Gem::Specification.find_by_name('railties')
|
60
66
|
|
61
67
|
abort 'railties gem not found' unless gem
|
62
68
|
|
@@ -68,5 +74,3 @@ module Rails
|
|
68
74
|
end
|
69
75
|
end
|
70
76
|
end
|
71
|
-
|
72
|
-
|
data/lib/rollbar/capistrano.rb
CHANGED
@@ -1,43 +1,83 @@
|
|
1
|
+
# This is a tasks file to use with Capistrano 2
|
2
|
+
|
1
3
|
require 'capistrano'
|
4
|
+
require 'rollbar/deploy'
|
5
|
+
require 'net/http'
|
6
|
+
require 'rubygems'
|
7
|
+
require 'json'
|
8
|
+
require 'rollbar/capistrano_tasks'
|
2
9
|
|
3
10
|
module Rollbar
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
11
|
+
# Module for loading Rollbar Capistrano tasks into Capistrano 2
|
12
|
+
module Capistrano2
|
13
|
+
class << self
|
14
|
+
def load_into(configuration)
|
15
|
+
load_tasks(configuration)
|
16
|
+
load_tasks_flow(configuration)
|
17
|
+
load_properties(configuration)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def load_tasks_flow(configuration)
|
23
|
+
configuration.load do
|
24
|
+
before 'deploy', 'rollbar:deploy_started'
|
25
|
+
|
26
|
+
after 'deploy', 'rollbar:deploy_succeeded'
|
27
|
+
after 'deploy:migrations', 'rollbar:deploy_succeeded'
|
28
|
+
after 'deploy:cold', 'rollbar:deploy_succeeded'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def load_properties(configuration)
|
33
|
+
configuration.load do
|
34
|
+
_cset(:rollbar_role) { :app }
|
35
|
+
_cset(:rollbar_user) { ENV['USER'] || ENV['USERNAME'] }
|
36
|
+
_cset(:rollbar_env) { fetch(:rails_env, 'production') }
|
37
|
+
_cset(:rollbar_token) do
|
38
|
+
abort(
|
39
|
+
"Please specify the Rollbar access token, set :rollbar_token, 'your token'"
|
40
|
+
)
|
41
|
+
end
|
42
|
+
_cset(:rollbar_revision) { real_revision }
|
43
|
+
_cset(:rollbar_comment) { nil }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def load_tasks(configuration)
|
48
|
+
load_deploy_started(configuration)
|
49
|
+
load_deploy_succeeded(configuration)
|
50
|
+
end
|
51
|
+
|
52
|
+
def load_deploy_started(configuration)
|
53
|
+
load_task(
|
54
|
+
:desc => 'Send deployment started notification to Rollbar.',
|
55
|
+
:task => :deploy_started,
|
56
|
+
:configuration => configuration
|
57
|
+
) do
|
58
|
+
::Rollbar::CapistranoTasks.deploy_started(
|
59
|
+
configuration, configuration.logger, configuration.dry_run
|
60
|
+
)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def load_deploy_succeeded(configuration)
|
65
|
+
load_task(
|
66
|
+
:desc => 'Send deployment succeeded notification to Rollbar.',
|
67
|
+
:task => :deploy_succeeded,
|
68
|
+
:configuration => configuration
|
69
|
+
) do
|
70
|
+
::Rollbar::CapistranoTasks.deploy_succeeded(
|
71
|
+
configuration, configuration.logger, configuration.dry_run
|
72
|
+
)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def load_task(configuration:, desc:, task:, &block)
|
77
|
+
configuration.load do
|
78
|
+
namespace :rollbar do
|
79
|
+
desc(desc)
|
80
|
+
task(task, &block)
|
41
81
|
end
|
42
82
|
end
|
43
83
|
end
|
@@ -46,5 +86,5 @@ module Rollbar
|
|
46
86
|
end
|
47
87
|
|
48
88
|
if Capistrano::Configuration.instance
|
49
|
-
Rollbar::
|
89
|
+
Rollbar::Capistrano2.load_into(Capistrano::Configuration.instance)
|
50
90
|
end
|
data/lib/rollbar/capistrano3.rb
CHANGED
@@ -1 +1,62 @@
|
|
1
|
-
|
1
|
+
# This is a tasks file to use with Capistrano 3
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'json'
|
6
|
+
require 'rollbar/deploy'
|
7
|
+
require 'rollbar/capistrano_tasks'
|
8
|
+
|
9
|
+
namespace :rollbar do
|
10
|
+
# dry_run? wasn't introduced till Capistrano 3.5.0; use the old fetch(:sshkit_backed)
|
11
|
+
set :dry_run, (proc {
|
12
|
+
::Capistrano::Configuration.env.fetch(:sshkit_backend) ==
|
13
|
+
::SSHKit::Backend::Printer
|
14
|
+
})
|
15
|
+
|
16
|
+
desc 'Send deployment started notification to Rollbar.'
|
17
|
+
task :deploy_started do
|
18
|
+
on primary fetch(:rollbar_role) do
|
19
|
+
::Rollbar::CapistranoTasks.deploy_started(self, self, fetch(:dry_run))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'Send deployment succeeded notification to Rollbar.'
|
24
|
+
task :deploy_succeeded do
|
25
|
+
on primary fetch(:rollbar_role) do
|
26
|
+
::Rollbar::CapistranoTasks.deploy_succeeded(self, self, fetch(:dry_run))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc 'Send deployment failed notification to Rollbar.'
|
31
|
+
task :deploy_failed do
|
32
|
+
on primary fetch(:rollbar_role) do
|
33
|
+
::Rollbar::CapistranoTasks.deploy_failed(self, self, fetch(:dry_run))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
task :fail do
|
38
|
+
raise StandardError
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
namespace :deploy do
|
43
|
+
after 'deploy:set_current_revision', 'rollbar:deploy_started'
|
44
|
+
after 'deploy:finished', 'rollbar:deploy_succeeded'
|
45
|
+
after 'deploy:failed', 'rollbar:deploy_failed'
|
46
|
+
|
47
|
+
# Used for testing :deploy_failed task
|
48
|
+
# after 'rollbar:deploy_started', 'rollbar:fail'
|
49
|
+
end
|
50
|
+
|
51
|
+
namespace :load do
|
52
|
+
task :defaults do
|
53
|
+
set :rollbar_user, (proc { fetch :local_user, ENV['USER'] || ENV['USERNAME'] })
|
54
|
+
set :rollbar_env, (proc { fetch :rails_env, 'production' })
|
55
|
+
set :rollbar_token, (proc {
|
56
|
+
abort 'Please specify the Rollbar access token, ' \
|
57
|
+
"set :rollbar_token, 'your token'"
|
58
|
+
})
|
59
|
+
set :rollbar_role, (proc { :app })
|
60
|
+
set :rollbar_revision, (proc { fetch :current_revision })
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
require 'rollbar/deploy'
|
2
|
+
|
3
|
+
module Rollbar
|
4
|
+
# Module containing the logic of Capistrano tasks for deploy tracking
|
5
|
+
module CapistranoTasks
|
6
|
+
class << self
|
7
|
+
def deploy_started(capistrano, logger, dry_run)
|
8
|
+
deploy_task(logger, :desc => 'Notifying Rollbar of deployment start') do
|
9
|
+
result = report_deploy_started(capistrano, dry_run)
|
10
|
+
|
11
|
+
debug_request_response(logger, result)
|
12
|
+
|
13
|
+
capistrano.set(:rollbar_deploy_id, 123) if dry_run
|
14
|
+
|
15
|
+
skip_in_dry_run(logger, dry_run) do
|
16
|
+
if result[:success] &&
|
17
|
+
(deploy_id = result[:data] &&
|
18
|
+
result[:data][:deploy_id])
|
19
|
+
capistrano.set :rollbar_deploy_id, deploy_id
|
20
|
+
else
|
21
|
+
message = format_message('Unable to report deploy to Rollbar',
|
22
|
+
result[:message])
|
23
|
+
log_error(logger, message)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def deploy_succeeded(capistrano, logger, dry_run)
|
30
|
+
deploy_update(
|
31
|
+
capistrano, logger, dry_run,
|
32
|
+
:desc => 'Setting deployment status to `succeeded` in Rollbar'
|
33
|
+
) do
|
34
|
+
report_deploy_succeeded(capistrano, dry_run)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def deploy_failed(capistrano, logger, dry_run)
|
39
|
+
deploy_update(capistrano, logger, dry_run,
|
40
|
+
:desc => 'Setting deployment status to `failed` in Rollbar') do
|
41
|
+
report_deploy_failed(capistrano, dry_run)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def deploy_task(logger, opts = {})
|
48
|
+
capistrano_300_warning(logger)
|
49
|
+
logger.info opts[:desc] if opts[:desc]
|
50
|
+
yield
|
51
|
+
rescue StandardError => e
|
52
|
+
log_error logger, "Error reporting to Rollbar: #{e.inspect}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def deploy_update(capistrano, logger, dry_run, opts = {})
|
56
|
+
deploy_task(logger, opts) do
|
57
|
+
depend_on_deploy_id(capistrano, logger) do
|
58
|
+
result = yield
|
59
|
+
|
60
|
+
debug_request_response(logger, result)
|
61
|
+
|
62
|
+
skip_in_dry_run(logger, dry_run) do
|
63
|
+
if result[:success]
|
64
|
+
logger.info 'Updated deploy status in Rollbar'
|
65
|
+
else
|
66
|
+
message = format_message('Unable to update deploy status in Rollbar',
|
67
|
+
result[:message])
|
68
|
+
log_error(logger, message)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def capistrano_300_warning(logger)
|
76
|
+
unless ::Capistrano.const_defined?('VERSION') && ::Capistrano::VERSION =~ /^3\.0/
|
77
|
+
return
|
78
|
+
end
|
79
|
+
|
80
|
+
logger.warn('You need to upgrade capistrano to >= 3.1 version in order'\
|
81
|
+
'to correctly report deploys to Rollbar. (On 3.0, the reported revision'\
|
82
|
+
'will be incorrect.)')
|
83
|
+
end
|
84
|
+
|
85
|
+
def report_deploy_started(capistrano, dry_run)
|
86
|
+
::Rollbar::Deploy.report(
|
87
|
+
{
|
88
|
+
:rollbar_username => capistrano.fetch(:rollbar_user),
|
89
|
+
:local_username => capistrano.fetch(:rollbar_user),
|
90
|
+
:comment => capistrano.fetch(:rollbar_comment),
|
91
|
+
:status => :started,
|
92
|
+
:proxy => :ENV,
|
93
|
+
:dry_run => dry_run
|
94
|
+
},
|
95
|
+
capistrano.fetch(:rollbar_token),
|
96
|
+
capistrano.fetch(:rollbar_env),
|
97
|
+
capistrano.fetch(:rollbar_revision)
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
def report_deploy_succeeded(capistrano, dry_run)
|
102
|
+
::Rollbar::Deploy.update(
|
103
|
+
{
|
104
|
+
:comment => capistrano.fetch(:rollbar_comment),
|
105
|
+
:proxy => :ENV,
|
106
|
+
:dry_run => dry_run
|
107
|
+
},
|
108
|
+
capistrano.fetch(:rollbar_token),
|
109
|
+
capistrano.fetch(:rollbar_deploy_id),
|
110
|
+
:succeeded
|
111
|
+
)
|
112
|
+
end
|
113
|
+
|
114
|
+
def report_deploy_failed(capistrano, dry_run)
|
115
|
+
::Rollbar::Deploy.update(
|
116
|
+
{
|
117
|
+
:comment => capistrano.fetch(:rollbar_comment),
|
118
|
+
:proxy => :ENV,
|
119
|
+
:dry_run => dry_run
|
120
|
+
},
|
121
|
+
capistrano.fetch(:rollbar_token),
|
122
|
+
capistrano.fetch(:rollbar_deploy_id),
|
123
|
+
:failed
|
124
|
+
)
|
125
|
+
end
|
126
|
+
|
127
|
+
def depend_on_deploy_id(capistrano, logger)
|
128
|
+
if capistrano.fetch(:rollbar_deploy_id)
|
129
|
+
yield
|
130
|
+
else
|
131
|
+
log_error logger,
|
132
|
+
'Failed to update the deploy in Rollbar. No deploy id available.'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def skip_in_dry_run(logger, dry_run)
|
137
|
+
if dry_run
|
138
|
+
logger.info 'Skipping sending HTTP requests to Rollbar in dry run.'
|
139
|
+
else
|
140
|
+
yield
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def debug_request_response(logger, result)
|
145
|
+
# NOTE: in Capistrano debug messages go to log/capistrano.log but not to
|
146
|
+
# stdout even if log_level == :debug
|
147
|
+
logger.debug result[:request_info]
|
148
|
+
logger.debug result[:response_info] if result[:response_info]
|
149
|
+
end
|
150
|
+
|
151
|
+
def format_message(*args)
|
152
|
+
args.compact.join(': ')
|
153
|
+
end
|
154
|
+
|
155
|
+
def log_error(logger, message)
|
156
|
+
# Capistrano 2.x doesn't have the #error method,
|
157
|
+
# so we use #important if #error isn't present
|
158
|
+
if logger.respond_to?(:error)
|
159
|
+
logger.error message
|
160
|
+
elsif logger.respond_to?(:important)
|
161
|
+
logger.important message
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|