appsignal 3.4.16-java → 3.5.1-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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9f4bbbebf35d65f97a75c99730464bb19e90387b1c84558c2d2bcaa195d15986
4
- data.tar.gz: 9e88ecb0449d0ce64b0e9bbe325834542f08016f31519005a65f077dd34c7979
3
+ metadata.gz: fe4aa04040848caadc77c47f984ee7969f08a5c36a5bd598e89e5807cb48124e
4
+ data.tar.gz: b3155c076dc8f322907d1c1d6dc49a7a8b03824272f0d7fb878d5b230fa3a25b
5
5
  SHA512:
6
- metadata.gz: 296a3681f8ad3d2eddb404e90448afe88d9dc71825f0aa66ad2f5de0418bca9500020ccf8199489a3aee87d935fc54c7cc29d3cc869dcce16bd1d3ffcbb795df
7
- data.tar.gz: 84f42f07b0ca6611326d8f3fd868221432bd81323837d2586be7b4245559ec94881275a3cf2c4b6899881098bffca72e1a82974bdc8b8e7448b4e04b71fbc781
6
+ metadata.gz: 7dd1e584fc1caa6a77d719186321a27e576d57d2f534db938a7e9157a520345f58054860ad0095381c4c41710e6d709bf587a1d9685398c81b82cff0255e82e9
7
+ data.tar.gz: 46b9a9f88c2e8d121ad43f403f41a56712e38f624e75ca899185c76a8244b970bee16637ed59b4b7b0441c0417138a08578db8c0eca3ac1b5e1e65d336b9a499
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # AppSignal for Ruby gem Changelog
2
2
 
3
+ ## 3.5.1
4
+
5
+ ### Fixed
6
+
7
+ - [2e93182b](https://github.com/appsignal/appsignal-ruby/commit/2e93182b6ae83b16fe9885558cd8f0bfce6a9a5f) patch - Fix an error in the diagnose report when reading a file's contents results in an "Invalid seek" error. This could happen when the log path is configured to `/dev/stdout`, which is not supported.
8
+ - [ae0b779b](https://github.com/appsignal/appsignal-ruby/commit/ae0b779b3ec00cc46291bc0373d748d720231e74) patch - Fix logger compatibility with Ruby 3.3
9
+
10
+ ## 3.5.0
11
+
12
+ ### Added
13
+
14
+ - [cee1676f](https://github.com/appsignal/appsignal-ruby/commit/cee1676fc5539e380c58e8a824b5c59c3c927119) minor - Nested errors are now supported. The error causes are stored as sample data on the transaction so they can be displayed in the UI.
15
+
3
16
  ## 3.4.16
4
17
 
5
18
  ### Changed
@@ -71,10 +71,14 @@ module Appsignal
71
71
  :group => Utils.group_for_gid(path_gid)
72
72
  }
73
73
  if info[:type] == "file"
74
- info[:content] = Utils.read_file_content(
75
- path,
76
- BYTES_TO_READ_FOR_FILES
77
- ).split("\n")
74
+ begin
75
+ info[:content] = Utils.read_file_content(
76
+ path,
77
+ BYTES_TO_READ_FOR_FILES
78
+ ).split("\n")
79
+ rescue => error
80
+ info[:read_error] = "#{error.class}: #{error.message}"
81
+ end
78
82
  end
79
83
  end
80
84
  end
@@ -631,6 +631,11 @@ module Appsignal
631
631
  else
632
632
  print_empty_line
633
633
  end
634
+
635
+ return unless path.key?(:read_error)
636
+
637
+ puts " Read error: #{path[:read_error]}"
638
+ print_empty_line
634
639
  end
635
640
 
636
641
  def print_empty_line
@@ -25,6 +25,8 @@ module Appsignal
25
25
  def initialize(group, level: INFO, format: PLAINTEXT)
26
26
  raise TypeError, "group must be a string" unless group.is_a? String
27
27
 
28
+ super(group, :level => level)
29
+
28
30
  @group = group
29
31
  @level = level
30
32
  @format = format
@@ -12,6 +12,7 @@ module Appsignal
12
12
  ALLOWED_TAG_KEY_TYPES = [Symbol, String].freeze
13
13
  ALLOWED_TAG_VALUE_TYPES = [Symbol, String, Integer].freeze
14
14
  BREADCRUMB_LIMIT = 20
15
+ ERROR_CAUSES_LIMIT = 10
15
16
 
16
17
  class << self
17
18
  def create(id, namespace, request, options = {})
@@ -374,6 +375,41 @@ module Appsignal
374
375
  cleaned_error_message(error),
375
376
  backtrace ? Appsignal::Utils::Data.generate(backtrace) : Appsignal::Extension.data_array_new
376
377
  )
378
+
379
+ root_cause_missing = false
380
+
381
+ causes = []
382
+ while error
383
+ error = error.cause
384
+
385
+ break unless error
386
+
387
+ if causes.length >= ERROR_CAUSES_LIMIT
388
+ Appsignal.logger.debug "Appsignal::Transaction#set_error: Error has more " \
389
+ "than #{ERROR_CAUSES_LIMIT} error causes. Only the first #{ERROR_CAUSES_LIMIT} " \
390
+ "will be reported."
391
+ root_cause_missing = true
392
+ break
393
+ end
394
+
395
+ causes << error
396
+ end
397
+
398
+ return if causes.empty?
399
+
400
+ causes_sample_data = causes.map do |e|
401
+ {
402
+ :name => e.class.name,
403
+ :message => cleaned_error_message(e)
404
+ }
405
+ end
406
+
407
+ causes_sample_data.last[:is_root_cause] = false if root_cause_missing
408
+
409
+ set_sample_data(
410
+ "error_causes",
411
+ causes_sample_data
412
+ )
377
413
  end
378
414
  alias_method :add_exception, :set_error
379
415
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "3.4.16"
4
+ VERSION = "3.5.1"
5
5
  end
@@ -71,5 +71,16 @@ describe Appsignal::CLI::Diagnose::Utils do
71
71
  is_expected.to eq(file_contents)
72
72
  end
73
73
  end
74
+
75
+ context "when reading the file raises an illegal seek error" do
76
+ let(:file_contents) { "line 1\n" }
77
+ before do
78
+ expect(File).to receive(:binread).and_raise(Errno::ESPIPE)
79
+ end
80
+
81
+ it "returns the error as the content" do
82
+ expect { subject }.to raise_error(Errno::ESPIPE)
83
+ end
84
+ end
74
85
  end
75
86
  end
@@ -1424,6 +1424,26 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
1424
1424
  )
1425
1425
  end
1426
1426
  end
1427
+
1428
+ context "when reading the file returns a illegal seek error" do
1429
+ before do
1430
+ File.write(file_path, "Some content")
1431
+ allow(File).to receive(:binread).and_call_original
1432
+ expect(File).to receive(:binread).with(file_path, anything,
1433
+ anything).and_raise(Errno::ESPIPE)
1434
+ run
1435
+ end
1436
+
1437
+ it "outputs file does not exists" do
1438
+ expect(output).to include %(Read error: Errno::ESPIPE: Illegal seek)
1439
+ end
1440
+
1441
+ it "transmits file data in report" do
1442
+ expect(received_report["paths"][filename]).to include(
1443
+ "read_error" => "Errno::ESPIPE: Illegal seek"
1444
+ )
1445
+ end
1446
+ end
1427
1447
  end
1428
1448
 
1429
1449
  describe "mkmf.log" do
@@ -788,6 +788,99 @@ describe Appsignal::Transaction do
788
788
  end
789
789
  end
790
790
 
791
+ context "when the error has no causes" do
792
+ it "should not send the causes information as sample data" do
793
+ expect(transaction.ext).to_not receive(:set_sample_data)
794
+
795
+ transaction.set_error(error)
796
+ end
797
+ end
798
+
799
+ context "when the error has multiple causes" do
800
+ let(:error) do
801
+ e = ExampleStandardError.new("test message")
802
+ e2 = RuntimeError.new("cause message")
803
+ e3 = StandardError.new("cause message 2")
804
+ allow(e).to receive(:backtrace).and_return(["line 1"])
805
+ allow(e).to receive(:cause).and_return(e2)
806
+ allow(e2).to receive(:cause).and_return(e3)
807
+ e
808
+ end
809
+
810
+ it "sends the causes information as sample data" do
811
+ expect(transaction.ext).to receive(:set_error).with(
812
+ "ExampleStandardError",
813
+ "test message",
814
+ Appsignal::Utils::Data.generate(["line 1"])
815
+ )
816
+
817
+ expect(transaction.ext).to receive(:set_sample_data).with(
818
+ "error_causes",
819
+ Appsignal::Utils::Data.generate(
820
+ [
821
+ {
822
+ :name => "RuntimeError",
823
+ :message => "cause message"
824
+ },
825
+ {
826
+ :name => "StandardError",
827
+ :message => "cause message 2"
828
+ }
829
+ ]
830
+ )
831
+ )
832
+
833
+ expect(Appsignal.logger).to_not receive(:debug)
834
+
835
+ transaction.set_error(error)
836
+ end
837
+ end
838
+
839
+ context "when the error has too many causes" do
840
+ let(:error) do
841
+ e = ExampleStandardError.new("root cause error")
842
+
843
+ 11.times do |i|
844
+ next_e = ExampleStandardError.new("wrapper error #{i}")
845
+ allow(next_e).to receive(:cause).and_return(e)
846
+ e = next_e
847
+ end
848
+
849
+ allow(e).to receive(:backtrace).and_return(["line 1"])
850
+ e
851
+ end
852
+
853
+ it "sends only the first causes as sample data" do
854
+ expect(transaction.ext).to receive(:set_error).with(
855
+ "ExampleStandardError",
856
+ "wrapper error 10",
857
+ Appsignal::Utils::Data.generate(["line 1"])
858
+ )
859
+
860
+ expected_error_causes = Array.new(10) do |i|
861
+ {
862
+ :name => "ExampleStandardError",
863
+ :message => "wrapper error #{9 - i}"
864
+ }
865
+ end
866
+
867
+ expected_error_causes.last[:is_root_cause] = false
868
+
869
+ expect(transaction.ext).to receive(:set_sample_data).with(
870
+ "error_causes",
871
+ Appsignal::Utils::Data.generate(expected_error_causes)
872
+ )
873
+
874
+ expect(Appsignal.logger).to receive(:debug).with(
875
+ "Appsignal::Transaction#set_error: Error has more " \
876
+ "than 10 error causes. Only the first 10 " \
877
+ "will be reported."
878
+ )
879
+
880
+ transaction.set_error(error)
881
+ end
882
+ end
883
+
791
884
  context "when error message is nil" do
792
885
  let(:error) do
793
886
  e = ExampleStandardError.new
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appsignal
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.16
4
+ version: 3.5.1
5
5
  platform: java
6
6
  authors:
7
7
  - Robert Beekman
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-12-01 00:00:00.000000000 Z
13
+ date: 2023-12-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -460,7 +460,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
460
460
  - !ruby/object:Gem::Version
461
461
  version: '0'
462
462
  requirements: []
463
- rubygems_version: 3.3.7
463
+ rubygems_version: 3.4.11
464
464
  signing_key:
465
465
  specification_version: 4
466
466
  summary: Logs performance and exception data from your app to appsignal.com