2019-05-02 18:17:27 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
# If Mini Profiler is included via gem
|
2014-07-16 18:34:30 -04:00
|
|
|
if Rails.configuration.respond_to?(:load_mini_profiler) && Rails.configuration.load_mini_profiler
|
2013-04-11 02:24:08 -04:00
|
|
|
require 'rack-mini-profiler'
|
2013-09-09 07:19:23 -04:00
|
|
|
require 'flamegraph'
|
2016-06-30 13:21:40 -04:00
|
|
|
|
|
|
|
begin
|
|
|
|
require 'memory_profiler'
|
|
|
|
rescue => e
|
2017-07-27 21:20:09 -04:00
|
|
|
STDERR.put "#{e} failed to require mini profiler"
|
2016-06-30 13:21:40 -04:00
|
|
|
end
|
2014-12-28 21:30:54 -05:00
|
|
|
|
2013-04-11 02:24:08 -04:00
|
|
|
# initialization is skipped so trigger it
|
|
|
|
Rack::MiniProfilerRails.initialize!(Rails.application)
|
|
|
|
end
|
|
|
|
|
2018-12-09 22:29:20 -05:00
|
|
|
if defined?(Rack::MiniProfiler) && defined?(Rack::MiniProfiler::Config)
|
2013-03-25 02:19:59 -04:00
|
|
|
# note, we may want to add some extra security here that disables mini profiler in a multi hosted env unless user global admin
|
|
|
|
# raw_connection means results are not namespaced
|
|
|
|
#
|
|
|
|
# namespacing gets complex, cause mini profiler is in the rack chain way before multisite
|
2017-08-02 01:32:01 -04:00
|
|
|
Rack::MiniProfiler.config.storage_instance = Rack::MiniProfiler::RedisStore.new(
|
|
|
|
connection: DiscourseRedis.new(nil, namespace: false)
|
|
|
|
)
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2015-04-16 22:16:37 -04:00
|
|
|
skip = [
|
|
|
|
/^\/message-bus/,
|
2018-01-08 19:30:59 -05:00
|
|
|
/^\/extra-locales/,
|
2015-04-16 22:16:37 -04:00
|
|
|
/topics\/timings/,
|
|
|
|
/assets/,
|
|
|
|
/\/user_avatar\//,
|
|
|
|
/\/letter_avatar\//,
|
2015-12-09 00:40:49 -05:00
|
|
|
/\/letter_avatar_proxy\//,
|
2015-04-16 22:16:37 -04:00
|
|
|
/\/highlight-js\//,
|
2018-11-26 16:49:57 -05:00
|
|
|
/\/svg-sprite\//,
|
2015-04-16 22:16:37 -04:00
|
|
|
/qunit/,
|
|
|
|
/srv\/status/,
|
|
|
|
/commits-widget/,
|
|
|
|
/^\/cdn_asset/,
|
|
|
|
/^\/logs/,
|
|
|
|
/^\/site_customizations/,
|
2015-05-04 02:11:27 -04:00
|
|
|
/^\/uploads/,
|
2020-02-27 21:11:30 -05:00
|
|
|
/^\/secure-media-uploads/,
|
2015-05-04 02:11:27 -04:00
|
|
|
/^\/javascripts\//,
|
2015-05-05 01:50:13 -04:00
|
|
|
/^\/images\//,
|
2015-08-24 21:54:23 -04:00
|
|
|
/^\/stylesheets\//,
|
|
|
|
/^\/favicon\/proxied/
|
2015-04-16 22:16:37 -04:00
|
|
|
]
|
|
|
|
|
2016-03-15 19:54:40 -04:00
|
|
|
# we DO NOT WANT mini-profiler loading on anything but real desktops and laptops
|
|
|
|
# so let's rule out all handheld, tablet, and mobile devices
|
2013-02-25 11:42:20 -05:00
|
|
|
Rack::MiniProfiler.config.pre_authorize_cb = lambda do |env|
|
2014-05-06 18:23:52 -04:00
|
|
|
path = env['PATH_INFO']
|
2015-04-16 22:16:37 -04:00
|
|
|
|
2016-03-15 19:46:41 -04:00
|
|
|
(env['HTTP_USER_AGENT'] !~ /iPad|iPhone|Android/) &&
|
2017-07-27 21:20:09 -04:00
|
|
|
!skip.any? { |re| re =~ path }
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2013-03-24 23:09:28 -04:00
|
|
|
# without a user provider our results will use the ip address for namespacing
|
|
|
|
# with a load balancer in front this becomes really bad as some results can
|
2013-06-19 15:06:23 -04:00
|
|
|
# be stored associated with ip1 as the user and retrieved using ip2 causing 404s
|
2013-03-24 22:52:03 -04:00
|
|
|
Rack::MiniProfiler.config.user_provider = lambda do |env|
|
2013-03-24 23:36:55 -04:00
|
|
|
request = Rack::Request.new(env)
|
|
|
|
id = request.cookies["_t"] || request.ip || "unknown"
|
|
|
|
id = id.to_s
|
|
|
|
# some security, lets not have these tokens floating about
|
|
|
|
Digest::MD5.hexdigest(id)
|
2013-03-24 22:52:03 -04:00
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
Rack::MiniProfiler.config.position = 'left'
|
|
|
|
Rack::MiniProfiler.config.backtrace_ignores ||= []
|
|
|
|
Rack::MiniProfiler.config.backtrace_ignores << /lib\/rack\/message_bus.rb/
|
|
|
|
Rack::MiniProfiler.config.backtrace_ignores << /config\/initializers\/silence_logger/
|
|
|
|
Rack::MiniProfiler.config.backtrace_ignores << /config\/initializers\/quiet_logger/
|
|
|
|
|
2019-08-19 01:47:53 -04:00
|
|
|
Rack::MiniProfiler.config.backtrace_includes = [/^\/?(app|config|lib|test|plugins)/]
|
|
|
|
|
2013-08-30 02:44:17 -04:00
|
|
|
# Rack::MiniProfiler.counter_method(ActiveRecord::QueryMethods, 'build_arel')
|
|
|
|
# Rack::MiniProfiler.counter_method(Array, 'uniq')
|
2013-02-05 14:16:51 -05:00
|
|
|
# require "#{Rails.root}/vendor/backports/notification"
|
|
|
|
|
2013-03-24 23:09:28 -04:00
|
|
|
# inst = Class.new
|
|
|
|
# class << inst
|
|
|
|
# def start(name,id,payload)
|
|
|
|
# if Rack::MiniProfiler.current && name !~ /(process_action.action_controller)|(render_template.action_view)/
|
|
|
|
# @prf ||= {}
|
|
|
|
# @prf[id] ||= []
|
|
|
|
# @prf[id] << Rack::MiniProfiler.start_step("#{payload[:serializer] if name =~ /serialize.serializer/} #{name}")
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
|
|
|
|
# def finish(name,id,payload)
|
|
|
|
# if Rack::MiniProfiler.current && name !~ /(process_action.action_controller)|(render_template.action_view)/
|
|
|
|
# t = @prf[id].pop
|
|
|
|
# @prf.delete id unless t
|
|
|
|
# Rack::MiniProfiler.finish_step t
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
2013-02-05 14:16:51 -05:00
|
|
|
# disabling for now cause this slows stuff down too much
|
|
|
|
# ActiveSupport::Notifications.subscribe(/.*/, inst)
|
|
|
|
|
|
|
|
# Rack::MiniProfiler.profile_method ActionView::PathResolver, 'find_templates'
|
|
|
|
end
|
2015-08-19 02:58:25 -04:00
|
|
|
|
|
|
|
if ENV["PRINT_EXCEPTIONS"]
|
2017-07-27 21:20:09 -04:00
|
|
|
trace = TracePoint.new(:raise) do |tp|
|
2015-08-19 02:58:25 -04:00
|
|
|
puts tp.raised_exception
|
|
|
|
puts tp.raised_exception.backtrace.join("\n")
|
|
|
|
puts
|
|
|
|
end
|
|
|
|
trace.enable
|
|
|
|
end
|