active_record_query_counter 2.1.0 → 2.2.1

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: 9d653eb9665511008bc78023c7e39ae8eb189e051847d83e16244424b5cbe595
4
- data.tar.gz: 6e9643c840a635228ea0a04cb02277b91c34b1ea5e69bd5b93753066be8ab4fb
3
+ metadata.gz: 752c1c799ab4ee023a24f4f8c3550da35831fdcebf39e71c9bb945bbf4ca7ff9
4
+ data.tar.gz: ecd642c76f010996f40d0a6d791db96c06515137b2e1393d5655c1feae314b23
5
5
  SHA512:
6
- metadata.gz: df192239b02e3ed039eac91a64393d5332cad36dce242e9e02948b3ec0cbe23e7ae5d4b23dc58ebf01158fa885680135e6719f444a871abd37779e85a9f85d2d
7
- data.tar.gz: '069e6959ba3f7ead49824ae91d35774b3b336afe18248c84800eaca65115daa040bdf5871d0c3e591b648cce2b0d5414078fe51ef39bef8d9f0e777be8e7330d'
6
+ metadata.gz: b4a88b4283290565e8352d35f6c0b5483515dbcacbd17fb223fc90398b94d50ac2984519f84c6a188a576468cb1f9ea373edfcc6855301e78522676558511e9d
7
+ data.tar.gz: ff360b2f495c953f79668a27520722c425c94d9cafe6607dcae40d25b65d10dd8f38f7b0d478771495927a5229ecf1e6948328b6adb87be5d6d186c77727d4f2
data/CHANGELOG.md CHANGED
@@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 2.2.1
8
+
9
+ ### Changed
10
+
11
+ - Classes not required to run the gem are now lazy loaded.
12
+
13
+ ## 2.2.0
14
+
15
+ ### Added
16
+
17
+ - Added `ActiveRecordQueryCounter.disable` method to allow disabling query counting behavior within a block.
18
+ - Rails 7.1 compatibility.
19
+
7
20
  ## 2.1.0
8
21
 
9
22
  ### Added
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
1
  # ActiveRecordQueryCounter
2
2
 
3
- ![Continuous Integration](https://github.com/bdurand/active_record_query_counter/workflows/Continuous%20Integration/badge.svg)
3
+ [![Continuous Integration](https://github.com/bdurand/active_record_query_counter/actions/workflows/continuous_integration.yml/badge.svg)](https://github.com/bdurand/active_record_query_counter/actions/workflows/continuous_integration.yml)
4
+ [![Regression Test](https://github.com/bdurand/active_record_query_counter/actions/workflows/regression_test.yml/badge.svg)](https://github.com/bdurand/active_record_query_counter/actions/workflows/regression_test.yml)
4
5
  [![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)
6
+ [![Gem Version](https://badge.fury.io/rb/active_record_query_counter.svg)](https://badge.fury.io/rb/active_record_query_counter)
5
7
 
6
8
  This gem injects itself into ActiveRecord to give you insight into how your code is using the database.
7
9
 
@@ -60,6 +62,18 @@ Sidekiq.configure_server do |config|
60
62
  end
61
63
  ```
62
64
 
65
+ If you want to disable query counting within a block of code, you can use the `disable` method.
66
+
67
+ ```ruby
68
+ ActiveRecordQueryCounter.count_queries do
69
+ do_something
70
+ ActiveRecordQueryCounter.disable do
71
+ # Queries will not be counted in this block.
72
+ do_something_else
73
+ end
74
+ end
75
+ ```
76
+
63
77
  ### Notifications
64
78
 
65
79
  You can also subscribe to ActiveSupport notifications to get notified when query thresholds are exceeded.
@@ -192,6 +206,24 @@ ActiveSupport::Notifications.subscribe('active_record_query_counter.transaction_
192
206
  end
193
207
  ```
194
208
 
209
+ ## Installation
210
+
211
+ Add this line to your application's Gemfile:
212
+
213
+ ```ruby
214
+ gem 'active_record_query_counter'
215
+ ```
216
+
217
+ And then execute:
218
+ ```bash
219
+ $ bundle
220
+ ```
221
+
222
+ Or install it yourself as:
223
+ ```bash
224
+ $ gem install active_record_query_counter
225
+ ```
226
+
195
227
  ## Contributing
196
228
 
197
229
  Open a pull request on GitHub.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.1.0
1
+ 2.2.1
@@ -3,14 +3,38 @@
3
3
  module ActiveRecordQueryCounter
4
4
  # Module to prepend to the connection adapter to inject the counting behavior.
5
5
  module ConnectionAdapterExtension
6
- def exec_query(sql, name = nil, binds = [], *args, **kwargs)
7
- start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
8
- result = super
9
- if result.is_a?(ActiveRecord::Result)
10
- end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
11
- ActiveRecordQueryCounter.add_query(sql, name, binds, result.length, start_time, end_time)
6
+ class << self
7
+ def inject(connection_class)
8
+ # Rails 7.1+ uses internal_exec_query instead of exec_query.
9
+ mod = (connection_class.instance_methods.include?(:internal_exec_query) ? InternalExecQuery : ExecQuery)
10
+ unless connection_class.include?(mod)
11
+ connection_class.prepend(mod)
12
+ end
13
+ end
14
+ end
15
+
16
+ module ExecQuery
17
+ def exec_query(sql, name = nil, binds = [], *args, **kwargs)
18
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
19
+ result = super
20
+ if result.is_a?(ActiveRecord::Result)
21
+ end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
22
+ ActiveRecordQueryCounter.add_query(sql, name, binds, result.length, start_time, end_time)
23
+ end
24
+ result
25
+ end
26
+ end
27
+
28
+ module InternalExecQuery
29
+ def internal_exec_query(sql, name = nil, binds = [], *args, **kwargs)
30
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
31
+ result = super
32
+ if result.is_a?(ActiveRecord::Result)
33
+ end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
34
+ ActiveRecordQueryCounter.add_query(sql, name, binds, result.length, start_time, end_time)
35
+ end
36
+ result
12
37
  end
13
- result
14
38
  end
15
39
  end
16
40
  end
@@ -6,6 +6,10 @@ module ActiveRecordQueryCounter
6
6
  class Thresholds
7
7
  attr_reader :query_time, :row_count, :transaction_time, :transaction_count
8
8
 
9
+ def initialize
10
+ clear
11
+ end
12
+
9
13
  def query_time=(value)
10
14
  @query_time = value&.to_f
11
15
  end
@@ -30,7 +34,7 @@ module ActiveRecordQueryCounter
30
34
  values.each do |key, value|
31
35
  setter = "#{key}="
32
36
  if respond_to?(setter)
33
- public_send("#{key}=", value)
37
+ public_send(:"#{key}=", value)
34
38
  else
35
39
  raise ArgumentError, "Unknown threshold: #{key}"
36
40
  end
@@ -3,6 +3,14 @@
3
3
  module ActiveRecordQueryCounter
4
4
  # Extension to ActiveRecord::ConnectionAdapters::TransactionManager to count transactions.
5
5
  module TransactionManagerExtension
6
+ class << self
7
+ def inject(transaction_manager_class)
8
+ unless transaction_manager_class.include?(self)
9
+ transaction_manager_class.prepend(self)
10
+ end
11
+ end
12
+ end
13
+
6
14
  def begin_transaction(*args, **kwargs)
7
15
  if open_transactions == 0
8
16
  @active_record_query_counter_transaction_start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
@@ -2,12 +2,9 @@
2
2
 
3
3
  require_relative "active_record_query_counter/connection_adapter_extension"
4
4
  require_relative "active_record_query_counter/counter"
5
- require_relative "active_record_query_counter/rack_middleware"
6
- require_relative "active_record_query_counter/sidekiq_middleware"
7
5
  require_relative "active_record_query_counter/thresholds"
8
6
  require_relative "active_record_query_counter/transaction_info"
9
7
  require_relative "active_record_query_counter/transaction_manager_extension"
10
- require_relative "active_record_query_counter/version"
11
8
 
12
9
  # Everything you need to count ActiveRecord queries and row counts within a block.
13
10
  #
@@ -19,6 +16,10 @@ require_relative "active_record_query_counter/version"
19
16
  # puts ActiveRecordQueryCounter.row_count
20
17
  # end
21
18
  module ActiveRecordQueryCounter
19
+ autoload :RackMiddleware, "active_record_query_counter/rack_middleware"
20
+ autoload :SidekiqMiddleware, "active_record_query_counter/sidekiq_middleware"
21
+ autoload :VERSION, "active_record_query_counter/version"
22
+
22
23
  IGNORED_STATEMENTS = %w[SCHEMA EXPLAIN].freeze
23
24
  private_constant :IGNORED_STATEMENTS
24
25
 
@@ -48,6 +49,20 @@ module ActiveRecordQueryCounter
48
49
  end
49
50
  end
50
51
 
52
+ # Disable query counting in a block. Any queries or transactions inside the block will not
53
+ # be counted.
54
+ #
55
+ # @return [Object] the return value of the block
56
+ def disable(&block)
57
+ counter = current_counter
58
+ begin
59
+ self.current_counter = nil
60
+ yield
61
+ ensure
62
+ self.current_counter = counter
63
+ end
64
+ end
65
+
51
66
  # Increment the query counters.
52
67
  #
53
68
  # @param row_count [Integer] the number of rows returned by the query
@@ -219,11 +234,9 @@ module ActiveRecordQueryCounter
219
234
  # @param connection_class [Class] the connection adapter class to extend
220
235
  # @return [void]
221
236
  def enable!(connection_class)
222
- unless connection_class.include?(ConnectionAdapterExtension)
223
- connection_class.prepend(ConnectionAdapterExtension)
224
- end
225
- unless ActiveRecord::ConnectionAdapters::TransactionManager.include?(TransactionManagerExtension)
226
- ActiveRecord::ConnectionAdapters::TransactionManager.prepend(TransactionManagerExtension)
237
+ ActiveSupport.on_load(:active_record) do
238
+ ConnectionAdapterExtension.inject(connection_class)
239
+ TransactionManagerExtension.inject(ActiveRecord::ConnectionAdapters::TransactionManager)
227
240
  end
228
241
 
229
242
  @cache_subscription ||= ActiveSupport::Notifications.subscribe("sql.active_record") do |_name, _start_time, _end_time, _id, payload|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_query_counter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Durand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-13 00:00:00.000000000 Z
11
+ date: 2024-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -46,7 +46,7 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - CHANGELOG.md
49
- - MIT_LICENSE
49
+ - MIT_LICENSE.txt
50
50
  - README.md
51
51
  - VERSION
52
52
  - active_record_query_counter.gemspec
@@ -78,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
78
  - !ruby/object:Gem::Version
79
79
  version: '0'
80
80
  requirements: []
81
- rubygems_version: 3.4.10
81
+ rubygems_version: 3.4.12
82
82
  signing_key:
83
83
  specification_version: 4
84
84
  summary: Count total number of ActiveRecord queries and row counts inside a block
File without changes