47 lines
1.2 KiB
Ruby
47 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'opentracing'
|
||
|
|
||
|
module Gitlab
|
||
|
module Tracing
|
||
|
class RackMiddleware
|
||
|
include Common
|
||
|
|
||
|
REQUEST_METHOD = 'REQUEST_METHOD'
|
||
|
|
||
|
def initialize(app)
|
||
|
@app = app
|
||
|
end
|
||
|
|
||
|
def call(env)
|
||
|
method = env[REQUEST_METHOD]
|
||
|
|
||
|
context = tracer.extract(OpenTracing::FORMAT_RACK, env)
|
||
|
tags = {
|
||
|
'component' => 'rack',
|
||
|
'span.kind' => 'server',
|
||
|
'http.method' => method,
|
||
|
'http.url' => self.class.build_sanitized_url_from_env(env)
|
||
|
}
|
||
|
|
||
|
in_tracing_span(operation_name: "http:#{method}", child_of: context, tags: tags) do |span|
|
||
|
@app.call(env).tap do |status_code, _headers, _body|
|
||
|
span.set_tag('http.status_code', status_code)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Generate a sanitized (safe) request URL from the rack environment
|
||
|
def self.build_sanitized_url_from_env(env)
|
||
|
request = ActionDispatch::Request.new(env)
|
||
|
|
||
|
original_url = request.original_url
|
||
|
uri = URI.parse(original_url)
|
||
|
uri.query = request.filtered_parameters.to_query if uri.query.present?
|
||
|
|
||
|
uri.to_s
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|