2018-11-19 21:01:13 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2015-11-04 13:13:19 -05:00
|
|
|
module Gitlab
|
|
|
|
module Sherlock
|
|
|
|
# Rack middleware used for tracking request metrics.
|
|
|
|
class Middleware
|
2019-05-05 06:19:14 -04:00
|
|
|
CONTENT_TYPES = %r{text/html|application/json}i.freeze
|
2015-11-04 13:13:19 -05:00
|
|
|
|
2019-05-05 06:19:14 -04:00
|
|
|
IGNORE_PATHS = %r{^/sherlock}.freeze
|
2015-11-04 13:13:19 -05:00
|
|
|
|
|
|
|
def initialize(app)
|
|
|
|
@app = app
|
|
|
|
end
|
|
|
|
|
2015-11-05 12:01:05 -05:00
|
|
|
# env - A Hash containing Rack environment details.
|
2015-11-04 13:13:19 -05:00
|
|
|
def call(env)
|
|
|
|
if instrument?(env)
|
|
|
|
call_with_instrumentation(env)
|
|
|
|
else
|
|
|
|
@app.call(env)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def call_with_instrumentation(env)
|
2015-11-05 12:01:05 -05:00
|
|
|
trans = transaction_from_env(env)
|
2015-11-04 13:13:19 -05:00
|
|
|
retval = trans.run { @app.call(env) }
|
|
|
|
|
|
|
|
Sherlock.collection.add(trans)
|
|
|
|
|
|
|
|
retval
|
|
|
|
end
|
|
|
|
|
|
|
|
def instrument?(env)
|
|
|
|
!!(env['HTTP_ACCEPT'] =~ CONTENT_TYPES &&
|
|
|
|
env['REQUEST_URI'] !~ IGNORE_PATHS)
|
|
|
|
end
|
2015-11-05 12:01:05 -05:00
|
|
|
|
|
|
|
def transaction_from_env(env)
|
|
|
|
Transaction.new(env['REQUEST_METHOD'], env['REQUEST_URI'])
|
|
|
|
end
|
2015-11-04 13:13:19 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|