prosopite 1.3.2 → 1.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c755dcf6b652f0c40d14ff94a4f6dc7beb9cc4f9612cff5ea95ce272d81b31bb
4
- data.tar.gz: 4c15915fb03a38760c93edd4fa5c12a7db3d48d1611d470f320a494c3f6673a1
3
+ metadata.gz: b53b2e152727ab756b2ddb8ae7b34e36c82f0bdb84a59a7345cdf3a8866daf88
4
+ data.tar.gz: b7aed1d1436d6fb14347b826eed46802ee7c0bb9069a22cdf4bf01d5ce1fbad2
5
5
  SHA512:
6
- metadata.gz: 1048554ad84f00835366801abd599fd590512d88d1523de3434ee24eec23aac9a9f1506084244295cbd34b80808b1ade2068027e958e531028d70ea9df21b970
7
- data.tar.gz: 5acd7e945c9056875adb72cc4222ec766df17f7ff638e1307de28b8a4486067df40f736522a9dd4f10d69da859350fcb9477fe98de4027ca57b362cb9bf930b8
6
+ metadata.gz: c42247c6d608841951aeec07580528578581856dff3f24a0bd72655036c9aace5de4db18587e2db489e6f5a44662531b45e0a2ec900da37e65d3c3e2a1c10a3e
7
+ data.tar.gz: b164c81ea349b7b537e09c286110316fe8d36b5b2343df425543786ef92f7448d6e1632d792a37146f2af77d418f9bb17a1dbe8c146af643f2c2362fe9bf99b3
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- prosopite (1.3.2)
4
+ prosopite (1.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -122,6 +122,7 @@ The preferred type of notifications can be configured with:
122
122
  * `Prosopite.stderr_logger = true`: Send warnings to STDERR
123
123
  * `Prosopite.backtrace_cleaner = my_custom_backtrace_cleaner`: use a different [ActiveSupport::BacktraceCleaner](https://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.html). Defaults to `Rails.backtrace_cleaner`.
124
124
  * `Prosopite.custom_logger = my_custom_logger`:
125
+ * `Prosopite.enabled = true`: Enables or disables the gem. Defaults to `true`.
125
126
 
126
127
  ### Custom Logging Configuration
127
128
 
@@ -203,6 +204,37 @@ end
203
204
 
204
205
  WARNING: scan/finish should run before/after **each** test and NOT before/after the whole suite.
205
206
 
207
+ ## Middleware
208
+
209
+ ### Rack
210
+
211
+ Instead of using an `around_action` hook in a Rails Controller, you can also use the rack middleware instead
212
+ implementing auto detect for all controllers.
213
+
214
+ Add the following line into your `config/initializers/prosopite.rb` file.
215
+
216
+ ```ruby
217
+ unless Rails.production?
218
+ require 'prosopite/middleware/rack'
219
+ Rails.configuration.middleware.use(Prosopite::Middleware::Rack)
220
+ end
221
+
222
+
223
+ ### Sidekiq
224
+ We also provide a middleware for sidekiq so that you can auto detect n+1 queries that may occur in a sidekiq job.
225
+ You just need to add the following to your sidekiq initializer.
226
+
227
+ ```ruby
228
+ Sidekiq.configure_server do |config|
229
+ unless Rails.production?
230
+ config.server_middleware do |chain|
231
+ require 'prosopite/middleware/sidekiq'
232
+ chain.add(Prosopite::Middleware::Sidekiq)
233
+ end
234
+ end
235
+ end
236
+ ```
237
+
206
238
  ## Allow list
207
239
 
208
240
  Ignore notifications for call stacks containing one or more substrings / regex:
@@ -0,0 +1,13 @@
1
+ module Prosopite
2
+ module Middleware
3
+ class Rack
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ Prosopite.scan { @app.call(env) }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Prosopite
2
+ module Middleware
3
+ class Sidekiq
4
+ include Sidekiq::ServerMiddleware
5
+
6
+ def call(_worker, _msg, _queue)
7
+ Prosopite.scan
8
+ yield
9
+ ensure
10
+ Prosopite.finish
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Prosopite
4
- VERSION = "1.3.2"
4
+ VERSION = "1.4.0"
5
5
  end
data/lib/prosopite.rb CHANGED
@@ -12,11 +12,13 @@ module Prosopite
12
12
  :rails_logger,
13
13
  :prosopite_logger,
14
14
  :custom_logger,
15
- :allow_stack_paths,
16
- :ignore_queries,
17
15
  :ignore_pauses,
18
- :min_n_queries,
19
- :backtrace_cleaner
16
+ :backtrace_cleaner,
17
+ :enabled
18
+
19
+ attr_accessor :allow_stack_paths,
20
+ :ignore_queries,
21
+ :min_n_queries
20
22
 
21
23
  def allow_list=(value)
22
24
  puts "Prosopite.allow_list= is deprecated. Use Prosopite.allow_stack_paths= instead."
@@ -28,9 +30,21 @@ module Prosopite
28
30
  @backtrace_cleaner ||= Rails.backtrace_cleaner
29
31
  end
30
32
 
33
+ def enabled?
34
+ @enabled = true if @enabled.nil?
35
+
36
+ @enabled
37
+ end
38
+
39
+ def disabled?
40
+ !enabled?
41
+ end
42
+
31
43
  def scan
32
44
  tc[:prosopite_scan] ||= false
33
- return if scan?
45
+ if scan? || disabled?
46
+ return block_given? ? yield : nil
47
+ end
34
48
 
35
49
  subscribe
36
50
 
@@ -130,7 +144,8 @@ module Prosopite
130
144
  end
131
145
 
132
146
  def fingerprint(query)
133
- if ActiveRecord::Base.connection.adapter_name.downcase.include?('mysql')
147
+ db_adapter = ActiveRecord::Base.connection.adapter_name.downcase
148
+ if db_adapter.include?('mysql') || db_adapter.include?('trilogy')
134
149
  mysql_fingerprint(query)
135
150
  else
136
151
  begin
@@ -246,13 +261,14 @@ module Prosopite
246
261
  sql, name = data[:sql], data[:name]
247
262
 
248
263
  if scan? && name != "SCHEMA" && sql.include?('SELECT') && data[:cached].nil? && !ignore_query?(sql)
249
- location_key = Digest::SHA1.hexdigest(caller.join)
264
+ query_caller = caller
265
+ location_key = Digest::SHA256.hexdigest(query_caller.join)
250
266
 
251
267
  tc[:prosopite_query_counter][location_key] += 1
252
268
  tc[:prosopite_query_holder][location_key] << sql
253
269
 
254
270
  if tc[:prosopite_query_counter][location_key] > 1
255
- tc[:prosopite_query_caller][location_key] = caller.dup
271
+ tc[:prosopite_query_caller][location_key] = query_caller.dup
256
272
  end
257
273
  end
258
274
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prosopite
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mpampis Kostas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-09 00:00:00.000000000 Z
11
+ date: 2023-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -123,6 +123,8 @@ files:
123
123
  - README.md
124
124
  - Rakefile
125
125
  - lib/prosopite.rb
126
+ - lib/prosopite/middleware/rack.rb
127
+ - lib/prosopite/middleware/sidekiq.rb
126
128
  - lib/prosopite/version.rb
127
129
  - prosopite.gemspec
128
130
  homepage: https://github.com/charkost/prosopite