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,38 +0,0 @@
|
|
1
|
-
describe Appsignal::Rack::InstrumentationMiddleware do
|
2
|
-
let(:app) { DummyApp.new }
|
3
|
-
let(:env) { Rack::MockRequest.env_for("/some/path") }
|
4
|
-
let(:middleware) { described_class.new(app, {}) }
|
5
|
-
|
6
|
-
before { start_agent }
|
7
|
-
around { |example| keep_transactions { example.run } }
|
8
|
-
|
9
|
-
def make_request(env)
|
10
|
-
middleware.call(env)
|
11
|
-
end
|
12
|
-
|
13
|
-
context "without an exception" do
|
14
|
-
it "reports a process_request_middleware.rack event" do
|
15
|
-
make_request(env)
|
16
|
-
|
17
|
-
expect(last_transaction).to include_event("name" => "process_request_middleware.rack")
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "with custom action name" do
|
22
|
-
let(:app) { DummyApp.new { |_env| Appsignal.set_action("MyAction") } }
|
23
|
-
|
24
|
-
it "reports the custom action name" do
|
25
|
-
make_request(env)
|
26
|
-
|
27
|
-
expect(last_transaction).to have_action("MyAction")
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "without action name metadata" do
|
32
|
-
it "reports no action name" do
|
33
|
-
make_request(env)
|
34
|
-
|
35
|
-
expect(last_transaction).to_not have_action
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,126 +0,0 @@
|
|
1
|
-
if DependencyHelper.rails_present?
|
2
|
-
describe Appsignal::Rack::RailsInstrumentation do
|
3
|
-
class MockController; end
|
4
|
-
|
5
|
-
let(:transaction) { new_transaction }
|
6
|
-
let(:app) { DummyApp.new }
|
7
|
-
let(:params) do
|
8
|
-
{
|
9
|
-
"controller" => "blog_posts",
|
10
|
-
"action" => "show",
|
11
|
-
"id" => "1",
|
12
|
-
"my_custom_param" => "my custom secret",
|
13
|
-
"password" => "super secret"
|
14
|
-
}
|
15
|
-
end
|
16
|
-
let(:env) do
|
17
|
-
http_request_env_with_data(
|
18
|
-
:params => params,
|
19
|
-
:with_queue_start => true,
|
20
|
-
"action_dispatch.request_id" => "request_id123",
|
21
|
-
"action_dispatch.parameter_filter" => [:my_custom_param, :password],
|
22
|
-
"action_controller.instance" => double(
|
23
|
-
:class => MockController,
|
24
|
-
:action_name => "index"
|
25
|
-
)
|
26
|
-
)
|
27
|
-
end
|
28
|
-
let(:middleware) { Appsignal::Rack::RailsInstrumentation.new(app, {}) }
|
29
|
-
around { |example| keep_transactions { example.run } }
|
30
|
-
before do
|
31
|
-
start_agent
|
32
|
-
env[Appsignal::Rack::APPSIGNAL_TRANSACTION] = transaction
|
33
|
-
end
|
34
|
-
|
35
|
-
def make_request
|
36
|
-
middleware.call(env)
|
37
|
-
last_transaction&._sample
|
38
|
-
end
|
39
|
-
|
40
|
-
def make_request_with_error(error_class, error_message)
|
41
|
-
expect { make_request }.to raise_error(error_class, error_message)
|
42
|
-
end
|
43
|
-
|
44
|
-
context "with a request that doesn't raise an error" do
|
45
|
-
before { make_request }
|
46
|
-
|
47
|
-
it "calls the next middleware in the stack" do
|
48
|
-
expect(app).to be_called
|
49
|
-
end
|
50
|
-
|
51
|
-
it "does not instrument an event" do
|
52
|
-
expect(last_transaction).to_not include_events
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context "with a request that raises an error" do
|
57
|
-
let(:app) do
|
58
|
-
DummyApp.new { |_env| raise ExampleException, "error message" }
|
59
|
-
end
|
60
|
-
before do
|
61
|
-
make_request_with_error(ExampleException, "error message")
|
62
|
-
end
|
63
|
-
|
64
|
-
it "calls the next middleware in the stack" do
|
65
|
-
expect(app).to be_called
|
66
|
-
end
|
67
|
-
|
68
|
-
it "reports the error on the transaction" do
|
69
|
-
expect(last_transaction).to have_error("ExampleException", "error message")
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
it "sets the controller action as the action name" do
|
74
|
-
make_request
|
75
|
-
|
76
|
-
expect(last_transaction).to have_namespace(Appsignal::Transaction::HTTP_REQUEST)
|
77
|
-
expect(last_transaction).to have_action("MockController#index")
|
78
|
-
end
|
79
|
-
|
80
|
-
it "sets request metadata on the transaction" do
|
81
|
-
make_request
|
82
|
-
|
83
|
-
expect(last_transaction).to include_metadata(
|
84
|
-
"method" => "GET",
|
85
|
-
"path" => "/blog"
|
86
|
-
)
|
87
|
-
expect(last_transaction).to include_tags("request_id" => "request_id123")
|
88
|
-
end
|
89
|
-
|
90
|
-
it "reports Rails filter parameters" do
|
91
|
-
make_request
|
92
|
-
|
93
|
-
expect(last_transaction).to include_params(
|
94
|
-
"controller" => "blog_posts",
|
95
|
-
"action" => "show",
|
96
|
-
"id" => "1",
|
97
|
-
"my_custom_param" => "[FILTERED]",
|
98
|
-
"password" => "[FILTERED]"
|
99
|
-
)
|
100
|
-
end
|
101
|
-
|
102
|
-
context "with an invalid HTTP request method" do
|
103
|
-
it "does not store the invalid HTTP request method" do
|
104
|
-
env[:request_method] = "FOO"
|
105
|
-
env["REQUEST_METHOD"] = "FOO"
|
106
|
-
logs = capture_logs { make_request }
|
107
|
-
|
108
|
-
expect(last_transaction).to_not include_metadata("method" => anything)
|
109
|
-
expect(logs).to contains_log(
|
110
|
-
:error,
|
111
|
-
"Exception while fetching the HTTP request method: "
|
112
|
-
)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
context "with a request path that's not a route" do
|
117
|
-
it "doesn't set an action name" do
|
118
|
-
env[:path] = "/unknown-route"
|
119
|
-
env["action_controller.instance"] = nil
|
120
|
-
make_request
|
121
|
-
|
122
|
-
expect(last_transaction).to_not have_action
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
@@ -1,217 +0,0 @@
|
|
1
|
-
if DependencyHelper.sinatra_present?
|
2
|
-
require "appsignal/rack/sinatra_instrumentation"
|
3
|
-
|
4
|
-
module SinatraRequestHelpers
|
5
|
-
def make_request
|
6
|
-
middleware.call(env)
|
7
|
-
end
|
8
|
-
|
9
|
-
def make_request_with_error(error)
|
10
|
-
expect { middleware.call(env) }.to raise_error(error)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe Appsignal::Rack::SinatraInstrumentation do
|
15
|
-
include SinatraRequestHelpers
|
16
|
-
|
17
|
-
let(:settings) { double(:raise_errors => false) }
|
18
|
-
let(:app) { double(:call => true, :settings => settings) }
|
19
|
-
let(:env) do
|
20
|
-
Rack::MockRequest.env_for("/path", "sinatra.route" => "GET /path", "REQUEST_METHOD" => "GET")
|
21
|
-
end
|
22
|
-
let(:middleware) { Appsignal::Rack::SinatraInstrumentation.new(app) }
|
23
|
-
|
24
|
-
before { start_agent }
|
25
|
-
around do |example|
|
26
|
-
keep_transactions { example.run }
|
27
|
-
end
|
28
|
-
|
29
|
-
describe "#call" do
|
30
|
-
before { allow(middleware).to receive(:raw_payload).and_return({}) }
|
31
|
-
|
32
|
-
it "doesn't instrument requests" do
|
33
|
-
expect { make_request }.to_not(change { created_transactions.count })
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe ".settings" do
|
38
|
-
subject { middleware.settings }
|
39
|
-
|
40
|
-
it "returns the app's settings" do
|
41
|
-
expect(subject).to eq(app.settings)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe Appsignal::Rack::SinatraBaseInstrumentation do
|
47
|
-
include SinatraRequestHelpers
|
48
|
-
|
49
|
-
let(:settings) { double(:raise_errors => false) }
|
50
|
-
let(:app) { double(:call => true, :settings => settings) }
|
51
|
-
let(:env) do
|
52
|
-
Rack::MockRequest.env_for("/path", "sinatra.route" => "GET /path", "REQUEST_METHOD" => "GET")
|
53
|
-
end
|
54
|
-
let(:appsignal_env) { :default }
|
55
|
-
let(:options) { {} }
|
56
|
-
let(:middleware) { Appsignal::Rack::SinatraBaseInstrumentation.new(app, options) }
|
57
|
-
|
58
|
-
before { start_agent(:env => appsignal_env) }
|
59
|
-
around { |example| keep_transactions { example.run } }
|
60
|
-
|
61
|
-
describe "#initialize" do
|
62
|
-
context "with no settings method in the Sinatra app" do
|
63
|
-
let(:app) { double(:call => true) }
|
64
|
-
|
65
|
-
it "does not raise errors" do
|
66
|
-
expect(middleware.raise_errors_on).to be(false)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
context "with no raise_errors setting in the Sinatra app" do
|
71
|
-
let(:app) { double(:call => true, :settings => double) }
|
72
|
-
|
73
|
-
it "does not raise errors" do
|
74
|
-
expect(middleware.raise_errors_on).to be(false)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context "with raise_errors turned off in the Sinatra app" do
|
79
|
-
let(:app) { double(:call => true, :settings => double(:raise_errors => false)) }
|
80
|
-
|
81
|
-
it "raises errors" do
|
82
|
-
expect(middleware.raise_errors_on).to be(false)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
context "with raise_errors turned on in the Sinatra app" do
|
87
|
-
let(:app) { double(:call => true, :settings => double(:raise_errors => true)) }
|
88
|
-
|
89
|
-
it "raises errors" do
|
90
|
-
expect(middleware.raise_errors_on).to be(true)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe "#call" do
|
96
|
-
before { allow(middleware).to receive(:raw_payload).and_return({}) }
|
97
|
-
|
98
|
-
context "when appsignal is not active" do
|
99
|
-
let(:appsignal_env) { :inactive_env }
|
100
|
-
|
101
|
-
it "does not instrument requests" do
|
102
|
-
expect { make_request }.to_not(change { created_transactions.count })
|
103
|
-
end
|
104
|
-
|
105
|
-
it "calls the next middleware in the stack" do
|
106
|
-
make_request
|
107
|
-
|
108
|
-
expect(app).to have_received(:call).with(env)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
context "when appsignal is active" do
|
113
|
-
context "without an error" do
|
114
|
-
it "creates a transaction for the request" do
|
115
|
-
expect { make_request }.to(change { created_transactions.count }.by(1))
|
116
|
-
|
117
|
-
expect(last_transaction).to have_namespace(Appsignal::Transaction::HTTP_REQUEST)
|
118
|
-
end
|
119
|
-
|
120
|
-
it "reports a process_action.sinatra event" do
|
121
|
-
make_request
|
122
|
-
|
123
|
-
expect(last_transaction).to include_event("name" => "process_action.sinatra")
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
context "with an error in sinatra.error" do
|
128
|
-
let(:error) { ExampleException.new("error message") }
|
129
|
-
before { env["sinatra.error"] = error }
|
130
|
-
|
131
|
-
it "creates a transaction for the request" do
|
132
|
-
expect { make_request }.to(change { created_transactions.count }.by(1))
|
133
|
-
|
134
|
-
expect(last_transaction).to have_namespace(Appsignal::Transaction::HTTP_REQUEST)
|
135
|
-
end
|
136
|
-
|
137
|
-
context "when raise_errors is off" do
|
138
|
-
let(:settings) { double(:raise_errors => false) }
|
139
|
-
|
140
|
-
it "records the error" do
|
141
|
-
make_request
|
142
|
-
|
143
|
-
expect(last_transaction).to have_error("ExampleException", "error message")
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
context "when raise_errors is on" do
|
148
|
-
let(:settings) { double(:raise_errors => true) }
|
149
|
-
|
150
|
-
it "does not record the error" do
|
151
|
-
make_request
|
152
|
-
|
153
|
-
expect(last_transaction).to_not have_error
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
context "if sinatra.skip_appsignal_error is set" do
|
158
|
-
before do
|
159
|
-
env.merge!(
|
160
|
-
"sinatra.error" => error,
|
161
|
-
"sinatra.skip_appsignal_error" => true
|
162
|
-
)
|
163
|
-
end
|
164
|
-
|
165
|
-
it "does not record the error" do
|
166
|
-
make_request
|
167
|
-
|
168
|
-
expect(last_transaction).to_not have_error
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
describe "action name" do
|
174
|
-
it "sets the action to the request method and path" do
|
175
|
-
make_request
|
176
|
-
|
177
|
-
expect(last_transaction).to have_action("GET /path")
|
178
|
-
end
|
179
|
-
|
180
|
-
context "without 'sinatra.route' env" do
|
181
|
-
let(:env) do
|
182
|
-
Rack::MockRequest.env_for("/path", "REQUEST_METHOD" => "GET")
|
183
|
-
end
|
184
|
-
|
185
|
-
it "doesn't set an action name" do
|
186
|
-
make_request
|
187
|
-
|
188
|
-
expect(last_transaction).to_not have_action
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
context "with mounted modular application" do
|
193
|
-
before { env["SCRIPT_NAME"] = "/api" }
|
194
|
-
|
195
|
-
it "sets the action name with an application prefix path" do
|
196
|
-
make_request
|
197
|
-
|
198
|
-
expect(last_transaction).to have_action("GET /api/path")
|
199
|
-
end
|
200
|
-
|
201
|
-
context "without 'sinatra.route' env" do
|
202
|
-
let(:env) do
|
203
|
-
Rack::MockRequest.env_for("/path", "REQUEST_METHOD" => "GET")
|
204
|
-
end
|
205
|
-
|
206
|
-
it "doesn't set an action name" do
|
207
|
-
make_request
|
208
|
-
|
209
|
-
expect(last_transaction).to_not have_action
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
@@ -1,243 +0,0 @@
|
|
1
|
-
describe Appsignal::Rack::Utils do
|
2
|
-
describe ".queue_start_from" do
|
3
|
-
let(:header_time) { fixed_time - 0.4 }
|
4
|
-
let(:header_time_value) { (header_time * factor).to_i }
|
5
|
-
subject { described_class.queue_start_from(env) }
|
6
|
-
|
7
|
-
shared_examples "HTTP queue start" do
|
8
|
-
context "when env is nil" do
|
9
|
-
let(:env) { nil }
|
10
|
-
|
11
|
-
it { is_expected.to be_nil }
|
12
|
-
end
|
13
|
-
|
14
|
-
context "with no relevant header set" do
|
15
|
-
let(:env) { {} }
|
16
|
-
|
17
|
-
it { is_expected.to be_nil }
|
18
|
-
end
|
19
|
-
|
20
|
-
context "with the HTTP_X_REQUEST_START header set" do
|
21
|
-
let(:env) { { "HTTP_X_REQUEST_START" => "t=#{header_time_value}" } }
|
22
|
-
|
23
|
-
it { is_expected.to eq 1_389_783_599_600 }
|
24
|
-
|
25
|
-
context "with unparsable content" do
|
26
|
-
let(:env) { { "HTTP_X_REQUEST_START" => "something" } }
|
27
|
-
|
28
|
-
it { is_expected.to be_nil }
|
29
|
-
end
|
30
|
-
|
31
|
-
context "with unparsable content at the end" do
|
32
|
-
let(:env) { { "HTTP_X_REQUEST_START" => "t=#{header_time_value}aaaa" } }
|
33
|
-
|
34
|
-
it { is_expected.to eq 1_389_783_599_600 }
|
35
|
-
end
|
36
|
-
|
37
|
-
context "with a really low number" do
|
38
|
-
let(:env) { { "HTTP_X_REQUEST_START" => "t=100" } }
|
39
|
-
|
40
|
-
it { is_expected.to be_nil }
|
41
|
-
end
|
42
|
-
|
43
|
-
context "with the alternate HTTP_X_QUEUE_START header set" do
|
44
|
-
let(:env) { { "HTTP_X_QUEUE_START" => "t=#{header_time_value}" } }
|
45
|
-
|
46
|
-
it { is_expected.to eq 1_389_783_599_600 }
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
context "time in milliseconds" do
|
52
|
-
let(:factor) { 1_000 }
|
53
|
-
|
54
|
-
it_should_behave_like "HTTP queue start"
|
55
|
-
end
|
56
|
-
|
57
|
-
context "time in microseconds" do
|
58
|
-
let(:factor) { 1_000_000 }
|
59
|
-
|
60
|
-
it_should_behave_like "HTTP queue start"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe Appsignal::Rack::ApplyRackRequest do
|
66
|
-
describe "#apply_to" do
|
67
|
-
let(:merged_env) do
|
68
|
-
Rack::MockRequest.env_for(
|
69
|
-
"/some/path",
|
70
|
-
{
|
71
|
-
"REQUEST_METHOD" => "GET",
|
72
|
-
:params => { "page" => 2, "query" => "lorem" },
|
73
|
-
"rack.session" => { "session" => "data", "user_id" => 123 }
|
74
|
-
}.merge(env)
|
75
|
-
)
|
76
|
-
end
|
77
|
-
let(:env) { {} }
|
78
|
-
let(:request) { ::Rack::Request.new(merged_env) }
|
79
|
-
let(:options) { {} }
|
80
|
-
let(:helper) { described_class.new(request, options) }
|
81
|
-
let(:transaction) { http_request_transaction }
|
82
|
-
before { start_agent }
|
83
|
-
|
84
|
-
def apply_to(transaction)
|
85
|
-
helper.apply_to(transaction)
|
86
|
-
transaction._sample
|
87
|
-
end
|
88
|
-
|
89
|
-
it "sets request metadata" do
|
90
|
-
apply_to(transaction)
|
91
|
-
|
92
|
-
expect(transaction).to include_metadata(
|
93
|
-
"method" => "GET",
|
94
|
-
"path" => "/some/path"
|
95
|
-
)
|
96
|
-
expect(transaction).to include_environment(
|
97
|
-
"REQUEST_METHOD" => "GET",
|
98
|
-
"PATH_INFO" => "/some/path"
|
99
|
-
# and more, but we don't need to test Rack mock defaults
|
100
|
-
)
|
101
|
-
end
|
102
|
-
|
103
|
-
context "with an invalid HTTP request method" do
|
104
|
-
let(:env) { { "REQUEST_METHOD" => "FOO" } }
|
105
|
-
|
106
|
-
it "stores the invalid HTTP request method" do
|
107
|
-
apply_to(transaction)
|
108
|
-
|
109
|
-
expect(transaction).to include_metadata("method" => "FOO")
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
context "when fetching the request method raises an error" do
|
114
|
-
class BrokenRequestMethodRequest < Rack::Request
|
115
|
-
def request_method
|
116
|
-
raise "uh oh!"
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
let(:env) { { "REQUEST_METHOD" => "FOO" } }
|
121
|
-
let(:request) { BrokenRequestMethodRequest.new(merged_env) }
|
122
|
-
|
123
|
-
it "does not store the invalid HTTP request method" do
|
124
|
-
logs = capture_logs { apply_to(transaction) }
|
125
|
-
|
126
|
-
expect(transaction).to_not include_metadata("method" => anything)
|
127
|
-
expect(logs).to contains_log(
|
128
|
-
:error,
|
129
|
-
"Exception while fetching the HTTP request method: RuntimeError: uh oh"
|
130
|
-
)
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
it "sets request parameters" do
|
135
|
-
apply_to(transaction)
|
136
|
-
|
137
|
-
expect(transaction).to include_params(
|
138
|
-
"page" => "2",
|
139
|
-
"query" => "lorem"
|
140
|
-
)
|
141
|
-
end
|
142
|
-
|
143
|
-
context "when params_method isn't set" do
|
144
|
-
let(:options) { { :params_method => nil } }
|
145
|
-
|
146
|
-
it "reports no params" do
|
147
|
-
apply_to(transaction)
|
148
|
-
|
149
|
-
expect(transaction).to_not include_params
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
context "when fetching the request method raises an error" do
|
154
|
-
class BrokenRequestParamsRequest < Rack::Request
|
155
|
-
def params
|
156
|
-
raise "uh oh!"
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
let(:request) { BrokenRequestParamsRequest.new(merged_env) }
|
161
|
-
let(:options) { { :params_method => :params } }
|
162
|
-
|
163
|
-
it "does not store the invalid HTTP request method" do
|
164
|
-
logs = capture_logs { apply_to(transaction) }
|
165
|
-
|
166
|
-
expect(transaction).to_not include_params
|
167
|
-
expect(logs).to contains_log(
|
168
|
-
:error,
|
169
|
-
"Exception while fetching params " \
|
170
|
-
"from 'BrokenRequestParamsRequest#params': RuntimeError uh oh!"
|
171
|
-
)
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
it "sets session data" do
|
176
|
-
apply_to(transaction)
|
177
|
-
|
178
|
-
expect(transaction).to include_session_data("session" => "data", "user_id" => 123)
|
179
|
-
end
|
180
|
-
|
181
|
-
context "with Hash-like session data" do
|
182
|
-
let(:env) { { "rack.session" => HashLike.new("hash-like" => "value", "user_id" => 123) } }
|
183
|
-
|
184
|
-
it "sets session data" do
|
185
|
-
apply_to(transaction)
|
186
|
-
|
187
|
-
expect(transaction).to include_session_data("hash-like" => "value", "user_id" => 123)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
context "with queue start header" do
|
192
|
-
let(:queue_start_time) { fixed_time * 1_000 }
|
193
|
-
let(:env) { { "HTTP_X_REQUEST_START" => "t=#{queue_start_time.to_i}" } } # in milliseconds
|
194
|
-
|
195
|
-
it "sets the queue start" do
|
196
|
-
apply_to(transaction)
|
197
|
-
|
198
|
-
expect(transaction).to have_queue_start(queue_start_time)
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
class RackFilteredRequest
|
203
|
-
attr_reader :env
|
204
|
-
|
205
|
-
def initialize(env)
|
206
|
-
@env = env
|
207
|
-
end
|
208
|
-
|
209
|
-
def path
|
210
|
-
"/static/path"
|
211
|
-
end
|
212
|
-
|
213
|
-
def request_method
|
214
|
-
"GET"
|
215
|
-
end
|
216
|
-
|
217
|
-
def filtered_params
|
218
|
-
{ "abc" => "123" }
|
219
|
-
end
|
220
|
-
|
221
|
-
def session
|
222
|
-
{ "data" => "value" }
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
context "with overridden request class and params method" do
|
227
|
-
let(:request) { RackFilteredRequest.new(env) }
|
228
|
-
let(:options) { { :params_method => :filtered_params } }
|
229
|
-
|
230
|
-
it "uses the overridden request class and params method to fetch params" do
|
231
|
-
apply_to(transaction)
|
232
|
-
|
233
|
-
expect(transaction).to include_params("abc" => "123")
|
234
|
-
end
|
235
|
-
|
236
|
-
it "uses the overridden request class to fetch session data" do
|
237
|
-
apply_to(transaction)
|
238
|
-
|
239
|
-
expect(transaction).to include_session_data("data" => "value")
|
240
|
-
end
|
241
|
-
end
|
242
|
-
end
|
243
|
-
end
|