46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# 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
 |