42 lines
1.3 KiB
Ruby
42 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "opentracing"
|
|
require "active_support/all"
|
|
require "action_dispatch"
|
|
|
|
module Labkit
|
|
module Tracing
|
|
# RackMiddleware is a rack middleware component for
|
|
# instrumenting incoming http requests into a Rails/Rack
|
|
# server
|
|
class RackMiddleware
|
|
REQUEST_METHOD = "REQUEST_METHOD"
|
|
|
|
def initialize(app)
|
|
@app = app
|
|
end
|
|
|
|
def call(env)
|
|
method = env[REQUEST_METHOD]
|
|
|
|
context = TracingUtils.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) }
|
|
|
|
TracingUtils.with_tracing(operation_name: "http:#{method}", child_of: context, tags: tags) do |span|
|
|
@app.call(env).tap { |status_code, _headers, _body| span.set_tag("http.status_code", status_code) }
|
|
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
|