diff options
author | Stan Hu <stanhu@gmail.com> | 2018-07-06 13:20:02 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2018-07-28 14:35:02 -0700 |
commit | eb2bc7d99a99981150f32ac2469bff29eebbfa19 (patch) | |
tree | 89fa9dab380931b67718443ab17f61c486df12c9 /lib | |
parent | 87f03f01735fb4b6dbef2e4bf625cf2546523a4e (diff) | |
download | gitlab-ce-eb2bc7d99a99981150f32ac2469bff29eebbfa19.tar.gz |
Simplify /-/liveness check to avoid connecting to the database
The previous implementation would hit the database each time
and provide a dummy response. If the database goes down, this
means all application workers would be taken out of service.
Simplify this check by using a Rails middleware that intercepts
this endpoint and returns a 200 response.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/middleware/liveness_health_check.rb | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/gitlab/middleware/liveness_health_check.rb b/lib/gitlab/middleware/liveness_health_check.rb new file mode 100644 index 00000000000..404c506a08e --- /dev/null +++ b/lib/gitlab/middleware/liveness_health_check.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +# This middleware provides a health check that does not hit the database. Its purpose +# is to notify the prober that the application server is handling requests, but a 200 +# response does not signify that the database or other services are ready. +# +# See https://thisdata.com/blog/making-a-rails-health-check-that-doesnt-hit-the-database/ for +# more details. + +module Gitlab + module Middleware + class LivenessHealthCheck + # This can't be frozen because Rails::Rack::Logger wraps the body + # rubocop:disable Style/MutableConstant + OK_RESPONSE = [200, { 'Content-Type' => 'text/plain' }, ["GitLab is alive"]] + EMPTY_RESPONSE = [404, { 'Content-Type' => 'text/plain' }, [""]] + # rubocop:enable Style/MutableConstant + LIVENESS_PATH = '/-/liveness' + + def initialize(app) + @app = app + end + + def call(env) + return @app.call(env) unless env['PATH_INFO'] == LIVENESS_PATH + + request = Rack::Request.new(env) + + return OK_RESPONSE if client_ip_whitelisted?(request) + + EMPTY_RESPONSE + end + + def client_ip_whitelisted?(request) + ip_whitelist.any? { |e| e.include?(request.ip) } + end + + def ip_whitelist + @ip_whitelist ||= Settings.monitoring.ip_whitelist.map(&IPAddr.method(:new)) + end + end + end +end |