The Healthcheck container is shut down right after performing the check, this makes it harder to troubleshoot configuration issues in the healthcheck endpoint, e.g DNS rebinding error. Printing the container logs helps the troubleshooting.
51 lines
1.3 KiB
Ruby
51 lines
1.3 KiB
Ruby
class Mrsk::Cli::Healthcheck < Mrsk::Cli::Base
|
|
MAX_ATTEMPTS = 5
|
|
|
|
class HealthcheckError < StandardError; end
|
|
|
|
default_command :perform
|
|
|
|
desc "perform", "Health check current app version"
|
|
def perform
|
|
on(MRSK.primary_host) do
|
|
begin
|
|
execute *MRSK.healthcheck.run
|
|
|
|
target = "Health check against #{MRSK.config.healthcheck["path"]}"
|
|
attempt = 1
|
|
|
|
begin
|
|
status = capture_with_info(*MRSK.healthcheck.curl)
|
|
|
|
if status == "200"
|
|
info "#{target} succeeded with 200 OK!"
|
|
else
|
|
raise HealthcheckError, "#{target} failed with status #{status}"
|
|
end
|
|
rescue SSHKit::Command::Failed
|
|
if attempt <= MAX_ATTEMPTS
|
|
info "#{target} failed to respond, retrying in #{attempt}s..."
|
|
sleep attempt
|
|
attempt += 1
|
|
|
|
retry
|
|
else
|
|
raise
|
|
end
|
|
end
|
|
rescue SSHKit::Command::Failed, HealthcheckError => e
|
|
error capture_with_info(*MRSK.healthcheck.logs)
|
|
|
|
if e.message =~ /curl/
|
|
raise SSHKit::Command::Failed, "#{target} failed to return 200 OK!"
|
|
else
|
|
raise
|
|
end
|
|
ensure
|
|
execute *MRSK.healthcheck.stop, raise_on_non_zero_exit: false
|
|
execute *MRSK.healthcheck.remove, raise_on_non_zero_exit: false
|
|
end
|
|
end
|
|
end
|
|
end
|