appsignal 2.9.18-java → 2.10.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +0 -6
- data/CHANGELOG.md +17 -1
- data/Rakefile +16 -2
- data/lib/appsignal/cli.rb +9 -2
- data/lib/appsignal/cli/diagnose.rb +20 -19
- data/lib/appsignal/cli/helpers.rb +22 -10
- data/lib/appsignal/cli/install.rb +2 -1
- data/lib/appsignal/config.rb +18 -7
- data/lib/appsignal/event_formatter.rb +4 -4
- data/lib/appsignal/minutely.rb +4 -4
- data/lib/appsignal/rack/js_exception_catcher.rb +6 -0
- data/lib/appsignal/transaction.rb +1 -1
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/cli/diagnose_spec.rb +54 -11
- data/spec/lib/appsignal/cli/helpers_spec.rb +11 -3
- data/spec/lib/appsignal/cli/install_spec.rb +30 -1
- data/spec/lib/appsignal/config_spec.rb +75 -7
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +1 -5
- data/spec/lib/appsignal/hooks/rake_spec.rb +41 -39
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +2 -15
- data/spec/lib/appsignal/integrations/object_spec.rb +2 -2
- data/spec/lib/appsignal/integrations/que_spec.rb +26 -39
- data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +108 -46
- data/spec/lib/appsignal/integrations/resque_spec.rb +40 -39
- data/spec/lib/appsignal/minutely_spec.rb +3 -3
- data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +19 -5
- data/spec/lib/appsignal/transaction_spec.rb +4 -12
- data/spec/lib/appsignal_spec.rb +7 -8
- data/spec/spec_helper.rb +11 -11
- data/spec/support/fixtures/projects/broken/config/appsignal.yml +1 -0
- data/spec/support/helpers/cli_helpers.rb +15 -1
- data/spec/support/helpers/transaction_helpers.rb +53 -0
- data/spec/support/matchers/be_completed.rb +5 -0
- data/spec/support/matchers/have_colorized_text.rb +28 -0
- data/spec/support/testing.rb +113 -0
- metadata +10 -2
@@ -24,7 +24,7 @@ describe Appsignal::CLI::Helpers do
|
|
24
24
|
describe ".colorize" do
|
25
25
|
subject { cli.send(:colorize, "text", :green) }
|
26
26
|
|
27
|
-
context "on windows" do
|
27
|
+
context "when on windows" do
|
28
28
|
before { allow(Gem).to receive(:win_platform?).and_return(true) }
|
29
29
|
|
30
30
|
it "outputs plain string" do
|
@@ -32,11 +32,19 @@ describe Appsignal::CLI::Helpers do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
context "
|
35
|
+
context "when coloring is set to false" do
|
36
|
+
before { cli.send(:coloring=, false) }
|
37
|
+
|
38
|
+
it "outputs plain string" do
|
39
|
+
expect(subject).to eq "text"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when not on windows" do
|
36
44
|
before { allow(Gem).to receive(:win_platform?).and_return(false) }
|
37
45
|
|
38
46
|
it "wraps text in color tags" do
|
39
|
-
expect(subject).to
|
47
|
+
expect(subject).to have_colorized_text(:green, "text")
|
40
48
|
end
|
41
49
|
end
|
42
50
|
end
|
@@ -9,6 +9,7 @@ describe Appsignal::CLI::Install do
|
|
9
9
|
let(:config) { Appsignal::Config.new(tmp_dir, "") }
|
10
10
|
let(:config_file_path) { File.join(tmp_dir, "config", "appsignal.yml") }
|
11
11
|
let(:config_file) { File.read(config_file_path) }
|
12
|
+
let(:options) { {} }
|
12
13
|
before do
|
13
14
|
stub_api_validation_request
|
14
15
|
# Stub calls to speed up tests
|
@@ -91,7 +92,7 @@ describe Appsignal::CLI::Install do
|
|
91
92
|
Dir.chdir tmp_dir do
|
92
93
|
prepare_cli_input
|
93
94
|
capture_stdout(out_stream) do
|
94
|
-
run_cli(["install", push_api_key])
|
95
|
+
run_cli(["install", push_api_key], options)
|
95
96
|
end
|
96
97
|
end
|
97
98
|
end
|
@@ -667,6 +668,34 @@ describe Appsignal::CLI::Install do
|
|
667
668
|
it_behaves_like "push_api_key validation"
|
668
669
|
it_behaves_like "demo data"
|
669
670
|
|
671
|
+
context "without color options" do
|
672
|
+
let(:options) { {} }
|
673
|
+
|
674
|
+
it "prints the instructions in color" do
|
675
|
+
run
|
676
|
+
expect(output).to have_colorized_text(:green, "## Starting AppSignal Installer ##")
|
677
|
+
end
|
678
|
+
end
|
679
|
+
|
680
|
+
context "with --color option" do
|
681
|
+
let(:options) { { "color" => nil } }
|
682
|
+
|
683
|
+
it "prints the instructions in color" do
|
684
|
+
run
|
685
|
+
expect(output).to have_colorized_text(:green, "## Starting AppSignal Installer ##")
|
686
|
+
end
|
687
|
+
end
|
688
|
+
|
689
|
+
context "with --no-color option" do
|
690
|
+
let(:options) { { "no-color" => nil } }
|
691
|
+
|
692
|
+
it "prints the instructions without special colors" do
|
693
|
+
run
|
694
|
+
expect(output).to include("Starting AppSignal Installer")
|
695
|
+
expect(output).to_not have_color_markers
|
696
|
+
end
|
697
|
+
end
|
698
|
+
|
670
699
|
it "prints a message about unknown framework" do
|
671
700
|
run
|
672
701
|
|
@@ -47,15 +47,43 @@ describe Appsignal::Config do
|
|
47
47
|
subject { config[:active] }
|
48
48
|
|
49
49
|
context "with APPSIGNAL_PUSH_API_KEY env variable" do
|
50
|
-
|
50
|
+
context "when not empty" do
|
51
|
+
before { ENV["APPSIGNAL_PUSH_API_KEY"] = "abc" }
|
51
52
|
|
52
|
-
|
53
|
-
|
53
|
+
it "becomes active" do
|
54
|
+
expect(subject).to be_truthy
|
55
|
+
end
|
56
|
+
|
57
|
+
it "sets the push_api_key as loaded through the env_config" do
|
58
|
+
expect(config.env_config).to eq(:push_api_key => "abc")
|
59
|
+
expect(config.system_config).to eq(:active => true)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "when empty string" do
|
64
|
+
before { ENV["APPSIGNAL_PUSH_API_KEY"] = "" }
|
65
|
+
|
66
|
+
it "does not becomes active" do
|
67
|
+
expect(subject).to be_falsy
|
68
|
+
end
|
69
|
+
|
70
|
+
it "sets the push_api_key as loaded through the env_config" do
|
71
|
+
expect(config.env_config).to eq(:push_api_key => "")
|
72
|
+
expect(config.system_config).to be_empty
|
73
|
+
end
|
54
74
|
end
|
55
75
|
|
56
|
-
|
57
|
-
|
58
|
-
|
76
|
+
context "when blank string" do
|
77
|
+
before { ENV["APPSIGNAL_PUSH_API_KEY"] = " " }
|
78
|
+
|
79
|
+
it "does not becomes active" do
|
80
|
+
expect(subject).to be_falsy
|
81
|
+
end
|
82
|
+
|
83
|
+
it "sets the push_api_key as loaded through the env_config" do
|
84
|
+
expect(config.env_config).to eq(:push_api_key => " ")
|
85
|
+
expect(config.system_config).to be_empty
|
86
|
+
end
|
59
87
|
end
|
60
88
|
end
|
61
89
|
|
@@ -215,6 +243,30 @@ describe Appsignal::Config do
|
|
215
243
|
end
|
216
244
|
end
|
217
245
|
|
246
|
+
context "with the config file causing an error" do
|
247
|
+
let(:config_path) do
|
248
|
+
File.expand_path(
|
249
|
+
File.join(File.dirname(__FILE__), "../../support/fixtures/projects/broken")
|
250
|
+
)
|
251
|
+
end
|
252
|
+
let(:config) { Appsignal::Config.new(config_path, "foo") }
|
253
|
+
|
254
|
+
it "logs & prints an error, skipping the file source" do
|
255
|
+
stdout = std_stream
|
256
|
+
stderr = std_stream
|
257
|
+
log = capture_logs { capture_std_streams(stdout, stderr) { config } }
|
258
|
+
message = "An error occured while loading the AppSignal config file. " \
|
259
|
+
"Skipping file config.\n" \
|
260
|
+
"File: #{File.join(config_path, "config", "appsignal.yml").inspect}\n" \
|
261
|
+
"NotExistingConstant: uninitialized constant NotExistingConstant\n"
|
262
|
+
expect(log).to contains_log :error, message
|
263
|
+
expect(log).to include("/appsignal/config.rb:") # Backtrace
|
264
|
+
expect(stdout.read).to_not include("appsignal:")
|
265
|
+
expect(stderr.read).to include "appsignal: #{message}"
|
266
|
+
expect(config.file_config).to eql({})
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
218
270
|
it "sets the file_config" do
|
219
271
|
# config found in spec/support/project_fixture/config/appsignal.yml
|
220
272
|
expect(config.file_config).to match(
|
@@ -265,7 +317,7 @@ describe Appsignal::Config do
|
|
265
317
|
expect_any_instance_of(Logger).to receive(:error).once
|
266
318
|
.with("Not loading from config file: config for 'nonsense' not found")
|
267
319
|
expect_any_instance_of(Logger).to receive(:error).once
|
268
|
-
.with("Push
|
320
|
+
.with("Push API key not set after loading config")
|
269
321
|
config
|
270
322
|
end
|
271
323
|
end
|
@@ -724,6 +776,22 @@ describe Appsignal::Config do
|
|
724
776
|
end
|
725
777
|
end
|
726
778
|
|
779
|
+
context "with empty push_api_key" do
|
780
|
+
let(:push_api_key) { "" }
|
781
|
+
|
782
|
+
it "sets valid to false" do
|
783
|
+
is_expected.to eq(false)
|
784
|
+
end
|
785
|
+
end
|
786
|
+
|
787
|
+
context "with blank push_api_key" do
|
788
|
+
let(:push_api_key) { " " }
|
789
|
+
|
790
|
+
it "sets valid to false" do
|
791
|
+
is_expected.to eq(false)
|
792
|
+
end
|
793
|
+
end
|
794
|
+
|
727
795
|
context "with push_api_key present" do
|
728
796
|
let(:push_api_key) { "abc" }
|
729
797
|
|
@@ -54,16 +54,12 @@ describe Appsignal::Hooks::ActionCableHook do
|
|
54
54
|
.with(transaction_id, Appsignal::Transaction::ACTION_CABLE, kind_of(ActionDispatch::Request))
|
55
55
|
.and_return(transaction)
|
56
56
|
allow(Appsignal::Transaction).to receive(:current).and_return(transaction)
|
57
|
-
# Make sure sample data is added
|
58
|
-
expect(transaction.ext).to receive(:finish).and_return(true)
|
59
|
-
# Stub complete call, stops it from being cleared in the extension
|
60
|
-
# And allows us to call `#to_h` on it after it's been completed.
|
61
|
-
expect(transaction.ext).to receive(:complete)
|
62
57
|
|
63
58
|
# Stub transmit call for subscribe/unsubscribe tests
|
64
59
|
allow(connection).to receive(:websocket)
|
65
60
|
.and_return(instance_double("ActionCable::Connection::WebSocket", :transmit => nil))
|
66
61
|
end
|
62
|
+
around { |example| keep_transactions { example.run } }
|
67
63
|
|
68
64
|
describe "#perform_action" do
|
69
65
|
it "creates a transaction for an action" do
|
@@ -4,69 +4,71 @@ describe Appsignal::Hooks::RakeHook do
|
|
4
4
|
let(:task) { Rake::Task.new("task:name", Rake::Application.new) }
|
5
5
|
let(:arguments) { Rake::TaskArguments.new(["foo"], ["bar"]) }
|
6
6
|
let(:generic_request) { Appsignal::Transaction::GenericRequest.new({}) }
|
7
|
-
before(:context)
|
8
|
-
Appsignal.config = project_fixture_config
|
9
|
-
expect(Appsignal.active?).to be_truthy
|
10
|
-
Appsignal::Hooks.load_hooks
|
11
|
-
end
|
7
|
+
before(:context) { start_agent }
|
12
8
|
|
13
9
|
describe "#execute" do
|
14
10
|
context "without error" do
|
11
|
+
before { expect(Appsignal).to_not receive(:stop) }
|
12
|
+
|
13
|
+
def perform
|
14
|
+
task.execute(arguments)
|
15
|
+
end
|
16
|
+
|
15
17
|
it "creates no transaction" do
|
16
|
-
expect(Appsignal::Transaction).to_not receive(:
|
18
|
+
expect(Appsignal::Transaction).to_not receive(:new)
|
19
|
+
expect { perform }.to_not(change { created_transactions })
|
17
20
|
end
|
18
21
|
|
19
22
|
it "calls the original task" do
|
20
|
-
expect(task).to receive(:execute_without_appsignal).with(
|
23
|
+
expect(task).to receive(:execute_without_appsignal).with(arguments)
|
24
|
+
perform
|
21
25
|
end
|
22
|
-
|
23
|
-
after { task.execute("foo") }
|
24
26
|
end
|
25
27
|
|
26
28
|
context "with error" do
|
27
29
|
let(:error) { ExampleException }
|
28
|
-
let(:transaction) { background_job_transaction }
|
29
30
|
before do
|
30
|
-
task.enhance { raise error }
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
Appsignal::Transaction::BACKGROUND_JOB,
|
35
|
-
kind_of(Appsignal::Transaction::GenericRequest)
|
36
|
-
).and_return(transaction)
|
31
|
+
task.enhance { raise error, "my error message" }
|
32
|
+
# We don't call `and_call_original` here as we don't want AppSignal to
|
33
|
+
# stop and start for every spec.
|
34
|
+
expect(Appsignal).to receive(:stop).with("rake")
|
37
35
|
end
|
38
36
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
it "sets the error" do
|
44
|
-
expect(transaction).to receive(:set_error).with(error)
|
37
|
+
def perform
|
38
|
+
keep_transactions do
|
39
|
+
expect { task.execute(arguments) }.to raise_error(error)
|
40
|
+
end
|
45
41
|
end
|
46
42
|
|
47
|
-
it "
|
48
|
-
|
49
|
-
expect(Appsignal).to receive(:stop).with("rake").ordered
|
50
|
-
end
|
43
|
+
it "creates a background job transaction" do
|
44
|
+
perform
|
51
45
|
|
52
|
-
|
53
|
-
expect(
|
54
|
-
|
55
|
-
|
46
|
+
expect(last_transaction).to be_completed
|
47
|
+
expect(last_transaction.to_h).to include(
|
48
|
+
"id" => kind_of(String),
|
49
|
+
"namespace" => Appsignal::Transaction::BACKGROUND_JOB,
|
50
|
+
"action" => "task:name",
|
51
|
+
"error" => {
|
52
|
+
"name" => "ExampleException",
|
53
|
+
"message" => "my error message",
|
54
|
+
"backtrace" => kind_of(String)
|
55
|
+
},
|
56
|
+
"sample_data" => hash_including(
|
57
|
+
"params" => { "foo" => "bar" }
|
58
|
+
)
|
59
|
+
)
|
56
60
|
end
|
57
61
|
|
58
62
|
context "when first argument is not a `Rake::TaskArguments`" do
|
59
63
|
let(:arguments) { nil }
|
60
64
|
|
61
|
-
it "
|
62
|
-
|
63
|
-
.with(:params => nil)
|
64
|
-
.and_return(generic_request)
|
65
|
-
end
|
66
|
-
end
|
65
|
+
it "does not add the params to the transaction" do
|
66
|
+
perform
|
67
67
|
|
68
|
-
|
69
|
-
|
68
|
+
expect(last_transaction.to_h).to include(
|
69
|
+
"sample_data" => hash_excluding("params")
|
70
|
+
)
|
71
|
+
end
|
70
72
|
end
|
71
73
|
end
|
72
74
|
end
|
@@ -38,28 +38,15 @@ describe Appsignal::Hooks::SidekiqPlugin, :with_yaml_parse_error => false do
|
|
38
38
|
}
|
39
39
|
end
|
40
40
|
let(:plugin) { Appsignal::Hooks::SidekiqPlugin.new }
|
41
|
-
let(:test_store) { {} }
|
42
41
|
let(:log) { StringIO.new }
|
43
42
|
before do
|
44
43
|
start_agent
|
45
44
|
Appsignal.logger = test_logger(log)
|
46
|
-
|
47
|
-
# Stub calls to extension, because that would remove the transaction
|
48
|
-
# from the extension.
|
49
|
-
allow_any_instance_of(Appsignal::Extension::Transaction).to receive(:finish).and_return(true)
|
50
|
-
allow_any_instance_of(Appsignal::Extension::Transaction).to receive(:complete)
|
51
|
-
|
52
|
-
# Stub removal of current transaction from current thread so we can fetch
|
53
|
-
# it later.
|
54
|
-
expect(Appsignal::Transaction).to receive(:clear_current_transaction!) do
|
55
|
-
transaction = Thread.current[:appsignal_transaction]
|
56
|
-
test_store[:transaction] = transaction if transaction
|
57
|
-
end
|
58
45
|
end
|
46
|
+
around { |example| keep_transactions { example.run } }
|
59
47
|
after :with_yaml_parse_error => false do
|
60
48
|
expect(log_contents(log)).to_not contains_log(:warn, "Unable to load YAML")
|
61
49
|
end
|
62
|
-
after { clear_current_transaction! }
|
63
50
|
|
64
51
|
shared_examples "sidekiq metadata" do
|
65
52
|
describe "internal Sidekiq job values" do
|
@@ -513,7 +500,7 @@ describe Appsignal::Hooks::SidekiqPlugin, :with_yaml_parse_error => false do
|
|
513
500
|
end
|
514
501
|
|
515
502
|
def transaction
|
516
|
-
|
503
|
+
last_transaction
|
517
504
|
end
|
518
505
|
|
519
506
|
def expect_transaction_to_have_sidekiq_event(transaction_hash)
|
@@ -16,8 +16,8 @@ describe Object do
|
|
16
16
|
context "when active" do
|
17
17
|
let(:transaction) { http_request_transaction }
|
18
18
|
before do
|
19
|
-
expect(Appsignal::Transaction).to receive(:current).at_least(:once).and_return(transaction)
|
20
19
|
Appsignal.config = project_fixture_config
|
20
|
+
expect(Appsignal::Transaction).to receive(:current).at_least(:once).and_return(transaction)
|
21
21
|
end
|
22
22
|
after { Appsignal.config = nil }
|
23
23
|
|
@@ -137,9 +137,9 @@ describe Object do
|
|
137
137
|
context "when active" do
|
138
138
|
let(:transaction) { http_request_transaction }
|
139
139
|
before do
|
140
|
+
Appsignal.config = project_fixture_config
|
140
141
|
expect(Appsignal::Transaction).to receive(:current).at_least(:once)
|
141
142
|
.and_return(transaction)
|
142
|
-
Appsignal.config = project_fixture_config
|
143
143
|
end
|
144
144
|
after { Appsignal.config = nil }
|
145
145
|
|
@@ -37,47 +37,30 @@ if DependencyHelper.que_present?
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
let(:instance) { job.new(job_attrs) }
|
40
|
-
let(:transaction) do
|
41
|
-
Appsignal::Transaction.new(
|
42
|
-
SecureRandom.uuid,
|
43
|
-
Appsignal::Transaction::BACKGROUND_JOB,
|
44
|
-
Appsignal::Transaction::GenericRequest.new(env)
|
45
|
-
)
|
46
|
-
end
|
47
40
|
|
48
41
|
before do
|
49
42
|
allow(Que).to receive(:execute)
|
50
43
|
|
51
44
|
start_agent
|
52
45
|
expect(Appsignal.active?).to be_truthy
|
53
|
-
transaction
|
54
|
-
|
55
|
-
expect(Appsignal::Transaction).to receive(:create)
|
56
|
-
.with(
|
57
|
-
kind_of(String),
|
58
|
-
Appsignal::Transaction::BACKGROUND_JOB,
|
59
|
-
kind_of(Appsignal::Transaction::GenericRequest)
|
60
|
-
).and_return(transaction)
|
61
|
-
allow(Appsignal::Transaction).to receive(:current).and_return(transaction)
|
62
|
-
expect(transaction.ext).to receive(:finish).and_return(true)
|
63
|
-
expect(transaction.ext).to receive(:complete)
|
64
46
|
end
|
65
|
-
|
66
|
-
subject { transaction.to_h }
|
47
|
+
around { |example| keep_transactions { example.run } }
|
67
48
|
|
68
49
|
context "success" do
|
69
50
|
it "creates a transaction for a job" do
|
70
51
|
expect do
|
71
52
|
instance._run
|
72
|
-
end.
|
53
|
+
end.to change { created_transactions.length }.by(1)
|
73
54
|
|
74
|
-
expect(
|
55
|
+
expect(last_transaction).to be_completed
|
56
|
+
transaction_hash = last_transaction.to_h
|
57
|
+
expect(transaction_hash).to include(
|
75
58
|
"action" => "MyQueJob#run",
|
76
59
|
"id" => instance_of(String),
|
77
60
|
"namespace" => Appsignal::Transaction::BACKGROUND_JOB
|
78
61
|
)
|
79
|
-
expect(
|
80
|
-
expect(
|
62
|
+
expect(transaction_hash["error"]).to be_nil
|
63
|
+
expect(transaction_hash["events"].first).to include(
|
81
64
|
"allocation_count" => kind_of(Integer),
|
82
65
|
"body" => "",
|
83
66
|
"body_format" => Appsignal::EventFormatter::DEFAULT,
|
@@ -91,7 +74,7 @@ if DependencyHelper.que_present?
|
|
91
74
|
"name" => "perform_job.que",
|
92
75
|
"title" => ""
|
93
76
|
)
|
94
|
-
expect(
|
77
|
+
expect(transaction_hash["sample_data"]).to include(
|
95
78
|
"params" => %w[1 birds],
|
96
79
|
"metadata" => {
|
97
80
|
"attempts" => 0,
|
@@ -107,24 +90,28 @@ if DependencyHelper.que_present?
|
|
107
90
|
context "with exception" do
|
108
91
|
let(:error) { ExampleException.new("oh no!") }
|
109
92
|
|
110
|
-
it "
|
93
|
+
it "reports exceptions and re-raise them" do
|
111
94
|
allow(instance).to receive(:run).and_raise(error)
|
112
95
|
|
113
96
|
expect do
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
97
|
+
expect do
|
98
|
+
instance._run
|
99
|
+
end.to raise_error(ExampleException)
|
100
|
+
end.to change { created_transactions.length }.by(1)
|
101
|
+
|
102
|
+
expect(last_transaction).to be_completed
|
103
|
+
transaction_hash = last_transaction.to_h
|
104
|
+
expect(transaction_hash).to include(
|
118
105
|
"action" => "MyQueJob#run",
|
119
106
|
"id" => instance_of(String),
|
120
107
|
"namespace" => Appsignal::Transaction::BACKGROUND_JOB
|
121
108
|
)
|
122
|
-
expect(
|
109
|
+
expect(transaction_hash["error"]).to include(
|
123
110
|
"backtrace" => kind_of(String),
|
124
111
|
"name" => error.class.name,
|
125
112
|
"message" => error.message
|
126
113
|
)
|
127
|
-
expect(
|
114
|
+
expect(transaction_hash["sample_data"]).to include(
|
128
115
|
"params" => %w[1 birds],
|
129
116
|
"metadata" => {
|
130
117
|
"attempts" => 0,
|
@@ -140,24 +127,24 @@ if DependencyHelper.que_present?
|
|
140
127
|
context "with error" do
|
141
128
|
let(:error) { ExampleStandardError.new("oh no!") }
|
142
129
|
|
143
|
-
it "
|
130
|
+
it "reports errors and not re-raise them" do
|
144
131
|
allow(instance).to receive(:run).and_raise(error)
|
145
132
|
|
146
|
-
expect
|
147
|
-
instance._run
|
148
|
-
end.to_not raise_error
|
133
|
+
expect { instance._run }.to change { created_transactions.length }.by(1)
|
149
134
|
|
150
|
-
expect(
|
135
|
+
expect(last_transaction).to be_completed
|
136
|
+
transaction_hash = last_transaction.to_h
|
137
|
+
expect(transaction_hash).to include(
|
151
138
|
"action" => "MyQueJob#run",
|
152
139
|
"id" => instance_of(String),
|
153
140
|
"namespace" => Appsignal::Transaction::BACKGROUND_JOB
|
154
141
|
)
|
155
|
-
expect(
|
142
|
+
expect(transaction_hash["error"]).to include(
|
156
143
|
"backtrace" => kind_of(String),
|
157
144
|
"name" => error.class.name,
|
158
145
|
"message" => error.message
|
159
146
|
)
|
160
|
-
expect(
|
147
|
+
expect(transaction_hash["sample_data"]).to include(
|
161
148
|
"params" => %w[1 birds],
|
162
149
|
"metadata" => {
|
163
150
|
"attempts" => 0,
|