class Mnemosyne::Middleware::Rack

Public Class Methods

new(app) click to toggle source
# File lib/mnemosyne/middleware/rack.rb, line 57
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/mnemosyne/middleware/rack.rb, line 61
def call(env)
  origin      = env.fetch('HTTP_X_MNEMOSYNE_ORIGIN', false)
  transaction = env.fetch('HTTP_X_MNEMOSYNE_TRANSACTION') do
    ::SecureRandom.uuid
  end

  trace = ::Mnemosyne::Instrumenter.trace 'app.web.request.rack',
    transaction: transaction,
    origin: origin

  if trace
    trace.start!

    scan_request(trace, env)

    response = @app.call env

    scan_response(trace, response)

    response[2] = Proxy.new(response[2], trace)
    response
  else
    @app.call env
  end
rescue StandardError, LoadError, SyntaxError => e
  if trace
    trace.attach_error(e)
    trace.submit
  end

  raise
ensure
  trace&.release
end

Private Instance Methods

scan_request(trace, env) click to toggle source
# File lib/mnemosyne/middleware/rack.rb, line 98
def scan_request(trace, env)
  trace.meta[:method] = env['REQUEST_METHOD']
  trace.meta[:path] = env['REQUEST_PATH']
  trace.meta[:query] = env['QUERY_STRING']
  trace.meta[:protocol] = env['SERVER_PROTOCOL']
  trace.meta[:headers] = {
    Accept: env['HTTP_ACCEPT'],
    Host: env['HTTP_HOST'],
    'User-Agent': env['HTTP_USER_AGENT']
  }
end
scan_response(trace, response) click to toggle source
# File lib/mnemosyne/middleware/rack.rb, line 110
def scan_response(trace, response)
  status, headers, = response

  trace.meta[:status] = status

  return unless headers

  trace.meta.merge!({
    content_type: headers['Content-Type'],
    location: headers['Location']
  }.compact)
end