OpenProject is the leading open source project management software.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openproject/config/initializers/log_slow_sql_queries.rb

36 lines
1.3 KiB

OpenProject::Application.configure do
config.after_initialize do
next if Rails.env.test?
# Avoid running this on migrations or when the database is incomplete
next if OpenProject::Database.migrations_pending?
slow_sql_threshold = OpenProject::Configuration.sql_slow_query_threshold.to_i
next if slow_sql_threshold == 0
ActiveSupport::Notifications.subscribe("sql.active_record") do |_name, start, finish, _id, data|
# Skip transaction that may be blocked
next if data[:sql].match(/BEGIN|COMMIT/)
# Skip smaller durations
duration = ((finish - start) * 1000).round(4)
next if duration <= slow_sql_threshold
payload = {
duration: duration,
time: start.iso8601,
cached: !!data[:cache],
sql: data[:sql]
}
sql_log_string = data[:sql].strip.gsub(/(^(\s+)?$\n)/, "")
OpenProject.logger.warn "Encountered slow SQL (#{payload[:duration]} ms): #{sql_log_string}",
payload: payload,
# Hash of the query for reference/fingerprinting
reference: Digest::SHA1.hexdigest(data[:sql])
rescue StandardError => e
OpenProject.logger.error "Failed to record slow SQL query: #{e}"
end
end
end