diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-04-29 18:10:07 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-04-29 18:10:07 +0300 |
commit | c5e4f06c597e7ef9b584595a55a82cb221804e4b (patch) | |
tree | 2db854553738bf601a40d427dbb9eaf5516be027 /lib/gitlab/middleware | |
parent | db36dea03b0e56ed242eb290c51be88ca4c61a65 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/middleware')
-rw-r--r-- | lib/gitlab/middleware/speedscope.rb | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/lib/gitlab/middleware/speedscope.rb b/lib/gitlab/middleware/speedscope.rb index 7eade40c47a..547aab9c797 100644 --- a/lib/gitlab/middleware/speedscope.rb +++ b/lib/gitlab/middleware/speedscope.rb @@ -8,35 +8,43 @@ module Gitlab end def call(env) - request = Rack::Request.new(env) + request = ActionDispatch::Request.new(env) - if request.params['performance_bar'] == 'flamegraph' && Gitlab::PerformanceBar.allowed_for_user?(request.env['warden'].user) - body = nil + return @app.call(env) unless rendering_flamegraph?(request) - Gitlab::SafeRequestStore[:capturing_flamegraph] = true + body = nil - require 'stackprof' + ::Gitlab::SafeRequestStore[:capturing_flamegraph] = true + require 'stackprof' + + begin flamegraph = ::StackProf.run( mode: :wall, raw: true, aggregate: false, - interval: (0.5 * 1000).to_i + interval: ::Gitlab::StackProf::DEFAULT_INTERVAL_US ) do _, _, body = @app.call(env) end - - path = env['PATH_INFO'].sub('//', '/') + ensure body.close if body.respond_to?(:close) - - return flamegraph(flamegraph, path) end - @app.call(env) + render_flamegraph(flamegraph, request) end - def flamegraph(graph, path) + private + + def rendering_flamegraph?(request) + request.params['performance_bar'] == 'flamegraph' && ::Gitlab::PerformanceBar.allowed_for_user?(request.env['warden']&.user) + end + + def render_flamegraph(graph, request) headers = { 'Content-Type' => 'text/html' } + path = request.env['PATH_INFO'].sub('//', '/') + + speedscope_url = ActionController::Base.helpers.asset_url('/-/speedscope/index.html') html = <<~HTML <!DOCTYPE html> @@ -48,7 +56,7 @@ module Gitlab </style> </head> <body> - <script type="text/javascript"> + <script type="text/javascript" nonce="#{request.content_security_policy_nonce}"> var graph = #{Gitlab::Json.generate(graph)}; var json = JSON.stringify(graph); var blob = new Blob([json], { type: 'text/plain' }); @@ -56,7 +64,7 @@ module Gitlab var iframe = document.createElement('IFRAME'); iframe.setAttribute('id', 'speedscope-iframe'); document.body.appendChild(iframe); - var iframeUrl = '#{Gitlab.config.gitlab.relative_url_root}/assets/speedscope/index.html#profileURL=' + objUrl + '&title=' + 'Flamegraph for #{CGI.escape(path)}'; + var iframeUrl = '#{speedscope_url}#profileURL=' + objUrl + '&title=' + 'Flamegraph for #{CGI.escape(path)}'; iframe.setAttribute('src', iframeUrl); </script> </body> |