Sha256: 7e0e12bdcb1af89ad41fc1edaebdf4199d49cba387d3b7b1793deffcf1d18855

Contents?: true

Size: 1.85 KB

Versions: 10

Compression:

Stored size: 1.85 KB

Contents

module LitmusPaper
  module Metric
    class Script
      attr_reader :script_pid

      def initialize(command, weight, options = {})
        @command = command
        @weight = weight
        @timeout = options.fetch(:timeout, 5)
      end

      def current_health
        @weight * result
      end

      def result
        value = 0
        Timeout.timeout(@timeout) do
          script_stdout = script_stderr = nil
          script_status = POpen4.popen4(@command) do |stdout, stderr, stdin, pid|
            @script_pid = pid
            value = script_stdout = stdout.read.strip
            script_stderr = stderr.read.strip
          end
          unless script_status.success?
            LitmusPaper.logger.info("Available check to #{@command} failed with status #{$CHILD_STATUS.exitstatus}")
            LitmusPaper.logger.info("Failed stdout: #{script_stdout}")
            LitmusPaper.logger.info("Failed stderr: #{script_stderr}")
          end

          value.to_f
        end
      rescue Timeout::Error
        LitmusPaper.logger.info("Available check to '#{@command}' timed out")
        kill_and_reap_script(@script_pid)
        0
      end

      def kill_and_reap_script(pid)
        Process.kill(9, pid)
        stop_time = Time.now + 2
        while Time.now < stop_time
          if Process.waitpid(pid, Process::WNOHANG)
            LitmusPaper.logger.info("Reaped PID #{pid}")
            return
          else
            sleep 0.1
          end
        end
        LitmusPaper.logger.error("Unable to reap PID #{pid}")
      rescue Errno::ESRCH
        LitmusPaper.logger.info("Attempted to kill non-existent PID #{pid} (ESRCH)")
      rescue Errno::ECHILD
        LitmusPaper.logger.info("Attempted to reap PID #{pid} but it has already been reaped (ECHILD)")
      end

      def to_s
        "Metric::Script(#{@command}, #{@weight})"
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
litmus_paper-0.9.6 lib/litmus_paper/metric/script.rb
litmus_paper-0.9.5 lib/litmus_paper/metric/script.rb
litmus_paper-0.9.4 lib/litmus_paper/metric/script.rb
litmus_paper-0.9.3 lib/litmus_paper/metric/script.rb
litmus_paper-0.9.2 lib/litmus_paper/metric/script.rb
litmus_paper-0.9.1 lib/litmus_paper/metric/script.rb
litmus_paper-0.9.0 lib/litmus_paper/metric/script.rb
litmus_paper-0.8.9 lib/litmus_paper/metric/script.rb
litmus_paper-0.8.8 lib/litmus_paper/metric/script.rb
litmus_paper-0.8.7 lib/litmus_paper/metric/script.rb