in lambda/rapid/start.go [116:165]
func doInitExtensions(execCtx *rapidContext, watchdog *core.Watchdog) error {
agentPaths := agents.ListExternalAgentPaths(defaultAgentLocation)
initFlow := execCtx.registrationService.InitFlow()
// we don't bring it into the loop below because we don't want unnecessary broadcasts on agent gate
if err := initFlow.SetExternalAgentsRegisterCount(uint16(len(agentPaths))); err != nil {
return err
}
for _, agentPath := range agentPaths {
env := execCtx.environment.AgentExecEnv()
agentStdoutWriter, agentStderrWriter, err := execCtx.logsEgressAPI.GetExtensionSockets()
if err != nil {
return err
}
// Compose debug log writer with all log sinks. Debug log writer w
// will not write logs when disabled by invoke parameter
agentStdoutWriter = io.MultiWriter(execCtx.debugTailLogger, agentStdoutWriter)
agentStderrWriter = io.MultiWriter(execCtx.debugTailLogger, agentStderrWriter)
agentProc := agents.NewExternalAgentProcess(agentPath, env, agentStdoutWriter, agentStderrWriter)
agent, err := execCtx.registrationService.CreateExternalAgent(agentProc.Name())
if err != nil {
return err
}
if execCtx.registrationService.CountAgents() > core.MaxAgentsAllowed {
agentLaunchError(agent, execCtx.appCtx, core.ErrTooManyExtensions)
return core.ErrTooManyExtensions
}
if err := agentProc.Start(); err != nil {
agentLaunchError(agent, execCtx.appCtx, err)
return err
}
agent.Pid = watchdog.GoWait(&agentProc, fatalerror.AgentCrash)
}
if err := initFlow.AwaitExternalAgentsRegistered(); err != nil {
return err
}
return nil
}