diff options
Diffstat (limited to 'lib/gitlab/metrics/requests_rack_middleware.rb')
-rw-r--r-- | lib/gitlab/metrics/requests_rack_middleware.rb | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/lib/gitlab/metrics/requests_rack_middleware.rb b/lib/gitlab/metrics/requests_rack_middleware.rb index 15db3999fa4..f6bda0dbea4 100644 --- a/lib/gitlab/metrics/requests_rack_middleware.rb +++ b/lib/gitlab/metrics/requests_rack_middleware.rb @@ -3,20 +3,13 @@ module Gitlab module Metrics class RequestsRackMiddleware - HTTP_METHODS = { - "delete" => %w(200 202 204 303 400 401 403 404 410 422 500 503), - "get" => %w(200 204 301 302 303 304 307 400 401 403 404 410 412 422 429 500 503), - "head" => %w(200 204 301 302 303 304 400 401 403 404 410 429 500 503), - "options" => %w(200 404), - "patch" => %w(200 202 204 400 403 404 409 416 422 500), - "post" => %w(200 201 202 204 301 302 303 304 400 401 403 404 406 409 410 412 413 415 422 429 500 503), - "propfind" => %w(404), - "put" => %w(200 202 204 400 401 403 404 405 406 409 410 415 422 500), - "report" => %w(404) - }.freeze + HTTP_METHODS = %w(delete get head options patch post put).to_set.freeze HEALTH_ENDPOINT = /^\/-\/(liveness|readiness|health|metrics)\/?$/.freeze + FEATURE_CATEGORY_HEADER = 'X-Gitlab-Feature-Category' + FEATURE_CATEGORY_DEFAULT = 'unknown' + def initialize(app) @app = app end @@ -39,33 +32,39 @@ module Gitlab end def self.initialize_http_request_duration_seconds - HTTP_METHODS.each do |method, statuses| - statuses.each do |status| - http_request_duration_seconds.get({ method: method, status: status.to_s }) - end + HTTP_METHODS.each do |method| + http_request_duration_seconds.get({ method: method }) end end def call(env) method = env['REQUEST_METHOD'].downcase + method = 'INVALID' unless HTTP_METHODS.include?(method) started = Time.now.to_f + health_endpoint = health_endpoint?(env['PATH_INFO']) + status = 'undefined' + feature_category = nil begin - if health_endpoint?(env['PATH_INFO']) - RequestsRackMiddleware.http_health_requests_total.increment(method: method) - else - RequestsRackMiddleware.http_request_total.increment(method: method) - end - status, headers, body = @app.call(env) elapsed = Time.now.to_f - started - RequestsRackMiddleware.http_request_duration_seconds.observe({ method: method, status: status.to_s }, elapsed) + feature_category = headers&.fetch(FEATURE_CATEGORY_HEADER, nil) + + unless health_endpoint + RequestsRackMiddleware.http_request_duration_seconds.observe({ method: method }, elapsed) + end [status, headers, body] rescue RequestsRackMiddleware.rack_uncaught_errors_count.increment raise + ensure + if health_endpoint + RequestsRackMiddleware.http_health_requests_total.increment(status: status, method: method) + else + RequestsRackMiddleware.http_request_total.increment(status: status, method: method, feature_category: feature_category || FEATURE_CATEGORY_DEFAULT) + end end end |