Skip to content

Commit 84c4598

Browse files
authored
Merge pull request rails#51457 from fatkodima/add-sql-queries-to-log
Add queries count to template rendering instrumentation
2 parents 58158c0 + 6369e92 commit 84c4598

File tree

4 files changed

+70
-10
lines changed

4 files changed

+70
-10
lines changed

actionview/CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
* Add queries count to template rendering instrumentation
2+
3+
```
4+
# Before
5+
Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms | Allocations: 112788)
6+
7+
# After
8+
Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms (2 queries, 1 cached) | Allocations: 112788)
9+
```
10+
11+
*fatkodima*
12+
113
* Raise `ArgumentError` if `:renderable` object does not respond to `#render_in`
214
315
*Sean Doyle*

actionview/test/activerecord/controller_runtime_test.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def redirect
3131

3232
def db_after_render
3333
render inline: "Hello world"
34-
Project.all
34+
Project.all.to_a
3535
ActiveRecord::RuntimeRegistry.sql_runtime += 100.0
3636
end
3737
end
@@ -68,7 +68,7 @@ def test_log_with_active_record
6868
wait
6969

7070
assert_equal 2, @logger.logged(:info).size
71-
assert_match(/\(Views: [\d.]+ms \| ActiveRecord: [\d.]+ms \| Allocations: [\d.]+\)/, @logger.logged(:info)[1])
71+
assert_match(/\(Views: [\d.]+ms \| ActiveRecord: [\d.]+ms \(0 queries, 0 cached\) \| Allocations: [\d.]+\)/, @logger.logged(:info)[1])
7272
end
7373

7474
def test_runtime_reset_before_requests
@@ -77,27 +77,27 @@ def test_runtime_reset_before_requests
7777
wait
7878

7979
assert_equal 2, @logger.logged(:info).size
80-
assert_match(/\(Views: [\d.]+ms \| ActiveRecord: [\d.]+ms \| Allocations: [\d.]+\)/, @logger.logged(:info)[1])
80+
assert_match(/\(Views: [\d.]+ms \| ActiveRecord: [\d.]+ms \(0 queries, 0 cached\) \| Allocations: [\d.]+\)/, @logger.logged(:info)[1])
8181
end
8282

8383
def test_log_with_active_record_when_post
8484
post :create
8585
wait
86-
assert_match(/ActiveRecord: ([1-9][\d.]+)ms \| Allocations: [\d.]+\)/, @logger.logged(:info)[2])
86+
assert_match(/ActiveRecord: ([1-9][\d.]+)ms \(1 query, 0 cached\) \| Allocations: [\d.]+\)/, @logger.logged(:info)[2])
8787
end
8888

8989
def test_log_with_active_record_when_redirecting
9090
get :redirect
9191
wait
9292
assert_equal 3, @logger.logged(:info).size
93-
assert_match(/\(ActiveRecord: [\d.]+ms \| Allocations: [\d.]+\)/, @logger.logged(:info)[2])
93+
assert_match(/\(ActiveRecord: [\d.]+ms \(0 queries, 0 cached\) \| Allocations: [\d.]+\)/, @logger.logged(:info)[2])
9494
end
9595

9696
def test_include_time_query_time_after_rendering
9797
get :db_after_render
9898
wait
9999

100100
assert_equal 2, @logger.logged(:info).size
101-
assert_match(/\(Views: [\d.]+ms \| ActiveRecord: ([1-9][\d.]+)ms \| Allocations: [\d.]+\)/, @logger.logged(:info)[1])
101+
assert_match(/\(Views: [\d.]+ms \| ActiveRecord: ([1-9][\d.]+)ms \(1 query, 0 cached\) \| Allocations: [\d.]+\)/, @logger.logged(:info)[1])
102102
end
103103
end

activerecord/lib/active_record/railties/controller_runtime.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,14 @@ module ControllerRuntime # :nodoc:
1111
module ClassMethods # :nodoc:
1212
def log_process_action(payload)
1313
messages, db_runtime = super, payload[:db_runtime]
14-
messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
14+
15+
if db_runtime
16+
queries_count = payload[:queries_count] || 0
17+
cached_queries_count = payload[:cached_queries_count] || 0
18+
messages << ("ActiveRecord: %.1fms (%d %s, %d cached)" % [db_runtime.to_f, queries_count,
19+
"query".pluralize(queries_count), cached_queries_count])
20+
end
21+
1522
messages
1623
end
1724
end
@@ -34,11 +41,11 @@ def process_action(action, *args)
3441

3542
def cleanup_view_runtime
3643
if logger && logger.info?
37-
db_rt_before_render = ActiveRecord::RuntimeRegistry.reset
44+
db_rt_before_render = ActiveRecord::RuntimeRegistry.reset_runtimes
3845
self.db_runtime = (db_runtime || 0) + db_rt_before_render
3946
runtime = super
4047
queries_rt = ActiveRecord::RuntimeRegistry.sql_runtime - ActiveRecord::RuntimeRegistry.async_sql_runtime
41-
db_rt_after_render = ActiveRecord::RuntimeRegistry.reset
48+
db_rt_after_render = ActiveRecord::RuntimeRegistry.reset_runtimes
4249
self.db_runtime += db_rt_after_render
4350
runtime - queries_rt
4451
else
@@ -49,7 +56,9 @@ def cleanup_view_runtime
4956
def append_info_to_payload(payload)
5057
super
5158

52-
payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::RuntimeRegistry.reset
59+
payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::RuntimeRegistry.reset_runtimes
60+
payload[:queries_count] = ActiveRecord::RuntimeRegistry.reset_queries_count
61+
payload[:cached_queries_count] = ActiveRecord::RuntimeRegistry.reset_cached_queries_count
5362
end
5463
end
5564
end

activerecord/lib/active_record/runtime_registry.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,54 @@ def async_sql_runtime=(runtime)
2525
ActiveSupport::IsolatedExecutionState[:active_record_async_sql_runtime] = runtime
2626
end
2727

28+
def queries_count
29+
ActiveSupport::IsolatedExecutionState[:active_record_queries_count] ||= 0
30+
end
31+
32+
def queries_count=(count)
33+
ActiveSupport::IsolatedExecutionState[:active_record_queries_count] = count
34+
end
35+
36+
def cached_queries_count
37+
ActiveSupport::IsolatedExecutionState[:active_record_cached_queries_count] ||= 0
38+
end
39+
40+
def cached_queries_count=(count)
41+
ActiveSupport::IsolatedExecutionState[:active_record_cached_queries_count] = count
42+
end
43+
2844
def reset
45+
reset_runtimes
46+
reset_queries_count
47+
reset_cached_queries_count
48+
end
49+
50+
def reset_runtimes
2951
rt, self.sql_runtime = sql_runtime, 0.0
3052
self.async_sql_runtime = 0.0
3153
rt
3254
end
55+
56+
def reset_queries_count
57+
qc = queries_count
58+
self.queries_count = 0
59+
qc
60+
end
61+
62+
def reset_cached_queries_count
63+
qc = cached_queries_count
64+
self.cached_queries_count = 0
65+
qc
66+
end
3367
end
3468
end
3569

3670
ActiveSupport::Notifications.monotonic_subscribe("sql.active_record") do |name, start, finish, id, payload|
71+
unless ["SCHEMA", "TRANSACTION"].include?(payload[:name])
72+
ActiveRecord::RuntimeRegistry.queries_count += 1
73+
ActiveRecord::RuntimeRegistry.cached_queries_count += 1 if payload[:cached]
74+
end
75+
3776
runtime = (finish - start) * 1_000.0
3877

3978
if payload[:async]

0 commit comments

Comments
 (0)