appsignal 4.0.8 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 05e742b53256b12c2f0f29eca8f595f2ec3208bce6fe8a20ebb8539fe05e3549
4
- data.tar.gz: d618aaef77d084971875a411754e27ae943f4e49920630701197e1f49dcdb7be
3
+ metadata.gz: 6cc06af97e89c3a76097a8b22b34db9665a967b84d6ddf39fdccfe8aaadb8adc
4
+ data.tar.gz: d00e77104454c2f28f6439a08293789edff5b8c758c5f349ac12d106953f323e
5
5
  SHA512:
6
- metadata.gz: 6e7bf5883a425d4bbd25d0d4707b6c1d668572217f91b0ca3df76faf9b8fb4d0ed7e2595c3e8e706c4dabbcb93f22a28d54d56ceaa7d9edf7568914777245827
7
- data.tar.gz: '0932d3a6c1e36236ae43d1de915605f852a7b1f56719f70ffdab9edad4db861b8471ea890c2851633765ad10d54b3de30f7c62a40497dffd6700c22f8ec815a7'
6
+ metadata.gz: 5f82c502d350b79840a9649fdb7e1dce6e7a64327b79f90b6090b950dbc0cf925486f76b24801cfd9c8c63b1b2b1926bc43914b340fe6eb9745271a3f59fe840
7
+ data.tar.gz: 14b10d0ef16f27cc312d961526d21add84c329b2213e9ff518bf4d1a29e6d44c1cd7b4dbf8e3b3e1f87c19599d61f2b944d93262faaca54c0705985d481ebc88
data/CHANGELOG.md CHANGED
@@ -1,5 +1,58 @@
1
1
  # AppSignal for Ruby gem Changelog
2
2
 
3
+ ## 4.1.0
4
+
5
+ _Published on 2024-09-26._
6
+
7
+ ### Added
8
+
9
+ - Add support for heartbeat check-ins.
10
+
11
+ Use the `Appsignal::CheckIn.heartbeat` method to send a single heartbeat check-in event from your application. This can be used, for example, in your application's main loop:
12
+
13
+ ```ruby
14
+ loop do
15
+ Appsignal::CheckIn.heartbeat("job_processor")
16
+ process_job
17
+ end
18
+ ```
19
+
20
+ Heartbeats are deduplicated and sent asynchronously, without blocking the current thread. Regardless of how often the `.heartbeat` method is called, at most one heartbeat with the same identifier will be sent every ten seconds.
21
+
22
+ Pass `continuous: true` as the second argument to send heartbeats continuously during the entire lifetime of the current process. This can be used, for example, after your application has finished its boot process:
23
+
24
+ ```ruby
25
+ def main
26
+ start_app
27
+ Appsignal::CheckIn.heartbeat("my_app", continuous: true)
28
+ end
29
+ ```
30
+
31
+ (minor [7ae7152c](https://github.com/appsignal/appsignal-ruby/commit/7ae7152cddae7c257e9d62d3bf2433cce1f4287d))
32
+ - Include the first backtrace line from error causes to show where each cause originated in the interface. (patch [496b035a](https://github.com/appsignal/appsignal-ruby/commit/496b035a3510dbb6dc47c7c59172f488ec55c986))
33
+
34
+ ## 4.0.9
35
+
36
+ _Published on 2024-09-17._
37
+
38
+ ### Changed
39
+
40
+ - Add the logger gem as a dependency. This fixes the deprecation warning on Ruby 3.3. (patch [8c1d577e](https://github.com/appsignal/appsignal-ruby/commit/8c1d577e4790185db887d49577cedc7d614d8d98))
41
+ - Do not report errors caused by `Errno::EPIPE` (broken pipe errors) when instrumenting response bodies, to avoid reporting errors that cannot be fixed by the application. (patch [1fdccba4](https://github.com/appsignal/appsignal-ruby/commit/1fdccba4ceeb8f9bb13ae077019b2c1f7d9d4fe4))
42
+ - Normalize Rack and Rails `UploadedFile` objects. Instead of displaying the Ruby class name, it will now show object details like the filename and content type.
43
+
44
+ ```
45
+ # Before
46
+ #<Rack::Multipart::UploadedFile>
47
+ #<ActionDispatch::Http::UploadedFile>
48
+
49
+ # After
50
+ #<Rack::Multipart::UploadedFile original_filename: "uploaded_file.txt", content_type: "text/plain">
51
+ #<ActionDispatch::Http::UploadedFile original_filename: "uploaded_file.txt", content_type: "text/plain">
52
+ ```
53
+
54
+ (patch [bb50c933](https://github.com/appsignal/appsignal-ruby/commit/bb50c93387eafebe043b0e7f4083c95556b93136))
55
+
3
56
  ## 4.0.8
4
57
 
5
58
  _Published on 2024-09-13._
data/appsignal.gemspec CHANGED
@@ -17,8 +17,8 @@ IGNORED_PATHS = [
17
17
  ".yardopts",
18
18
  "benchmark.rake",
19
19
  "mono.yml",
20
- "rubocop.yml",
21
- "rubocop_todo.yml"
20
+ ".rubocop.yml",
21
+ ".rubocop_todo.yml"
22
22
  ].freeze
23
23
 
24
24
  Gem::Specification.new do |gem| # rubocop:disable Metrics/BlockLength
@@ -56,6 +56,7 @@ Gem::Specification.new do |gem| # rubocop:disable Metrics/BlockLength
56
56
  "source_code_uri" => "https://github.com/appsignal/appsignal-ruby"
57
57
  }
58
58
 
59
+ gem.add_dependency "logger"
59
60
  gem.add_dependency "rack"
60
61
 
61
62
  gem.add_development_dependency "pry"
@@ -22,13 +22,11 @@ module Appsignal
22
22
  private
23
23
 
24
24
  def event(kind)
25
- {
25
+ Event.cron(
26
26
  :identifier => @identifier,
27
27
  :digest => @digest,
28
- :kind => kind,
29
- :timestamp => Time.now.utc.to_i,
30
- :check_in_type => "cron"
31
- }
28
+ :kind => kind
29
+ )
32
30
  end
33
31
  end
34
32
  end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appsignal
4
+ module CheckIn
5
+ # @api private
6
+ class Event
7
+ class << self
8
+ def new(check_in_type:, identifier:, digest: nil, kind: nil)
9
+ {
10
+ :identifier => identifier,
11
+ :digest => digest,
12
+ :kind => kind,
13
+ :timestamp => Time.now.utc.to_i,
14
+ :check_in_type => check_in_type
15
+ }.compact
16
+ end
17
+
18
+ def cron(identifier:, digest:, kind:)
19
+ new(
20
+ :check_in_type => "cron",
21
+ :identifier => identifier,
22
+ :digest => digest,
23
+ :kind => kind
24
+ )
25
+ end
26
+
27
+ def heartbeat(identifier:)
28
+ new(
29
+ :check_in_type => "heartbeat",
30
+ :identifier => identifier
31
+ )
32
+ end
33
+
34
+ def redundant?(event, other)
35
+ return false if
36
+ other[:check_in_type] != event[:check_in_type] ||
37
+ other[:identifier] != event[:identifier]
38
+
39
+ return false if event[:check_in_type] == "cron" && (
40
+ other[:digest] != event[:digest] ||
41
+ other[:kind] != event[:kind]
42
+ )
43
+
44
+ return false if
45
+ event[:check_in_type] != "cron" &&
46
+ event[:check_in_type] != "heartbeat"
47
+
48
+ true
49
+ end
50
+
51
+ def describe(events)
52
+ if events.empty?
53
+ # This shouldn't happen.
54
+ "no check-in events"
55
+ elsif events.length > 1
56
+ "#{events.length} check-in events"
57
+ else
58
+ event = events.first
59
+ if event[:check_in_type] == "cron"
60
+ "cron check-in `#{event[:identifier] || "unknown"}` " \
61
+ "#{event[:kind] || "unknown"} event (digest #{event[:digest] || "unknown"})"
62
+ elsif event[:check_in_type] == "heartbeat"
63
+ "heartbeat check-in `#{event[:identifier] || "unknown"}` event"
64
+ else
65
+ "unknown check-in event"
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -29,7 +29,7 @@ module Appsignal
29
29
  def schedule(event)
30
30
  unless Appsignal.active?
31
31
  Appsignal.internal_logger.debug(
32
- "Cannot transmit #{describe([event])}: AppSignal is not active"
32
+ "Cannot transmit #{Event.describe([event])}: AppSignal is not active"
33
33
  )
34
34
  return
35
35
  end
@@ -37,7 +37,7 @@ module Appsignal
37
37
  @mutex.synchronize do
38
38
  if @queue.closed?
39
39
  Appsignal.internal_logger.debug(
40
- "Cannot transmit #{describe([event])}: AppSignal is stopped"
40
+ "Cannot transmit #{Event.describe([event])}: AppSignal is stopped"
41
41
  )
42
42
  return
43
43
  end
@@ -48,7 +48,7 @@ module Appsignal
48
48
  start_waker(INITIAL_DEBOUNCE_SECONDS) if @waker.nil?
49
49
 
50
50
  Appsignal.internal_logger.debug(
51
- "Scheduling #{describe([event])} to be transmitted"
51
+ "Scheduling #{Event.describe([event])} to be transmitted"
52
52
  )
53
53
 
54
54
  # Make sure to start the thread after an event has been added.
@@ -92,7 +92,7 @@ module Appsignal
92
92
  end
93
93
 
94
94
  def transmit(events)
95
- description = describe(events)
95
+ description = Event.describe(events)
96
96
 
97
97
  begin
98
98
  response = CheckIn.transmitter.transmit(events, :format => :ndjson)
@@ -110,42 +110,18 @@ module Appsignal
110
110
  end
111
111
  end
112
112
 
113
- def describe(events)
114
- if events.empty?
115
- # This shouldn't happen.
116
- "no check-in events"
117
- elsif events.length > 1
118
- "#{events.length} check-in events"
119
- else
120
- event = events.first
121
- if event[:check_in_type] == "cron"
122
- "cron check-in `#{event[:identifier] || "unknown"}` " \
123
- "#{event[:kind] || "unknown"} event (digest #{event[:digest] || "unknown"})" \
124
- else
125
- "unknown check-in event"
126
- end
127
- end
128
- end
129
-
130
113
  # Must be called from within a `@mutex.synchronize` block.
131
114
  def add_event(event)
132
115
  # Remove redundant events, keeping the newly added one, which
133
116
  # should be the one with the most recent timestamp.
134
- if event[:check_in_type] == "cron"
135
- # Remove any existing cron check-in event with the same identifier,
136
- # digest and kind as the one we're adding.
137
- @events.reject! do |existing_event|
138
- next unless existing_event[:identifier] == event[:identifier] &&
139
- existing_event[:digest] == event[:digest] &&
140
- existing_event[:kind] == event[:kind] &&
141
- existing_event[:check_in_type] == "cron"
117
+ @events.reject! do |existing_event|
118
+ next unless Event.redundant?(event, existing_event)
142
119
 
143
- Appsignal.internal_logger.debug(
144
- "Replacing previously scheduled #{describe([existing_event])}"
145
- )
120
+ Appsignal.internal_logger.debug(
121
+ "Replacing previously scheduled #{Event.describe([existing_event])}"
122
+ )
146
123
 
147
- true
148
- end
124
+ true
149
125
  end
150
126
 
151
127
  @events << event
@@ -2,10 +2,21 @@
2
2
 
3
3
  module Appsignal
4
4
  module CheckIn
5
+ HEARTBEAT_CONTINUOUS_INTERVAL_SECONDS = 30
5
6
  class << self
7
+ # @api private
8
+ def continuous_heartbeats
9
+ @continuous_heartbeats ||= []
10
+ end
11
+
12
+ # @api private
13
+ def kill_continuous_heartbeats
14
+ continuous_heartbeats.each(&:kill)
15
+ end
16
+
6
17
  # Track cron check-ins.
7
18
  #
8
- # Track the execution of certain processes by sending a cron check-in.
19
+ # Track the execution of scheduled processes by sending a cron check-in.
9
20
  #
10
21
  # To track the duration of a piece of code, pass a block to {.cron}
11
22
  # to report both when the process starts, and when it finishes.
@@ -40,6 +51,37 @@ module Appsignal
40
51
  output
41
52
  end
42
53
 
54
+ # Track heartbeat check-ins.
55
+ #
56
+ # Track the execution of long-lived processes by sending a heartbeat
57
+ # check-in.
58
+ #
59
+ # @example Send a heartbeat check-in
60
+ # Appsignal::CheckIn.heartbeat("main_loop")
61
+ #
62
+ # @param identifier [String] identifier of the heartbeat check-in to report.
63
+ # @param continuous [Boolean] whether the heartbeats should be sent continuously
64
+ # during the lifetime of the process. Defaults to `false`.
65
+ # @yield the block to monitor.
66
+ # @return [void]
67
+ # @since 4.1.0
68
+ # @see https://docs.appsignal.com/check-ins/heartbeat
69
+ def heartbeat(identifier, continuous: false)
70
+ if continuous
71
+ continuous_heartbeats << Thread.new do
72
+ loop do
73
+ heartbeat(identifier)
74
+ sleep HEARTBEAT_CONTINUOUS_INTERVAL_SECONDS
75
+ end
76
+ end
77
+
78
+ return
79
+ end
80
+
81
+ event = Event.heartbeat(:identifier => identifier)
82
+ scheduler.schedule(event)
83
+ end
84
+
43
85
  # @api private
44
86
  def transmitter
45
87
  @transmitter ||= Transmitter.new(
@@ -60,5 +102,6 @@ module Appsignal
60
102
  end
61
103
  end
62
104
 
105
+ require "appsignal/check_in/event"
63
106
  require "appsignal/check_in/scheduler"
64
107
  require "appsignal/check_in/cron"
@@ -54,7 +54,7 @@ module Appsignal
54
54
  rescue *IGNORED_ERRORS # Do not report
55
55
  raise
56
56
  rescue Exception => error # rubocop:disable Lint/RescueException
57
- @transaction.set_error(error)
57
+ appsignal_report_error(error)
58
58
  raise error
59
59
  end
60
60
 
@@ -72,6 +72,19 @@ module Appsignal
72
72
  @body.__send__(method_name, *args, &block)
73
73
  end
74
74
  ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
75
+
76
+ private
77
+
78
+ def appsignal_report_error(error)
79
+ @transaction.set_error(error) if appsignal_accepted_error?(error)
80
+ end
81
+
82
+ def appsignal_accepted_error?(error)
83
+ return true unless error.cause
84
+ return false if IGNORED_ERRORS.include?(error.cause.class)
85
+
86
+ appsignal_accepted_error?(error.cause)
87
+ end
75
88
  end
76
89
 
77
90
  # The standard Rack body wrapper which exposes "each" for iterating
@@ -97,7 +110,7 @@ module Appsignal
97
110
  rescue *IGNORED_ERRORS # Do not report
98
111
  raise
99
112
  rescue Exception => error # rubocop:disable Lint/RescueException
100
- @transaction.set_error(error)
113
+ appsignal_report_error(error)
101
114
  raise error
102
115
  end
103
116
  end
@@ -118,7 +131,7 @@ module Appsignal
118
131
  rescue *IGNORED_ERRORS # Do not report
119
132
  raise
120
133
  rescue Exception => error # rubocop:disable Lint/RescueException
121
- @transaction.set_error(error)
134
+ appsignal_report_error(error)
122
135
  raise error
123
136
  end
124
137
  end
@@ -144,7 +157,7 @@ module Appsignal
144
157
  rescue *IGNORED_ERRORS # Do not report
145
158
  raise
146
159
  rescue Exception => error # rubocop:disable Lint/RescueException
147
- @transaction.set_error(error)
160
+ appsignal_report_error(error)
148
161
  raise error
149
162
  end
150
163
  end
@@ -162,7 +175,7 @@ module Appsignal
162
175
  rescue *IGNORED_ERRORS # Do not report
163
176
  raise
164
177
  rescue Exception => error # rubocop:disable Lint/RescueException
165
- @transaction.set_error(error)
178
+ appsignal_report_error(error)
166
179
  raise error
167
180
  end
168
181
  end
@@ -627,7 +627,8 @@ module Appsignal
627
627
  causes_sample_data = causes.map do |e|
628
628
  {
629
629
  :name => e.class.name,
630
- :message => cleaned_error_message(e)
630
+ :message => cleaned_error_message(e),
631
+ :first_line => first_formatted_backtrace_line(e)
631
632
  }
632
633
  end
633
634
 
@@ -639,6 +640,36 @@ module Appsignal
639
640
  )
640
641
  end
641
642
 
643
+ BACKTRACE_REGEX =
644
+ %r{(?<gem>[\w-]+ \(.+\) )?(?<path>:?/?\w+?.+?):(?<line>:?\d+)(?<group>:in `(?<method>.+)')?$}.freeze # rubocop:disable Layout/LineLength
645
+
646
+ def first_formatted_backtrace_line(error)
647
+ backtrace = cleaned_backtrace(error.backtrace)
648
+ first_line = backtrace&.first
649
+ return unless first_line
650
+
651
+ captures = BACKTRACE_REGEX.match(first_line)
652
+ return unless captures
653
+
654
+ captures.named_captures
655
+ .merge("original" => first_line)
656
+ .tap do |c|
657
+ config = Appsignal.config
658
+ c.delete("group") # Unused key, only for easier matching
659
+ # Strip of whitespace at the end of the gem name
660
+ c["gem"] = c["gem"]&.strip
661
+ # Strip the app path from the path if present
662
+ root_path = config.root_path
663
+ if c["path"].start_with?(root_path)
664
+ c["path"].delete_prefix!(root_path)
665
+ # Relative paths shouldn't start with a slash
666
+ c["path"].delete_prefix!("/")
667
+ end
668
+ # Add revision for linking to the repository from the UI
669
+ c["revision"] = config[:revision]
670
+ end
671
+ end
672
+
642
673
  def set_sample_data(key, data)
643
674
  return unless key && data
644
675
 
@@ -707,7 +738,7 @@ module Appsignal
707
738
  return unless Appsignal.config[:send_params]
708
739
 
709
740
  filter_keys = Appsignal.config[:filter_parameters] || []
710
- Appsignal::Utils::HashSanitizer.sanitize params, filter_keys
741
+ Appsignal::Utils::SampleDataSanitizer.sanitize(params, filter_keys)
711
742
  end
712
743
 
713
744
  def session_data
@@ -720,7 +751,8 @@ module Appsignal
720
751
 
721
752
  # Returns sanitized session data.
722
753
  #
723
- # The session data is sanitized by the {Appsignal::Utils::HashSanitizer}.
754
+ # The session data is sanitized by the
755
+ # {Appsignal::Utils::SampleDataSanitizer}.
724
756
  #
725
757
  # @return [nil] if `:send_session_data` config is set to `false`.
726
758
  # @return [nil] if the {#request} object doesn't respond to `#session`.
@@ -729,8 +761,9 @@ module Appsignal
729
761
  def sanitized_session_data
730
762
  return unless Appsignal.config[:send_session_data]
731
763
 
732
- Appsignal::Utils::HashSanitizer.sanitize(
733
- session_data, Appsignal.config[:filter_session_data]
764
+ Appsignal::Utils::SampleDataSanitizer.sanitize(
765
+ session_data,
766
+ Appsignal.config[:filter_session_data]
734
767
  )
735
768
  end
736
769
 
@@ -25,7 +25,7 @@ module Appsignal
25
25
  # An Integer too big for C-lang longs to fit
26
26
  bigint = 1 << 63
27
27
  if value >= bigint
28
- map.set_string(key, "bigint:#{value}")
28
+ map.set_string(key, map_bigint(value))
29
29
  else
30
30
  map.set_integer(key, value)
31
31
  end
@@ -56,7 +56,7 @@ module Appsignal
56
56
  # An Integer too big for C-lang longs to fit
57
57
  bigint = 1 << 63
58
58
  if value >= bigint
59
- array.append_string("bigint:#{value}")
59
+ array.append_string(map_bigint(value))
60
60
  else
61
61
  array.append_integer(value)
62
62
  end
@@ -76,6 +76,10 @@ module Appsignal
76
76
  end
77
77
  array
78
78
  end
79
+
80
+ def map_bigint(value)
81
+ "bigint:#{value}"
82
+ end
79
83
  end
80
84
  end
81
85
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Appsignal
4
4
  module Utils
5
- class HashSanitizer
5
+ class SampleDataSanitizer
6
6
  FILTERED = "[FILTERED]"
7
7
  RECURSIVE = "[RECURSIVE VALUE]"
8
8
 
@@ -26,7 +26,21 @@ module Appsignal
26
26
  when Date
27
27
  "#<Date: #{value.iso8601}>"
28
28
  else
29
- inspected(value)
29
+ if defined?(::Rack::Multipart::UploadedFile) &&
30
+ value.is_a?(::Rack::Multipart::UploadedFile)
31
+ "#<Rack::Multipart::UploadedFile " \
32
+ "original_filename: #{value.original_filename.inspect}, " \
33
+ "content_type: #{value.content_type.inspect}" \
34
+ ">"
35
+ elsif defined?(::ActionDispatch::Http::UploadedFile) &&
36
+ value.is_a?(::ActionDispatch::Http::UploadedFile)
37
+ "#<ActionDispatch::Http::UploadedFile " \
38
+ "original_filename: #{value.original_filename.inspect}, " \
39
+ "content_type: #{value.content_type.inspect}" \
40
+ ">"
41
+ else
42
+ inspected(value)
43
+ end
30
44
  end
31
45
  end
32
46
 
@@ -9,7 +9,7 @@ end
9
9
  require "appsignal/utils/integration_memory_logger"
10
10
  require "appsignal/utils/stdout_and_logger_message"
11
11
  require "appsignal/utils/data"
12
- require "appsignal/utils/hash_sanitizer"
12
+ require "appsignal/utils/sample_data_sanitizer"
13
13
  require "appsignal/utils/integration_logger"
14
14
  require "appsignal/utils/json"
15
15
  require "appsignal/utils/ndjson"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "4.0.8"
4
+ VERSION = "4.1.0"
5
5
  end
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: 4.0.8
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Beekman
@@ -10,8 +10,22 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-09-13 00:00:00.000000000 Z
13
+ date: 2024-09-26 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: logger
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
15
29
  - !ruby/object:Gem::Dependency
16
30
  name: rack
17
31
  requirement: !ruby/object:Gem::Requirement
@@ -133,8 +147,6 @@ extensions:
133
147
  - ext/extconf.rb
134
148
  extra_rdoc_files: []
135
149
  files:
136
- - ".rubocop.yml"
137
- - ".rubocop_todo.yml"
138
150
  - CHANGELOG.md
139
151
  - CODE_OF_CONDUCT.md
140
152
  - Gemfile
@@ -155,6 +167,7 @@ files:
155
167
  - lib/appsignal/capistrano.rb
156
168
  - lib/appsignal/check_in.rb
157
169
  - lib/appsignal/check_in/cron.rb
170
+ - lib/appsignal/check_in/event.rb
158
171
  - lib/appsignal/check_in/scheduler.rb
159
172
  - lib/appsignal/cli.rb
160
173
  - lib/appsignal/cli/demo.rb
@@ -260,13 +273,13 @@ files:
260
273
  - lib/appsignal/transmitter.rb
261
274
  - lib/appsignal/utils.rb
262
275
  - lib/appsignal/utils/data.rb
263
- - lib/appsignal/utils/hash_sanitizer.rb
264
276
  - lib/appsignal/utils/integration_logger.rb
265
277
  - lib/appsignal/utils/integration_memory_logger.rb
266
278
  - lib/appsignal/utils/json.rb
267
279
  - lib/appsignal/utils/ndjson.rb
268
280
  - lib/appsignal/utils/query_params_sanitizer.rb
269
281
  - lib/appsignal/utils/rails_helper.rb
282
+ - lib/appsignal/utils/sample_data_sanitizer.rb
270
283
  - lib/appsignal/utils/stdout_and_logger_message.rb
271
284
  - lib/appsignal/version.rb
272
285
  - lib/puma/plugin/appsignal.rb
@@ -299,7 +312,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
299
312
  - !ruby/object:Gem::Version
300
313
  version: '0'
301
314
  requirements: []
302
- rubygems_version: 3.5.14
315
+ rubygems_version: 3.3.7
303
316
  signing_key:
304
317
  specification_version: 4
305
318
  summary: Logs performance and exception data from your app to appsignal.com
data/.rubocop.yml DELETED
@@ -1,133 +0,0 @@
1
- inherit_from: .rubocop_todo.yml
2
-
3
- AllCops:
4
- TargetRubyVersion: 2.7
5
- NewCops: enable
6
- Include:
7
- - "**/*.rb"
8
- - "**/*.cap"
9
- - "**/*.rake"
10
- - "**/Gemfile"
11
- - "**/Rakefile"
12
- - "appsignal.gemspec"
13
- Exclude:
14
- - "pkg/**/*"
15
- - "tmp/**/*"
16
- - "vendor/**/*"
17
- - "spec/integration/diagnose/**/*"
18
- DisplayCopNames: true
19
- UseCache: true
20
- CacheRootDirectory: ./tmp
21
-
22
- Style/RescueStandardError:
23
- Enabled: false
24
-
25
- Style/Documentation:
26
- Enabled: false
27
-
28
- Style/StringLiterals:
29
- EnforcedStyle: double_quotes
30
-
31
- Style/StringLiteralsInInterpolation:
32
- EnforcedStyle: double_quotes
33
-
34
- Style/HashSyntax:
35
- EnforcedStyle: hash_rockets
36
-
37
- Style/EmptyMethod:
38
- EnforcedStyle: expanded
39
-
40
- Style/MissingRespondToMissing:
41
- Exclude:
42
- - "lib/appsignal/extension.rb"
43
- - "lib/appsignal/transaction.rb"
44
-
45
- Style/TrailingUnderscoreVariable:
46
- Enabled: false
47
-
48
- Style/Lambda:
49
- EnforcedStyle: lambda
50
-
51
- Style/WordArray:
52
- Enabled: false
53
-
54
- Style/FrozenStringLiteralComment:
55
- Enabled: true
56
- Exclude:
57
- - "spec/**/*.rb"
58
-
59
- Style/NumericPredicate:
60
- Enabled: false
61
-
62
- Style/SymbolArray:
63
- EnforcedStyle: brackets
64
-
65
- Style/RedundantConstantBase:
66
- Enabled: false
67
-
68
- Lint/ConstantDefinitionInBlock:
69
- Exclude:
70
- - "spec/**/*.rb"
71
-
72
- Lint/EmptyClass:
73
- Exclude:
74
- - "spec/**/*.rb"
75
-
76
- Lint/EmptyFile:
77
- Exclude:
78
- - "spec/**/*.rb"
79
-
80
- Layout/HashAlignment:
81
- EnforcedLastArgumentHashStyle: ignore_implicit
82
-
83
- Layout/ArgumentAlignment:
84
- EnforcedStyle: with_fixed_indentation
85
-
86
- Layout/LineContinuationLeadingSpace:
87
- Enabled: false
88
-
89
- Layout/FirstArrayElementIndentation:
90
- EnforcedStyle: consistent
91
-
92
- Layout/LineEndStringConcatenationIndentation:
93
- EnforcedStyle: indented
94
-
95
- Layout/ParameterAlignment:
96
- EnforcedStyle: with_fixed_indentation
97
-
98
- Layout/MultilineMethodCallIndentation:
99
- EnforcedStyle: indented
100
-
101
- Layout/MultilineOperationIndentation:
102
- EnforcedStyle: indented
103
-
104
- Layout/LineLength:
105
- Max: 100
106
-
107
- Naming/FileName:
108
- Exclude:
109
- - "ext/Rakefile"
110
-
111
- Naming/AccessorMethodName:
112
- Exclude:
113
- - "lib/appsignal/helpers/instrumentation.rb"
114
- - "lib/appsignal/transaction.rb"
115
-
116
- Naming/RescuedExceptionsVariableName:
117
- Enabled: false
118
-
119
- Naming/VariableNumber:
120
- Enabled: false
121
-
122
- Metrics/ModuleLength:
123
- Enabled: false
124
-
125
- Metrics/ClassLength:
126
- Enabled: false
127
-
128
- Metrics/BlockLength:
129
- Exclude:
130
- - "Rakefile"
131
-
132
- Gemspec/DevelopmentDependencies:
133
- Enabled: false
data/.rubocop_todo.yml DELETED
@@ -1,84 +0,0 @@
1
- # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2024-06-27 09:42:06 UTC using RuboCop version 1.64.1.
4
- # The point is for the user to remove these configuration records
5
- # one by one as the offenses are removed from the code base.
6
- # Note that changes in the inspected code, or installation of new
7
- # versions of RuboCop, may require this file to be generated again.
8
-
9
- # Offense count: 2
10
- # Configuration parameters: AllowedParentClasses.
11
- Lint/MissingSuper:
12
- Exclude:
13
- - 'lib/appsignal/extension.rb'
14
- - 'lib/appsignal/logger.rb'
15
-
16
- # Offense count: 1
17
- Lint/StructNewOverride:
18
- Exclude:
19
- - 'spec/lib/appsignal/probes/sidekiq_spec.rb'
20
-
21
- # Offense count: 63
22
- # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
23
- Metrics/AbcSize:
24
- Max: 44
25
-
26
- # Offense count: 6
27
- # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
28
- # AllowedMethods: refine
29
- Metrics/BlockLength:
30
- Max: 31
31
-
32
- # Offense count: 21
33
- # Configuration parameters: AllowedMethods, AllowedPatterns.
34
- Metrics/CyclomaticComplexity:
35
- Max: 11
36
-
37
- # Offense count: 139
38
- # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
39
- Metrics/MethodLength:
40
- Max: 56
41
-
42
- # Offense count: 18
43
- # Configuration parameters: AllowedMethods, AllowedPatterns.
44
- Metrics/PerceivedComplexity:
45
- Max: 13
46
-
47
- # Offense count: 2
48
- Security/Open:
49
- Exclude:
50
- - 'ext/base.rb'
51
-
52
- # Offense count: 2
53
- # This cop supports unsafe autocorrection (--autocorrect-all).
54
- Security/YAMLLoad:
55
- Exclude:
56
- - 'lib/appsignal/config.rb'
57
- - 'lib/appsignal/integrations/sidekiq.rb'
58
-
59
- # Offense count: 7
60
- # This cop supports safe autocorrection (--autocorrect).
61
- # Configuration parameters: EnforcedStyle.
62
- # SupportedStyles: prefer_alias, prefer_alias_method
63
- Style/Alias:
64
- Exclude:
65
- - 'lib/appsignal/helpers/instrumentation.rb'
66
- - 'lib/appsignal/transaction.rb'
67
-
68
- # Offense count: 1
69
- Style/ClassVars:
70
- Exclude:
71
- - 'spec/lib/appsignal/event_formatter_spec.rb'
72
-
73
- # Offense count: 1
74
- Style/OpenStructUse:
75
- Exclude:
76
- - 'lib/appsignal/cli/install.rb'
77
-
78
- # Offense count: 2
79
- # Configuration parameters: AllowedMethods.
80
- # AllowedMethods: respond_to_missing?
81
- Style/OptionalBooleanParameter:
82
- Exclude:
83
- - 'lib/appsignal/integrations/delayed_job_plugin.rb'
84
- - 'lib/appsignal/utils/query_params_sanitizer.rb'