diff --git a/app/models/application_record.rb b/app/models/application_record.rb index d710abfdc9f7311ecda1fa536e697ff4ecc2b227..121c4bbfc32084ea8cb4f87ce6e0b8444ba3290e 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -104,19 +104,6 @@ def self.declarative_enum(enum_mod) enum(enum_mod.key => values) end - def self.transaction(**options, &block) - if options[:requires_new] && track_subtransactions? - ::Gitlab::Database::Metrics.subtransactions_increment(self.name) - end - - super(**options, &block) - end - - def self.track_subtransactions? - ::Feature.enabled?(:active_record_subtransactions_counter, type: :ops, default_enabled: :yaml) && - connection.transaction_open? - end - def self.cached_column_list self.column_names.map { |column_name| self.arel_table[column_name] } end diff --git a/config/feature_flags/ops/active_record_subtransactions_counter.yml b/config/feature_flags/ops/active_record_subtransactions_counter.yml deleted file mode 100644 index 0d2b1b0c84a29cdadf42b97c9c4307549b25c258..0000000000000000000000000000000000000000 --- a/config/feature_flags/ops/active_record_subtransactions_counter.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: active_record_subtransactions_counter -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66477 -rollout_issue_url: -milestone: '14.1' -type: ops -group: group::pipeline execution -default_enabled: false diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index 022752a065051d6a402ea1a174c398d5e612ba67..110708e44ebc67440fdfda812436829d3a5c7529 100644 --- a/lib/gitlab/database.rb +++ b/lib/gitlab/database.rb @@ -214,9 +214,13 @@ module ActiveRecordBaseTransactionMetrics extend ActiveSupport::Concern class_methods do - # A monkeypatch over ActiveRecord::Base.transaction. - # It provides observability into transactional methods. + # A patch over ActiveRecord::Base.transaction that provides + # observability into transactional methods. def transaction(**options, &block) + if options[:requires_new] && connection.transaction_open? + ::Gitlab::Database::Metrics.subtransactions_increment(self.name) + end + ActiveSupport::Notifications.instrument('transaction.active_record', { connection: connection }) do super(**options, &block) end diff --git a/spec/models/application_record_spec.rb b/spec/models/application_record_spec.rb index f9a05c720a3eaaedd80b100a2090f86486029afc..40e2aae0bad36150e26df3d183d35b4eb232883e 100644 --- a/spec/models/application_record_spec.rb +++ b/spec/models/application_record_spec.rb @@ -164,6 +164,23 @@ end end end + + # rubocop:disable Database/MultipleDatabases + it 'increments a counter when a transaction is created in ActiveRecord' do + expect(described_class.connection.transaction_open?).to be false + + expect(::Gitlab::Database::Metrics) + .to receive(:subtransactions_increment) + .with('ActiveRecord::Base') + .once + + ActiveRecord::Base.transaction do + ActiveRecord::Base.transaction(requires_new: true) do + expect(ActiveRecord::Base.connection.transaction_open?).to be true + end + end + end + # rubocop:enable Database/MultipleDatabases end describe '.with_fast_read_statement_timeout' do