dial 0.2.9 → 0.3.1

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: 2a57407973b1542535078ec0688bf10ae767acfe0b50b6e6a95374e7b595e9ce
4
- data.tar.gz: 164e521cbd64295baee46891e67d01b8e9893b00d876dbc5d8431d9d64c6971d
3
+ metadata.gz: c57fbfd8d0f023bcfd0606a5d61cfe84dd7b93d618dd844d50332b576dcce3d5
4
+ data.tar.gz: 27db795cf357bd7c878ea939c9c66374cc50f54e304466f91b9add37e0535a95
5
5
  SHA512:
6
- metadata.gz: 497288fd60e67bfdf8d0cda035d781feeb59cc9605f1002f6d30bb7e5613c59d40b690f4750e11882f7f2feecb4baf71536c95deb6ae1b4dfa42e4fce4d1a223
7
- data.tar.gz: b486a6b420d89312f1733286e4b3f559d5c8026af45562675003ccba179cab9e997dfd02e281669d9b3ccf5ca8d5108daf8bfce4992ae2d88ef611cbf35dee47
6
+ metadata.gz: ea4ba198fd052cdfed3a35d95a5424f6da32c94da85dec1cad9d78edd6b92e336d35afa76704349c5ef0475ac8a60f9ba90026b753109f4a0cea8caba994d3c4
7
+ data.tar.gz: 4d1578a97dd8439a4e6060698d24a0605f9747fd471d47844dd5f981f257790a00ecd4a5ed097377ef3af6d61062dd0b76d6023f5fd5dca0990a8f2642421c5a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.1] - 2025-05-03
4
+
5
+ - Only show truncated summary + one full query in N+1 logs
6
+ - Fix parsing of multiline N+1 query logs
7
+ - Truncate summary N+1 queries to 100 chars
8
+
9
+ ## [0.3.0] - 2025-05-02
10
+
11
+ - Require rails 7.1.0 or later
12
+ - Add missing logger require
13
+ - Add missing stringio require
14
+
3
15
  ## [0.2.9] - 2025-04-11
4
16
 
5
17
  - No changes
data/README.md CHANGED
@@ -10,7 +10,7 @@ Utilizes [vernier](https://github.com/jhawthorn/vernier) for profiling and
10
10
 
11
11
  > [!NOTE]
12
12
  > Check out the resources in the vernier project for more information on how to
13
- > interpret the viewer, as well as comparisons with other profilers, including `stackprof`.
13
+ > interpret the viewer, as well as comparisons with other profilers, including stackprof.
14
14
 
15
15
  ![Demo](demo.gif)
16
16
 
data/dial.gemspec CHANGED
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.files = Dir["{lib}/**/*", "**/*.{gemspec,md,txt}"]
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "railties", ">= 7"
23
- spec.add_dependency "activerecord", ">= 7"
24
- spec.add_dependency "actionpack", ">= 7"
22
+ spec.add_dependency "railties", ">= 7.1"
23
+ spec.add_dependency "activerecord", ">= 7.1"
24
+ spec.add_dependency "actionpack", ">= 7.1"
25
25
  spec.add_dependency "vernier"
26
26
  spec.add_dependency "prosopite"
27
27
  spec.add_dependency "pg_query"
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "rack"
4
4
  require "action_dispatch"
5
+ require "stringio"
5
6
 
6
7
  require_relative "version"
7
8
 
@@ -10,6 +11,7 @@ module Dial
10
11
 
11
12
  HTTP_ACCEPT = "HTTP_ACCEPT"
12
13
  CONTENT_TYPE = ::Rack::CONTENT_TYPE
14
+ CONTENT_TYPE_HTML = "text/html"
13
15
  CONTENT_LENGTH = ::Rack::CONTENT_LENGTH
14
16
  NONCE = ::ActionDispatch::ContentSecurityPolicy::Request::NONCE
15
17
  REQUEST_TIMING = "dial_request_timing"
@@ -4,6 +4,8 @@ require "uri"
4
4
 
5
5
  module Dial
6
6
  class Panel
7
+ QUERY_CHARS_TRUNCATION_THRESHOLD = 100
8
+
7
9
  class << self
8
10
  def html env, headers, profile_out_filename, query_logs, ruby_vm_stat, gc_stat, gc_stat_heap, server_timing
9
11
  <<~HTML
@@ -11,20 +13,20 @@ module Dial
11
13
 
12
14
  <div id="dial">
13
15
  <div id="dial-preview">
14
- <span>
16
+ <span id="dial-preview-header">
15
17
  #{formatted_rails_route_info env} |
16
18
  #{formatted_request_timing env} |
17
19
  #{formatted_profile_output env, profile_out_filename}
18
20
  </span>
19
- <span>#{formatted_rails_version}</span>
20
- <span>#{formatted_rack_version}</span>
21
- <span>#{formatted_ruby_version}</span>
21
+ <span id="dial-preview-rails-version">#{formatted_rails_version}</span>
22
+ <span id="dial-preview-rack-version">#{formatted_rack_version}</span>
23
+ <span id="dial-preview-ruby-version">#{formatted_ruby_version}</span>
22
24
  </div>
23
25
 
24
26
  <hr>
25
27
 
26
28
  <div id="dial-details">
27
- <details>
29
+ <details id="dial-details-n-plus-ones">
28
30
  <summary>N+1s</summary>
29
31
  <div class="section query-logs">
30
32
  #{formatted_query_logs query_logs}
@@ -33,7 +35,7 @@ module Dial
33
35
 
34
36
  <hr>
35
37
 
36
- <details>
38
+ <details id="dial-details-server-timing">
37
39
  <summary>Server timing</summary>
38
40
  <div class="section">
39
41
  #{formatted_server_timing server_timing}
@@ -42,7 +44,7 @@ module Dial
42
44
 
43
45
  <hr>
44
46
 
45
- <details>
47
+ <details id="dial-details-ruby-vm-stat">
46
48
  <summary>RubyVM stat</summary>
47
49
  <div class="section">
48
50
  #{formatted_ruby_vm_stat ruby_vm_stat}
@@ -51,7 +53,7 @@ module Dial
51
53
 
52
54
  <hr>
53
55
 
54
- <details>
56
+ <details id="dial-details-gc-stat">
55
57
  <summary>GC stat</summary>
56
58
  <div class="section">
57
59
  #{formatted_gc_stat gc_stat}
@@ -60,7 +62,7 @@ module Dial
60
62
 
61
63
  <hr>
62
64
 
63
- <details>
65
+ <details id="dial-details-gc-stat-heap">
64
66
  <summary>GC stat heap</summary>
65
67
  <div class="section">
66
68
  #{formatted_gc_stat_heap gc_stat_heap}
@@ -223,7 +225,7 @@ module Dial
223
225
  query_logs.map do |(queries, stack_lines)|
224
226
  <<~HTML
225
227
  <details>
226
- <summary>#{queries.shift}</summary>
228
+ <summary>#{truncated_query queries.first}</summary>
227
229
  <div class="section query-logs">
228
230
  #{queries.map { |query| "<span>#{query}</span>" }.join}
229
231
  #{stack_lines.map { |stack_line| "<span>#{stack_line}</span>" }.join}
@@ -236,6 +238,12 @@ module Dial
236
238
  end
237
239
  end
238
240
 
241
+ def truncated_query query
242
+ return query if query.length <= QUERY_CHARS_TRUNCATION_THRESHOLD
243
+
244
+ query[0...QUERY_CHARS_TRUNCATION_THRESHOLD] + "..."
245
+ end
246
+
239
247
  def formatted_ruby_vm_stat ruby_vm_stat
240
248
  ruby_vm_stat.map { |key, value| "<span><b>#{key}:</b> #{value}</span>" }.join
241
249
  end
@@ -17,7 +17,7 @@ module Dial
17
17
  end
18
18
 
19
19
  def call env
20
- unless env[HTTP_ACCEPT]&.include? "text/html"
20
+ unless env[HTTP_ACCEPT]&.include? CONTENT_TYPE_HTML
21
21
  return @app.call env
22
22
  end
23
23
 
@@ -38,7 +38,7 @@ module Dial
38
38
  end
39
39
  server_timing = server_timing headers
40
40
 
41
- unless headers[CONTENT_TYPE]&.include? "text/html"
41
+ unless headers[CONTENT_TYPE]&.include? CONTENT_TYPE_HTML
42
42
  return [status, headers, rack_body]
43
43
  end
44
44
 
@@ -104,13 +104,13 @@ module Dial
104
104
  when /N\+1 queries detected/
105
105
  [[[],[]], :queries, 0]
106
106
  when /Call stack/
107
- entry.first << "+ #{count - 5} more queries" if count > 5
107
+ entry.first << "+ #{count - 1} more queries" if count > 1
108
108
  [entry, :call_stack, count]
109
109
  else
110
110
  case section
111
111
  when :queries
112
112
  count += 1
113
- entry.first << line.strip if count <= 5
113
+ entry.first << line.strip if count == 1
114
114
  [entry, :queries, count]
115
115
  when :call_stack
116
116
  if line.strip.empty?
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dial
4
+ module Prosopite
5
+ def send_notifications
6
+ tc[:prosopite_notifications] = tc[:prosopite_notifications].to_h do |queries, kaller|
7
+ [queries.map { |query| query.squish }, kaller]
8
+ end
9
+
10
+ super
11
+ end
12
+ end
13
+ end
14
+
15
+ module ::Prosopite
16
+ class << self
17
+ prepend Dial::Prosopite
18
+ end
19
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "logger"
4
+
3
5
  module Dial
4
6
  class ProsopiteLogger < Logger
5
7
  end
data/lib/dial/railtie.rb CHANGED
@@ -4,6 +4,7 @@ require "rails"
4
4
  require "active_record"
5
5
  require "prosopite"
6
6
 
7
+ require_relative "prosopite"
7
8
  require_relative "middleware"
8
9
  require_relative "prosopite_logger"
9
10
 
data/lib/dial/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dial
4
- VERSION = "0.2.9"
4
+ VERSION = "0.3.1"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dial
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Young
@@ -15,42 +15,42 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '7'
18
+ version: '7.1'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '7'
25
+ version: '7.1'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activerecord
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: '7'
32
+ version: '7.1'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '7'
39
+ version: '7.1'
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: actionpack
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '7'
46
+ version: '7.1'
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: '7'
53
+ version: '7.1'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: vernier
56
56
  requirement: !ruby/object:Gem::Requirement
@@ -113,6 +113,7 @@ files:
113
113
  - lib/dial/middleware/panel.rb
114
114
  - lib/dial/middleware/rails_stat.rb
115
115
  - lib/dial/middleware/ruby_stat.rb
116
+ - lib/dial/prosopite.rb
116
117
  - lib/dial/prosopite_logger.rb
117
118
  - lib/dial/railtie.rb
118
119
  - lib/dial/util.rb