appsignal 3.0.16-java → 3.0.20-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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +0 -3
  3. data/.semaphore/semaphore.yml +512 -103
  4. data/CHANGELOG.md +37 -0
  5. data/appsignal.gemspec +0 -2
  6. data/build_matrix.yml +44 -16
  7. data/ext/agent.yml +25 -25
  8. data/ext/base.rb +3 -2
  9. data/gemfiles/rails-6.1.gemfile +7 -0
  10. data/gemfiles/rails-7.0.gemfile +7 -0
  11. data/lib/appsignal/cli/diagnose/utils.rb +0 -14
  12. data/lib/appsignal/cli/diagnose.rb +4 -4
  13. data/lib/appsignal/config.rb +65 -20
  14. data/lib/appsignal/event_formatter/sequel/sql_formatter.rb +24 -0
  15. data/lib/appsignal/integrations/sidekiq.rb +5 -1
  16. data/lib/appsignal/system.rb +0 -4
  17. data/lib/appsignal/transaction.rb +2 -2
  18. data/lib/appsignal/version.rb +1 -1
  19. data/lib/appsignal.rb +4 -10
  20. data/spec/lib/appsignal/cli/diagnose_spec.rb +11 -11
  21. data/spec/lib/appsignal/config_spec.rb +208 -10
  22. data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +2 -2
  23. data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +30 -0
  24. data/spec/lib/appsignal/event_formatter_spec.rb +2 -2
  25. data/spec/lib/appsignal/hooks/activejob_spec.rb +17 -6
  26. data/spec/lib/appsignal/hooks/sequel_spec.rb +1 -1
  27. data/spec/lib/appsignal/integrations/padrino_spec.rb +8 -2
  28. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +23 -5
  29. data/spec/lib/appsignal/transaction_spec.rb +2 -2
  30. data/spec/lib/appsignal/utils/data_spec.rb +0 -2
  31. data/spec/lib/appsignal/utils/json_spec.rb +0 -2
  32. data/spec/lib/appsignal_spec.rb +2 -3
  33. data/spec/support/helpers/activejob_helpers.rb +27 -0
  34. data/spec/support/helpers/dependency_helper.rb +13 -1
  35. metadata +10 -3
@@ -251,14 +251,14 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
251
251
 
252
252
  it "adds the installation report to the diagnostics report" do
253
253
  run
254
- jruby = DependencyHelper.running_jruby?
254
+ jruby = Appsignal::System.jruby?
255
255
  expect(received_report["installation"]).to match(
256
256
  "result" => {
257
257
  "status" => "success"
258
258
  },
259
259
  "language" => {
260
260
  "name" => "ruby",
261
- "version" => "#{rbconfig["ruby_version"]}-p#{rbconfig["PATCHLEVEL"]}",
261
+ "version" => "#{rbconfig["RUBY_PROGRAM_VERSION"]}-p#{rbconfig["PATCHLEVEL"]}",
262
262
  "implementation" => jruby ? "jruby" : "ruby"
263
263
  },
264
264
  "download" => {
@@ -295,7 +295,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
295
295
  " Status: success",
296
296
  "Language details",
297
297
  " Implementation: \"#{jruby ? "jruby" : "ruby"}\"",
298
- " Ruby version: \"#{"#{rbconfig["ruby_version"]}-p#{rbconfig["PATCHLEVEL"]}"}\"",
298
+ " Ruby version: \"#{"#{rbconfig["RUBY_PROGRAM_VERSION"]}-p#{rbconfig["PATCHLEVEL"]}"}\"",
299
299
  "Download details",
300
300
  " Download URL: \"https://",
301
301
  " Checksum: \"verified\"",
@@ -321,7 +321,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
321
321
  expect(File).to receive(:read)
322
322
  .with(File.expand_path("../../../../../ext/install.report", __FILE__))
323
323
  .and_return(
324
- YAML.dump(
324
+ JSON.generate(
325
325
  "result" => {
326
326
  "status" => "error",
327
327
  "error" => "RuntimeError: some error",
@@ -384,8 +384,8 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
384
384
  end
385
385
  end
386
386
 
387
- context "when report is invalid YAML" do
388
- let(:raw_report) { "foo:\nbar" }
387
+ context "when report is invalid JSON" do
388
+ let(:raw_report) { "{}-" }
389
389
  before do
390
390
  allow(File).to receive(:read).and_call_original
391
391
  expect(File).to receive(:read)
@@ -604,7 +604,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
604
604
 
605
605
  describe "host information" do
606
606
  let(:rbconfig) { RbConfig::CONFIG }
607
- let(:language_version) { "#{rbconfig["ruby_version"]}-p#{rbconfig["PATCHLEVEL"]}" }
607
+ let(:language_version) { "#{rbconfig["RUBY_PROGRAM_VERSION"]}-p#{rbconfig["PATCHLEVEL"]}" }
608
608
 
609
609
  it "outputs host information" do
610
610
  run
@@ -769,10 +769,10 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
769
769
  it "transmits validation in report" do
770
770
  default_config = hash_with_string_keys(Appsignal::Config::DEFAULT_CONFIG)
771
771
  expect(received_report["config"]).to eq(
772
- "options" => default_config.merge("env" => ""),
772
+ "options" => default_config.merge("env" => "", "send_session_data" => true),
773
773
  "sources" => {
774
774
  "default" => default_config,
775
- "system" => {},
775
+ "system" => { "send_session_data" => true },
776
776
  "initial" => { "env" => "" },
777
777
  "file" => {},
778
778
  "env" => {}
@@ -890,7 +890,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
890
890
  "options" => hash_with_string_keys(final_config),
891
891
  "sources" => {
892
892
  "default" => hash_with_string_keys(Appsignal::Config::DEFAULT_CONFIG),
893
- "system" => {},
893
+ "system" => { "send_session_data" => true },
894
894
  "initial" => hash_with_string_keys(config.initial_config.merge(additional_initial_config)),
895
895
  "file" => hash_with_string_keys(config.file_config),
896
896
  "env" => {}
@@ -917,7 +917,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
917
917
  "options" => hash_with_string_keys(config.config_hash).merge("env" => "foobar"),
918
918
  "sources" => {
919
919
  "default" => hash_with_string_keys(Appsignal::Config::DEFAULT_CONFIG),
920
- "system" => {},
920
+ "system" => { "send_session_data" => true },
921
921
  "initial" => hash_with_string_keys(config.initial_config),
922
922
  "file" => hash_with_string_keys(config.file_config),
923
923
  "env" => {}
@@ -69,8 +69,8 @@ describe Appsignal::Config do
69
69
  end
70
70
 
71
71
  it "sets the push_api_key as loaded through the env_config" do
72
- expect(config.env_config).to eq(:push_api_key => "abc")
73
- expect(config.system_config).to eq(:active => true)
72
+ expect(config.env_config).to include(:push_api_key => "abc")
73
+ expect(config.system_config).to include(:active => true)
74
74
  end
75
75
  end
76
76
 
@@ -82,8 +82,8 @@ describe Appsignal::Config do
82
82
  end
83
83
 
84
84
  it "sets the push_api_key as loaded through the env_config" do
85
- expect(config.env_config).to eq(:push_api_key => "")
86
- expect(config.system_config).to be_empty
85
+ expect(config.env_config).to include(:push_api_key => "")
86
+ expect(config.system_config).to_not have_key(:active)
87
87
  end
88
88
  end
89
89
 
@@ -95,8 +95,8 @@ describe Appsignal::Config do
95
95
  end
96
96
 
97
97
  it "sets the push_api_key as loaded through the env_config" do
98
- expect(config.env_config).to eq(:push_api_key => " ")
99
- expect(config.system_config).to be_empty
98
+ expect(config.env_config).to include(:push_api_key => " ")
99
+ expect(config.system_config).to_not have_key(:active)
100
100
  end
101
101
  end
102
102
  end
@@ -119,7 +119,7 @@ describe Appsignal::Config do
119
119
  end
120
120
 
121
121
  it "sets the log as loaded through the system" do
122
- expect(config.system_config).to eq(:log => "stdout")
122
+ expect(config.system_config).to include(:log => "stdout")
123
123
  end
124
124
  end
125
125
 
@@ -129,7 +129,7 @@ describe Appsignal::Config do
129
129
  end
130
130
 
131
131
  it "does not set log as loaded through the system" do
132
- expect(config.system_config).to eq({})
132
+ expect(config.system_config).to_not have_key(:log)
133
133
  end
134
134
  end
135
135
  end
@@ -171,14 +171,13 @@ describe Appsignal::Config do
171
171
  :instrument_redis => true,
172
172
  :instrument_sequel => true,
173
173
  :log => "file",
174
- :log_level => "info",
175
174
  :name => "TestApp",
176
175
  :push_api_key => "abc",
177
176
  :request_headers => [],
178
177
  :revision => "v2.5.1",
179
178
  :send_environment_metadata => true,
180
179
  :send_params => true,
181
- :skip_session_data => false,
180
+ :send_session_data => true,
182
181
  :transaction_debug_mode => false
183
182
  )
184
183
  end
@@ -744,6 +743,126 @@ describe Appsignal::Config do
744
743
  end
745
744
  end
746
745
 
746
+ describe "#maintain_backwards_compatibility" do
747
+ let(:log_stream) { StringIO.new }
748
+ let(:logger) { test_logger(log_stream) }
749
+ let(:logs) { log_contents(log_stream) }
750
+ let(:config) do
751
+ described_class.new(Dir.pwd, "production", config_options, logger)
752
+ end
753
+
754
+ describe "working_dir_path" do
755
+ let(:err_stream) { std_stream }
756
+ let(:stderr) { err_stream.read }
757
+ let(:deprecation_message) do
758
+ "The `working_dir_path` option is deprecated, please use " \
759
+ "`working_directory_path` instead and specify the " \
760
+ "full path to the working directory"
761
+ end
762
+ before do
763
+ capture_std_streams(std_stream, err_stream) { config }
764
+ end
765
+
766
+ context "when not set" do
767
+ let(:config_options) { {} }
768
+
769
+ it "sets the default working_dir_path value" do
770
+ expect(config[:working_dir_path]).to be_nil
771
+ end
772
+
773
+ it "does not print a deprecation warning" do
774
+ expect(stderr).to_not include("appsignal WARNING: #{deprecation_message}")
775
+ expect(logs).to_not include(deprecation_message)
776
+ end
777
+ end
778
+
779
+ context "when set" do
780
+ let(:config_options) { { :working_dir_path => "/tmp/appsignal2" } }
781
+
782
+ it "sets the default working_dir_path value" do
783
+ expect(config[:working_dir_path]).to eq("/tmp/appsignal2")
784
+ end
785
+
786
+ it "does not print a deprecation warning" do
787
+ expect(stderr).to include("appsignal WARNING: #{deprecation_message}")
788
+ expect(logs).to include(deprecation_message)
789
+ end
790
+ end
791
+ end
792
+
793
+ describe "skip_session_data" do
794
+ let(:err_stream) { std_stream }
795
+ let(:stderr) { err_stream.read }
796
+ let(:deprecation_message) do
797
+ "The `skip_session_data` config option is deprecated. Please use " \
798
+ "`send_session_data` instead."
799
+ end
800
+ before do
801
+ capture_std_streams(std_stream, err_stream) { config }
802
+ end
803
+
804
+ context "when not set" do
805
+ let(:config_options) { {} }
806
+
807
+ it "sets the default send_session_data value" do
808
+ expect(config[:skip_session_data]).to be_nil
809
+ expect(config[:send_session_data]).to eq(true)
810
+ expect(config.system_config[:send_session_data]).to eq(true)
811
+ end
812
+
813
+ it "does not print a deprecation warning" do
814
+ expect(stderr).to_not include("appsignal WARNING: #{deprecation_message}")
815
+ expect(logs).to_not include(deprecation_message)
816
+ end
817
+ end
818
+
819
+ context "when set to true" do
820
+ let(:config_options) { { :skip_session_data => true } }
821
+
822
+ it "sets send_session_data if send_session_data is not set by the user" do
823
+ expect(config[:skip_session_data]).to eq(true)
824
+ expect(config[:send_session_data]).to eq(false)
825
+ expect(config.system_config[:send_session_data]).to eq(false)
826
+ end
827
+
828
+ it "prints a deprecation warning" do
829
+ expect(stderr).to include("appsignal WARNING: #{deprecation_message}")
830
+ expect(logs).to include(deprecation_message)
831
+ end
832
+ end
833
+
834
+ context "when set to false" do
835
+ let(:config_options) { { :skip_session_data => false } }
836
+
837
+ it "sets send_session_data if send_session_data is not set by the user" do
838
+ expect(config[:skip_session_data]).to eq(false)
839
+ expect(config[:send_session_data]).to eq(true)
840
+ expect(config.system_config[:send_session_data]).to eq(true)
841
+ end
842
+
843
+ it "prints a deprecation warning" do
844
+ expect(stderr).to include("appsignal WARNING: #{deprecation_message}")
845
+ expect(logs).to include(deprecation_message)
846
+ end
847
+ end
848
+
849
+ context "when skip_session_data and send_session_data are both set" do
850
+ let(:config_options) { { :skip_session_data => true, :send_session_data => true } }
851
+
852
+ it "does not overwrite the send_session_data value" do
853
+ expect(config[:skip_session_data]).to eq(true)
854
+ expect(config[:send_session_data]).to eq(true)
855
+ expect(config.system_config[:send_session_data]).to be_nil
856
+ end
857
+
858
+ it "prints a deprecation warning" do
859
+ expect(stderr).to include("appsignal WARNING: #{deprecation_message}")
860
+ expect(logs).to include(deprecation_message)
861
+ end
862
+ end
863
+ end
864
+ end
865
+
747
866
  describe "#validate" do
748
867
  subject { config.valid? }
749
868
  let(:config) do
@@ -787,4 +906,83 @@ describe Appsignal::Config do
787
906
  end
788
907
  end
789
908
  end
909
+
910
+ describe "#log_level" do
911
+ let(:options) { {} }
912
+ let(:config) { described_class.new("", nil, options) }
913
+ subject { config.log_level }
914
+
915
+ context "without any config" do
916
+ it "returns info by default" do
917
+ is_expected.to eq(Logger::INFO)
918
+ end
919
+ end
920
+
921
+ context "with debug set to true" do
922
+ let(:options) { { :debug => true } }
923
+ it { is_expected.to eq(Logger::DEBUG) }
924
+ end
925
+
926
+ context "with transaction_debug_mode set to true" do
927
+ let(:options) { { :transaction_debug_mode => true } }
928
+ it { is_expected.to eq(Logger::DEBUG) }
929
+ end
930
+
931
+ context "with log_level set to error" do
932
+ let(:options) { { :log_level => "error" } }
933
+ it { is_expected.to eq(Logger::ERROR) }
934
+ end
935
+
936
+ context "with log_level set to warn" do
937
+ let(:options) { { :log_level => "warn" } }
938
+ it { is_expected.to eq(Logger::WARN) }
939
+ end
940
+
941
+ context "with log_level set to info" do
942
+ let(:options) { { :log_level => "info" } }
943
+ it { is_expected.to eq(Logger::INFO) }
944
+ end
945
+
946
+ context "with log_level set to debug" do
947
+ let(:options) { { :log_level => "debug" } }
948
+ it { is_expected.to eq(Logger::DEBUG) }
949
+ end
950
+
951
+ context "with log_level set to trace" do
952
+ let(:options) { { :log_level => "trace" } }
953
+ it { is_expected.to eq(Logger::DEBUG) }
954
+ end
955
+
956
+ context "with debug and log_level set" do
957
+ let(:options) { { :log_level => "error", :debug => true } }
958
+
959
+ it "the log_level option is leading" do
960
+ is_expected.to eq(Logger::ERROR)
961
+ end
962
+ end
963
+
964
+ context "with transaction_debug_mode and log_level set" do
965
+ let(:options) { { :log_level => "error", :transaction_debug_mode => true } }
966
+
967
+ it "the log_level option is leading" do
968
+ is_expected.to eq(Logger::ERROR)
969
+ end
970
+ end
971
+
972
+ context "with log level set to an unknown value" do
973
+ let(:options) { { :log_level => "fatal" } }
974
+
975
+ it "prints a warning and doesn't use the log_level" do
976
+ is_expected.to eql(Logger::INFO)
977
+ end
978
+
979
+ context "with debug option set to true" do
980
+ let(:options) { { :log_level => "fatal", :debug => true } }
981
+
982
+ it "prints a warning and sets it to debug" do
983
+ is_expected.to eql(Logger::DEBUG)
984
+ end
985
+ end
986
+ end
987
+ end
790
988
  end
@@ -1,5 +1,5 @@
1
- describe Appsignal::EventFormatter::ActiveRecord::InstantiationFormatter do
2
- let(:klass) { Appsignal::EventFormatter::ActiveRecord::SqlFormatter }
1
+ describe Appsignal::EventFormatter::ActiveRecord::SqlFormatter do
2
+ let(:klass) { described_class }
3
3
  let(:formatter) { klass.new }
4
4
 
5
5
  it "should register sql.active_record" do
@@ -0,0 +1,30 @@
1
+ describe Appsignal::EventFormatter::Sequel::SqlFormatter do
2
+ let(:klass) { described_class }
3
+ let(:formatter) { klass.new }
4
+
5
+ it "registers the sql.sequel event formatter" do
6
+ expect(Appsignal::EventFormatter.registered?("sql.sequel", klass)).to be_truthy
7
+ end
8
+
9
+ describe "#format" do
10
+ before do
11
+ stub_const(
12
+ "SequelDatabaseTypeClass",
13
+ Class.new do
14
+ def self.to_s
15
+ "SequelDatabaseTypeClassToString"
16
+ end
17
+ end
18
+ )
19
+ end
20
+ let(:payload) do
21
+ {
22
+ :name => SequelDatabaseTypeClass,
23
+ :sql => "SELECT * FROM users"
24
+ }
25
+ end
26
+ subject { formatter.format(payload) }
27
+
28
+ it { is_expected.to eq ["SequelDatabaseTypeClassToString", "SELECT * FROM users", 1] }
29
+ end
30
+ end
@@ -28,7 +28,7 @@ end
28
28
 
29
29
  class MockDependentFormatter < Appsignal::EventFormatter
30
30
  def initialize
31
- NonsenseDependency.something
31
+ raise "There is an error"
32
32
  end
33
33
 
34
34
  def format(_payload)
@@ -72,7 +72,7 @@ describe Appsignal::EventFormatter do
72
72
  end
73
73
  expect(klass.registered?("mock.dependent")).to be_falsy
74
74
  expect(logs).to contains_log :error, \
75
- "'uninitialized constant MockDependentFormatter::NonsenseDependency' " \
75
+ "'There is an error' " \
76
76
  "when initializing mock.dependent event formatter"
77
77
  end
78
78
  end
@@ -30,6 +30,7 @@ if DependencyHelper.active_job_present?
30
30
  end
31
31
 
32
32
  describe Appsignal::Hooks::ActiveJobHook::ActiveJobClassInstrumentation do
33
+ include ActiveJobHelpers
33
34
  let(:time) { Time.parse("2001-01-01 10:00:00UTC") }
34
35
  let(:namespace) { Appsignal::Transaction::BACKGROUND_JOB }
35
36
  let(:queue) { "default" }
@@ -64,6 +65,13 @@ if DependencyHelper.active_job_present?
64
65
  parameterized_expected_args
65
66
  ]
66
67
  end
68
+ let(:expected_perform_events) do
69
+ if DependencyHelper.rails7_present?
70
+ ["perform.active_job", "perform_start.active_job"]
71
+ else
72
+ ["perform_start.active_job", "perform.active_job"]
73
+ end
74
+ end
67
75
  before do
68
76
  ActiveJob::Base.queue_adapter = :inline
69
77
 
@@ -119,7 +127,8 @@ if DependencyHelper.active_job_present?
119
127
  events = transaction_hash["events"]
120
128
  .sort_by { |e| e["start"] }
121
129
  .map { |event| event["name"] }
122
- expect(events).to eq(["perform_start.active_job", "perform.active_job"])
130
+
131
+ expect(events).to eq(expected_perform_events)
123
132
  end
124
133
 
125
134
  context "with custom queue" do
@@ -208,7 +217,8 @@ if DependencyHelper.active_job_present?
208
217
  events = transaction_hash["events"]
209
218
  .sort_by { |e| e["start"] }
210
219
  .map { |event| event["name"] }
211
- expect(events).to eq(["perform_start.active_job", "perform.active_job"])
220
+
221
+ expect(events).to eq(expected_perform_events)
212
222
  end
213
223
 
214
224
  if DependencyHelper.rails_version >= Gem::Version.new("5.0.0")
@@ -286,7 +296,8 @@ if DependencyHelper.active_job_present?
286
296
  .reject { |e| e["name"] == "enqueue.active_job" }
287
297
  .sort_by { |e| e["start"] }
288
298
  .map { |event| event["name"] }
289
- expect(events).to eq(["perform_start.active_job", "perform.active_job"])
299
+
300
+ expect(events).to eq(expected_perform_events)
290
301
  end
291
302
  end
292
303
 
@@ -414,7 +425,7 @@ if DependencyHelper.active_job_present?
414
425
  expect(transaction_hash).to include(
415
426
  "action" => "ActionMailerTestJob#welcome",
416
427
  "sample_data" => hash_including(
417
- "params" => ["ActionMailerTestJob", "welcome", "deliver_now"],
428
+ "params" => ["ActionMailerTestJob", "welcome", "deliver_now"] + active_job_args_wrapper,
418
429
  "tags" => {
419
430
  "active_job_id" => kind_of(String),
420
431
  "queue" => "mailers"
@@ -433,7 +444,7 @@ if DependencyHelper.active_job_present?
433
444
  expect(transaction_hash).to include(
434
445
  "action" => "ActionMailerTestJob#welcome",
435
446
  "sample_data" => hash_including(
436
- "params" => ["ActionMailerTestJob", "welcome", "deliver_now"] + method_expected_args,
447
+ "params" => ["ActionMailerTestJob", "welcome", "deliver_now"] + active_job_args_wrapper(:args => method_expected_args),
437
448
  "tags" => {
438
449
  "active_job_id" => kind_of(String),
439
450
  "queue" => "mailers"
@@ -453,7 +464,7 @@ if DependencyHelper.active_job_present?
453
464
  expect(transaction_hash).to include(
454
465
  "action" => "ActionMailerTestJob#welcome",
455
466
  "sample_data" => hash_including(
456
- "params" => ["ActionMailerTestJob", "welcome", "deliver_now", parameterized_expected_args],
467
+ "params" => ["ActionMailerTestJob", "welcome", "deliver_now"] + active_job_args_wrapper(:params => parameterized_expected_args),
457
468
  "tags" => {
458
469
  "active_job_id" => kind_of(String),
459
470
  "queue" => "mailers"
@@ -1,7 +1,7 @@
1
1
  describe Appsignal::Hooks::SequelHook do
2
2
  if DependencyHelper.sequel_present?
3
3
  let(:db) do
4
- if Appsignal::System.jruby?
4
+ if DependencyHelper.running_jruby?
5
5
  Sequel.connect("jdbc:sqlite::memory:")
6
6
  else
7
7
  Sequel.sqlite
@@ -98,7 +98,13 @@ if DependencyHelper.padrino_present?
98
98
  RSpec::Matchers.define :match_response do |expected_status, expected_content|
99
99
  match do |response|
100
100
  status, _headers, content = response
101
- status == expected_status && content == [expected_content].compact
101
+ matches_content =
102
+ if expected_content.is_a?(Regexp)
103
+ content.join =~ expected_content
104
+ else
105
+ content == [expected_content].compact
106
+ end
107
+ status == expected_status && matches_content
102
108
  end
103
109
  end
104
110
 
@@ -142,7 +148,7 @@ if DependencyHelper.padrino_present?
142
148
  expect_a_transaction_to_be_created
143
149
  # Uses path for action name
144
150
  expect(transaction).to receive(:set_action_if_nil).with("PadrinoTestApp#unknown")
145
- expect(response).to match_response(404, "GET /404")
151
+ expect(response).to match_response(404, %r{^GET /404})
146
152
  end
147
153
  end
148
154
 
@@ -339,6 +339,7 @@ if DependencyHelper.active_job_present?
339
339
  require "sidekiq/testing"
340
340
 
341
341
  describe "Sidekiq ActiveJob integration" do
342
+ include ActiveJobHelpers
342
343
  let(:namespace) { Appsignal::Transaction::BACKGROUND_JOB }
343
344
  let(:time) { Time.parse("2001-01-01 10:00:00UTC") }
344
345
  let(:log) { StringIO.new }
@@ -366,6 +367,16 @@ if DependencyHelper.active_job_present?
366
367
  }
367
368
  ]
368
369
  end
370
+ let(:expected_wrapped_args) do
371
+ if (DependencyHelper.rails6_1_present? && DependencyHelper.ruby_3_1_or_newer?) || DependencyHelper.rails7_present?
372
+ [{
373
+ "_aj_ruby2_keywords" => ["args"],
374
+ "args" => expected_args
375
+ }]
376
+ else
377
+ expected_args
378
+ end
379
+ end
369
380
  let(:expected_tags) do
370
381
  {}.tap do |hash|
371
382
  hash["active_job_id"] = kind_of(String)
@@ -374,6 +385,13 @@ if DependencyHelper.active_job_present?
374
385
  end
375
386
  end
376
387
  end
388
+ let(:expected_perform_events) do
389
+ if DependencyHelper.rails7_present?
390
+ ["perform_job.sidekiq", "perform.active_job", "perform_start.active_job"]
391
+ else
392
+ ["perform_job.sidekiq", "perform_start.active_job", "perform.active_job"]
393
+ end
394
+ end
377
395
  before do
378
396
  start_agent
379
397
  Appsignal.logger = test_logger(log)
@@ -434,8 +452,8 @@ if DependencyHelper.active_job_present?
434
452
  events = transaction_hash["events"]
435
453
  .sort_by { |e| e["start"] }
436
454
  .map { |event| event["name"] }
437
- expect(events)
438
- .to eq(["perform_job.sidekiq", "perform_start.active_job", "perform.active_job"])
455
+
456
+ expect(events).to eq(expected_perform_events)
439
457
  end
440
458
 
441
459
  context "with error" do
@@ -467,8 +485,8 @@ if DependencyHelper.active_job_present?
467
485
  events = transaction_hash["events"]
468
486
  .sort_by { |e| e["start"] }
469
487
  .map { |event| event["name"] }
470
- expect(events)
471
- .to eq(["perform_job.sidekiq", "perform_start.active_job", "perform.active_job"])
488
+
489
+ expect(events).to eq(expected_perform_events)
472
490
  end
473
491
  end
474
492
 
@@ -490,7 +508,7 @@ if DependencyHelper.active_job_present?
490
508
  expect(transaction_hash).to include(
491
509
  "action" => "ActionMailerSidekiqTestJob#welcome",
492
510
  "sample_data" => hash_including(
493
- "params" => ["ActionMailerSidekiqTestJob", "welcome", "deliver_now"] + expected_args
511
+ "params" => ["ActionMailerSidekiqTestJob", "welcome", "deliver_now"] + expected_wrapped_args
494
512
  )
495
513
  )
496
514
  end
@@ -1282,8 +1282,8 @@ describe Appsignal::Transaction do
1282
1282
  end
1283
1283
  end
1284
1284
 
1285
- context "when skipping session data" do
1286
- before { Appsignal.config[:skip_session_data] = true }
1285
+ context "when not sending session data" do
1286
+ before { Appsignal.config[:send_session_data] = false }
1287
1287
 
1288
1288
  it "does not set any session data on the transaction" do
1289
1289
  expect(subject).to be_nil
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  describe Appsignal::Utils::Data do
4
2
  describe ".generate" do
5
3
  subject { Appsignal::Utils::Data.generate(body) }
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  describe Appsignal::Utils::JSON do
4
2
  describe ".generate" do
5
3
  subject { Appsignal::Utils::JSON.generate(body) }
@@ -86,8 +86,7 @@ describe Appsignal do
86
86
  expect_environment_metadata("ruby_gc_instrumentation_enabled", "true")
87
87
  end
88
88
 
89
- unless Appsignal::System.jruby?
90
-
89
+ unless DependencyHelper.running_jruby?
91
90
  it "installs the allocation event hook" do
92
91
  expect(Appsignal::Extension).to receive(:install_allocation_event_hook)
93
92
  .and_call_original
@@ -1236,7 +1235,7 @@ describe Appsignal do
1236
1235
  before do
1237
1236
  capture_stdout(out_stream) do
1238
1237
  initialize_config
1239
- Appsignal.config[:debug] = true
1238
+ Appsignal.config[:log_level] = "debug"
1240
1239
  Appsignal.start_logger
1241
1240
  end
1242
1241
  end
@@ -0,0 +1,27 @@
1
+ module ActiveJobHelpers
2
+ def active_job_args_wrapper(args: [], params: nil)
3
+ if (DependencyHelper.rails6_1_present? && DependencyHelper.ruby_3_1_or_newer?) || DependencyHelper.rails7_present?
4
+ wrapped_args = {}
5
+
6
+ if params
7
+ if DependencyHelper.rails7_present?
8
+ wrapped_args["_aj_ruby2_keywords"] = ["params", "args"]
9
+ wrapped_args["args"] = []
10
+ wrapped_args["params"] = {
11
+ "_aj_symbol_keys" => ["foo"]
12
+ }.merge(params)
13
+ else
14
+ wrapped_args["_aj_symbol_keys"] = ["foo"]
15
+ wrapped_args.merge!(params)
16
+ end
17
+ else
18
+ wrapped_args["_aj_ruby2_keywords"] = ["args"]
19
+ wrapped_args["args"] = args
20
+ end
21
+
22
+ [wrapped_args]
23
+ else
24
+ params.nil? ? args : args + [params]
25
+ end
26
+ end
27
+ end