diff options
Diffstat (limited to 'lib/gitlab/middleware/memory_report.rb')
-rw-r--r-- | lib/gitlab/middleware/memory_report.rb | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/gitlab/middleware/memory_report.rb b/lib/gitlab/middleware/memory_report.rb new file mode 100644 index 00000000000..1c6c771009c --- /dev/null +++ b/lib/gitlab/middleware/memory_report.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module Gitlab + module Middleware + class MemoryReport + def initialize(app) + @app = app + end + + def call(env) + request = ActionDispatch::Request.new(env) + + return @app.call(env) unless rendering_memory_profiler?(request) + + begin + require 'memory_profiler' + + report = MemoryProfiler.report do + @app.call(env) + end + + report = report_to_string(report) + headers = { 'Content-Type' => 'text/plain' } + + [200, headers, [report]] + rescue StandardError => e + ::Gitlab::ErrorTracking.track_exception(e) + [500, { 'Content-Type' => 'text/plain' }, ["Could not generate memory report: #{e}"]] + end + end + + private + + def rendering_memory_profiler?(request) + Rails.env.development? && request.params['performance_bar'] == 'memory' + end + + def report_to_string(report) + io = StringIO.new + report.pretty_print(io, detailed_report: true, scale_bytes: true, normalize_paths: true) + io.string + end + end + end +end |