appsignal 4.0.6-java → 4.0.7-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (201) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/Rakefile +9 -9
  4. data/appsignal.gemspec +22 -1
  5. data/ext/agent.rb +27 -27
  6. data/lib/appsignal/check_in.rb +1 -1
  7. data/lib/appsignal/config.rb +1 -3
  8. data/lib/appsignal/integrations/resque.rb +1 -6
  9. data/lib/appsignal/utils/hash_sanitizer.rb +4 -0
  10. data/lib/appsignal/version.rb +1 -1
  11. metadata +2 -192
  12. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  13. data/.github/ISSUE_TEMPLATE/chore.md +0 -14
  14. data/.github/workflows/ci.yml +0 -3285
  15. data/.github/workflows/create_release_from_tag.yml +0 -62
  16. data/.gitignore +0 -35
  17. data/.gitmodules +0 -3
  18. data/.rspec +0 -4
  19. data/.yardopts +0 -8
  20. data/benchmark.rake +0 -139
  21. data/gemfiles/capistrano2.gemfile +0 -6
  22. data/gemfiles/capistrano3.gemfile +0 -7
  23. data/gemfiles/dry-monitor.gemfile +0 -5
  24. data/gemfiles/grape.gemfile +0 -5
  25. data/gemfiles/hanami-2.0.gemfile +0 -7
  26. data/gemfiles/hanami-2.1.gemfile +0 -7
  27. data/gemfiles/http5.gemfile +0 -5
  28. data/gemfiles/no_dependencies.gemfile +0 -10
  29. data/gemfiles/padrino.gemfile +0 -7
  30. data/gemfiles/psych-3.gemfile +0 -5
  31. data/gemfiles/psych-4.gemfile +0 -5
  32. data/gemfiles/que-1.gemfile +0 -5
  33. data/gemfiles/que-2.gemfile +0 -5
  34. data/gemfiles/rails-6.0.gemfile +0 -10
  35. data/gemfiles/rails-6.1.gemfile +0 -11
  36. data/gemfiles/rails-7.0.gemfile +0 -11
  37. data/gemfiles/rails-7.1.gemfile +0 -11
  38. data/gemfiles/rails-7.2.gemfile +0 -11
  39. data/gemfiles/redis-4.gemfile +0 -5
  40. data/gemfiles/redis-5.gemfile +0 -6
  41. data/gemfiles/resque-2.gemfile +0 -6
  42. data/gemfiles/sequel.gemfile +0 -10
  43. data/gemfiles/sinatra.gemfile +0 -5
  44. data/gemfiles/webmachine1.gemfile +0 -7
  45. data/gemfiles/webmachine2.gemfile +0 -6
  46. data/mono.yml +0 -16
  47. data/spec/.rubocop.yml +0 -7
  48. data/spec/lib/appsignal/auth_check_spec.rb +0 -84
  49. data/spec/lib/appsignal/capistrano2_spec.rb +0 -227
  50. data/spec/lib/appsignal/capistrano3_spec.rb +0 -284
  51. data/spec/lib/appsignal/check_in/cron_spec.rb +0 -210
  52. data/spec/lib/appsignal/check_in/scheduler_spec.rb +0 -557
  53. data/spec/lib/appsignal/cli/demo_spec.rb +0 -46
  54. data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +0 -16
  55. data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +0 -86
  56. data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1553
  57. data/spec/lib/appsignal/cli/helpers_spec.rb +0 -179
  58. data/spec/lib/appsignal/cli/install_spec.rb +0 -848
  59. data/spec/lib/appsignal/cli_spec.rb +0 -56
  60. data/spec/lib/appsignal/config_spec.rb +0 -1380
  61. data/spec/lib/appsignal/demo_spec.rb +0 -83
  62. data/spec/lib/appsignal/environment_spec.rb +0 -190
  63. data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +0 -60
  64. data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +0 -21
  65. data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +0 -21
  66. data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +0 -52
  67. data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +0 -21
  68. data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -84
  69. data/spec/lib/appsignal/event_formatter/rom/sql_formatter_spec.rb +0 -22
  70. data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -30
  71. data/spec/lib/appsignal/event_formatter/view_component/render_formatter_spec.rb +0 -41
  72. data/spec/lib/appsignal/event_formatter_spec.rb +0 -193
  73. data/spec/lib/appsignal/extension/jruby_spec.rb +0 -46
  74. data/spec/lib/appsignal/extension_install_failure_spec.rb +0 -20
  75. data/spec/lib/appsignal/extension_spec.rb +0 -178
  76. data/spec/lib/appsignal/garbage_collection_spec.rb +0 -98
  77. data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -345
  78. data/spec/lib/appsignal/hooks/action_mailer_spec.rb +0 -55
  79. data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +0 -23
  80. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +0 -99
  81. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +0 -47
  82. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +0 -47
  83. data/spec/lib/appsignal/hooks/activejob_spec.rb +0 -650
  84. data/spec/lib/appsignal/hooks/at_exit_spec.rb +0 -105
  85. data/spec/lib/appsignal/hooks/celluloid_spec.rb +0 -40
  86. data/spec/lib/appsignal/hooks/data_mapper_spec.rb +0 -40
  87. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +0 -38
  88. data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +0 -83
  89. data/spec/lib/appsignal/hooks/excon_spec.rb +0 -67
  90. data/spec/lib/appsignal/hooks/gvl_spec.rb +0 -145
  91. data/spec/lib/appsignal/hooks/http_spec.rb +0 -37
  92. data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +0 -46
  93. data/spec/lib/appsignal/hooks/mri_spec.rb +0 -23
  94. data/spec/lib/appsignal/hooks/net_http_spec.rb +0 -18
  95. data/spec/lib/appsignal/hooks/passenger_spec.rb +0 -30
  96. data/spec/lib/appsignal/hooks/puma_spec.rb +0 -80
  97. data/spec/lib/appsignal/hooks/que_spec.rb +0 -19
  98. data/spec/lib/appsignal/hooks/rake_spec.rb +0 -144
  99. data/spec/lib/appsignal/hooks/redis_client_spec.rb +0 -218
  100. data/spec/lib/appsignal/hooks/redis_spec.rb +0 -124
  101. data/spec/lib/appsignal/hooks/resque_spec.rb +0 -27
  102. data/spec/lib/appsignal/hooks/sequel_spec.rb +0 -44
  103. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -29
  104. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +0 -115
  105. data/spec/lib/appsignal/hooks/unicorn_spec.rb +0 -63
  106. data/spec/lib/appsignal/hooks/webmachine_spec.rb +0 -24
  107. data/spec/lib/appsignal/hooks_spec.rb +0 -124
  108. data/spec/lib/appsignal/integrations/data_mapper_spec.rb +0 -74
  109. data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +0 -454
  110. data/spec/lib/appsignal/integrations/http_spec.rb +0 -111
  111. data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +0 -154
  112. data/spec/lib/appsignal/integrations/net_http_spec.rb +0 -33
  113. data/spec/lib/appsignal/integrations/object_spec.rb +0 -347
  114. data/spec/lib/appsignal/integrations/puma_spec.rb +0 -150
  115. data/spec/lib/appsignal/integrations/que_spec.rb +0 -187
  116. data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -457
  117. data/spec/lib/appsignal/integrations/resque_spec.rb +0 -155
  118. data/spec/lib/appsignal/integrations/shoryuken_spec.rb +0 -165
  119. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +0 -640
  120. data/spec/lib/appsignal/integrations/webmachine_spec.rb +0 -136
  121. data/spec/lib/appsignal/loaders/grape_spec.rb +0 -12
  122. data/spec/lib/appsignal/loaders/hanami_spec.rb +0 -92
  123. data/spec/lib/appsignal/loaders/padrino_spec.rb +0 -273
  124. data/spec/lib/appsignal/loaders/sinatra_spec.rb +0 -44
  125. data/spec/lib/appsignal/loaders_spec.rb +0 -144
  126. data/spec/lib/appsignal/logger_spec.rb +0 -205
  127. data/spec/lib/appsignal/marker_spec.rb +0 -51
  128. data/spec/lib/appsignal/probes/gvl_spec.rb +0 -164
  129. data/spec/lib/appsignal/probes/mri_spec.rb +0 -162
  130. data/spec/lib/appsignal/probes/sidekiq_spec.rb +0 -333
  131. data/spec/lib/appsignal/probes_spec.rb +0 -414
  132. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +0 -370
  133. data/spec/lib/appsignal/rack/body_wrapper_spec.rb +0 -319
  134. data/spec/lib/appsignal/rack/event_handler_spec.rb +0 -441
  135. data/spec/lib/appsignal/rack/grape_middleware_spec.rb +0 -201
  136. data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +0 -36
  137. data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +0 -38
  138. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +0 -126
  139. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +0 -217
  140. data/spec/lib/appsignal/rack_spec.rb +0 -243
  141. data/spec/lib/appsignal/sample_data_spec.rb +0 -238
  142. data/spec/lib/appsignal/span_spec.rb +0 -141
  143. data/spec/lib/appsignal/system_spec.rb +0 -126
  144. data/spec/lib/appsignal/transaction_spec.rb +0 -2115
  145. data/spec/lib/appsignal/transmitter_spec.rb +0 -198
  146. data/spec/lib/appsignal/utils/data_spec.rb +0 -166
  147. data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +0 -182
  148. data/spec/lib/appsignal/utils/integration_logger_spec.rb +0 -21
  149. data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -153
  150. data/spec/lib/appsignal/utils/json_spec.rb +0 -44
  151. data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +0 -192
  152. data/spec/lib/appsignal_spec.rb +0 -1919
  153. data/spec/lib/puma/appsignal_spec.rb +0 -334
  154. data/spec/spec_helper.rb +0 -179
  155. data/spec/support/fixtures/generated_config.yml +0 -24
  156. data/spec/support/fixtures/projects/broken/config/appsignal.yml +0 -1
  157. data/spec/support/fixtures/projects/valid/config/appsignal.yml +0 -57
  158. data/spec/support/fixtures/projects/valid/log/.gitkeep +0 -0
  159. data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +0 -16
  160. data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +0 -56
  161. data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +0 -10
  162. data/spec/support/fixtures/projects/valid_with_rails_app/log/.gitkeep +0 -0
  163. data/spec/support/fixtures/uploaded_file.txt +0 -0
  164. data/spec/support/hanami/hanami_app.rb +0 -29
  165. data/spec/support/helpers/action_mailer_helpers.rb +0 -25
  166. data/spec/support/helpers/activejob_helpers.rb +0 -27
  167. data/spec/support/helpers/api_request_helper.rb +0 -60
  168. data/spec/support/helpers/cli_helpers.rb +0 -40
  169. data/spec/support/helpers/config_helpers.rb +0 -66
  170. data/spec/support/helpers/dependency_helper.rb +0 -155
  171. data/spec/support/helpers/directory_helper.rb +0 -27
  172. data/spec/support/helpers/env_helpers.rb +0 -41
  173. data/spec/support/helpers/environment_metdata_helper.rb +0 -16
  174. data/spec/support/helpers/example_exception.rb +0 -13
  175. data/spec/support/helpers/example_standard_error.rb +0 -13
  176. data/spec/support/helpers/loader_helper.rb +0 -21
  177. data/spec/support/helpers/log_helpers.rb +0 -36
  178. data/spec/support/helpers/rails_helper.rb +0 -28
  179. data/spec/support/helpers/std_streams_helper.rb +0 -94
  180. data/spec/support/helpers/system_helpers.rb +0 -8
  181. data/spec/support/helpers/take_at_most_helper.rb +0 -21
  182. data/spec/support/helpers/time_helpers.rb +0 -11
  183. data/spec/support/helpers/transaction_helpers.rb +0 -122
  184. data/spec/support/helpers/wait_for_helper.rb +0 -39
  185. data/spec/support/matchers/contains_log.rb +0 -26
  186. data/spec/support/matchers/have_colorized_text.rb +0 -28
  187. data/spec/support/matchers/transaction.rb +0 -200
  188. data/spec/support/mocks/appsignal_mock.rb +0 -18
  189. data/spec/support/mocks/dummy_app.rb +0 -20
  190. data/spec/support/mocks/fake_gc_profiler.rb +0 -19
  191. data/spec/support/mocks/fake_gvl_tools.rb +0 -28
  192. data/spec/support/mocks/hash_like.rb +0 -10
  193. data/spec/support/mocks/mock_probe.rb +0 -13
  194. data/spec/support/mocks/puma_mock.rb +0 -43
  195. data/spec/support/shared_examples/instrument.rb +0 -48
  196. data/spec/support/stubs/appsignal/loaders/loader_stub.rb +0 -7
  197. data/spec/support/stubs/delayed_job.rb +0 -0
  198. data/spec/support/stubs/sidekiq/api.rb +0 -4
  199. data/spec/support/testing.rb +0 -203
  200. data/support/bundler_wrapper +0 -12
  201. data/support/install_deps +0 -33
@@ -1,94 +0,0 @@
1
- module StdStreamsHelper
2
- def std_stream
3
- Tempfile.new SecureRandom.uuid
4
- end
5
-
6
- # Capture STDOUT in a variable
7
- #
8
- # Given tempfiles are rewinded and unlinked after yield, so no cleanup
9
- # required. You can read from the stream using `stdout.read`.
10
- #
11
- # Usage
12
- #
13
- # out_stream = Tempfile.new
14
- # capture_stdout(out_stream) { do_something }
15
- def capture_stdout(stdout)
16
- original_stdout = $stdout.dup
17
- $stdout.reopen stdout
18
-
19
- yield
20
- ensure
21
- $stdout.reopen original_stdout
22
- stdout.rewind
23
- stdout.unlink
24
- end
25
-
26
- # Capture STDOUT and STDERR in variables
27
- #
28
- # Given tempfiles are rewinded and unlinked after yield, so no cleanup
29
- # required. You can read from the stream using `stdout.read`.
30
- #
31
- # Usage
32
- #
33
- # out_stream = Tempfile.new
34
- # err_stream = Tempfile.new
35
- # capture_std_streams(out_stream, err_stream) { do_something }
36
- def capture_std_streams(stdout, stderr)
37
- original_stdout = $stdout.dup
38
- $stdout.reopen stdout
39
- original_stderr = $stderr.dup
40
- $stderr.reopen stderr
41
-
42
- yield
43
- ensure
44
- $stdout.reopen original_stdout
45
- $stderr.reopen original_stderr
46
- stdout.rewind
47
- stdout.unlink
48
- stderr.rewind
49
- stderr.unlink
50
- end
51
-
52
- # Silence the STDOUT.
53
- #
54
- # Ignore the STDOUT and don't print it in the test suite's STDOUT.
55
- #
56
- # If an error is found the output the output is raised as an error, failing
57
- # the spec. Warnings and other AppSignal messages are ignored.
58
- #
59
- # @example
60
- # silence { do_something }
61
- # # Does nothing
62
- #
63
- # silence { puts "ERROR!" }
64
- # # => Error found in silenced output:
65
- # # ERROR!
66
- #
67
- # @example Ignore certain errors
68
- # silence(:allowed => ["my error"]) { puts "my error!" }
69
- # # Does nothing
70
- #
71
- # silence { puts "my error!" }
72
- # # => Error found in silenced output:
73
- # # my error!
74
- def silence(options = {}, &block)
75
- stream = Tempfile.new(SecureRandom.uuid)
76
- capture_std_streams(stream, stream, &block)
77
- ensure
78
- output = filter_allowed_errors(stream.read, options.fetch(:allowed, []))
79
- raise "Error found in silenced output:\n#{output}" if output =~ /(ERR|Error|error)/
80
- end
81
-
82
- def filter_allowed_errors(output, allowed_errors)
83
- output.lines.reject do |line|
84
- reject = false
85
- allowed_errors.each do |error|
86
- if line.include?(error)
87
- reject = true
88
- break
89
- end
90
- end
91
- reject
92
- end.join
93
- end
94
- end
@@ -1,8 +0,0 @@
1
- module SystemHelpers
2
- def recognize_as_heroku
3
- ENV["DYNO"] = "dyno1"
4
- value = yield
5
- ENV.delete "DYNO"
6
- value
7
- end
8
- end
@@ -1,21 +0,0 @@
1
- module TakeAtMostHelper
2
- # Assert that it takes at most a certain amount of time to run a block.
3
- #
4
- # @example
5
- # # Assert that it takes at most 1 second to run the block
6
- # take_at_most(1) { sleep 0.5 }
7
- #
8
- # @param time [Integer, Float] The maximum amount of time the block is allowed to
9
- # run in seconds.
10
- # @yield Block to run.
11
- # @raise [StandardError] Raises error if the block takes longer than the
12
- # specified time to run.
13
- def take_at_most(time)
14
- start = Time.now
15
- yield
16
- elapsed = Time.now - start
17
- return if elapsed <= time
18
-
19
- raise "Expected block to take at most #{time} seconds, but took #{elapsed}"
20
- end
21
- end
@@ -1,11 +0,0 @@
1
- module TimeHelpers
2
- def fixed_time
3
- @fixed_time ||= Time.utc(2014, 1, 15, 11, 0, 0).to_f
4
- end
5
-
6
- def advance_frozen_time(time, addition)
7
- Time.at(time.to_f + addition).tap do |new_time|
8
- Timecop.freeze(new_time)
9
- end
10
- end
11
- end
@@ -1,122 +0,0 @@
1
- module TransactionHelpers
2
- def uploaded_file
3
- if DependencyHelper.rails_present?
4
- ActionDispatch::Http::UploadedFile.new(:tempfile => "/tmp")
5
- else
6
- ::Rack::Multipart::UploadedFile.new(File.join(fixtures_dir, "/uploaded_file.txt"))
7
- end
8
- end
9
-
10
- def default_namespace
11
- Appsignal::Transaction::HTTP_REQUEST
12
- end
13
-
14
- def create_transaction(namespace = default_namespace)
15
- Appsignal::Transaction.create(namespace)
16
- end
17
-
18
- def new_transaction(namespace = default_namespace, ext: nil)
19
- Appsignal::Transaction.new(namespace, :ext => ext)
20
- end
21
-
22
- def rack_request(env)
23
- Rack::Request.new(env)
24
- end
25
-
26
- def background_job_transaction
27
- new_transaction(Appsignal::Transaction::BACKGROUND_JOB)
28
- end
29
-
30
- def http_request_transaction
31
- new_transaction(Appsignal::Transaction::HTTP_REQUEST)
32
- end
33
-
34
- # Returns the all {Appsignal::Transaction} objects created during this test
35
- # run so far.
36
- #
37
- # @return [Array<Appsignal::Transaction>]
38
- def created_transactions
39
- Appsignal::Testing.transactions
40
- end
41
-
42
- # Returns the last created {Appsignal::Transaction}.
43
- #
44
- # @return [Appsignal::Transaction]
45
- def last_transaction
46
- created_transactions.last
47
- end
48
-
49
- def current_transaction?
50
- Appsignal::Transaction.current?
51
- end
52
-
53
- def current_transaction
54
- Appsignal::Transaction.current
55
- end
56
-
57
- # Set current transaction manually.
58
- # Cleared by {clear_current_transaction!}
59
- #
60
- # When a block is given, the current transaction is automatically unset after
61
- # the block.
62
- def set_current_transaction(transaction) # rubocop:disable Naming/AccessorMethodName
63
- Thread.current[:appsignal_transaction] = transaction
64
- yield if block_given?
65
- ensure
66
- clear_current_transaction! if block_given?
67
- end
68
-
69
- # Use when {Appsignal::Transaction.clear_current_transaction!} is stubbed to
70
- # clear the current transaction on the current thread.
71
- def clear_current_transaction!
72
- Thread.current[:appsignal_transaction] = nil
73
- end
74
-
75
- # Set the current for the duration of the given block.
76
- #
77
- # Helper for {set_current_transaction} and {clear_current_transaction!}
78
- def with_current_transaction(transaction)
79
- set_current_transaction transaction
80
- yield
81
- ensure
82
- clear_current_transaction!
83
- end
84
-
85
- # Track the AppSignal transaction JSON when a transaction gets completed
86
- # ({Appsignal::Transaction.complete}).
87
- #
88
- # It will also add sample data to the transaction when it gets completed.
89
- # This can be disabled by setting the `sample` option to `false`.
90
- #
91
- # It will be tracked for every transaction that is started inside the
92
- # `keep_transactions` block.
93
- #
94
- # @example Keep a transaction while also adding sample data
95
- # keep_transactions do
96
- # transaction = Appsignal::Transaction.new(...)
97
- # transaction.complete
98
- # transaction.to_h # => Hash with transaction data before it was completed
99
- # end
100
- #
101
- # @example Keep a transaction without adding sample data
102
- # keep_transactions :sample => false do
103
- # transaction = Appsignal::Transaction.new(...)
104
- # transaction.complete
105
- # transaction.to_h
106
- # # => Hash with transaction data before it was completed with an empty
107
- # # Hash for the `sample_data` key.
108
- # end
109
- #
110
- # @yield block to perform while the transactions are tracked.
111
- # @param options [Hash]
112
- # @option options [Boolean] :sample Whether or not to sample transactions.
113
- # @return [Object] returns the block return value.
114
- def keep_transactions(options = {})
115
- Appsignal::Testing.keep_transactions = true
116
- Appsignal::Testing.sample_transactions = options.fetch(:sample, true)
117
- yield
118
- ensure
119
- Appsignal::Testing.keep_transactions = nil
120
- Appsignal::Testing.sample_transactions = nil
121
- end
122
- end
@@ -1,39 +0,0 @@
1
- module WaitForHelper
2
- # Wait for a condition to be met
3
- #
4
- # @example
5
- # # Perform threaded operation
6
- # wait_for("enough probe calls") { probe.calls >= 2 }
7
- # # Assert on result
8
- #
9
- # @param name [String] The name of the condition to check. Used in the
10
- # error when it fails.
11
- # @yield Assertion to check.
12
- # @yieldreturn [Boolean] True/False value that indicates if the condition
13
- # is met.
14
- # @raise [StandardError] Raises error if the condition is not met after 5
15
- # seconds, 5_000 tries.
16
- def wait_for(name)
17
- max_wait = 5_000
18
- i = 0
19
- error = nil
20
- while i < max_wait
21
- begin
22
- result = yield
23
- break if result
24
- rescue Exception => e # rubocop:disable Lint/RescueException
25
- # Capture error so we know if it exited with an error
26
- error = e
27
- ensure
28
- i += 1
29
- sleep 0.001
30
- end
31
- end
32
-
33
- return unless i >= max_wait
34
-
35
- error_message =
36
- ("\nError: #{error.class}: #{error.message}\n#{error.backtrace.join("\n")}" if error)
37
- raise "Waited 5 seconds for #{name} condition, but was not met.#{error_message}"
38
- end
39
- end
@@ -1,26 +0,0 @@
1
- RSpec::Matchers.define :contains_log do |level, message|
2
- log_level_prefix = level.upcase
3
-
4
- match do |actual|
5
- case message
6
- when Regexp
7
- /\[#{log_level_prefix}\] #{message}/.match?(actual)
8
- else
9
- expected_log_line = "[#{log_level_prefix}] #{message}"
10
- actual.include?(expected_log_line)
11
- end
12
- end
13
-
14
- failure_message do |actual|
15
- <<~MESSAGE
16
- Did not contain log line:
17
- Log level: #{log_level_prefix}
18
- Message: #{message}
19
-
20
- Received logs:
21
- #{actual}
22
- MESSAGE
23
- end
24
-
25
- diffable
26
- end
@@ -1,28 +0,0 @@
1
- RSpec::Matchers.define :have_colorized_text do |color, text|
2
- match do |actual|
3
- color_codes = Appsignal::CLI::Helpers::COLOR_CODES
4
- reset_color_code = color_codes.fetch(:default)
5
- color_code = color_codes.fetch(color)
6
-
7
- @expected = "\e[#{color_code}m#{text}\e[#{reset_color_code}m"
8
- expect(actual).to include(@expected)
9
- end
10
-
11
- diffable
12
- attr_reader :expected
13
- end
14
-
15
- COLOR_TAG_MATCHER_REGEX = /\e\[(\d+)m/.freeze
16
- RSpec::Matchers.define :have_color_markers do
17
- match do |actual|
18
- actual =~ COLOR_TAG_MATCHER_REGEX
19
- end
20
-
21
- failure_message do
22
- "expected that output contains color markers: /\\e[\\d+m/"
23
- end
24
-
25
- failure_message_when_negated do
26
- "expected that output does not contain color markers: /\\e[\\d+m/"
27
- end
28
- end
@@ -1,200 +0,0 @@
1
- def define_transaction_metadata_matcher_for(matcher_key, value_key = matcher_key)
2
- value_key = value_key.to_s
3
-
4
- RSpec::Matchers.define "have_#{matcher_key}" do |expected_value|
5
- match(:notify_expectation_failures => true) do |transaction|
6
- actual_value = transaction.to_h[value_key]
7
- if expected_value
8
- expect(actual_value).to eq(expected_value)
9
- else
10
- expect(actual_value).to_not be_nil
11
- end
12
- end
13
-
14
- match_when_negated(:notify_expectation_failures => true) do |transaction|
15
- actual_value = transaction.to_h[value_key]
16
- if expected_value
17
- expect(actual_value).to_not eq(expected_value)
18
- else
19
- expect(actual_value).to be_nil
20
- end
21
- end
22
- end
23
- end
24
-
25
- define_transaction_metadata_matcher_for(:id)
26
- define_transaction_metadata_matcher_for(:namespace)
27
- define_transaction_metadata_matcher_for(:action)
28
-
29
- def define_transaction_sample_matcher_for(matcher_key, value_key = matcher_key)
30
- value_key = value_key.to_s
31
-
32
- RSpec::Matchers.define "include_#{matcher_key}" do |expected_value|
33
- match(:notify_expectation_failures => true) do |transaction|
34
- sample_data = transaction.to_h.dig("sample_data", value_key) || {}
35
-
36
- if expected_value
37
- expected_value = hash_including(expected_value) if expected_value.is_a?(Hash)
38
- expect(sample_data).to match(expected_value)
39
- else
40
- expect(sample_data).to be_present
41
- end
42
- end
43
-
44
- match_when_negated(:notify_expectation_failures => true) do |transaction|
45
- sample_data = transaction.to_h.dig("sample_data", value_key) || {}
46
-
47
- if expected_value
48
- expect(sample_data).to_not include(expected_value)
49
- else
50
- expect(sample_data).to be_empty
51
- end
52
- end
53
- end
54
- end
55
-
56
- define_transaction_sample_matcher_for(:sample_metadata, :metadata)
57
- define_transaction_sample_matcher_for(:params)
58
- define_transaction_sample_matcher_for(:environment)
59
- define_transaction_sample_matcher_for(:session_data)
60
- define_transaction_sample_matcher_for(:tags)
61
- define_transaction_sample_matcher_for(:custom_data)
62
- define_transaction_sample_matcher_for(:error_causes)
63
-
64
- RSpec::Matchers.define :be_completed do
65
- match(:notify_expectation_failures => true) do |transaction|
66
- values_match? transaction.ext._completed?, true
67
- end
68
- end
69
-
70
- RSpec::Matchers.define :have_error do |error_class, error_message, error_backtrace|
71
- match(:notify_expectation_failures => true) do |transaction|
72
- transaction_error = transaction.to_h["error"]
73
- if error_class && error_message
74
- expect(transaction_error).to include(
75
- "name" => error_class,
76
- "message" => error_message,
77
- "backtrace" => error_backtrace ? JSON.dump(error_backtrace) : kind_of(String)
78
- )
79
- else
80
- expect(transaction_error).to be_any
81
- end
82
- end
83
-
84
- match_when_negated(:notify_expectation_failures => true) do |transaction|
85
- transaction_error = transaction.to_h["error"]
86
- if error_class && error_message
87
- expect(transaction_error).to_not include(
88
- "name" => error_class,
89
- "message" => error_message,
90
- "backtrace" => kind_of(String)
91
- )
92
- else
93
- expect(transaction_error).to be_nil
94
- end
95
- end
96
- end
97
-
98
- RSpec::Matchers.define :include_event do |event|
99
- match(:notify_expectation_failures => true) do |transaction|
100
- events = transaction.to_h["events"]
101
- if event
102
- expect(events).to include(format_event(event))
103
- else
104
- expect(events).to be_any
105
- end
106
- end
107
-
108
- match_when_negated(:notify_expectation_failures => true) do |transaction|
109
- events = transaction.to_h["events"]
110
- if event
111
- expect(events).to_not include(format_event(event))
112
- else
113
- expect(events).to be_empty
114
- end
115
- end
116
-
117
- def format_event(event)
118
- hash_including({
119
- "body" => "",
120
- "body_format" => Appsignal::EventFormatter::DEFAULT,
121
- "count" => 1,
122
- "name" => kind_of(String),
123
- "title" => ""
124
- }.merge(event.transform_keys(&:to_s)))
125
- end
126
- end
127
- RSpec::Matchers.alias_matcher :include_events, :include_event
128
-
129
- RSpec::Matchers.define :include_metadata do |metadata|
130
- match(:notify_expectation_failures => true) do |transaction|
131
- actual_metadata = transaction.to_h["metadata"]
132
- if metadata
133
- expect(actual_metadata).to include(metadata)
134
- else
135
- expect(actual_metadata).to be_any
136
- end
137
- end
138
-
139
- match_when_negated(:notify_expectation_failures => true) do |transaction|
140
- actual_metadata = transaction.to_h["metadata"]
141
- if metadata
142
- expect(actual_metadata).to_not include(metadata)
143
- else
144
- expect(actual_metadata).to be_empty
145
- end
146
- end
147
- end
148
-
149
- RSpec::Matchers.define :include_breadcrumb do |action, category, message, metadata, time|
150
- match(:notify_expectation_failures => true) do |transaction|
151
- breadcrumbs = transaction.to_h.dig("sample_data", "breadcrumbs")
152
- if action
153
- breadcrumb = format_breadcrumb(action, category, message, metadata, time)
154
- expect(breadcrumbs).to include(breadcrumb)
155
- else
156
- expect(transaction.to_h.dig("sample_data", "breadcrumbs")).to be_any
157
- end
158
- end
159
-
160
- match_when_negated(:notify_expectation_failures => true) do |transaction|
161
- breadcrumbs = transaction.to_h.dig("sample_data", "breadcrumbs")
162
- if action
163
- breadcrumb = format_breadcrumb(action, category, message, metadata, time)
164
- expect(breadcrumbs).to_not include(breadcrumb)
165
- else
166
- expect(breadcrumbs).to_not be_any
167
- end
168
- end
169
-
170
- def format_breadcrumb(action, category, message, metadata, time)
171
- {
172
- "action" => action,
173
- "category" => category,
174
- "message" => message || "",
175
- "metadata" => metadata || {},
176
- "time" => time || kind_of(Integer)
177
- }
178
- end
179
- end
180
- RSpec::Matchers.alias_matcher :include_breadcrumbs, :include_breadcrumb
181
-
182
- RSpec::Matchers.define :have_queue_start do |queue_start_time|
183
- match(:notify_expectation_failures => true) do |transaction|
184
- actual_start = transaction.ext.queue_start
185
- if queue_start_time
186
- expect(actual_start).to eq(queue_start_time)
187
- else
188
- expect(actual_start).to_not be_nil
189
- end
190
- end
191
-
192
- match_when_negated(:notify_expectation_failures => true) do |transaction|
193
- actual_start = transaction.ext.queue_start
194
- if queue_start_time
195
- expect(actual_start).to_not eq(queue_start_time)
196
- else
197
- expect(actual_start).to be_nil
198
- end
199
- end
200
- end
@@ -1,18 +0,0 @@
1
- class AppsignalMock
2
- attr_reader :gauges
3
-
4
- def initialize(hostname: nil)
5
- @hostname = hostname
6
- @gauges = []
7
- end
8
-
9
- def config
10
- options = {}
11
- options[:hostname] = @hostname if @hostname
12
- ConfigHelpers.build_config(:options => options)
13
- end
14
-
15
- def set_gauge(*args)
16
- @gauges << args
17
- end
18
- end
@@ -1,20 +0,0 @@
1
- class DummyApp
2
- def initialize(&app)
3
- @app = app
4
- @called = false
5
- end
6
-
7
- def call(env)
8
- if @app
9
- @app&.call(env)
10
- else
11
- [200, {}, ["body"]]
12
- end
13
- ensure
14
- @called = true
15
- end
16
-
17
- def called?
18
- @called
19
- end
20
- end
@@ -1,19 +0,0 @@
1
- class FakeGCProfiler
2
- attr_accessor :total_time
3
- attr_writer :clear_delay
4
-
5
- def initialize(total_time = 0)
6
- @total_time = total_time
7
- end
8
-
9
- def clear
10
- sleep clear_delay
11
- @total_time = 0
12
- end
13
-
14
- private
15
-
16
- def clear_delay
17
- @clear_delay ||= 0
18
- end
19
- end
@@ -1,28 +0,0 @@
1
- module FakeGVLTools
2
- def self.reset
3
- self::GlobalTimer.monotonic_time = 0
4
- self::WaitingThreads.count = 0
5
- end
6
-
7
- module GlobalTimer
8
- @monotonic_time = 0
9
-
10
- class << self
11
- attr_accessor :monotonic_time
12
- end
13
- end
14
-
15
- module WaitingThreads
16
- @count = 0
17
- @enabled = false
18
-
19
- class << self
20
- attr_accessor :count
21
- attr_writer :enabled
22
-
23
- def enabled?
24
- @enabled
25
- end
26
- end
27
- end
28
- end
@@ -1,10 +0,0 @@
1
- class HashLike < Hash
2
- def initialize(value)
3
- super
4
- @value = value
5
- end
6
-
7
- def to_h
8
- @value
9
- end
10
- end
@@ -1,13 +0,0 @@
1
- class MockProbe
2
- attr_reader :calls
3
-
4
- def initialize
5
- Appsignal::Testing.store[:mock_probe_call] = 0
6
- @calls = 0
7
- end
8
-
9
- def call
10
- Appsignal::Testing.store[:mock_probe_call] += 1
11
- @calls += 1
12
- end
13
- end