Skip to content

Commit

Permalink
fix: make sure plugins display correctly in logs (#4144)
Browse files Browse the repository at this point in the history
  • Loading branch information
stuartwdouglas authored Jan 22, 2025
1 parent 41e647e commit 0d38cbe
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 7 deletions.
1 change: 1 addition & 0 deletions backend/provisioner/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ func provisionerIDToProvisioner(ctx context.Context, id string, controller ftlv1
ctx,
log.FromContext(ctx).GetLevel(),
"ftl-provisioner-"+id,
"",
".",
"ftl-provisioner-"+id,
provisionerconnect.NewProvisionerPluginServiceClient,
Expand Down
1 change: 1 addition & 0 deletions backend/runner/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,7 @@ func (s *Service) deploy(ctx context.Context, key key.Deployment, module *schema
unstoppable.Context(verbCtx),
log.FromContext(ctx).GetLevel(),
module.Name,
module.Name,
deploymentDir,
"./launch",
ftlv1connect.NewVerbServiceClient,
Expand Down
23 changes: 17 additions & 6 deletions common/plugin/spawn.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,11 @@ type Plugin[Client rpc.Pingable[Req, Resp, RespPtr], Req any, Resp any, RespPtr
func Spawn[Client rpc.Pingable[Req, Resp, RespPtr], Req any, Resp any, RespPtr rpc.PingResponse[Resp]](
ctx context.Context,
defaultLevel log.Level,
name, dir, exe string,
name, module, dir, exe string,
makeClient rpc.ClientFactory[Client, Req, Resp, RespPtr],
options ...Option,
) (plugin *Plugin[Client, Req, Resp, RespPtr], cmdCtx context.Context, err error) {
logger := log.FromContext(ctx).Scope(name)
logger := log.FromContext(ctx).Scope(name).Module(module)

opts := pluginOptions{
startTimeout: time.Second * 30,
Expand Down Expand Up @@ -124,11 +124,16 @@ func Spawn[Client rpc.Pingable[Req, Resp, RespPtr], Req any, Resp any, RespPtr r
logger.Tracef("Spawning plugin on %s", pluginEndpoint)
cmd := exec.Command(ctx, defaultLevel, dir, exe)

// Send the plugin's stderr to the logger.
// Send the plugin's stderr and stdout to the logger.
cmd.Stderr = nil
pipe, err := cmd.StderrPipe()
epipe, err := cmd.StderrPipe()
if err != nil {
return nil, nil, err
return nil, nil, fmt.Errorf("failed to create stderr pipe: %w", err)
}
cmd.Stdout = nil
opipe, err := cmd.StdoutPipe()
if err != nil {
return nil, nil, fmt.Errorf("failed to create stdout pipe: %w", err)
}
cmd.Env = append(cmd.Env, "FTL_BIND="+pluginEndpoint.String())
cmd.Env = append(cmd.Env, "FTL_WORKING_DIR="+workingDir)
Expand All @@ -142,7 +147,13 @@ func Spawn[Client rpc.Pingable[Req, Resp, RespPtr], Req any, Resp any, RespPtr r
go func() { cancelWithCause(cmd.Wait()) }()

go func() {
err := log.JSONStreamer(pipe, logger, log.Error)
err := log.JSONStreamer(epipe, logger, log.Error)
if err != nil {
logger.Errorf(err, "Error streaming plugin logs.")
}
}()
go func() {
err := log.JSONStreamer(opipe, logger, log.Info)
if err != nil {
logger.Errorf(err, "Error streaming plugin logs.")
}
Expand Down
1 change: 1 addition & 0 deletions internal/buildengine/languageplugin/plugin_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ func (p *pluginClientImpl) start(ctx context.Context, dir, language, name string
plugin, cmdCtx, err := plugin.Spawn(ctx,
log.FromContext(ctx).GetLevel(),
name,
name,
dir,
cmdPath,
langconnect.NewLanguageServiceClient,
Expand Down
3 changes: 2 additions & 1 deletion internal/log/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"encoding/json"
"errors"
"io"
"strings"
"time"
)

Expand Down Expand Up @@ -69,7 +70,7 @@ func JSONStreamer(r io.Reader, log *Logger, defaultLevel Level) error {
}
}
err := scan.Err()
if errors.Is(err, io.EOF) {
if errors.Is(err, io.EOF) || (err != nil && strings.Contains(err.Error(), "already closed")) {
return nil
}
return err
Expand Down
4 changes: 4 additions & 0 deletions jvm-runtime/plugin/common/jvmcommon.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ func (s *Service) GetCreateModuleFlags(ctx context.Context, req *connect.Request
// CreateModule generates files for a new module with the requested name
func (s *Service) CreateModule(ctx context.Context, req *connect.Request[langpb.CreateModuleRequest]) (*connect.Response[langpb.CreateModuleResponse], error) {
logger := log.FromContext(ctx)
logger = logger.Module(req.Msg.Name)
projConfig := langpb.ProjectConfigFromProto(req.Msg.ProjectConfig)
groupAny, ok := req.Msg.Flags.AsMap()["group"]
if !ok {
Expand Down Expand Up @@ -189,6 +190,9 @@ func (s *Service) SyncStubReferences(ctx context.Context, req *connect.Request[l
// rebuild must include the latest build context id provided by the request or subsequent BuildContextUpdated
// calls.
func (s *Service) Build(ctx context.Context, req *connect.Request[langpb.BuildRequest], stream *connect.ServerStream[langpb.BuildResponse]) error {
logger := log.FromContext(ctx)
logger = logger.Module(req.Msg.BuildContext.ModuleConfig.Name)
ctx = log.ContextWithLogger(ctx, logger)
buildCtx, err := buildContextFromProto(req.Msg.BuildContext)
if err != nil {
return err
Expand Down

0 comments on commit 0d38cbe

Please sign in to comment.