appsignal 4.0.5 → 4.0.7
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 +4 -4
- data/CHANGELOG.md +20 -0
- data/Rakefile +9 -9
- data/appsignal.gemspec +22 -1
- data/build_matrix.yml +2 -1
- data/ext/agent.rb +27 -27
- data/lib/appsignal/check_in/scheduler.rb +3 -4
- data/lib/appsignal/check_in.rb +1 -1
- data/lib/appsignal/config.rb +1 -3
- data/lib/appsignal/integrations/que.rb +8 -2
- data/lib/appsignal/integrations/resque.rb +1 -6
- data/lib/appsignal/utils/hash_sanitizer.rb +4 -0
- data/lib/appsignal/version.rb +1 -1
- metadata +2 -191
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
- data/.github/ISSUE_TEMPLATE/chore.md +0 -14
- data/.github/workflows/ci.yml +0 -3150
- data/.github/workflows/create_release_from_tag.yml +0 -62
- data/.gitignore +0 -35
- data/.gitmodules +0 -3
- data/.rspec +0 -4
- data/.yardopts +0 -8
- data/benchmark.rake +0 -139
- data/gemfiles/capistrano2.gemfile +0 -6
- data/gemfiles/capistrano3.gemfile +0 -7
- data/gemfiles/dry-monitor.gemfile +0 -5
- data/gemfiles/grape.gemfile +0 -5
- data/gemfiles/hanami-2.0.gemfile +0 -7
- data/gemfiles/hanami-2.1.gemfile +0 -7
- data/gemfiles/http5.gemfile +0 -5
- data/gemfiles/no_dependencies.gemfile +0 -10
- data/gemfiles/padrino.gemfile +0 -7
- data/gemfiles/psych-3.gemfile +0 -5
- data/gemfiles/psych-4.gemfile +0 -5
- data/gemfiles/que.gemfile +0 -5
- data/gemfiles/rails-6.0.gemfile +0 -10
- data/gemfiles/rails-6.1.gemfile +0 -11
- data/gemfiles/rails-7.0.gemfile +0 -11
- data/gemfiles/rails-7.1.gemfile +0 -11
- data/gemfiles/rails-7.2.gemfile +0 -11
- data/gemfiles/redis-4.gemfile +0 -5
- data/gemfiles/redis-5.gemfile +0 -6
- data/gemfiles/resque-2.gemfile +0 -6
- data/gemfiles/sequel.gemfile +0 -10
- data/gemfiles/sinatra.gemfile +0 -5
- data/gemfiles/webmachine1.gemfile +0 -7
- data/gemfiles/webmachine2.gemfile +0 -6
- data/mono.yml +0 -16
- data/spec/.rubocop.yml +0 -7
- data/spec/lib/appsignal/auth_check_spec.rb +0 -84
- data/spec/lib/appsignal/capistrano2_spec.rb +0 -227
- data/spec/lib/appsignal/capistrano3_spec.rb +0 -284
- data/spec/lib/appsignal/check_in/cron_spec.rb +0 -202
- data/spec/lib/appsignal/check_in/scheduler_spec.rb +0 -443
- data/spec/lib/appsignal/cli/demo_spec.rb +0 -46
- data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +0 -16
- data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +0 -86
- data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1553
- data/spec/lib/appsignal/cli/helpers_spec.rb +0 -179
- data/spec/lib/appsignal/cli/install_spec.rb +0 -848
- data/spec/lib/appsignal/cli_spec.rb +0 -56
- data/spec/lib/appsignal/config_spec.rb +0 -1380
- data/spec/lib/appsignal/demo_spec.rb +0 -83
- data/spec/lib/appsignal/environment_spec.rb +0 -190
- data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +0 -60
- data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +0 -21
- data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +0 -21
- data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +0 -52
- data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +0 -21
- data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -84
- data/spec/lib/appsignal/event_formatter/rom/sql_formatter_spec.rb +0 -22
- data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -30
- data/spec/lib/appsignal/event_formatter/view_component/render_formatter_spec.rb +0 -41
- data/spec/lib/appsignal/event_formatter_spec.rb +0 -193
- data/spec/lib/appsignal/extension/jruby_spec.rb +0 -46
- data/spec/lib/appsignal/extension_install_failure_spec.rb +0 -20
- data/spec/lib/appsignal/extension_spec.rb +0 -178
- data/spec/lib/appsignal/garbage_collection_spec.rb +0 -98
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -345
- data/spec/lib/appsignal/hooks/action_mailer_spec.rb +0 -55
- data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +0 -23
- data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +0 -99
- data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +0 -47
- data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +0 -47
- data/spec/lib/appsignal/hooks/activejob_spec.rb +0 -650
- data/spec/lib/appsignal/hooks/at_exit_spec.rb +0 -105
- data/spec/lib/appsignal/hooks/celluloid_spec.rb +0 -40
- data/spec/lib/appsignal/hooks/data_mapper_spec.rb +0 -40
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +0 -38
- data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +0 -83
- data/spec/lib/appsignal/hooks/excon_spec.rb +0 -67
- data/spec/lib/appsignal/hooks/gvl_spec.rb +0 -145
- data/spec/lib/appsignal/hooks/http_spec.rb +0 -37
- data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +0 -46
- data/spec/lib/appsignal/hooks/mri_spec.rb +0 -23
- data/spec/lib/appsignal/hooks/net_http_spec.rb +0 -18
- data/spec/lib/appsignal/hooks/passenger_spec.rb +0 -30
- data/spec/lib/appsignal/hooks/puma_spec.rb +0 -80
- data/spec/lib/appsignal/hooks/que_spec.rb +0 -19
- data/spec/lib/appsignal/hooks/rake_spec.rb +0 -144
- data/spec/lib/appsignal/hooks/redis_client_spec.rb +0 -218
- data/spec/lib/appsignal/hooks/redis_spec.rb +0 -124
- data/spec/lib/appsignal/hooks/resque_spec.rb +0 -27
- data/spec/lib/appsignal/hooks/sequel_spec.rb +0 -44
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -29
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +0 -115
- data/spec/lib/appsignal/hooks/unicorn_spec.rb +0 -63
- data/spec/lib/appsignal/hooks/webmachine_spec.rb +0 -24
- data/spec/lib/appsignal/hooks_spec.rb +0 -124
- data/spec/lib/appsignal/integrations/data_mapper_spec.rb +0 -74
- data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +0 -454
- data/spec/lib/appsignal/integrations/http_spec.rb +0 -111
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +0 -154
- data/spec/lib/appsignal/integrations/net_http_spec.rb +0 -33
- data/spec/lib/appsignal/integrations/object_spec.rb +0 -347
- data/spec/lib/appsignal/integrations/puma_spec.rb +0 -150
- data/spec/lib/appsignal/integrations/que_spec.rb +0 -152
- data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -457
- data/spec/lib/appsignal/integrations/resque_spec.rb +0 -155
- data/spec/lib/appsignal/integrations/shoryuken_spec.rb +0 -165
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +0 -640
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +0 -136
- data/spec/lib/appsignal/loaders/grape_spec.rb +0 -12
- data/spec/lib/appsignal/loaders/hanami_spec.rb +0 -92
- data/spec/lib/appsignal/loaders/padrino_spec.rb +0 -273
- data/spec/lib/appsignal/loaders/sinatra_spec.rb +0 -44
- data/spec/lib/appsignal/loaders_spec.rb +0 -144
- data/spec/lib/appsignal/logger_spec.rb +0 -205
- data/spec/lib/appsignal/marker_spec.rb +0 -51
- data/spec/lib/appsignal/probes/gvl_spec.rb +0 -164
- data/spec/lib/appsignal/probes/mri_spec.rb +0 -162
- data/spec/lib/appsignal/probes/sidekiq_spec.rb +0 -333
- data/spec/lib/appsignal/probes_spec.rb +0 -411
- data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +0 -370
- data/spec/lib/appsignal/rack/body_wrapper_spec.rb +0 -319
- data/spec/lib/appsignal/rack/event_handler_spec.rb +0 -441
- data/spec/lib/appsignal/rack/grape_middleware_spec.rb +0 -201
- data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +0 -36
- data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +0 -38
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +0 -126
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +0 -217
- data/spec/lib/appsignal/rack_spec.rb +0 -243
- data/spec/lib/appsignal/sample_data_spec.rb +0 -238
- data/spec/lib/appsignal/span_spec.rb +0 -141
- data/spec/lib/appsignal/system_spec.rb +0 -126
- data/spec/lib/appsignal/transaction_spec.rb +0 -2111
- data/spec/lib/appsignal/transmitter_spec.rb +0 -198
- data/spec/lib/appsignal/utils/data_spec.rb +0 -166
- data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +0 -182
- data/spec/lib/appsignal/utils/integration_logger_spec.rb +0 -21
- data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -153
- data/spec/lib/appsignal/utils/json_spec.rb +0 -44
- data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +0 -192
- data/spec/lib/appsignal_spec.rb +0 -1919
- data/spec/lib/puma/appsignal_spec.rb +0 -334
- data/spec/spec_helper.rb +0 -173
- data/spec/support/fixtures/generated_config.yml +0 -24
- data/spec/support/fixtures/projects/broken/config/appsignal.yml +0 -1
- data/spec/support/fixtures/projects/valid/config/appsignal.yml +0 -57
- data/spec/support/fixtures/projects/valid/log/.gitkeep +0 -0
- data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +0 -16
- data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +0 -56
- data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +0 -10
- data/spec/support/fixtures/projects/valid_with_rails_app/log/.gitkeep +0 -0
- data/spec/support/fixtures/uploaded_file.txt +0 -0
- data/spec/support/hanami/hanami_app.rb +0 -29
- data/spec/support/helpers/action_mailer_helpers.rb +0 -25
- data/spec/support/helpers/activejob_helpers.rb +0 -27
- data/spec/support/helpers/api_request_helper.rb +0 -20
- data/spec/support/helpers/cli_helpers.rb +0 -40
- data/spec/support/helpers/config_helpers.rb +0 -66
- data/spec/support/helpers/dependency_helper.rb +0 -150
- data/spec/support/helpers/directory_helper.rb +0 -27
- data/spec/support/helpers/env_helpers.rb +0 -41
- data/spec/support/helpers/environment_metdata_helper.rb +0 -16
- data/spec/support/helpers/example_exception.rb +0 -13
- data/spec/support/helpers/example_standard_error.rb +0 -13
- data/spec/support/helpers/loader_helper.rb +0 -21
- data/spec/support/helpers/log_helpers.rb +0 -36
- data/spec/support/helpers/rails_helper.rb +0 -28
- data/spec/support/helpers/std_streams_helper.rb +0 -94
- data/spec/support/helpers/system_helpers.rb +0 -8
- data/spec/support/helpers/take_at_most_helper.rb +0 -21
- data/spec/support/helpers/time_helpers.rb +0 -11
- data/spec/support/helpers/transaction_helpers.rb +0 -122
- data/spec/support/helpers/wait_for_helper.rb +0 -39
- data/spec/support/matchers/contains_log.rb +0 -26
- data/spec/support/matchers/have_colorized_text.rb +0 -28
- data/spec/support/matchers/transaction.rb +0 -200
- data/spec/support/mocks/appsignal_mock.rb +0 -18
- data/spec/support/mocks/dummy_app.rb +0 -20
- data/spec/support/mocks/fake_gc_profiler.rb +0 -19
- data/spec/support/mocks/fake_gvl_tools.rb +0 -28
- data/spec/support/mocks/hash_like.rb +0 -10
- data/spec/support/mocks/mock_probe.rb +0 -13
- data/spec/support/mocks/puma_mock.rb +0 -43
- data/spec/support/shared_examples/instrument.rb +0 -48
- data/spec/support/stubs/appsignal/loaders/loader_stub.rb +0 -7
- data/spec/support/stubs/delayed_job.rb +0 -0
- data/spec/support/stubs/sidekiq/api.rb +0 -4
- data/spec/support/testing.rb +0 -194
- data/support/bundler_wrapper +0 -12
- data/support/install_deps +0 -33
@@ -1,136 +0,0 @@
|
|
1
|
-
if DependencyHelper.webmachine_present?
|
2
|
-
require "appsignal/integrations/webmachine"
|
3
|
-
|
4
|
-
class Response
|
5
|
-
attr_accessor :code
|
6
|
-
|
7
|
-
def body
|
8
|
-
""
|
9
|
-
end
|
10
|
-
|
11
|
-
def headers
|
12
|
-
{}
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe Appsignal::Integrations::WebmachineIntegration do
|
17
|
-
let(:request) do
|
18
|
-
Webmachine::Request.new(
|
19
|
-
"GET",
|
20
|
-
"http://google.com:80/foo?param1=value1¶m2=value2",
|
21
|
-
{
|
22
|
-
"REQUEST_METHOD" => "GET",
|
23
|
-
"PATH_INFO" => "/some/path",
|
24
|
-
"ignored_header" => "something"
|
25
|
-
},
|
26
|
-
nil
|
27
|
-
)
|
28
|
-
end
|
29
|
-
let(:app) do
|
30
|
-
proc do
|
31
|
-
def to_html
|
32
|
-
"Some HTML"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
let(:resource) do
|
37
|
-
app_block = app
|
38
|
-
Class.new(Webmachine::Resource) do
|
39
|
-
class_eval(&app_block) if app_block
|
40
|
-
|
41
|
-
def self.name
|
42
|
-
"MyResource"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
let(:resource_instance) { resource.new(request, response) }
|
47
|
-
let(:response) { Webmachine::Response.new }
|
48
|
-
let(:fsm) { Webmachine::Decision::FSM.new(resource_instance, request, response) }
|
49
|
-
before { start_agent }
|
50
|
-
around { |example| keep_transactions { example.run } }
|
51
|
-
|
52
|
-
describe "#run" do
|
53
|
-
it "creates a transaction" do
|
54
|
-
expect { fsm.run }.to(change { created_transactions.count }.by(1))
|
55
|
-
end
|
56
|
-
|
57
|
-
it "sets the action" do
|
58
|
-
fsm.run
|
59
|
-
expect(last_transaction).to have_action("MyResource#GET")
|
60
|
-
end
|
61
|
-
|
62
|
-
context "with action already set" do
|
63
|
-
let(:app) do
|
64
|
-
proc do
|
65
|
-
def to_html
|
66
|
-
Appsignal.set_action("Custom Action")
|
67
|
-
"Some HTML"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
it "doesn't overwrite the action" do
|
73
|
-
fsm.run
|
74
|
-
expect(last_transaction).to have_action("Custom Action")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
it "records an instrumentation event" do
|
79
|
-
fsm.run
|
80
|
-
expect(last_transaction).to include_event("name" => "process_action.webmachine")
|
81
|
-
end
|
82
|
-
|
83
|
-
it "sets the params" do
|
84
|
-
fsm.run
|
85
|
-
expect(last_transaction).to include_params("param1" => "value1", "param2" => "value2")
|
86
|
-
end
|
87
|
-
|
88
|
-
it "sets the headers" do
|
89
|
-
fsm.run
|
90
|
-
expect(last_transaction).to include_environment(
|
91
|
-
"REQUEST_METHOD" => "GET",
|
92
|
-
"PATH_INFO" => "/some/path"
|
93
|
-
)
|
94
|
-
end
|
95
|
-
|
96
|
-
it "closes the transaction" do
|
97
|
-
fsm.run
|
98
|
-
expect(last_transaction).to be_completed
|
99
|
-
expect(current_transaction?).to be_falsy
|
100
|
-
end
|
101
|
-
|
102
|
-
context "with parent transaction" do
|
103
|
-
let(:transaction) { http_request_transaction }
|
104
|
-
before { set_current_transaction(transaction) }
|
105
|
-
|
106
|
-
it "sets the action" do
|
107
|
-
fsm.run
|
108
|
-
expect(last_transaction).to have_action("MyResource#GET")
|
109
|
-
end
|
110
|
-
|
111
|
-
it "sets the params" do
|
112
|
-
fsm.run
|
113
|
-
last_transaction._sample
|
114
|
-
expect(last_transaction).to include_params("param1" => "value1", "param2" => "value2")
|
115
|
-
end
|
116
|
-
|
117
|
-
it "does not close the transaction" do
|
118
|
-
expect(last_transaction).to_not be_completed
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
describe "#handle_exceptions" do
|
124
|
-
let(:error) { ExampleException.new("error message") }
|
125
|
-
let(:transaction) { http_request_transaction }
|
126
|
-
|
127
|
-
it "tracks the error" do
|
128
|
-
with_current_transaction(transaction) do
|
129
|
-
fsm.send(:handle_exceptions) { raise error }
|
130
|
-
end
|
131
|
-
|
132
|
-
expect(last_transaction).to have_error("ExampleException", "error message")
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
if DependencyHelper.grape_present?
|
2
|
-
describe "Appsignal::Loaders::PadrinoLoader" do
|
3
|
-
describe "#on_load" do
|
4
|
-
it "ensures the Grape middleware is loaded" do
|
5
|
-
load_loader(:grape)
|
6
|
-
|
7
|
-
# Calling this doesn't raise a NameError
|
8
|
-
Appsignal::Rack::GrapeMiddleware
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
if DependencyHelper.hanami_present?
|
2
|
-
describe "Appsignal::Loaders::HanamiLoader" do
|
3
|
-
describe "#on_load" do
|
4
|
-
it "registers Hanami default config" do
|
5
|
-
load_loader(:hanami)
|
6
|
-
|
7
|
-
expect(Appsignal::Config.loader_defaults).to include(
|
8
|
-
:name => :hanami,
|
9
|
-
:root_path => Dir.pwd,
|
10
|
-
:env => :test,
|
11
|
-
:options => {}
|
12
|
-
)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "#on_start" do
|
17
|
-
before do
|
18
|
-
allow(::Hanami::Action).to receive(:prepend)
|
19
|
-
load_loader(:hanami)
|
20
|
-
start_loader(:hanami)
|
21
|
-
end
|
22
|
-
after { uninstall_hanami_middleware }
|
23
|
-
|
24
|
-
def uninstall_hanami_middleware
|
25
|
-
middleware_stack = ::Hanami.app.config.middleware.stack[::Hanami::Router::DEFAULT_PREFIX]
|
26
|
-
middleware_stack.delete_if do |middleware|
|
27
|
-
middleware.first == Appsignal::Rack::HanamiMiddleware ||
|
28
|
-
middleware.first == Rack::Events
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
it "adds the instrumentation middleware to Sinatra::Base" do
|
33
|
-
expect(::Hanami.app.config.middleware.stack[::Hanami::Router::DEFAULT_PREFIX])
|
34
|
-
.to include(
|
35
|
-
[Rack::Events, [[kind_of(Appsignal::Rack::EventHandler)]], *hanami_middleware_options],
|
36
|
-
[Appsignal::Rack::HanamiMiddleware, [], *hanami_middleware_options]
|
37
|
-
)
|
38
|
-
end
|
39
|
-
|
40
|
-
it "prepends the integration to Hanami::Action" do
|
41
|
-
expect(::Hanami::Action)
|
42
|
-
.to have_received(:prepend).with(Appsignal::Loaders::HanamiLoader::HanamiIntegration)
|
43
|
-
end
|
44
|
-
|
45
|
-
def hanami_middleware_options
|
46
|
-
if DependencyHelper.hanami2_1_present?
|
47
|
-
[{}, nil]
|
48
|
-
else
|
49
|
-
[nil]
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe "Appsignal::Loaders::HanamiLoader::HanamiIntegration" do
|
55
|
-
let(:transaction) { http_request_transaction }
|
56
|
-
let(:app) { HanamiApp::Actions::Books::Index }
|
57
|
-
around { |example| keep_transactions { example.run } }
|
58
|
-
before do
|
59
|
-
expect(::Hanami.app.config).to receive(:root).and_return(project_fixture_path)
|
60
|
-
Appsignal.load(:hanami)
|
61
|
-
start_agent
|
62
|
-
end
|
63
|
-
|
64
|
-
def make_request(env)
|
65
|
-
action = app.new
|
66
|
-
action.call(env)
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "#call" do
|
70
|
-
context "without an active transaction" do
|
71
|
-
let(:env) { {} }
|
72
|
-
|
73
|
-
it "does not set the action name" do
|
74
|
-
make_request(env)
|
75
|
-
|
76
|
-
expect(transaction).to_not have_action
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context "with an active transaction" do
|
81
|
-
let(:env) { { Appsignal::Rack::APPSIGNAL_TRANSACTION => transaction } }
|
82
|
-
|
83
|
-
it "sets action name on the transaction" do
|
84
|
-
make_request(env)
|
85
|
-
|
86
|
-
expect(transaction).to have_action("HanamiApp::Actions::Books::Index")
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,273 +0,0 @@
|
|
1
|
-
if DependencyHelper.padrino_present?
|
2
|
-
describe "Appsignal::Loaders::PadrinoLoader" do
|
3
|
-
describe "#on_load" do
|
4
|
-
it "registers Padrino default config" do
|
5
|
-
load_loader(:padrino)
|
6
|
-
|
7
|
-
expect(Appsignal::Config.loader_defaults).to include(
|
8
|
-
:name => :padrino,
|
9
|
-
:root_path => Padrino.mounted_root,
|
10
|
-
:env => :test,
|
11
|
-
:options => {}
|
12
|
-
)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "#on_start" do
|
17
|
-
let(:callbacks) { { :before_load => nil } }
|
18
|
-
before do
|
19
|
-
allow(Padrino).to receive(:before_load)
|
20
|
-
.and_wrap_original do |original_method, *args, &block|
|
21
|
-
callbacks[:before_load] = block
|
22
|
-
original_method.call(*args, &block)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
after { uninstall_padrino_integration }
|
26
|
-
|
27
|
-
def uninstall_padrino_integration
|
28
|
-
expected_middleware = [
|
29
|
-
Rack::Events,
|
30
|
-
Appsignal::Rack::SinatraBaseInstrumentation
|
31
|
-
]
|
32
|
-
Padrino.middleware.delete_if do |middleware|
|
33
|
-
expected_middleware.include?(middleware.first)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
it "adds the instrumentation middleware to Padrino" do
|
38
|
-
load_loader(:padrino)
|
39
|
-
start_loader(:padrino)
|
40
|
-
|
41
|
-
callbacks[:before_load].call
|
42
|
-
|
43
|
-
middlewares = Padrino.middleware
|
44
|
-
expect(middlewares).to include(
|
45
|
-
[Rack::Events, [[instance_of(Appsignal::Rack::EventHandler)]], nil]
|
46
|
-
)
|
47
|
-
expect(middlewares).to include(
|
48
|
-
[
|
49
|
-
Appsignal::Rack::SinatraBaseInstrumentation,
|
50
|
-
[
|
51
|
-
:instrument_event_name => "process_action.padrino"
|
52
|
-
],
|
53
|
-
nil
|
54
|
-
]
|
55
|
-
)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "Padrino integration" do
|
60
|
-
class PadrinoClassWithRouter
|
61
|
-
include Padrino::Routing
|
62
|
-
end
|
63
|
-
|
64
|
-
let(:base) { double }
|
65
|
-
let(:router) { PadrinoClassWithRouter.new }
|
66
|
-
let(:env) { {} }
|
67
|
-
# TODO: use an instance double
|
68
|
-
let(:settings) { double(:name => "TestApp") }
|
69
|
-
around { |example| keep_transactions { example.run } }
|
70
|
-
|
71
|
-
describe "routes" do
|
72
|
-
let(:env) do
|
73
|
-
{
|
74
|
-
"REQUEST_METHOD" => "GET",
|
75
|
-
"PATH_INFO" => path,
|
76
|
-
"REQUEST_PATH" => path,
|
77
|
-
"rack.input" => StringIO.new
|
78
|
-
}
|
79
|
-
end
|
80
|
-
let(:app) do
|
81
|
-
Class.new(Padrino::Application) do
|
82
|
-
def self.name
|
83
|
-
"PadrinoTestApp"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
let(:response) { app.call(env) }
|
88
|
-
|
89
|
-
def fetch_body(body)
|
90
|
-
if body.respond_to?(:response)
|
91
|
-
_, _, nested_body = body.response.to_a
|
92
|
-
fetch_body(nested_body)
|
93
|
-
elsif body.respond_to?(:to_ary)
|
94
|
-
body.to_ary
|
95
|
-
else
|
96
|
-
body
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
RSpec::Matchers.define :match_response do |expected_status, expected_body|
|
101
|
-
match do |response|
|
102
|
-
status, _headers, potential_body = response
|
103
|
-
body = fetch_body(potential_body)
|
104
|
-
|
105
|
-
matches_body =
|
106
|
-
if expected_body.is_a?(Regexp)
|
107
|
-
body.join =~ expected_body
|
108
|
-
else
|
109
|
-
body == [expected_body].compact
|
110
|
-
end
|
111
|
-
status == expected_status && matches_body
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context "when AppSignal is not active" do
|
116
|
-
let(:path) { "/foo" }
|
117
|
-
before { app.controllers { get(:foo) { "content" } } }
|
118
|
-
|
119
|
-
it "does not instrument the request" do
|
120
|
-
expect do
|
121
|
-
expect(response).to match_response(200, "content")
|
122
|
-
end.to_not(change { created_transactions.count })
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context "when AppSignal is active" do
|
127
|
-
let(:transaction) { http_request_transaction }
|
128
|
-
before do
|
129
|
-
start_agent
|
130
|
-
set_current_transaction(transaction)
|
131
|
-
end
|
132
|
-
|
133
|
-
context "with not existing route" do
|
134
|
-
let(:path) { "/404" }
|
135
|
-
|
136
|
-
it "instruments the request" do
|
137
|
-
expect(response).to match_response(404, /^GET /404/)
|
138
|
-
expect(last_transaction).to have_action("PadrinoTestApp#unknown")
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
context "when Sinatra tells us it's a static file" do
|
143
|
-
let(:path) { "/static" }
|
144
|
-
before do
|
145
|
-
env["sinatra.static_file"] = true
|
146
|
-
app.controllers { get(:static) { "Static!" } }
|
147
|
-
end
|
148
|
-
|
149
|
-
it "does not instrument the request" do
|
150
|
-
expect(response).to match_response(200, "Static!")
|
151
|
-
expect(last_transaction).to_not have_action
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
# Older Padrino versions don't support `action` (v11.0+)
|
156
|
-
context "without #action on Sinatra::Request" do
|
157
|
-
let(:path) { "/my_original_path/10" }
|
158
|
-
before do
|
159
|
-
allow_any_instance_of(Sinatra::Request).to receive(:action).and_return(nil)
|
160
|
-
app.controllers { get(:my_original_path, :with => :id) { "content" } }
|
161
|
-
end
|
162
|
-
|
163
|
-
it "falls back on Sinatra::Request#route_obj.original_path" do
|
164
|
-
expect(response).to match_response(200, "content")
|
165
|
-
expect(last_transaction).to have_action("PadrinoTestApp:/my_original_path/:id")
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
context "without Sinatra::Request#route_obj.original_path" do
|
170
|
-
let(:path) { "/my_original_path" }
|
171
|
-
before do
|
172
|
-
allow_any_instance_of(Sinatra::Request).to receive(:action).and_return(nil)
|
173
|
-
allow_any_instance_of(Sinatra::Request).to receive(:route_obj).and_return(nil)
|
174
|
-
app.controllers { get(:my_original_path) { "content" } }
|
175
|
-
end
|
176
|
-
|
177
|
-
it "falls back on app name" do
|
178
|
-
expect(response).to match_response(200, "content")
|
179
|
-
expect(last_transaction).to have_action("PadrinoTestApp#unknown")
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
context "with existing route" do
|
184
|
-
let(:path) { "/" }
|
185
|
-
def make_request
|
186
|
-
expect(response).to match_response(200, "content")
|
187
|
-
end
|
188
|
-
|
189
|
-
context "with action name as symbol" do
|
190
|
-
context "with :index helper" do
|
191
|
-
before do
|
192
|
-
# :index == "/"
|
193
|
-
app.controllers { get(:index) { "content" } }
|
194
|
-
end
|
195
|
-
|
196
|
-
it "sets the action with the app name and action name" do
|
197
|
-
make_request
|
198
|
-
expect(last_transaction).to have_action("PadrinoTestApp:#index")
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
context "with custom action name" do
|
203
|
-
let(:path) { "/foo" }
|
204
|
-
before do
|
205
|
-
app.controllers { get(:foo) { "content" } }
|
206
|
-
end
|
207
|
-
|
208
|
-
it "sets the action with the app name and action name" do
|
209
|
-
make_request
|
210
|
-
expect(last_transaction).to have_action("PadrinoTestApp:#foo")
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
context "with an action defined with a path" do
|
216
|
-
context "with root path" do
|
217
|
-
before do
|
218
|
-
# :index == "/"
|
219
|
-
app.controllers { get("/") { "content" } }
|
220
|
-
end
|
221
|
-
|
222
|
-
it "sets the action with the app name and action path" do
|
223
|
-
make_request
|
224
|
-
expect(last_transaction).to have_action("PadrinoTestApp:#/")
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
context "with custom path" do
|
229
|
-
let(:path) { "/foo" }
|
230
|
-
before do
|
231
|
-
app.controllers { get("/foo") { "content" } }
|
232
|
-
end
|
233
|
-
|
234
|
-
it "sets the action with the app name and action path" do
|
235
|
-
make_request
|
236
|
-
expect(last_transaction).to have_action("PadrinoTestApp:#/foo")
|
237
|
-
end
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
|
-
context "with controller" do
|
242
|
-
let(:path) { "/my_controller" }
|
243
|
-
|
244
|
-
context "with controller as name" do
|
245
|
-
before do
|
246
|
-
# :index == "/"
|
247
|
-
app.controllers(:my_controller) { get(:index) { "content" } }
|
248
|
-
end
|
249
|
-
|
250
|
-
it "sets the action with the app name, controller name and action name" do
|
251
|
-
make_request
|
252
|
-
expect(last_transaction).to have_action("PadrinoTestApp:my_controller#index")
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
context "with controller as path" do
|
257
|
-
before do
|
258
|
-
# :index == "/"
|
259
|
-
app.controllers("/my_controller") { get(:index) { "content" } }
|
260
|
-
end
|
261
|
-
|
262
|
-
it "sets the action with the app name, controller name and action path" do
|
263
|
-
make_request
|
264
|
-
expect(last_transaction).to have_action("PadrinoTestApp:/my_controller#index")
|
265
|
-
end
|
266
|
-
end
|
267
|
-
end
|
268
|
-
end
|
269
|
-
end
|
270
|
-
end
|
271
|
-
end
|
272
|
-
end
|
273
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
if DependencyHelper.sinatra_present?
|
2
|
-
describe "Appsignal::Loaders::SinatraLoader" do
|
3
|
-
describe "#on_load" do
|
4
|
-
it "registers Sinatra default config" do
|
5
|
-
::Sinatra::Application.settings.root = "/some/path"
|
6
|
-
load_loader(:sinatra)
|
7
|
-
|
8
|
-
expect(Appsignal::Config.loader_defaults).to include(
|
9
|
-
:name => :sinatra,
|
10
|
-
:root_path => "/some/path",
|
11
|
-
:env => :test,
|
12
|
-
:options => {}
|
13
|
-
)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "#on_start" do
|
18
|
-
after { uninstall_sinatra_integration }
|
19
|
-
|
20
|
-
def uninstall_sinatra_integration
|
21
|
-
expected_middleware = [
|
22
|
-
Rack::Events,
|
23
|
-
Appsignal::Rack::SinatraBaseInstrumentation
|
24
|
-
]
|
25
|
-
Sinatra::Base.instance_variable_get(:@middleware).delete_if do |middleware|
|
26
|
-
expected_middleware.include?(middleware.first)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
it "adds the instrumentation middleware to Sinatra::Base" do
|
31
|
-
load_loader(:sinatra)
|
32
|
-
start_loader(:sinatra)
|
33
|
-
|
34
|
-
middlewares = Sinatra::Base.middleware.to_a
|
35
|
-
expect(middlewares).to include(
|
36
|
-
[Rack::Events, [[instance_of(Appsignal::Rack::EventHandler)]], nil]
|
37
|
-
)
|
38
|
-
expect(middlewares).to include(
|
39
|
-
[Appsignal::Rack::SinatraBaseInstrumentation, [], nil]
|
40
|
-
)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,144 +0,0 @@
|
|
1
|
-
describe Appsignal::Loaders do
|
2
|
-
describe ".register" do
|
3
|
-
before do
|
4
|
-
define_loader(:test_loader) do
|
5
|
-
def on_load
|
6
|
-
puts "do something on_load"
|
7
|
-
register_config_defaults(
|
8
|
-
:root_path => "/some/path",
|
9
|
-
:env => "test env",
|
10
|
-
:active => false
|
11
|
-
)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
it "registers a loader" do
|
17
|
-
define_loader(:test_loader)
|
18
|
-
expect(Appsignal::Loaders.loaders).to have_key(:test_loader)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe ".unregister" do
|
23
|
-
it "unregisters a loader" do
|
24
|
-
define_loader(:test_loader)
|
25
|
-
expect(Appsignal::Loaders.loaders).to have_key(:test_loader)
|
26
|
-
|
27
|
-
Appsignal::Loaders.unregister(:test_loader)
|
28
|
-
expect(Appsignal::Loaders.loaders).to_not have_key(:test_loader)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe ".load" do
|
33
|
-
it "calls the Loader's on_loader method" do
|
34
|
-
Appsignal::Testing.store[:loader_loaded] = 0
|
35
|
-
define_loader(:test_loader) do
|
36
|
-
def on_load
|
37
|
-
Appsignal::Testing.store[:loader_loaded] += 1
|
38
|
-
end
|
39
|
-
end
|
40
|
-
Appsignal::Loaders.load(:test_loader)
|
41
|
-
|
42
|
-
expect(Appsignal::Testing.store[:loader_loaded]).to eq(1)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "registers config defaults" do
|
46
|
-
define_loader(:test_loader) do
|
47
|
-
def on_load
|
48
|
-
register_config_defaults(:my_option => true)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
Appsignal::Loaders.load(:test_loader)
|
52
|
-
|
53
|
-
expect(Appsignal::Config.loader_defaults).to eq([
|
54
|
-
{
|
55
|
-
:name => :test_loader,
|
56
|
-
:env => nil,
|
57
|
-
:root_path => nil,
|
58
|
-
:options => { :my_option => true }
|
59
|
-
}
|
60
|
-
])
|
61
|
-
end
|
62
|
-
|
63
|
-
it "does not load errors that aren't registered" do
|
64
|
-
logs =
|
65
|
-
capture_logs do
|
66
|
-
Appsignal::Loaders.load(:unknown_loader)
|
67
|
-
end
|
68
|
-
|
69
|
-
expect(logs).to contains_log(:warn, "No loader found with the name 'unknown_loader'.")
|
70
|
-
end
|
71
|
-
|
72
|
-
it "loads the loader file on load" do
|
73
|
-
expect(Appsignal::Loaders.registered?(:loader_stub)).to be_falsy
|
74
|
-
Appsignal::Loaders.load(:loader_stub)
|
75
|
-
|
76
|
-
expect(Appsignal::Loaders.registered?(:loader_stub)).to be_truthy
|
77
|
-
end
|
78
|
-
|
79
|
-
it "does not error when a loader has no on_load method" do
|
80
|
-
define_loader(:test_loader) do
|
81
|
-
# Do nothing
|
82
|
-
end
|
83
|
-
Appsignal::Loaders.load(:test_loader)
|
84
|
-
end
|
85
|
-
|
86
|
-
it "logs an error when an error occurs on load" do
|
87
|
-
define_loader(:test_loader) do
|
88
|
-
def on_load
|
89
|
-
raise ExampleStandardError, "uh oh"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
logs =
|
93
|
-
capture_logs do
|
94
|
-
Appsignal::Loaders.load(:test_loader)
|
95
|
-
end
|
96
|
-
|
97
|
-
expect(logs).to contains_log(
|
98
|
-
:error,
|
99
|
-
"An error occurred while loading the 'test_loader' loader: ExampleStandardError: uh oh"
|
100
|
-
)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe ".start" do
|
105
|
-
it "starts all loaded loaders" do
|
106
|
-
Appsignal::Testing.store[:loader_started] = 0
|
107
|
-
define_loader(:test_loader) do
|
108
|
-
def on_start
|
109
|
-
Appsignal::Testing.store[:loader_started] += 1
|
110
|
-
end
|
111
|
-
end
|
112
|
-
Appsignal::Loaders.load(:test_loader)
|
113
|
-
Appsignal::Loaders.start
|
114
|
-
|
115
|
-
expect(Appsignal::Testing.store[:loader_started]).to eq(1)
|
116
|
-
end
|
117
|
-
|
118
|
-
it "does not error when a loader has no on_start method" do
|
119
|
-
define_loader(:test_loader) do
|
120
|
-
# Do nothing
|
121
|
-
end
|
122
|
-
Appsignal::Loaders.load(:test_loader)
|
123
|
-
Appsignal::Loaders.start
|
124
|
-
end
|
125
|
-
|
126
|
-
it "logs an error when an error occurs on start" do
|
127
|
-
define_loader(:test_loader) do
|
128
|
-
def on_start
|
129
|
-
raise ExampleStandardError, "uh oh"
|
130
|
-
end
|
131
|
-
end
|
132
|
-
logs =
|
133
|
-
capture_logs do
|
134
|
-
Appsignal::Loaders.load(:test_loader)
|
135
|
-
Appsignal::Loaders.start
|
136
|
-
end
|
137
|
-
|
138
|
-
expect(logs).to contains_log(
|
139
|
-
:error,
|
140
|
-
"An error occurred while starting the 'test_loader' loader: ExampleStandardError: uh oh"
|
141
|
-
)
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|