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.
Files changed (203) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/Rakefile +9 -9
  4. data/appsignal.gemspec +22 -1
  5. data/build_matrix.yml +2 -1
  6. data/ext/agent.rb +27 -27
  7. data/lib/appsignal/check_in/scheduler.rb +3 -4
  8. data/lib/appsignal/check_in.rb +1 -1
  9. data/lib/appsignal/config.rb +1 -3
  10. data/lib/appsignal/integrations/que.rb +8 -2
  11. data/lib/appsignal/integrations/resque.rb +1 -6
  12. data/lib/appsignal/utils/hash_sanitizer.rb +4 -0
  13. data/lib/appsignal/version.rb +1 -1
  14. metadata +2 -191
  15. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  16. data/.github/ISSUE_TEMPLATE/chore.md +0 -14
  17. data/.github/workflows/ci.yml +0 -3150
  18. data/.github/workflows/create_release_from_tag.yml +0 -62
  19. data/.gitignore +0 -35
  20. data/.gitmodules +0 -3
  21. data/.rspec +0 -4
  22. data/.yardopts +0 -8
  23. data/benchmark.rake +0 -139
  24. data/gemfiles/capistrano2.gemfile +0 -6
  25. data/gemfiles/capistrano3.gemfile +0 -7
  26. data/gemfiles/dry-monitor.gemfile +0 -5
  27. data/gemfiles/grape.gemfile +0 -5
  28. data/gemfiles/hanami-2.0.gemfile +0 -7
  29. data/gemfiles/hanami-2.1.gemfile +0 -7
  30. data/gemfiles/http5.gemfile +0 -5
  31. data/gemfiles/no_dependencies.gemfile +0 -10
  32. data/gemfiles/padrino.gemfile +0 -7
  33. data/gemfiles/psych-3.gemfile +0 -5
  34. data/gemfiles/psych-4.gemfile +0 -5
  35. data/gemfiles/que.gemfile +0 -5
  36. data/gemfiles/rails-6.0.gemfile +0 -10
  37. data/gemfiles/rails-6.1.gemfile +0 -11
  38. data/gemfiles/rails-7.0.gemfile +0 -11
  39. data/gemfiles/rails-7.1.gemfile +0 -11
  40. data/gemfiles/rails-7.2.gemfile +0 -11
  41. data/gemfiles/redis-4.gemfile +0 -5
  42. data/gemfiles/redis-5.gemfile +0 -6
  43. data/gemfiles/resque-2.gemfile +0 -6
  44. data/gemfiles/sequel.gemfile +0 -10
  45. data/gemfiles/sinatra.gemfile +0 -5
  46. data/gemfiles/webmachine1.gemfile +0 -7
  47. data/gemfiles/webmachine2.gemfile +0 -6
  48. data/mono.yml +0 -16
  49. data/spec/.rubocop.yml +0 -7
  50. data/spec/lib/appsignal/auth_check_spec.rb +0 -84
  51. data/spec/lib/appsignal/capistrano2_spec.rb +0 -227
  52. data/spec/lib/appsignal/capistrano3_spec.rb +0 -284
  53. data/spec/lib/appsignal/check_in/cron_spec.rb +0 -202
  54. data/spec/lib/appsignal/check_in/scheduler_spec.rb +0 -443
  55. data/spec/lib/appsignal/cli/demo_spec.rb +0 -46
  56. data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +0 -16
  57. data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +0 -86
  58. data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1553
  59. data/spec/lib/appsignal/cli/helpers_spec.rb +0 -179
  60. data/spec/lib/appsignal/cli/install_spec.rb +0 -848
  61. data/spec/lib/appsignal/cli_spec.rb +0 -56
  62. data/spec/lib/appsignal/config_spec.rb +0 -1380
  63. data/spec/lib/appsignal/demo_spec.rb +0 -83
  64. data/spec/lib/appsignal/environment_spec.rb +0 -190
  65. data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +0 -60
  66. data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +0 -21
  67. data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +0 -21
  68. data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +0 -52
  69. data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +0 -21
  70. data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -84
  71. data/spec/lib/appsignal/event_formatter/rom/sql_formatter_spec.rb +0 -22
  72. data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -30
  73. data/spec/lib/appsignal/event_formatter/view_component/render_formatter_spec.rb +0 -41
  74. data/spec/lib/appsignal/event_formatter_spec.rb +0 -193
  75. data/spec/lib/appsignal/extension/jruby_spec.rb +0 -46
  76. data/spec/lib/appsignal/extension_install_failure_spec.rb +0 -20
  77. data/spec/lib/appsignal/extension_spec.rb +0 -178
  78. data/spec/lib/appsignal/garbage_collection_spec.rb +0 -98
  79. data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -345
  80. data/spec/lib/appsignal/hooks/action_mailer_spec.rb +0 -55
  81. data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +0 -23
  82. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +0 -99
  83. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +0 -47
  84. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +0 -47
  85. data/spec/lib/appsignal/hooks/activejob_spec.rb +0 -650
  86. data/spec/lib/appsignal/hooks/at_exit_spec.rb +0 -105
  87. data/spec/lib/appsignal/hooks/celluloid_spec.rb +0 -40
  88. data/spec/lib/appsignal/hooks/data_mapper_spec.rb +0 -40
  89. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +0 -38
  90. data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +0 -83
  91. data/spec/lib/appsignal/hooks/excon_spec.rb +0 -67
  92. data/spec/lib/appsignal/hooks/gvl_spec.rb +0 -145
  93. data/spec/lib/appsignal/hooks/http_spec.rb +0 -37
  94. data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +0 -46
  95. data/spec/lib/appsignal/hooks/mri_spec.rb +0 -23
  96. data/spec/lib/appsignal/hooks/net_http_spec.rb +0 -18
  97. data/spec/lib/appsignal/hooks/passenger_spec.rb +0 -30
  98. data/spec/lib/appsignal/hooks/puma_spec.rb +0 -80
  99. data/spec/lib/appsignal/hooks/que_spec.rb +0 -19
  100. data/spec/lib/appsignal/hooks/rake_spec.rb +0 -144
  101. data/spec/lib/appsignal/hooks/redis_client_spec.rb +0 -218
  102. data/spec/lib/appsignal/hooks/redis_spec.rb +0 -124
  103. data/spec/lib/appsignal/hooks/resque_spec.rb +0 -27
  104. data/spec/lib/appsignal/hooks/sequel_spec.rb +0 -44
  105. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -29
  106. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +0 -115
  107. data/spec/lib/appsignal/hooks/unicorn_spec.rb +0 -63
  108. data/spec/lib/appsignal/hooks/webmachine_spec.rb +0 -24
  109. data/spec/lib/appsignal/hooks_spec.rb +0 -124
  110. data/spec/lib/appsignal/integrations/data_mapper_spec.rb +0 -74
  111. data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +0 -454
  112. data/spec/lib/appsignal/integrations/http_spec.rb +0 -111
  113. data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +0 -154
  114. data/spec/lib/appsignal/integrations/net_http_spec.rb +0 -33
  115. data/spec/lib/appsignal/integrations/object_spec.rb +0 -347
  116. data/spec/lib/appsignal/integrations/puma_spec.rb +0 -150
  117. data/spec/lib/appsignal/integrations/que_spec.rb +0 -152
  118. data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -457
  119. data/spec/lib/appsignal/integrations/resque_spec.rb +0 -155
  120. data/spec/lib/appsignal/integrations/shoryuken_spec.rb +0 -165
  121. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +0 -640
  122. data/spec/lib/appsignal/integrations/webmachine_spec.rb +0 -136
  123. data/spec/lib/appsignal/loaders/grape_spec.rb +0 -12
  124. data/spec/lib/appsignal/loaders/hanami_spec.rb +0 -92
  125. data/spec/lib/appsignal/loaders/padrino_spec.rb +0 -273
  126. data/spec/lib/appsignal/loaders/sinatra_spec.rb +0 -44
  127. data/spec/lib/appsignal/loaders_spec.rb +0 -144
  128. data/spec/lib/appsignal/logger_spec.rb +0 -205
  129. data/spec/lib/appsignal/marker_spec.rb +0 -51
  130. data/spec/lib/appsignal/probes/gvl_spec.rb +0 -164
  131. data/spec/lib/appsignal/probes/mri_spec.rb +0 -162
  132. data/spec/lib/appsignal/probes/sidekiq_spec.rb +0 -333
  133. data/spec/lib/appsignal/probes_spec.rb +0 -411
  134. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +0 -370
  135. data/spec/lib/appsignal/rack/body_wrapper_spec.rb +0 -319
  136. data/spec/lib/appsignal/rack/event_handler_spec.rb +0 -441
  137. data/spec/lib/appsignal/rack/grape_middleware_spec.rb +0 -201
  138. data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +0 -36
  139. data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +0 -38
  140. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +0 -126
  141. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +0 -217
  142. data/spec/lib/appsignal/rack_spec.rb +0 -243
  143. data/spec/lib/appsignal/sample_data_spec.rb +0 -238
  144. data/spec/lib/appsignal/span_spec.rb +0 -141
  145. data/spec/lib/appsignal/system_spec.rb +0 -126
  146. data/spec/lib/appsignal/transaction_spec.rb +0 -2111
  147. data/spec/lib/appsignal/transmitter_spec.rb +0 -198
  148. data/spec/lib/appsignal/utils/data_spec.rb +0 -166
  149. data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +0 -182
  150. data/spec/lib/appsignal/utils/integration_logger_spec.rb +0 -21
  151. data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -153
  152. data/spec/lib/appsignal/utils/json_spec.rb +0 -44
  153. data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +0 -192
  154. data/spec/lib/appsignal_spec.rb +0 -1919
  155. data/spec/lib/puma/appsignal_spec.rb +0 -334
  156. data/spec/spec_helper.rb +0 -173
  157. data/spec/support/fixtures/generated_config.yml +0 -24
  158. data/spec/support/fixtures/projects/broken/config/appsignal.yml +0 -1
  159. data/spec/support/fixtures/projects/valid/config/appsignal.yml +0 -57
  160. data/spec/support/fixtures/projects/valid/log/.gitkeep +0 -0
  161. data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +0 -16
  162. data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +0 -56
  163. data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +0 -10
  164. data/spec/support/fixtures/projects/valid_with_rails_app/log/.gitkeep +0 -0
  165. data/spec/support/fixtures/uploaded_file.txt +0 -0
  166. data/spec/support/hanami/hanami_app.rb +0 -29
  167. data/spec/support/helpers/action_mailer_helpers.rb +0 -25
  168. data/spec/support/helpers/activejob_helpers.rb +0 -27
  169. data/spec/support/helpers/api_request_helper.rb +0 -20
  170. data/spec/support/helpers/cli_helpers.rb +0 -40
  171. data/spec/support/helpers/config_helpers.rb +0 -66
  172. data/spec/support/helpers/dependency_helper.rb +0 -150
  173. data/spec/support/helpers/directory_helper.rb +0 -27
  174. data/spec/support/helpers/env_helpers.rb +0 -41
  175. data/spec/support/helpers/environment_metdata_helper.rb +0 -16
  176. data/spec/support/helpers/example_exception.rb +0 -13
  177. data/spec/support/helpers/example_standard_error.rb +0 -13
  178. data/spec/support/helpers/loader_helper.rb +0 -21
  179. data/spec/support/helpers/log_helpers.rb +0 -36
  180. data/spec/support/helpers/rails_helper.rb +0 -28
  181. data/spec/support/helpers/std_streams_helper.rb +0 -94
  182. data/spec/support/helpers/system_helpers.rb +0 -8
  183. data/spec/support/helpers/take_at_most_helper.rb +0 -21
  184. data/spec/support/helpers/time_helpers.rb +0 -11
  185. data/spec/support/helpers/transaction_helpers.rb +0 -122
  186. data/spec/support/helpers/wait_for_helper.rb +0 -39
  187. data/spec/support/matchers/contains_log.rb +0 -26
  188. data/spec/support/matchers/have_colorized_text.rb +0 -28
  189. data/spec/support/matchers/transaction.rb +0 -200
  190. data/spec/support/mocks/appsignal_mock.rb +0 -18
  191. data/spec/support/mocks/dummy_app.rb +0 -20
  192. data/spec/support/mocks/fake_gc_profiler.rb +0 -19
  193. data/spec/support/mocks/fake_gvl_tools.rb +0 -28
  194. data/spec/support/mocks/hash_like.rb +0 -10
  195. data/spec/support/mocks/mock_probe.rb +0 -13
  196. data/spec/support/mocks/puma_mock.rb +0 -43
  197. data/spec/support/shared_examples/instrument.rb +0 -48
  198. data/spec/support/stubs/appsignal/loaders/loader_stub.rb +0 -7
  199. data/spec/support/stubs/delayed_job.rb +0 -0
  200. data/spec/support/stubs/sidekiq/api.rb +0 -4
  201. data/spec/support/testing.rb +0 -194
  202. data/support/bundler_wrapper +0 -12
  203. 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