From 0e19ead37cacf0234eea5d512b0142be2a32326d Mon Sep 17 00:00:00 2001 From: Jberczel Date: Wed, 3 May 2023 14:15:46 -0400 Subject: [PATCH] Capture container health log when unhealthy --- lib/mrsk/cli/healthcheck.rb | 1 + lib/mrsk/commands/base.rb | 1 + lib/mrsk/commands/healthcheck.rb | 4 ++++ lib/mrsk/sshkit_with_ext.rb | 5 +++++ test/cli/healthcheck_test.rb | 5 +++++ test/commands/healthcheck_test.rb | 6 ++++++ 6 files changed, 22 insertions(+) diff --git a/lib/mrsk/cli/healthcheck.rb b/lib/mrsk/cli/healthcheck.rb index 81677d62..2db63ce7 100644 --- a/lib/mrsk/cli/healthcheck.rb +++ b/lib/mrsk/cli/healthcheck.rb @@ -9,6 +9,7 @@ class Mrsk::Cli::Healthcheck < Mrsk::Cli::Base Mrsk::Utils::HealthcheckPoller.wait_for_healthy { capture_with_info(*MRSK.healthcheck.status) } rescue Mrsk::Utils::HealthcheckPoller::HealthcheckError => e error capture_with_info(*MRSK.healthcheck.logs) + error capture_with_pretty_json(*MRSK.healthcheck.container_health_log) raise ensure execute *MRSK.healthcheck.stop, raise_on_non_zero_exit: false diff --git a/lib/mrsk/commands/base.rb b/lib/mrsk/commands/base.rb index 49911a04..4ca57fa0 100644 --- a/lib/mrsk/commands/base.rb +++ b/lib/mrsk/commands/base.rb @@ -3,6 +3,7 @@ module Mrsk::Commands delegate :sensitive, :argumentize, to: Mrsk::Utils DOCKER_HEALTH_STATUS_FORMAT = "'{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}'" + DOCKER_HEALTH_LOG_FORMAT = "'{{json .State.Health}}'" attr_accessor :config diff --git a/lib/mrsk/commands/healthcheck.rb b/lib/mrsk/commands/healthcheck.rb index 14932f3a..ad8070df 100644 --- a/lib/mrsk/commands/healthcheck.rb +++ b/lib/mrsk/commands/healthcheck.rb @@ -22,6 +22,10 @@ class Mrsk::Commands::Healthcheck < Mrsk::Commands::Base pipe container_id, xargs(docker(:inspect, "--format", DOCKER_HEALTH_STATUS_FORMAT)) end + def container_health_log + pipe container_id, xargs(docker(:inspect, "--format", DOCKER_HEALTH_LOG_FORMAT)) + end + def logs pipe container_id, xargs(docker(:logs, "--tail", 50, "2>&1")) end diff --git a/lib/mrsk/sshkit_with_ext.rb b/lib/mrsk/sshkit_with_ext.rb index 075c2643..a32e0b4b 100644 --- a/lib/mrsk/sshkit_with_ext.rb +++ b/lib/mrsk/sshkit_with_ext.rb @@ -1,5 +1,6 @@ require "sshkit" require "sshkit/dsl" +require "json" class SSHKit::Backend::Abstract def capture_with_info(*args, **kwargs) @@ -9,4 +10,8 @@ class SSHKit::Backend::Abstract def puts_by_host(host, output, type: "App") puts "#{type} Host: #{host}\n#{output}\n\n" end + + def capture_with_pretty_json(*args, **kwargs) + JSON.pretty_generate(JSON.parse(capture(*args, **kwargs))) + end end diff --git a/test/cli/healthcheck_test.rb b/test/cli/healthcheck_test.rb index a3577aa4..67c3314f 100644 --- a/test/cli/healthcheck_test.rb +++ b/test/cli/healthcheck_test.rb @@ -53,6 +53,11 @@ class CliHealthcheckTest < CliTestCase .with(:docker, :container, :ls, "--all", "--filter", "name=^healthcheck-app-999$", "--quiet", "|", :xargs, :docker, :logs, "--tail", 50, "2>&1") .returns("some log output") + # Capture container health log when failing + SSHKit::Backend::Abstract.any_instance.stubs(:capture_with_pretty_json) + .with(:docker, :container, :ls, "--all", "--filter", "name=^healthcheck-app-999$", "--quiet", "|", :xargs, :docker, :inspect, "--format", "'{{json .State.Health}}'") + .returns('{"Status":"unhealthy","Log":[{"ExitCode": 1,"Output": "/bin/sh: 1: curl: not found\n"}]}"') + exception = assert_raises do run_command("perform") end diff --git a/test/commands/healthcheck_test.rb b/test/commands/healthcheck_test.rb index 68387487..4bf46ac0 100644 --- a/test/commands/healthcheck_test.rb +++ b/test/commands/healthcheck_test.rb @@ -51,6 +51,12 @@ class CommandsHealthcheckTest < ActiveSupport::TestCase new_command.status.join(" ") end + test "container_health_log" do + assert_equal \ + "docker container ls --all --filter name=^healthcheck-app-123$ --quiet | xargs docker inspect --format '{{json .State.Health}}'", + new_command.container_health_log.join(" ") + end + test "stop" do assert_equal \ "docker container ls --all --filter name=^healthcheck-app-123$ --quiet | xargs docker stop",