appsignal 2.5.0.alpha.1-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,73 @@
|
|
1
|
+
if DependencyHelper.sinatra_present?
|
2
|
+
require "appsignal/integrations/sinatra"
|
3
|
+
|
4
|
+
def install_sinatra_integration
|
5
|
+
load File.expand_path("lib/appsignal/integrations/sinatra.rb", project_dir)
|
6
|
+
end
|
7
|
+
|
8
|
+
# "Uninstall" the AppSignal integration
|
9
|
+
def uninstall_sinatra_integration
|
10
|
+
Sinatra::Base.instance_variable_get(:@middleware).delete_if do |middleware|
|
11
|
+
middleware.first == Appsignal::Rack::SinatraBaseInstrumentation
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "Sinatra integration" do
|
16
|
+
before { allow(Appsignal).to receive(:active?).and_return(true) }
|
17
|
+
after { uninstall_sinatra_integration }
|
18
|
+
|
19
|
+
context "Appsignal.logger" do
|
20
|
+
subject { Appsignal.logger }
|
21
|
+
|
22
|
+
it "sets a logger" do
|
23
|
+
install_sinatra_integration
|
24
|
+
is_expected.to be_a Logger
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "middleware" do
|
29
|
+
context "when AppSignal is not active" do
|
30
|
+
before { allow(Appsignal).to receive(:active?).and_return(false) }
|
31
|
+
|
32
|
+
it "does not add the instrumentation middleware to Sinatra::Base" do
|
33
|
+
install_sinatra_integration
|
34
|
+
expect(Sinatra::Base.middleware.to_a).to_not include(
|
35
|
+
[Appsignal::Rack::SinatraBaseInstrumentation, [], nil]
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when AppSignal is active" do
|
41
|
+
it "adds the instrumentation middleware to Sinatra::Base" do
|
42
|
+
install_sinatra_integration
|
43
|
+
expect(Sinatra::Base.middleware.to_a).to include(
|
44
|
+
[Appsignal::Rack::SinatraBaseInstrumentation, [], nil]
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "environment" do
|
51
|
+
subject { Appsignal.config.env }
|
52
|
+
|
53
|
+
context "without APPSIGNAL_APP_ENV" do
|
54
|
+
before { install_sinatra_integration }
|
55
|
+
|
56
|
+
it "uses the app environment" do
|
57
|
+
expect(subject).to eq("test")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "with APPSIGNAL_APP_ENV" do
|
62
|
+
before do
|
63
|
+
ENV["APPSIGNAL_APP_ENV"] = "env-staging"
|
64
|
+
install_sinatra_integration
|
65
|
+
end
|
66
|
+
|
67
|
+
it "uses the environment variable" do
|
68
|
+
expect(subject).to eq("env-staging")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
if DependencyHelper.webmachine_present?
|
2
|
+
require "appsignal/integrations/webmachine"
|
3
|
+
|
4
|
+
describe Appsignal::Integrations::WebmachinePlugin::FSM do
|
5
|
+
let(:request) do
|
6
|
+
Webmachine::Request.new("GET", "http://google.com:80/foo", {}, nil)
|
7
|
+
end
|
8
|
+
let(:resource) { double(:trace? => false, :handle_exception => true) }
|
9
|
+
let(:response) { double }
|
10
|
+
let(:transaction) { double(:set_action_if_nil => true) }
|
11
|
+
let(:fsm) { Webmachine::Decision::FSM.new(resource, request, response) }
|
12
|
+
before(:context) { start_agent }
|
13
|
+
|
14
|
+
# Make sure the request responds to the method we need to get query params.
|
15
|
+
describe "request" do
|
16
|
+
it "should respond to `query`" do
|
17
|
+
expect(request).to respond_to(:query)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#run_with_appsignal" do
|
22
|
+
before do
|
23
|
+
allow(fsm).to receive(:request).and_return(request)
|
24
|
+
allow(fsm).to receive(:run_without_appsignal).and_return(true)
|
25
|
+
allow(SecureRandom).to receive(:uuid).and_return("uuid")
|
26
|
+
allow(Appsignal::Transaction).to receive(:create).and_return(transaction)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should create a transaction" do
|
30
|
+
expect(Appsignal::Transaction).to receive(:create).with(
|
31
|
+
"uuid",
|
32
|
+
Appsignal::Transaction::HTTP_REQUEST,
|
33
|
+
request,
|
34
|
+
:params_method => :query
|
35
|
+
).and_return(transaction)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should set the action" do
|
39
|
+
expect(transaction).to receive(:set_action_if_nil).with("RSpec::Mocks::Double#GET")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should call the original method" do
|
43
|
+
expect(fsm).to receive(:run_without_appsignal)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should instrument the original method" do
|
47
|
+
expect(Appsignal).to receive(:instrument).with("process_action.webmachine")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should close the transaction" do
|
51
|
+
expect(Appsignal::Transaction).to receive(:complete_current!)
|
52
|
+
end
|
53
|
+
|
54
|
+
after { fsm.run }
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#handle_exceptions_with_appsignal" do
|
58
|
+
let(:error) { ExampleException }
|
59
|
+
|
60
|
+
it "should catch the error and send it to AppSignal" do
|
61
|
+
expect(Appsignal).to receive(:set_error).with(error)
|
62
|
+
end
|
63
|
+
|
64
|
+
after do
|
65
|
+
fsm.send(:handle_exceptions) { raise error }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
describe Appsignal::JSExceptionTransaction do
|
2
|
+
before { allow(SecureRandom).to receive(:uuid).and_return("123abc") }
|
3
|
+
|
4
|
+
let!(:transaction) { Appsignal::JSExceptionTransaction.new(data) }
|
5
|
+
let(:data) do
|
6
|
+
{
|
7
|
+
"name" => "TypeError",
|
8
|
+
"message" => "foo is not a valid method",
|
9
|
+
"action" => "ExceptionIncidentComponent",
|
10
|
+
"path" => "foo.bar/moo",
|
11
|
+
"environment" => "development",
|
12
|
+
"backtrace" => [
|
13
|
+
"foo.bar/js:11:1",
|
14
|
+
"foo.bar/js:22:2"
|
15
|
+
],
|
16
|
+
"tags" => [
|
17
|
+
"tag1"
|
18
|
+
]
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#initialize" do
|
23
|
+
it "should call all required methods" do
|
24
|
+
expect(Appsignal::Extension).to receive(:start_transaction).with("123abc", "frontend", 0).and_return(1)
|
25
|
+
|
26
|
+
expect(transaction).to receive(:set_action)
|
27
|
+
expect(transaction).to receive(:set_metadata)
|
28
|
+
expect(transaction).to receive(:set_error)
|
29
|
+
expect(transaction).to receive(:set_sample_data)
|
30
|
+
|
31
|
+
transaction.send :initialize, data
|
32
|
+
|
33
|
+
expect(transaction.ext).to_not be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#set_action" do
|
38
|
+
it "should call `Appsignal::Extension.set_action`" do
|
39
|
+
expect(transaction.ext).to receive(:set_action).with(
|
40
|
+
"ExceptionIncidentComponent"
|
41
|
+
)
|
42
|
+
|
43
|
+
transaction.set_action
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#set_metadata" do
|
48
|
+
it "should call `Appsignal::Extension.set_transaction_metadata`" do
|
49
|
+
expect(transaction.ext).to receive(:set_metadata).with(
|
50
|
+
"path",
|
51
|
+
"foo.bar/moo"
|
52
|
+
)
|
53
|
+
|
54
|
+
transaction.set_metadata
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#set_error" do
|
59
|
+
it "should call `Appsignal::Extension.set_transaction_error`" do
|
60
|
+
expect(transaction.ext).to receive(:set_error).with(
|
61
|
+
"TypeError",
|
62
|
+
"foo is not a valid method",
|
63
|
+
Appsignal::Utils.data_generate(["foo.bar/js:11:1", "foo.bar/js:22:2"])
|
64
|
+
)
|
65
|
+
|
66
|
+
transaction.set_error
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#set_sample_data" do
|
71
|
+
it "should call `Appsignal::Extension.set_transaction_error_data`" do
|
72
|
+
expect(transaction.ext).to receive(:set_sample_data).with(
|
73
|
+
"tags",
|
74
|
+
Appsignal::Utils.data_generate(["tag1"])
|
75
|
+
)
|
76
|
+
|
77
|
+
transaction.set_sample_data
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "when sending just the name" do
|
82
|
+
let(:data) { { "name" => "TypeError" } }
|
83
|
+
|
84
|
+
describe "#set_action" do
|
85
|
+
it "should not call `Appsignal::Extension.set_action`" do
|
86
|
+
expect(transaction.ext).to_not receive(:set_action)
|
87
|
+
|
88
|
+
transaction.set_action
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "#set_metadata" do
|
93
|
+
it "should not call `Appsignal::Extension.set_transaction_metadata`" do
|
94
|
+
expect(transaction.ext).to_not receive(:set_metadata)
|
95
|
+
|
96
|
+
transaction.set_metadata
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe "#set_error" do
|
101
|
+
it "should call `Appsignal::Extension.set_transaction_error` with just the name" do
|
102
|
+
expect(transaction.ext).to receive(:set_error).with(
|
103
|
+
"TypeError",
|
104
|
+
"",
|
105
|
+
Appsignal::Utils.data_generate([])
|
106
|
+
)
|
107
|
+
|
108
|
+
transaction.set_error
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#set_sample_data" do
|
113
|
+
it "should not call `Appsignal::Extension.set_transaction_error_data`" do
|
114
|
+
expect(transaction.ext).to_not receive(:set_sample_data)
|
115
|
+
|
116
|
+
transaction.set_sample_data
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "#complete!" do
|
122
|
+
it "should call all required methods" do
|
123
|
+
expect(transaction.ext).to receive(:finish).and_call_original
|
124
|
+
expect(transaction.ext).to receive(:complete).and_call_original
|
125
|
+
transaction.complete!
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
describe Appsignal::Marker do
|
2
|
+
let(:config) { project_fixture_config }
|
3
|
+
let(:marker) do
|
4
|
+
described_class.new(
|
5
|
+
{
|
6
|
+
:revision => "503ce0923ed177a3ce000005",
|
7
|
+
:repository => "master",
|
8
|
+
:user => "batman",
|
9
|
+
:rails_env => "production"
|
10
|
+
},
|
11
|
+
config
|
12
|
+
)
|
13
|
+
end
|
14
|
+
let(:out_stream) { std_stream }
|
15
|
+
let(:output) { out_stream.read }
|
16
|
+
|
17
|
+
describe "#transmit" do
|
18
|
+
def stub_marker_request
|
19
|
+
stub_api_request config, "markers", marker.marker_data
|
20
|
+
end
|
21
|
+
|
22
|
+
def run
|
23
|
+
capture_stdout(out_stream) { marker.transmit }
|
24
|
+
end
|
25
|
+
|
26
|
+
context "when request is valid" do
|
27
|
+
before { stub_marker_request.to_return(:status => 200) }
|
28
|
+
|
29
|
+
it "outputs success" do
|
30
|
+
run
|
31
|
+
expect(output).to include \
|
32
|
+
"Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
|
33
|
+
"AppSignal has been notified of this deploy!"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when request is invalid" do
|
38
|
+
before { stub_marker_request.to_return(:status => 500) }
|
39
|
+
|
40
|
+
it "outputs failure" do
|
41
|
+
run
|
42
|
+
expect(output).to include \
|
43
|
+
"Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
|
44
|
+
"Something went wrong while trying to notify AppSignal: 500 at "\
|
45
|
+
"#{config[:endpoint]}/1/markers"
|
46
|
+
expect(output).to_not include \
|
47
|
+
"AppSignal has been notified of this deploy!"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
describe Appsignal::Minutely do
|
2
|
+
before do
|
3
|
+
Appsignal::Minutely.probes.clear
|
4
|
+
end
|
5
|
+
|
6
|
+
it "should have a list of probes" do
|
7
|
+
expect(Appsignal::Minutely.probes).to be_instance_of(Array)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe ".start" do
|
11
|
+
it "should call the probes periodically" do
|
12
|
+
probe = double
|
13
|
+
expect(probe).to receive(:call).at_least(:twice)
|
14
|
+
Appsignal::Minutely.probes << probe
|
15
|
+
allow(Appsignal::Minutely).to receive(:wait_time).and_return(0.1)
|
16
|
+
|
17
|
+
Appsignal::Minutely.start
|
18
|
+
|
19
|
+
sleep 0.5
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ".wait_time" do
|
24
|
+
it "should get the time to the next minute" do
|
25
|
+
allow_any_instance_of(Time).to receive(:sec).and_return(30)
|
26
|
+
expect(Appsignal::Minutely.wait_time).to eq 30
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ".add_gc_probe" do
|
31
|
+
it "should add the gc probe to the list" do
|
32
|
+
expect(Appsignal::Minutely.probes).to be_empty
|
33
|
+
|
34
|
+
Appsignal::Minutely.add_gc_probe
|
35
|
+
|
36
|
+
expect(Appsignal::Minutely.probes.size).to eq(1)
|
37
|
+
expect(Appsignal::Minutely.probes[0]).to be_instance_of(Appsignal::Minutely::GCProbe)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe Appsignal::Minutely::GCProbe do
|
42
|
+
describe "#call" do
|
43
|
+
it "should collect GC metrics" do
|
44
|
+
expect(Appsignal).to receive(:set_process_gauge).at_least(8).times
|
45
|
+
|
46
|
+
Appsignal::Minutely::GCProbe.new.call
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
describe Appsignal::Rack::GenericInstrumentation do
|
2
|
+
before :context do
|
3
|
+
start_agent
|
4
|
+
end
|
5
|
+
|
6
|
+
let(:app) { double(:call => true) }
|
7
|
+
let(:env) { { :path => "/", :method => "GET" } }
|
8
|
+
let(:options) { {} }
|
9
|
+
let(:middleware) { Appsignal::Rack::GenericInstrumentation.new(app, options) }
|
10
|
+
|
11
|
+
describe "#call" do
|
12
|
+
before do
|
13
|
+
allow(middleware).to receive(:raw_payload).and_return({})
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when appsignal is active" do
|
17
|
+
before { allow(Appsignal).to receive(:active?).and_return(true) }
|
18
|
+
|
19
|
+
it "should call with monitoring" do
|
20
|
+
expect(middleware).to receive(:call_with_appsignal_monitoring).with(env)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when appsignal is not active" do
|
25
|
+
before { allow(Appsignal).to receive(:active?).and_return(false) }
|
26
|
+
|
27
|
+
it "should not call with monitoring" do
|
28
|
+
expect(middleware).to_not receive(:call_with_appsignal_monitoring)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should call the stack" do
|
32
|
+
expect(app).to receive(:call).with(env)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
after { middleware.call(env) }
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#call_with_appsignal_monitoring", :error => false do
|
40
|
+
it "should create a transaction" do
|
41
|
+
expect(Appsignal::Transaction).to receive(:create).with(
|
42
|
+
kind_of(String),
|
43
|
+
Appsignal::Transaction::HTTP_REQUEST,
|
44
|
+
kind_of(Rack::Request)
|
45
|
+
).and_return(double(:set_action_if_nil => nil, :set_http_or_background_queue_start => nil, :set_metadata => nil))
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should call the app" do
|
49
|
+
expect(app).to receive(:call).with(env)
|
50
|
+
end
|
51
|
+
|
52
|
+
context "with an exception", :error => true do
|
53
|
+
let(:error) { ExampleException }
|
54
|
+
let(:app) do
|
55
|
+
double.tap do |d|
|
56
|
+
allow(d).to receive(:call).and_raise(error)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it "records the exception" do
|
61
|
+
expect_any_instance_of(Appsignal::Transaction).to receive(:set_error).with(error)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should set the action to unknown" do
|
66
|
+
expect_any_instance_of(Appsignal::Transaction).to receive(:set_action_if_nil).with("unknown")
|
67
|
+
end
|
68
|
+
|
69
|
+
context "with a route specified in the env" do
|
70
|
+
before do
|
71
|
+
env["appsignal.route"] = "GET /"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should set the action" do
|
75
|
+
expect_any_instance_of(Appsignal::Transaction).to receive(:set_action_if_nil).with("GET /")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should set metadata" do
|
80
|
+
expect_any_instance_of(Appsignal::Transaction).to receive(:set_metadata).twice
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should set the queue start" do
|
84
|
+
expect_any_instance_of(Appsignal::Transaction).to receive(:set_http_or_background_queue_start)
|
85
|
+
end
|
86
|
+
|
87
|
+
after(:error => false) { middleware.call(env) }
|
88
|
+
after(:error => true) { expect { middleware.call(env) }.to raise_error(error) }
|
89
|
+
end
|
90
|
+
end
|