Sha256: 33e7598b210469ce4c9cb851f6776ae57343f9d62f4c7b41c1e66bdefb7f3a86

Contents?: true

Size: 1.33 KB

Versions: 5

Compression:

Stored size: 1.33 KB

Contents

# typed: true
module Datadog
  module Tasks
    # Wraps command with Datadog tracing
    class Exec
      attr_reader :args

      def initialize(args)
        @args = args
      end

      def run
        set_rubyopt!
        exec_with_error_handling(args)
      end

      def rubyopts
        [
          '-rddtrace/profiling/preload'
        ]
      end

      private

      def set_rubyopt!
        existing_rubyopt = ENV['RUBYOPT']

        ENV['RUBYOPT'] = existing_rubyopt ? "#{existing_rubyopt} #{rubyopts.join(' ')}" : rubyopts.join(' ')
      end

      # If there's an error here, rather than throwing a cryptic stack trace, let's instead have clearer messages, and
      # follow the same status codes as the shell uses
      # See also:
      # * https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html
      # * https://github.com/rubygems/rubygems/blob/dd93966cac224532035deda533cba2685dfa30cc/bundler/lib/bundler/cli/exec.rb#L45
      def exec_with_error_handling(args)
        Kernel.exec(*args)
      rescue Errno::ENOENT => e
        Kernel.warn "ddtracerb exec failed: #{e.message} (command was '#{args.join(' ')}')"
        Kernel.exit 127
      rescue Errno::EACCES, Errno::ENOEXEC => e
        Kernel.warn "ddtracerb exec failed: #{e.message} (command was '#{args.join(' ')}')"
        Kernel.exit 126
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
ddtrace-0.54.2 lib/ddtrace/tasks/exec.rb
ddtrace-0.54.1 lib/ddtrace/tasks/exec.rb
ddtrace-0.54.0 lib/ddtrace/tasks/exec.rb
ddtrace-0.53.0 lib/ddtrace/tasks/exec.rb
ddtrace-0.52.0 lib/ddtrace/tasks/exec.rb