class ElasticAPM::Spies::RakeSpy

@api private

def execute(*args)

def execute(*args)
  agent = ElasticAPM.start
  unless agent && agent.config.instrumented_rake_tasks.include?(name)
    return execute_without_apm(*args)
  end
  transaction = ElasticAPM.transaction("Rake::Task[#{name}]", 'Rake')
  begin
    result = execute_without_apm(*args)
    transaction.submit('success') if transaction
  rescue StandardError => e
    transaction.submit(:error) if transaction
    ElasticAPM.report(e)
    raise
  ensure
    transaction.release if transaction
    ElasticAPM.stop
  end
  result
end

def install

rubocop:disable Metrics/CyclomaticComplexity
rubocop:disable Metrics/AbcSize, Metrics/MethodLength
def install
  ::Rake::Task.class_eval do
    alias execute_without_apm execute
    def execute(*args)
      agent = ElasticAPM.start
      unless agent && agent.config.instrumented_rake_tasks.include?(name)
        return execute_without_apm(*args)
      end
      transaction = ElasticAPM.transaction("Rake::Task[#{name}]", 'Rake')
      begin
        result = execute_without_apm(*args)
        transaction.submit('success') if transaction
      rescue StandardError => e
        transaction.submit(:error) if transaction
        ElasticAPM.report(e)
        raise
      ensure
        transaction.release if transaction
        ElasticAPM.stop
      end
      result
    end
  end
end