Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/middleware/memory_report.rb')
-rw-r--r--lib/gitlab/middleware/memory_report.rb45
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