Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
0ca7b3ba
Commit
0ca7b3ba
authored
Jun 14, 2016
by
Yorick Peterse
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '18449-instrument-grape-endpoints' into 'master'
Instrument Grape API endpoints See merge request !4587
parents
f558bf0d
509082ba
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
53 additions
and
1 deletion
+53
-1
lib/gitlab/metrics/rack_middleware.rb
lib/gitlab/metrics/rack_middleware.rb
+24
-1
spec/lib/gitlab/metrics/rack_middleware_spec.rb
spec/lib/gitlab/metrics/rack_middleware_spec.rb
+29
-0
No files found.
lib/gitlab/metrics/rack_middleware.rb
View file @
0ca7b3ba
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
...
@@ -21,6 +22,8 @@ module Gitlab
...
@@ -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
...
@@ -42,6 +45,26 @@ module Gitlab
...
@@ -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
spec/lib/gitlab/metrics/rack_middleware_spec.rb
View file @
0ca7b3ba
...
@@ -31,6 +31,20 @@ describe Gitlab::Metrics::RackMiddleware do
...
@@ -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
...
@@ -60,4 +74,19 @@ describe Gitlab::Metrics::RackMiddleware do
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment