sentry-rails 5.10.0 → 5.14.0
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/.gitignore +1 -1
- data/Gemfile +18 -7
- data/README.md +1 -1
- data/lib/sentry/rails/action_cable.rb +1 -4
- data/lib/sentry/rails/breadcrumb/active_support_logger.rb +4 -64
- data/lib/sentry/rails/capture_exceptions.rb +1 -4
- data/lib/sentry/rails/configuration.rb +72 -1
- data/lib/sentry/rails/railtie.rb +1 -1
- data/lib/sentry/rails/tracing/active_record_subscriber.rb +26 -1
- data/lib/sentry/rails/version.rb +1 -1
- data/sentry-rails.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a6aa240a1333c8d01ce8db9c622057faec2e4879b39b9a209a9156e4e5eb37a
|
4
|
+
data.tar.gz: bb73a1d4d80a2438a497907e7c7fb32bc321f35b232be1324767febb1c4885f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e64aeb3142b11c51aabe1f7fa75f0a89e8b3e908e38b34be43704dba2f3288eb132fd0860f944e218a393b9cc6b1cb10c0ec63af4d1224f5030075ba9b749855
|
7
|
+
data.tar.gz: dfb5c2f71936de177e980b1bb6adb53de739a8cc19f1ae0d6c2dcba2463c703d6c86ecdeb89781c9df448c86a47b25e74c38e01cc91fc0e4cedbeba57fa95ebd
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -11,7 +11,7 @@ platform :jruby do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
rails_version = ENV["RAILS_VERSION"]
|
14
|
-
rails_version = "7.
|
14
|
+
rails_version = "7.1.0" if rails_version.nil?
|
15
15
|
rails_version = Gem::Version.new(rails_version)
|
16
16
|
|
17
17
|
if rails_version < Gem::Version.new("6.0.0")
|
@@ -20,10 +20,13 @@ else
|
|
20
20
|
gem "sqlite3", platform: :ruby
|
21
21
|
end
|
22
22
|
|
23
|
-
if rails_version
|
23
|
+
if rails_version >= Gem::Version.new("7.2.0.alpha")
|
24
24
|
gem "rails", github: "rails/rails"
|
25
|
+
elsif rails_version >= Gem::Version.new("7.1.0")
|
26
|
+
gem "rails", "~> #{rails_version}"
|
25
27
|
else
|
26
28
|
gem "rails", "~> #{rails_version}"
|
29
|
+
gem "psych", "~> 3.0.0"
|
27
30
|
end
|
28
31
|
|
29
32
|
gem "mini_magick"
|
@@ -39,17 +42,25 @@ gem 'simplecov'
|
|
39
42
|
gem "simplecov-cobertura", "~> 1.4"
|
40
43
|
gem "rexml"
|
41
44
|
|
42
|
-
|
43
|
-
# loofah changed the required ruby version in a patch so we need to explicitly pin it
|
44
|
-
gem "loofah", "2.20.0" if RUBY_VERSION.to_f < 2.5
|
45
|
+
ruby_version = Gem::Version.new(RUBY_VERSION)
|
45
46
|
|
46
|
-
|
47
|
+
if ruby_version < Gem::Version.new("2.5.0")
|
48
|
+
# https://github.com/flavorjones/loofah/pull/267
|
49
|
+
# loofah changed the required ruby version in a patch so we need to explicitly pin it
|
50
|
+
gem "loofah", "2.20.0"
|
51
|
+
end
|
47
52
|
|
48
|
-
if
|
53
|
+
if ruby_version >= Gem::Version.new("2.6.0")
|
49
54
|
gem "debug", github: "ruby/debug", platform: :ruby
|
50
55
|
gem "irb"
|
56
|
+
|
57
|
+
if ruby_version >= Gem::Version.new("3.0.0")
|
58
|
+
gem "ruby-lsp-rspec"
|
59
|
+
end
|
51
60
|
end
|
52
61
|
|
62
|
+
gem "rake", "~> 12.0"
|
63
|
+
|
53
64
|
gem "pry"
|
54
65
|
|
55
66
|
gem "benchmark-ips"
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
|
13
13
|
[](https://rubygems.org/gems/sentry-rails)
|
14
|
-

|
15
15
|
[](https://codecov.io/gh/getsentry/sentry-ruby/branch/master)
|
16
16
|
[](https://rubygems.org/gems/sentry-rails/)
|
17
17
|
[](https://dependabot.com/compatibility-score.html?dependency-name=sentry-rails&package-manager=bundler&version-scheme=semver)
|
@@ -33,11 +33,8 @@ module Sentry
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def start_transaction(env, scope)
|
36
|
-
sentry_trace = env["HTTP_SENTRY_TRACE"]
|
37
|
-
baggage = env["HTTP_BAGGAGE"]
|
38
|
-
|
39
36
|
options = { name: scope.transaction_name, source: scope.transaction_source, op: OP_NAME }
|
40
|
-
transaction = Sentry
|
37
|
+
transaction = Sentry.continue_trace(env, **options)
|
41
38
|
Sentry.start_transaction(transaction: transaction, **options)
|
42
39
|
end
|
43
40
|
|
@@ -2,75 +2,13 @@ module Sentry
|
|
2
2
|
module Rails
|
3
3
|
module Breadcrumb
|
4
4
|
module ActiveSupportLogger
|
5
|
-
ALLOWED_LIST = {
|
6
|
-
# action_controller
|
7
|
-
"write_fragment.action_controller" => %i[key],
|
8
|
-
"read_fragment.action_controller" => %i[key],
|
9
|
-
"exist_fragment?.action_controller" => %i[key],
|
10
|
-
"expire_fragment.action_controller" => %i[key],
|
11
|
-
"start_processing.action_controller" => %i[controller action params format method path],
|
12
|
-
"process_action.action_controller" => %i[controller action params format method path status view_runtime db_runtime],
|
13
|
-
"send_file.action_controller" => %i[path],
|
14
|
-
"redirect_to.action_controller" => %i[status location],
|
15
|
-
"halted_callback.action_controller" => %i[filter],
|
16
|
-
# action_dispatch
|
17
|
-
"process_middleware.action_dispatch" => %i[middleware],
|
18
|
-
# action_view
|
19
|
-
"render_template.action_view" => %i[identifier layout],
|
20
|
-
"render_partial.action_view" => %i[identifier],
|
21
|
-
"render_collection.action_view" => %i[identifier count cache_hits],
|
22
|
-
"render_layout.action_view" => %i[identifier],
|
23
|
-
# active_record
|
24
|
-
"sql.active_record" => %i[sql name statement_name cached],
|
25
|
-
"instantiation.active_record" => %i[record_count class_name],
|
26
|
-
# action_mailer
|
27
|
-
# not including to, from, or subject..etc. because of PII concern
|
28
|
-
"deliver.action_mailer" => %i[mailer date perform_deliveries],
|
29
|
-
"process.action_mailer" => %i[mailer action params],
|
30
|
-
# active_support
|
31
|
-
"cache_read.active_support" => %i[key store hit],
|
32
|
-
"cache_generate.active_support" => %i[key store],
|
33
|
-
"cache_fetch_hit.active_support" => %i[key store],
|
34
|
-
"cache_write.active_support" => %i[key store],
|
35
|
-
"cache_delete.active_support" => %i[key store],
|
36
|
-
"cache_exist?.active_support" => %i[key store],
|
37
|
-
# active_job
|
38
|
-
"enqueue_at.active_job" => %i[],
|
39
|
-
"enqueue.active_job" => %i[],
|
40
|
-
"enqueue_retry.active_job" => %i[],
|
41
|
-
"perform_start.active_job" => %i[],
|
42
|
-
"perform.active_job" => %i[],
|
43
|
-
"retry_stopped.active_job" => %i[],
|
44
|
-
"discard.active_job" => %i[],
|
45
|
-
# action_cable
|
46
|
-
"perform_action.action_cable" => %i[channel_class action],
|
47
|
-
"transmit.action_cable" => %i[channel_class],
|
48
|
-
"transmit_subscription_confirmation.action_cable" => %i[channel_class],
|
49
|
-
"transmit_subscription_rejection.action_cable" => %i[channel_class],
|
50
|
-
"broadcast.action_cable" => %i[broadcasting],
|
51
|
-
# active_storage
|
52
|
-
"service_upload.active_storage" => %i[service key checksum],
|
53
|
-
"service_streaming_download.active_storage" => %i[service key],
|
54
|
-
"service_download_chunk.active_storage" => %i[service key],
|
55
|
-
"service_download.active_storage" => %i[service key],
|
56
|
-
"service_delete.active_storage" => %i[service key],
|
57
|
-
"service_delete_prefixed.active_storage" => %i[service prefix],
|
58
|
-
"service_exist.active_storage" => %i[service key exist],
|
59
|
-
"service_url.active_storage" => %i[service key url],
|
60
|
-
"service_update_metadata.active_storage" => %i[service key],
|
61
|
-
"preview.active_storage" => %i[key],
|
62
|
-
"analyze.active_storage" => %i[analyzer],
|
63
|
-
}.freeze
|
64
|
-
|
65
5
|
class << self
|
66
6
|
def add(name, started, _finished, _unique_id, data)
|
67
7
|
# skip Rails' internal events
|
68
8
|
return if name.start_with?("!")
|
69
9
|
|
70
|
-
allowed_keys = ALLOWED_LIST[name]
|
71
|
-
|
72
10
|
if data.is_a?(Hash)
|
73
|
-
data = data.slice(
|
11
|
+
data = data.slice(*@allowed_keys[name])
|
74
12
|
end
|
75
13
|
|
76
14
|
crumb = Sentry::Breadcrumb.new(
|
@@ -81,7 +19,9 @@ module Sentry
|
|
81
19
|
Sentry.add_breadcrumb(crumb)
|
82
20
|
end
|
83
21
|
|
84
|
-
def inject
|
22
|
+
def inject(allowed_keys)
|
23
|
+
@allowed_keys = allowed_keys
|
24
|
+
|
85
25
|
@subscriber = ::ActiveSupport::Notifications.subscribe(/.*/) do |name, started, finished, unique_id, data|
|
86
26
|
# we only record events that has a started timestamp
|
87
27
|
if started.is_a?(Time)
|
@@ -32,16 +32,13 @@ module Sentry
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def start_transaction(env, scope)
|
35
|
-
sentry_trace = env["HTTP_SENTRY_TRACE"]
|
36
|
-
baggage = env["HTTP_BAGGAGE"]
|
37
|
-
|
38
35
|
options = { name: scope.transaction_name, source: scope.transaction_source, op: transaction_op }
|
39
36
|
|
40
37
|
if @assets_regexp && scope.transaction_name.match?(@assets_regexp)
|
41
38
|
options.merge!(sampled: false)
|
42
39
|
end
|
43
40
|
|
44
|
-
transaction = Sentry
|
41
|
+
transaction = Sentry.continue_trace(env, **options)
|
45
42
|
Sentry.start_transaction(transaction: transaction, custom_sampling_context: { env: env }, **options)
|
46
43
|
end
|
47
44
|
|
@@ -12,7 +12,12 @@ module Sentry
|
|
12
12
|
@excluded_exceptions = @excluded_exceptions.concat(Sentry::Rails::IGNORE_DEFAULT)
|
13
13
|
|
14
14
|
if ::Rails.logger
|
15
|
-
|
15
|
+
if defined?(::ActiveSupport::BroadcastLogger) && ::Rails.logger.is_a?(::ActiveSupport::BroadcastLogger)
|
16
|
+
dupped_broadcasts = ::Rails.logger.broadcasts.map(&:dup)
|
17
|
+
@logger = ::ActiveSupport::BroadcastLogger.new(*dupped_broadcasts)
|
18
|
+
else
|
19
|
+
@logger = ::Rails.logger.dup
|
20
|
+
end
|
16
21
|
else
|
17
22
|
@logger.warn(Sentry::LOGGER_PROGNAME) do
|
18
23
|
<<~MSG
|
@@ -41,6 +46,67 @@ module Sentry
|
|
41
46
|
'ActionDispatch::Http::Parameters::ParseError',
|
42
47
|
'ActiveRecord::RecordNotFound'
|
43
48
|
].freeze
|
49
|
+
|
50
|
+
ACTIVE_SUPPORT_LOGGER_SUBSCRIPTION_ITEMS_DEFAULT = {
|
51
|
+
# action_controller
|
52
|
+
"write_fragment.action_controller" => %i[key],
|
53
|
+
"read_fragment.action_controller" => %i[key],
|
54
|
+
"exist_fragment?.action_controller" => %i[key],
|
55
|
+
"expire_fragment.action_controller" => %i[key],
|
56
|
+
"start_processing.action_controller" => %i[controller action params format method path],
|
57
|
+
"process_action.action_controller" => %i[controller action params format method path status view_runtime db_runtime],
|
58
|
+
"send_file.action_controller" => %i[path],
|
59
|
+
"redirect_to.action_controller" => %i[status location],
|
60
|
+
"halted_callback.action_controller" => %i[filter],
|
61
|
+
# action_dispatch
|
62
|
+
"process_middleware.action_dispatch" => %i[middleware],
|
63
|
+
# action_view
|
64
|
+
"render_template.action_view" => %i[identifier layout],
|
65
|
+
"render_partial.action_view" => %i[identifier],
|
66
|
+
"render_collection.action_view" => %i[identifier count cache_hits],
|
67
|
+
"render_layout.action_view" => %i[identifier],
|
68
|
+
# active_record
|
69
|
+
"sql.active_record" => %i[sql name statement_name cached],
|
70
|
+
"instantiation.active_record" => %i[record_count class_name],
|
71
|
+
# action_mailer
|
72
|
+
# not including to, from, or subject..etc. because of PII concern
|
73
|
+
"deliver.action_mailer" => %i[mailer date perform_deliveries],
|
74
|
+
"process.action_mailer" => %i[mailer action params],
|
75
|
+
# active_support
|
76
|
+
"cache_read.active_support" => %i[key store hit],
|
77
|
+
"cache_generate.active_support" => %i[key store],
|
78
|
+
"cache_fetch_hit.active_support" => %i[key store],
|
79
|
+
"cache_write.active_support" => %i[key store],
|
80
|
+
"cache_delete.active_support" => %i[key store],
|
81
|
+
"cache_exist?.active_support" => %i[key store],
|
82
|
+
# active_job
|
83
|
+
"enqueue_at.active_job" => %i[],
|
84
|
+
"enqueue.active_job" => %i[],
|
85
|
+
"enqueue_retry.active_job" => %i[],
|
86
|
+
"perform_start.active_job" => %i[],
|
87
|
+
"perform.active_job" => %i[],
|
88
|
+
"retry_stopped.active_job" => %i[],
|
89
|
+
"discard.active_job" => %i[],
|
90
|
+
# action_cable
|
91
|
+
"perform_action.action_cable" => %i[channel_class action],
|
92
|
+
"transmit.action_cable" => %i[channel_class],
|
93
|
+
"transmit_subscription_confirmation.action_cable" => %i[channel_class],
|
94
|
+
"transmit_subscription_rejection.action_cable" => %i[channel_class],
|
95
|
+
"broadcast.action_cable" => %i[broadcasting],
|
96
|
+
# active_storage
|
97
|
+
"service_upload.active_storage" => %i[service key checksum],
|
98
|
+
"service_streaming_download.active_storage" => %i[service key],
|
99
|
+
"service_download_chunk.active_storage" => %i[service key],
|
100
|
+
"service_download.active_storage" => %i[service key],
|
101
|
+
"service_delete.active_storage" => %i[service key],
|
102
|
+
"service_delete_prefixed.active_storage" => %i[service prefix],
|
103
|
+
"service_exist.active_storage" => %i[service key exist],
|
104
|
+
"service_url.active_storage" => %i[service key url],
|
105
|
+
"service_update_metadata.active_storage" => %i[service key],
|
106
|
+
"preview.active_storage" => %i[key],
|
107
|
+
"analyze.active_storage" => %i[analyzer],
|
108
|
+
}.freeze
|
109
|
+
|
44
110
|
class Configuration
|
45
111
|
# Rails 7.0 introduced a new error reporter feature, which the SDK once opted-in by default.
|
46
112
|
# But after receiving multiple issue reports, the integration seemed to cause serious troubles to some users.
|
@@ -75,6 +141,10 @@ module Sentry
|
|
75
141
|
# ```
|
76
142
|
attr_accessor :assets_regexp
|
77
143
|
|
144
|
+
# Hash of subscription items that will be shown in breadcrumbs active support logger.
|
145
|
+
# @return [Hash<String, Array<Symbol>>]
|
146
|
+
attr_accessor :active_support_logger_subscription_items
|
147
|
+
|
78
148
|
def initialize
|
79
149
|
@register_error_subscriber = false
|
80
150
|
@report_rescued_exceptions = true
|
@@ -87,6 +157,7 @@ module Sentry
|
|
87
157
|
Sentry::Rails::Tracing::ActiveRecordSubscriber,
|
88
158
|
Sentry::Rails::Tracing::ActiveStorageSubscriber
|
89
159
|
])
|
160
|
+
@active_support_logger_subscription_items = Sentry::Rails::ACTIVE_SUPPORT_LOGGER_SUBSCRIPTION_ITEMS_DEFAULT.dup
|
90
161
|
end
|
91
162
|
end
|
92
163
|
end
|
data/lib/sentry/rails/railtie.rb
CHANGED
@@ -89,7 +89,7 @@ module Sentry
|
|
89
89
|
def inject_breadcrumbs_logger
|
90
90
|
if Sentry.configuration.breadcrumbs_logger.include?(:active_support_logger)
|
91
91
|
require 'sentry/rails/breadcrumb/active_support_logger'
|
92
|
-
Sentry::Rails::Breadcrumb::ActiveSupportLogger.inject
|
92
|
+
Sentry::Rails::Breadcrumb::ActiveSupportLogger.inject(Sentry.configuration.rails.active_support_logger_subscription_items)
|
93
93
|
end
|
94
94
|
|
95
95
|
if Sentry.configuration.breadcrumbs_logger.include?(:monotonic_active_support_logger)
|
@@ -13,8 +13,33 @@ module Sentry
|
|
13
13
|
next if EXCLUDED_EVENTS.include? payload[:name]
|
14
14
|
|
15
15
|
record_on_current_span(op: SPAN_PREFIX + event_name, start_timestamp: payload[START_TIMESTAMP_NAME], description: payload[:sql], duration: duration) do |span|
|
16
|
-
span.set_data(:connection_id, payload[:connection_id])
|
17
16
|
span.set_tag(:cached, true) if payload.fetch(:cached, false) # cached key is only set for hits in the QueryCache, from Rails 5.1
|
17
|
+
|
18
|
+
connection = payload[:connection]
|
19
|
+
|
20
|
+
if payload[:connection_id]
|
21
|
+
span.set_data(:connection_id, payload[:connection_id])
|
22
|
+
|
23
|
+
# we fallback to the base connection on rails < 6.0.0 since the payload doesn't have it
|
24
|
+
base_connection = ActiveRecord::Base.connection
|
25
|
+
connection ||= base_connection if payload[:connection_id] == base_connection.object_id
|
26
|
+
end
|
27
|
+
|
28
|
+
next unless connection
|
29
|
+
|
30
|
+
db_config = if connection.pool.respond_to?(:db_config)
|
31
|
+
connection.pool.db_config.configuration_hash
|
32
|
+
elsif connection.pool.respond_to?(:spec)
|
33
|
+
connection.pool.spec.config
|
34
|
+
end
|
35
|
+
|
36
|
+
next unless db_config
|
37
|
+
|
38
|
+
span.set_data(Span::DataConventions::DB_SYSTEM, db_config[:adapter]) if db_config[:adapter]
|
39
|
+
span.set_data(Span::DataConventions::DB_NAME, db_config[:database]) if db_config[:database]
|
40
|
+
span.set_data(Span::DataConventions::SERVER_ADDRESS, db_config[:host]) if db_config[:host]
|
41
|
+
span.set_data(Span::DataConventions::SERVER_PORT, db_config[:port]) if db_config[:port]
|
42
|
+
span.set_data(Span::DataConventions::SERVER_SOCKET_ADDRESS, db_config[:socket]) if db_config[:socket]
|
18
43
|
end
|
19
44
|
end
|
20
45
|
end
|
data/lib/sentry/rails/version.rb
CHANGED
data/sentry-rails.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sentry-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sentry Team
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 5.
|
33
|
+
version: 5.14.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 5.
|
40
|
+
version: 5.14.0
|
41
41
|
description: A gem that provides Rails integration for the Sentry error logger
|
42
42
|
email: accounts@sentry.io
|
43
43
|
executables: []
|