appsignal 2.5.0.alpha.1-java
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 +7 -0
- data/.gitignore +33 -0
- data/.rspec +4 -0
- data/.rubocop.yml +66 -0
- data/.rubocop_todo.yml +124 -0
- data/.travis.yml +72 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +639 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +264 -0
- data/Rakefile +214 -0
- data/appsignal.gemspec +42 -0
- data/benchmark.rake +77 -0
- data/bin/appsignal +13 -0
- data/ext/Rakefile +27 -0
- data/ext/agent.yml +64 -0
- data/ext/appsignal_extension.c +692 -0
- data/ext/base.rb +79 -0
- data/ext/extconf.rb +35 -0
- data/gemfiles/capistrano2.gemfile +7 -0
- data/gemfiles/capistrano3.gemfile +7 -0
- data/gemfiles/grape.gemfile +7 -0
- data/gemfiles/no_dependencies.gemfile +5 -0
- data/gemfiles/padrino.gemfile +7 -0
- data/gemfiles/que.gemfile +5 -0
- data/gemfiles/rails-3.2.gemfile +6 -0
- data/gemfiles/rails-4.0.gemfile +6 -0
- data/gemfiles/rails-4.1.gemfile +6 -0
- data/gemfiles/rails-4.2.gemfile +10 -0
- data/gemfiles/rails-5.0.gemfile +5 -0
- data/gemfiles/rails-5.1.gemfile +5 -0
- data/gemfiles/resque.gemfile +12 -0
- data/gemfiles/sequel-435.gemfile +11 -0
- data/gemfiles/sequel.gemfile +11 -0
- data/gemfiles/sinatra.gemfile +6 -0
- data/gemfiles/webmachine.gemfile +5 -0
- data/lib/appsignal.rb +804 -0
- data/lib/appsignal/auth_check.rb +65 -0
- data/lib/appsignal/capistrano.rb +10 -0
- data/lib/appsignal/cli.rb +108 -0
- data/lib/appsignal/cli/demo.rb +63 -0
- data/lib/appsignal/cli/diagnose.rb +500 -0
- data/lib/appsignal/cli/helpers.rb +72 -0
- data/lib/appsignal/cli/install.rb +277 -0
- data/lib/appsignal/cli/notify_of_deploy.rb +113 -0
- data/lib/appsignal/config.rb +287 -0
- data/lib/appsignal/demo.rb +107 -0
- data/lib/appsignal/event_formatter.rb +74 -0
- data/lib/appsignal/event_formatter/action_view/render_formatter.rb +24 -0
- data/lib/appsignal/event_formatter/active_record/instantiation_formatter.rb +14 -0
- data/lib/appsignal/event_formatter/active_record/sql_formatter.rb +14 -0
- data/lib/appsignal/event_formatter/elastic_search/search_formatter.rb +32 -0
- data/lib/appsignal/event_formatter/faraday/request_formatter.rb +19 -0
- data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +89 -0
- data/lib/appsignal/event_formatter/moped/query_formatter.rb +80 -0
- data/lib/appsignal/extension.rb +63 -0
- data/lib/appsignal/extension/jruby.rb +460 -0
- data/lib/appsignal/garbage_collection_profiler.rb +48 -0
- data/lib/appsignal/hooks.rb +105 -0
- data/lib/appsignal/hooks/action_cable.rb +113 -0
- data/lib/appsignal/hooks/active_support_notifications.rb +52 -0
- data/lib/appsignal/hooks/celluloid.rb +30 -0
- data/lib/appsignal/hooks/data_mapper.rb +18 -0
- data/lib/appsignal/hooks/delayed_job.rb +19 -0
- data/lib/appsignal/hooks/mongo_ruby_driver.rb +21 -0
- data/lib/appsignal/hooks/net_http.rb +29 -0
- data/lib/appsignal/hooks/passenger.rb +22 -0
- data/lib/appsignal/hooks/puma.rb +35 -0
- data/lib/appsignal/hooks/que.rb +21 -0
- data/lib/appsignal/hooks/rake.rb +39 -0
- data/lib/appsignal/hooks/redis.rb +30 -0
- data/lib/appsignal/hooks/sequel.rb +60 -0
- data/lib/appsignal/hooks/shoryuken.rb +43 -0
- data/lib/appsignal/hooks/sidekiq.rb +144 -0
- data/lib/appsignal/hooks/unicorn.rb +40 -0
- data/lib/appsignal/hooks/webmachine.rb +23 -0
- data/lib/appsignal/integrations/capistrano/appsignal.cap +39 -0
- data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +52 -0
- data/lib/appsignal/integrations/data_mapper.rb +33 -0
- data/lib/appsignal/integrations/delayed_job_plugin.rb +54 -0
- data/lib/appsignal/integrations/grape.rb +53 -0
- data/lib/appsignal/integrations/mongo_ruby_driver.rb +55 -0
- data/lib/appsignal/integrations/object.rb +35 -0
- data/lib/appsignal/integrations/padrino.rb +84 -0
- data/lib/appsignal/integrations/que.rb +43 -0
- data/lib/appsignal/integrations/railtie.rb +41 -0
- data/lib/appsignal/integrations/rake.rb +2 -0
- data/lib/appsignal/integrations/resque.rb +20 -0
- data/lib/appsignal/integrations/resque_active_job.rb +30 -0
- data/lib/appsignal/integrations/sinatra.rb +17 -0
- data/lib/appsignal/integrations/webmachine.rb +38 -0
- data/lib/appsignal/js_exception_transaction.rb +54 -0
- data/lib/appsignal/marker.rb +63 -0
- data/lib/appsignal/minutely.rb +42 -0
- data/lib/appsignal/rack/generic_instrumentation.rb +49 -0
- data/lib/appsignal/rack/js_exception_catcher.rb +70 -0
- data/lib/appsignal/rack/rails_instrumentation.rb +51 -0
- data/lib/appsignal/rack/sinatra_instrumentation.rb +99 -0
- data/lib/appsignal/rack/streaming_listener.rb +73 -0
- data/lib/appsignal/system.rb +81 -0
- data/lib/appsignal/transaction.rb +498 -0
- data/lib/appsignal/transmitter.rb +107 -0
- data/lib/appsignal/utils.rb +127 -0
- data/lib/appsignal/utils/params_sanitizer.rb +59 -0
- data/lib/appsignal/utils/query_params_sanitizer.rb +55 -0
- data/lib/appsignal/version.rb +3 -0
- data/lib/sequel/extensions/appsignal_integration.rb +3 -0
- data/resources/appsignal.yml.erb +39 -0
- data/resources/cacert.pem +3866 -0
- data/spec/.rubocop.yml +7 -0
- data/spec/lib/appsignal/auth_check_spec.rb +80 -0
- data/spec/lib/appsignal/capistrano2_spec.rb +224 -0
- data/spec/lib/appsignal/capistrano3_spec.rb +237 -0
- data/spec/lib/appsignal/cli/demo_spec.rb +67 -0
- data/spec/lib/appsignal/cli/diagnose_spec.rb +988 -0
- data/spec/lib/appsignal/cli/helpers_spec.rb +171 -0
- data/spec/lib/appsignal/cli/install_spec.rb +632 -0
- data/spec/lib/appsignal/cli/notify_of_deploy_spec.rb +168 -0
- data/spec/lib/appsignal/cli_spec.rb +56 -0
- data/spec/lib/appsignal/config_spec.rb +637 -0
- data/spec/lib/appsignal/demo_spec.rb +87 -0
- data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +44 -0
- data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +21 -0
- data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +21 -0
- data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +52 -0
- data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +21 -0
- data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +113 -0
- data/spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb +112 -0
- data/spec/lib/appsignal/event_formatter_spec.rb +100 -0
- data/spec/lib/appsignal/extension/jruby_spec.rb +43 -0
- data/spec/lib/appsignal/extension_spec.rb +137 -0
- data/spec/lib/appsignal/garbage_collection_profiler_spec.rb +66 -0
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +370 -0
- data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +92 -0
- data/spec/lib/appsignal/hooks/celluloid_spec.rb +35 -0
- data/spec/lib/appsignal/hooks/data_mapper_spec.rb +39 -0
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +358 -0
- data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +44 -0
- data/spec/lib/appsignal/hooks/net_http_spec.rb +53 -0
- data/spec/lib/appsignal/hooks/passenger_spec.rb +30 -0
- data/spec/lib/appsignal/hooks/puma_spec.rb +80 -0
- data/spec/lib/appsignal/hooks/que_spec.rb +19 -0
- data/spec/lib/appsignal/hooks/rake_spec.rb +73 -0
- data/spec/lib/appsignal/hooks/redis_spec.rb +55 -0
- data/spec/lib/appsignal/hooks/sequel_spec.rb +46 -0
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +192 -0
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +419 -0
- data/spec/lib/appsignal/hooks/unicorn_spec.rb +52 -0
- data/spec/lib/appsignal/hooks/webmachine_spec.rb +35 -0
- data/spec/lib/appsignal/hooks_spec.rb +195 -0
- data/spec/lib/appsignal/integrations/data_mapper_spec.rb +65 -0
- data/spec/lib/appsignal/integrations/grape_spec.rb +225 -0
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +127 -0
- data/spec/lib/appsignal/integrations/object_spec.rb +249 -0
- data/spec/lib/appsignal/integrations/padrino_spec.rb +323 -0
- data/spec/lib/appsignal/integrations/que_spec.rb +174 -0
- data/spec/lib/appsignal/integrations/railtie_spec.rb +129 -0
- data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +83 -0
- data/spec/lib/appsignal/integrations/resque_spec.rb +92 -0
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +73 -0
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +69 -0
- data/spec/lib/appsignal/js_exception_transaction_spec.rb +128 -0
- data/spec/lib/appsignal/marker_spec.rb +51 -0
- data/spec/lib/appsignal/minutely_spec.rb +50 -0
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +90 -0
- data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +147 -0
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +117 -0
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +213 -0
- data/spec/lib/appsignal/rack/streaming_listener_spec.rb +161 -0
- data/spec/lib/appsignal/system_spec.rb +131 -0
- data/spec/lib/appsignal/transaction_spec.rb +1146 -0
- data/spec/lib/appsignal/transmitter_spec.rb +152 -0
- data/spec/lib/appsignal/utils/params_sanitizer_spec.rb +136 -0
- data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +192 -0
- data/spec/lib/appsignal/utils_spec.rb +150 -0
- data/spec/lib/appsignal_spec.rb +1049 -0
- data/spec/spec_helper.rb +116 -0
- data/spec/support/fixtures/containers/cgroups/docker +14 -0
- data/spec/support/fixtures/containers/cgroups/docker_systemd +8 -0
- data/spec/support/fixtures/containers/cgroups/lxc +10 -0
- data/spec/support/fixtures/containers/cgroups/no_permission +0 -0
- data/spec/support/fixtures/containers/cgroups/none +1 -0
- data/spec/support/fixtures/generated_config.yml +24 -0
- data/spec/support/fixtures/uploaded_file.txt +0 -0
- data/spec/support/helpers/api_request_helper.rb +19 -0
- data/spec/support/helpers/cli_helpers.rb +26 -0
- data/spec/support/helpers/config_helpers.rb +21 -0
- data/spec/support/helpers/dependency_helper.rb +73 -0
- data/spec/support/helpers/directory_helper.rb +27 -0
- data/spec/support/helpers/env_helpers.rb +33 -0
- data/spec/support/helpers/example_exception.rb +13 -0
- data/spec/support/helpers/example_standard_error.rb +13 -0
- data/spec/support/helpers/log_helpers.rb +22 -0
- data/spec/support/helpers/std_streams_helper.rb +66 -0
- data/spec/support/helpers/system_helpers.rb +8 -0
- data/spec/support/helpers/time_helpers.rb +11 -0
- data/spec/support/helpers/transaction_helpers.rb +37 -0
- data/spec/support/matchers/contains_log.rb +7 -0
- data/spec/support/mocks/fake_gc_profiler.rb +19 -0
- data/spec/support/mocks/mock_extension.rb +6 -0
- data/spec/support/project_fixture/config/application.rb +0 -0
- data/spec/support/project_fixture/config/appsignal.yml +32 -0
- data/spec/support/project_fixture/config/environments/development.rb +0 -0
- data/spec/support/project_fixture/config/environments/production.rb +0 -0
- data/spec/support/project_fixture/config/environments/test.rb +0 -0
- data/spec/support/project_fixture/log/.gitkeep +0 -0
- data/spec/support/rails/my_app.rb +6 -0
- data/spec/support/shared_examples/instrument.rb +43 -0
- data/spec/support/stubs/delayed_job.rb +0 -0
- metadata +483 -0
data/spec/.rubocop.yml
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
describe Appsignal::AuthCheck do
|
2
|
+
let(:config) { project_fixture_config }
|
3
|
+
let(:auth_check) { Appsignal::AuthCheck.new(config) }
|
4
|
+
let(:auth_url) do
|
5
|
+
query = {
|
6
|
+
:api_key => config[:push_api_key],
|
7
|
+
:environment => config.env,
|
8
|
+
:gem_version => Appsignal::VERSION,
|
9
|
+
:hostname => config[:hostname],
|
10
|
+
:name => config[:name]
|
11
|
+
}.map { |k, v| "#{k}=#{v}" }.join("&")
|
12
|
+
|
13
|
+
URI(config[:endpoint]).tap do |uri|
|
14
|
+
uri.path = "/1/auth"
|
15
|
+
uri.query = query
|
16
|
+
end.to_s
|
17
|
+
end
|
18
|
+
let(:stubbed_request) do
|
19
|
+
WebMock.stub_request(:post, auth_url).with(:body => "{}")
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#perform" do
|
23
|
+
subject { auth_check.perform }
|
24
|
+
|
25
|
+
context "when performing a request against the push api" do
|
26
|
+
before { stubbed_request.to_return(:status => 200) }
|
27
|
+
|
28
|
+
it "returns status code" do
|
29
|
+
is_expected.to eq("200")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when encountering an exception" do
|
34
|
+
before { stubbed_request.to_timeout }
|
35
|
+
|
36
|
+
it "raises an error" do
|
37
|
+
expect { subject }.to raise_error(Net::OpenTimeout)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#perform_with_result" do
|
43
|
+
subject { auth_check.perform_with_result }
|
44
|
+
|
45
|
+
context "when successful response" do
|
46
|
+
before { stubbed_request.to_return(:status => 200) }
|
47
|
+
|
48
|
+
it "returns success tuple" do
|
49
|
+
is_expected.to eq ["200", "AppSignal has confirmed authorization!"]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when unauthorized response" do
|
54
|
+
before { stubbed_request.to_return(:status => 401) }
|
55
|
+
|
56
|
+
it "returns unauthorirzed tuple" do
|
57
|
+
is_expected.to eq ["401", "API key not valid with AppSignal..."]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "when unrecognized response" do
|
62
|
+
before { stubbed_request.to_return(:status => 500) }
|
63
|
+
|
64
|
+
it "returns an error tuple" do
|
65
|
+
is_expected.to eq ["500", "Could not confirm authorization: 500"]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "when encountering an exception" do
|
70
|
+
before { stubbed_request.to_timeout }
|
71
|
+
|
72
|
+
it "returns an error tuple" do
|
73
|
+
is_expected.to eq [
|
74
|
+
nil,
|
75
|
+
"Something went wrong while trying to authenticate with AppSignal: execution expired"
|
76
|
+
]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,224 @@
|
|
1
|
+
if DependencyHelper.capistrano2_present?
|
2
|
+
require "capistrano"
|
3
|
+
require "capistrano/configuration"
|
4
|
+
require "appsignal/capistrano"
|
5
|
+
|
6
|
+
describe "Capistrano 2 integration" do
|
7
|
+
let(:out_stream) { std_stream }
|
8
|
+
let(:output) { out_stream.read }
|
9
|
+
let(:config) { project_fixture_config }
|
10
|
+
let(:capistrano_config) do
|
11
|
+
Capistrano::Configuration.new.tap do |c|
|
12
|
+
c.set(:rails_env, "production")
|
13
|
+
c.set(:repository, "master")
|
14
|
+
c.set(:deploy_to, "/home/username/app")
|
15
|
+
c.set(:current_release, "")
|
16
|
+
c.set(:current_revision, "503ce0923ed177a3ce000005")
|
17
|
+
c.dry_run = false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
before { Appsignal::Capistrano.tasks(capistrano_config) }
|
21
|
+
|
22
|
+
def run
|
23
|
+
capture_stdout(out_stream) do
|
24
|
+
capistrano_config.find_and_execute_task("appsignal:deploy")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has a deploy task" do
|
29
|
+
expect(capistrano_config.find_task("appsignal:deploy")).to_not be_nil
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "appsignal:deploy task" do
|
33
|
+
before do
|
34
|
+
ENV["USER"] = "batman"
|
35
|
+
ENV["PWD"] = project_fixture_path
|
36
|
+
end
|
37
|
+
|
38
|
+
context "config" do
|
39
|
+
before do
|
40
|
+
capistrano_config.dry_run = true
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when appsignal_config is available" do
|
44
|
+
before do
|
45
|
+
capistrano_config.set(
|
46
|
+
:appsignal_config,
|
47
|
+
:name => "AppName",
|
48
|
+
:active => true,
|
49
|
+
:push_api_key => "abc"
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "overrides the default config with the custom appsignal_config" do
|
54
|
+
original_new = Appsignal::Marker.method(:new)
|
55
|
+
|
56
|
+
expect(Appsignal::Marker).to receive(:new) do |data, given_config|
|
57
|
+
expect(given_config[:name]).to eq("AppName")
|
58
|
+
original_new.call(data, given_config)
|
59
|
+
end
|
60
|
+
|
61
|
+
run
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when rack_env is used instead of rails_env" do
|
65
|
+
before do
|
66
|
+
capistrano_config.unset(:rails_env)
|
67
|
+
capistrano_config.set(:rack_env, "rack_production")
|
68
|
+
end
|
69
|
+
|
70
|
+
it "uses the rack_env as the env" do
|
71
|
+
original_new = Appsignal::Marker.method(:new)
|
72
|
+
|
73
|
+
expect(Appsignal::Marker).to receive(:new) do |data, given_config|
|
74
|
+
expect(given_config.env).to eq("rack_production")
|
75
|
+
original_new.call(data, given_config)
|
76
|
+
end
|
77
|
+
|
78
|
+
run
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when stage is used instead of rack_env / rails_env" do
|
83
|
+
before do
|
84
|
+
capistrano_config.unset(:rails_env)
|
85
|
+
capistrano_config.set(:stage, "stage_production")
|
86
|
+
end
|
87
|
+
|
88
|
+
it "uses the stage as the env" do
|
89
|
+
original_new = Appsignal::Marker.method(:new)
|
90
|
+
|
91
|
+
expect(Appsignal::Marker).to receive(:new) do |data, given_config|
|
92
|
+
expect(given_config.env).to eq("stage_production")
|
93
|
+
original_new.call(data, given_config)
|
94
|
+
end
|
95
|
+
|
96
|
+
run
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when appsignal_env is set" do
|
101
|
+
before do
|
102
|
+
capistrano_config.set(:rack_env, "rack_production")
|
103
|
+
capistrano_config.set(:stage, "stage_production")
|
104
|
+
capistrano_config.set(:appsignal_env, "appsignal_production")
|
105
|
+
end
|
106
|
+
|
107
|
+
it "uses the appsignal_env as the env" do
|
108
|
+
original_new = Appsignal::Marker.method(:new)
|
109
|
+
|
110
|
+
expect(Appsignal::Marker).to receive(:new) do |data, given_config|
|
111
|
+
expect(given_config.env).to eq("appsignal_production")
|
112
|
+
original_new.call(data, given_config)
|
113
|
+
end
|
114
|
+
|
115
|
+
run
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "with invalid config" do
|
120
|
+
before do
|
121
|
+
capistrano_config.set(:appsignal_config, :push_api_key => nil)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "does not continue with invalid config" do
|
125
|
+
run
|
126
|
+
expect(output).to include \
|
127
|
+
"Not notifying of deploy, config is not active for environment: production"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "markers" do
|
134
|
+
def stub_marker_request(data = {})
|
135
|
+
stub_api_request config, "markers", marker_data.merge(data)
|
136
|
+
end
|
137
|
+
|
138
|
+
let(:marker_data) do
|
139
|
+
{
|
140
|
+
:revision => "503ce0923ed177a3ce000005",
|
141
|
+
:user => "batman"
|
142
|
+
}
|
143
|
+
end
|
144
|
+
|
145
|
+
context "when active for this environment" do
|
146
|
+
it "transmits marker" do
|
147
|
+
stub_marker_request.to_return(:status => 200)
|
148
|
+
run
|
149
|
+
|
150
|
+
expect(output).to include \
|
151
|
+
"Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
|
152
|
+
"AppSignal has been notified of this deploy!"
|
153
|
+
end
|
154
|
+
|
155
|
+
context "with overridden revision" do
|
156
|
+
before do
|
157
|
+
capistrano_config.set(:appsignal_revision, "abc123")
|
158
|
+
stub_marker_request(:revision => "abc123").to_return(:status => 200)
|
159
|
+
run
|
160
|
+
end
|
161
|
+
|
162
|
+
it "transmits the overriden revision" do
|
163
|
+
expect(output).to include \
|
164
|
+
"Notifying AppSignal of deploy with: revision: abc123, user: batman",
|
165
|
+
"AppSignal has been notified of this deploy!"
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context "with overridden deploy user" do
|
170
|
+
before do
|
171
|
+
capistrano_config.set(:appsignal_user, "robin")
|
172
|
+
stub_marker_request(:user => "robin").to_return(:status => 200)
|
173
|
+
run
|
174
|
+
end
|
175
|
+
|
176
|
+
it "transmits the overriden deploy user" do
|
177
|
+
expect(output).to include \
|
178
|
+
"Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: robin",
|
179
|
+
"AppSignal has been notified of this deploy!"
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
context "with failed request" do
|
184
|
+
before do
|
185
|
+
stub_marker_request.to_return(:status => 500)
|
186
|
+
run
|
187
|
+
end
|
188
|
+
|
189
|
+
it "does not transmit marker" do
|
190
|
+
expect(output).to include \
|
191
|
+
"Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
|
192
|
+
"Something went wrong while trying to notify AppSignal:"
|
193
|
+
expect(output).to_not include "AppSignal has been notified of this deploy!"
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context "when dry run" do
|
198
|
+
before do
|
199
|
+
capistrano_config.dry_run = true
|
200
|
+
run
|
201
|
+
end
|
202
|
+
|
203
|
+
it "does not transmit marker" do
|
204
|
+
expect(output).to include \
|
205
|
+
"Dry run: AppSignal deploy marker not actually sent."
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
context "when not active for this environment" do
|
211
|
+
before do
|
212
|
+
capistrano_config.set(:rails_env, "nonsense")
|
213
|
+
run
|
214
|
+
end
|
215
|
+
|
216
|
+
it "does not transmit marker" do
|
217
|
+
expect(output).to include \
|
218
|
+
"Not notifying of deploy, config is not active for environment: nonsense"
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
@@ -0,0 +1,237 @@
|
|
1
|
+
if DependencyHelper.capistrano3_present?
|
2
|
+
require "capistrano/all"
|
3
|
+
require "capistrano/deploy"
|
4
|
+
require "appsignal/capistrano"
|
5
|
+
|
6
|
+
describe "Capistrano 3 integration" do
|
7
|
+
let(:capistrano) { Class.new.extend(Capistrano::DSL) }
|
8
|
+
let(:config) { project_fixture_config }
|
9
|
+
let(:out_stream) { std_stream }
|
10
|
+
let(:output) { out_stream.read }
|
11
|
+
let(:logger) { Logger.new(out_stream) }
|
12
|
+
let!(:capistrano_config) do
|
13
|
+
Capistrano::Configuration.reset!
|
14
|
+
Capistrano::Configuration.env.tap do |c|
|
15
|
+
c.set(:log_level, :error)
|
16
|
+
c.set(:logger, logger)
|
17
|
+
c.set(:rails_env, "production")
|
18
|
+
c.set(:repository, "master")
|
19
|
+
c.set(:deploy_to, "/home/username/app")
|
20
|
+
c.set(:current_release, "")
|
21
|
+
c.set(:current_revision, "503ce0923ed177a3ce000005")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
let(:marker_data) do
|
25
|
+
{
|
26
|
+
:revision => "503ce0923ed177a3ce000005",
|
27
|
+
:user => "batman"
|
28
|
+
}
|
29
|
+
end
|
30
|
+
before { Rake::Task["appsignal:deploy"].reenable }
|
31
|
+
|
32
|
+
def run
|
33
|
+
capture_std_streams(out_stream, out_stream) do
|
34
|
+
capistrano.invoke("appsignal:deploy")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should have a deploy task" do
|
39
|
+
expect(Rake::Task.task_defined?("appsignal:deploy")).to be_truthy
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "appsignal:deploy task" do
|
43
|
+
before do
|
44
|
+
ENV["USER"] = "batman"
|
45
|
+
ENV["PWD"] = project_fixture_path
|
46
|
+
end
|
47
|
+
|
48
|
+
context "config" do
|
49
|
+
let(:env) { "production" }
|
50
|
+
before do
|
51
|
+
capistrano_config.set(
|
52
|
+
:appsignal_config,
|
53
|
+
:name => "AppName",
|
54
|
+
:active => true,
|
55
|
+
:push_api_key => "abc"
|
56
|
+
)
|
57
|
+
config[:name] = "AppName"
|
58
|
+
config.instance_variable_set(:@env, env)
|
59
|
+
stub_marker_request.to_return(:status => 200)
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when rack_env is the only env set" do
|
63
|
+
let(:env) { "rack_production" }
|
64
|
+
before do
|
65
|
+
capistrano_config.delete(:rails_env)
|
66
|
+
capistrano_config.set(:rack_env, env)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "uses the rack_env as the env" do
|
70
|
+
original_new = Appsignal::Marker.method(:new)
|
71
|
+
|
72
|
+
expect(Appsignal::Marker).to receive(:new) do |data, given_config|
|
73
|
+
expect(given_config.env).to eq("rack_production")
|
74
|
+
original_new.call(data, given_config)
|
75
|
+
end
|
76
|
+
|
77
|
+
run
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "when stage is set" do
|
82
|
+
let(:env) { "stage_production" }
|
83
|
+
before do
|
84
|
+
capistrano_config.set(:rack_env, "rack_production")
|
85
|
+
capistrano_config.set(:stage, env)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "prefers the Capistrano stage rather than rails_env and rack_env" do
|
89
|
+
original_new = Appsignal::Marker.method(:new)
|
90
|
+
|
91
|
+
expect(Appsignal::Marker).to receive(:new) do |data, given_config|
|
92
|
+
expect(given_config.env).to eq("stage_production")
|
93
|
+
original_new.call(data, given_config)
|
94
|
+
end
|
95
|
+
|
96
|
+
run
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when `appsignal_config` is set" do
|
101
|
+
before do
|
102
|
+
ENV["APPSIGNAL_APP_NAME"] = "EnvName"
|
103
|
+
capistrano_config.set(:appsignal_config, :name => "AppName")
|
104
|
+
config[:name] = "AppName"
|
105
|
+
end
|
106
|
+
|
107
|
+
it "overrides the default config with the custom appsignal_config" do
|
108
|
+
original_new = Appsignal::Marker.method(:new)
|
109
|
+
|
110
|
+
expect(Appsignal::Marker).to receive(:new) do |data, given_config|
|
111
|
+
expect(given_config[:name]).to eq("AppName")
|
112
|
+
original_new.call(data, given_config)
|
113
|
+
end
|
114
|
+
|
115
|
+
run
|
116
|
+
end
|
117
|
+
|
118
|
+
context "with invalid config" do
|
119
|
+
before do
|
120
|
+
capistrano_config.set(:appsignal_config, :push_api_key => nil)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "does not continue with invalid config" do
|
124
|
+
run
|
125
|
+
expect(output).to include \
|
126
|
+
"Not notifying of deploy, config is not active for environment: production"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context "when `appsignal_env` is set" do
|
132
|
+
let(:env) { "appsignal_production" }
|
133
|
+
before do
|
134
|
+
capistrano_config.set(:rack_env, "rack_production")
|
135
|
+
capistrano_config.set(:stage, "stage_production")
|
136
|
+
capistrano_config.set(:appsignal_env, env)
|
137
|
+
end
|
138
|
+
|
139
|
+
it "prefers the appsignal_env rather than stage, rails_env and rack_env" do
|
140
|
+
original_new = Appsignal::Marker.method(:new)
|
141
|
+
|
142
|
+
expect(Appsignal::Marker).to receive(:new) do |data, given_config|
|
143
|
+
expect(given_config.env).to eq("appsignal_production")
|
144
|
+
original_new.call(data, given_config)
|
145
|
+
end
|
146
|
+
|
147
|
+
run
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "markers" do
|
153
|
+
context "when active for this environment" do
|
154
|
+
it "transmits marker" do
|
155
|
+
stub_marker_request.to_return(:status => 200)
|
156
|
+
run
|
157
|
+
|
158
|
+
expect(output).to include \
|
159
|
+
"Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
|
160
|
+
"AppSignal has been notified of this deploy!"
|
161
|
+
end
|
162
|
+
|
163
|
+
context "with overridden revision" do
|
164
|
+
before do
|
165
|
+
capistrano_config.set(:appsignal_revision, "abc123")
|
166
|
+
stub_marker_request(:revision => "abc123").to_return(:status => 200)
|
167
|
+
run
|
168
|
+
end
|
169
|
+
|
170
|
+
it "transmits the overriden revision" do
|
171
|
+
expect(output).to include \
|
172
|
+
"Notifying AppSignal of deploy with: revision: abc123, user: batman",
|
173
|
+
"AppSignal has been notified of this deploy!"
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context "with overridden deploy user" do
|
178
|
+
before do
|
179
|
+
capistrano_config.set(:appsignal_user, "robin")
|
180
|
+
stub_marker_request(:user => "robin").to_return(:status => 200)
|
181
|
+
run
|
182
|
+
end
|
183
|
+
|
184
|
+
it "transmits the overriden deploy user" do
|
185
|
+
expect(output).to include \
|
186
|
+
"Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: robin",
|
187
|
+
"AppSignal has been notified of this deploy!"
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
if Gem::Version.new(Capistrano::VERSION) >= Gem::Version.new("3.5.0")
|
192
|
+
context "when dry run" do
|
193
|
+
before do
|
194
|
+
expect(capistrano_config).to receive(:dry_run?).and_return(true)
|
195
|
+
run
|
196
|
+
end
|
197
|
+
|
198
|
+
it "does not transmit the marker" do
|
199
|
+
expect(output).to include "Dry run: AppSignal deploy marker not actually sent."
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
context "with failed request" do
|
205
|
+
before do
|
206
|
+
stub_marker_request.to_return(:status => 500)
|
207
|
+
run
|
208
|
+
end
|
209
|
+
|
210
|
+
it "does not transmit marker" do
|
211
|
+
expect(output).to include \
|
212
|
+
"Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
|
213
|
+
"Something went wrong while trying to notify AppSignal:"
|
214
|
+
expect(output).to_not include "AppSignal has been notified of this deploy!"
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context "when not active for this environment" do
|
220
|
+
before do
|
221
|
+
capistrano_config.set(:rails_env, "nonsense")
|
222
|
+
run
|
223
|
+
end
|
224
|
+
|
225
|
+
it "should not send deploy marker" do
|
226
|
+
expect(output).to include \
|
227
|
+
"Not notifying of deploy, config is not active for environment: nonsense"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
def stub_marker_request(data = {})
|
235
|
+
stub_api_request config, "markers", marker_data.merge(data)
|
236
|
+
end
|
237
|
+
end
|