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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/Rakefile +9 -9
- data/appsignal.gemspec +22 -1
- data/ext/agent.rb +27 -27
- data/lib/appsignal/check_in.rb +1 -1
- data/lib/appsignal/config.rb +1 -3
- 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 -192
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
- data/.github/ISSUE_TEMPLATE/chore.md +0 -14
- data/.github/workflows/ci.yml +0 -3285
- 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-1.gemfile +0 -5
- data/gemfiles/que-2.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 -210
- data/spec/lib/appsignal/check_in/scheduler_spec.rb +0 -557
- 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 -187
- 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 -414
- 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 -2115
- 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 -179
- 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 -60
- 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 -155
- 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 -203
- data/support/bundler_wrapper +0 -12
- 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,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,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,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
|