mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #26584 from Shopify/cached-query-name
Preserve cached queries name in AS notifications
This commit is contained in:
commit
dc61db08b6
4 changed files with 18 additions and 11 deletions
|
@ -65,7 +65,7 @@ module ActiveRecord
|
|||
if @query_cache_enabled && !locked?(arel)
|
||||
arel, binds = binds_from_relation arel, binds
|
||||
sql = to_sql(arel, binds)
|
||||
cache_sql(sql, binds) { super(sql, name, binds, preparable: preparable) }
|
||||
cache_sql(sql, name, binds) { super(sql, name, binds, preparable: preparable) }
|
||||
else
|
||||
super
|
||||
end
|
||||
|
@ -73,11 +73,17 @@ module ActiveRecord
|
|||
|
||||
private
|
||||
|
||||
def cache_sql(sql, binds)
|
||||
def cache_sql(sql, name, binds)
|
||||
result =
|
||||
if @query_cache[sql].key?(binds)
|
||||
ActiveSupport::Notifications.instrument("sql.active_record",
|
||||
sql: sql, binds: binds, name: "CACHE", connection_id: object_id)
|
||||
ActiveSupport::Notifications.instrument(
|
||||
"sql.active_record",
|
||||
sql: sql,
|
||||
binds: binds,
|
||||
name: name,
|
||||
connection_id: object_id,
|
||||
cached: true,
|
||||
)
|
||||
@query_cache[sql][binds]
|
||||
else
|
||||
@query_cache[sql][binds] = yield
|
||||
|
|
|
@ -18,10 +18,13 @@ module ActiveRecord
|
|||
#
|
||||
# On the other hand, we want to monitor the performance of our real database
|
||||
# queries, not the performance of the access to the query cache.
|
||||
IGNORED_PAYLOADS = %w(SCHEMA EXPLAIN CACHE)
|
||||
IGNORED_PAYLOADS = %w(SCHEMA EXPLAIN)
|
||||
EXPLAINED_SQLS = /\A\s*(with|select|update|delete|insert)\b/i
|
||||
def ignore_payload?(payload)
|
||||
payload[:exception] || IGNORED_PAYLOADS.include?(payload[:name]) || payload[:sql] !~ EXPLAINED_SQLS
|
||||
payload[:exception] ||
|
||||
payload[:cached] ||
|
||||
IGNORED_PAYLOADS.include?(payload[:name]) ||
|
||||
payload[:sql] !~ EXPLAINED_SQLS
|
||||
end
|
||||
|
||||
ActiveSupport::Notifications.subscribe("sql.active_record", new)
|
||||
|
|
|
@ -35,6 +35,7 @@ module ActiveRecord
|
|||
return if IGNORE_PAYLOAD_NAMES.include?(payload[:name])
|
||||
|
||||
name = "#{payload[:name]} (#{event.duration.round(1)}ms)"
|
||||
name = "CACHE #{name}" if payload[:cached]
|
||||
sql = payload[:sql]
|
||||
binds = nil
|
||||
|
||||
|
|
|
@ -125,12 +125,9 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def call(name, start, finish, message_id, values)
|
||||
return if values[:cached]
|
||||
|
||||
sql = values[:sql]
|
||||
|
||||
# FIXME: this seems bad. we should probably have a better way to indicate
|
||||
# the query was cached
|
||||
return if "CACHE" == values[:name]
|
||||
|
||||
self.class.log_all << sql
|
||||
self.class.log << sql unless ignore.match?(sql)
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue