Skip to content
Snippets Groups Projects
Commit 509082ba authored by Paco Guzman's avatar Paco Guzman
Browse files

Instrument Grape Endpoint with Metrics::RackMiddleware

Generating the following tags

Grape#GET /projects/:id/archive

from Grape::Route objects like

{ :path => /:version/projects/:id/archive(.:format)
  :version => “v3”,
  :method => “GET” }

Use an instance variable to cache raw_path transformations.
This variable is only going to growth to the number of 
endpoints of the API, not with exact different requests

We can store this cache as an instance variable because 
middleware are initialised only once
parent 0c0ef7df
No related branches found
No related tags found
No related merge requests found
module Gitlab module Gitlab
module Metrics module Metrics
# Rack middleware for tracking Rails requests. # Rack middleware for tracking Rails and Grape requests.
class RackMiddleware class RackMiddleware
CONTROLLER_KEY = 'action_controller.instance' CONTROLLER_KEY = 'action_controller.instance'
ENDPOINT_KEY = 'api.endpoint'
   
def initialize(app) def initialize(app)
@app = app @app = app
Loading
@@ -21,6 +22,8 @@ module Gitlab
Loading
@@ -21,6 +22,8 @@ module Gitlab
ensure ensure
if env[CONTROLLER_KEY] if env[CONTROLLER_KEY]
tag_controller(trans, env) tag_controller(trans, env)
elsif env[ENDPOINT_KEY]
tag_endpoint(trans, env)
end end
   
trans.finish trans.finish
Loading
@@ -42,6 +45,26 @@ module Gitlab
Loading
@@ -42,6 +45,26 @@ module Gitlab
controller = env[CONTROLLER_KEY] controller = env[CONTROLLER_KEY]
trans.action = "#{controller.class.name}##{controller.action_name}" trans.action = "#{controller.class.name}##{controller.action_name}"
end end
def tag_endpoint(trans, env)
endpoint = env[ENDPOINT_KEY]
path = endpoint_paths_cache[endpoint.route.route_method][endpoint.route.route_path]
trans.action = "Grape##{endpoint.route.route_method} #{path}"
end
private
def endpoint_paths_cache
@endpoint_paths_cache ||= Hash.new do |hash, http_method|
hash[http_method] = Hash.new do |inner_hash, raw_path|
inner_hash[raw_path] = endpoint_instrumentable_path(raw_path)
end
end
end
def endpoint_instrumentable_path(raw_path)
raw_path.sub('(.:format)', '').sub('/:version', '')
end
end end
end end
end end
Loading
@@ -31,6 +31,20 @@ describe Gitlab::Metrics::RackMiddleware do
Loading
@@ -31,6 +31,20 @@ describe Gitlab::Metrics::RackMiddleware do
   
middleware.call(env) middleware.call(env)
end end
it 'tags a transaction with the method andpath of the route in the grape endpoint' do
route = double(:route, route_method: "GET", route_path: "/:version/projects/:id/archive(.:format)")
endpoint = double(:endpoint, route: route)
env['api.endpoint'] = endpoint
allow(app).to receive(:call).with(env)
expect(middleware).to receive(:tag_endpoint).
with(an_instance_of(Gitlab::Metrics::Transaction), env)
middleware.call(env)
end
end end
   
describe '#transaction_from_env' do describe '#transaction_from_env' do
Loading
@@ -60,4 +74,19 @@ describe Gitlab::Metrics::RackMiddleware do
Loading
@@ -60,4 +74,19 @@ describe Gitlab::Metrics::RackMiddleware do
expect(transaction.action).to eq('TestController#show') expect(transaction.action).to eq('TestController#show')
end end
end end
describe '#tag_endpoint' do
let(:transaction) { middleware.transaction_from_env(env) }
it 'tags a transaction with the method and path of the route in the grape endpount' do
route = double(:route, route_method: "GET", route_path: "/:version/projects/:id/archive(.:format)")
endpoint = double(:endpoint, route: route)
env['api.endpoint'] = endpoint
middleware.tag_endpoint(transaction, env)
expect(transaction.action).to eq('Grape#GET /projects/:id/archive')
end
end
end end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment