Skip to content

Commit 6de3ef3

Browse files
authored
RSDK-6473 - Create all graph node loggers before errors (viamrobotics#3466)
1 parent c673baa commit 6de3ef3

File tree

4 files changed

+30
-14
lines changed

4 files changed

+30
-14
lines changed

resource/graph_node.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,19 @@ func (w *GraphNode) Resource() (Resource, error) {
111111
return w.current, nil
112112
}
113113

114-
// SetLogger associates a logger object with this resource node. This is expected to be the logger
115-
// passed into the `Constructor` when registering component resources.
116-
func (w *GraphNode) SetLogger(logger logging.Logger) {
114+
// InitializeLogger initializes the logger object associated with this resource node.
115+
func (w *GraphNode) InitializeLogger(parent logging.Logger, subname string, level logging.Level) {
116+
logger := parent.Sublogger(subname)
117+
logger.SetLevel(level)
117118
w.logger = logger
118119
}
119120

121+
// Logger returns the logger object associated with this resource node. This is expected to be the logger
122+
// passed into the `Constructor` when registering resources.
123+
func (w *GraphNode) Logger() logging.Logger {
124+
return w.logger
125+
}
126+
120127
// SetLogLevel changes the log level of the logger (if available). Processing configs is the main
121128
// entry point for changing log levels. Which will affect whether models making log calls are
122129
// suppressed or not.

robot/impl/local_robot.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -643,17 +643,14 @@ func (r *localRobot) newResource(
643643
}
644644
}
645645

646-
resLogger := r.logger.Sublogger(conf.ResourceName().String())
647-
resLogger.SetLevel(conf.LogConfiguration.Level)
648-
gNode.SetLogger(resLogger)
649646
if resInfo.Constructor != nil {
650-
return resInfo.Constructor(ctx, deps, conf, resLogger)
647+
return resInfo.Constructor(ctx, deps, conf, gNode.Logger())
651648
}
652649
if resInfo.DeprecatedRobotConstructor == nil {
653650
return nil, errors.Errorf("invariant: no constructor for %q", conf.API)
654651
}
655652
r.logger.CWarnw(ctx, "using deprecated robot constructor", "api", resName.API, "model", conf.Model)
656-
return resInfo.DeprecatedRobotConstructor(ctx, r, conf, resLogger)
653+
return resInfo.DeprecatedRobotConstructor(ctx, r, conf, gNode.Logger())
657654
}
658655

659656
func (r *localRobot) updateWeakDependents(ctx context.Context) {

robot/impl/resource_manager.go

+13-3
Original file line numberDiff line numberDiff line change
@@ -508,13 +508,18 @@ func (manager *resourceManager) completeConfig(
508508
)
509509
continue
510510
}
511+
if gNode.IsUninitialized() {
512+
gNode.InitializeLogger(
513+
manager.logger, fromRemoteNameToRemoteNodeName(remConf.Name).String(), manager.logger.GetLevel(),
514+
)
515+
}
511516
// this is done in config validation but partial start rules require us to check again
512517
if _, err := remConf.Validate(""); err != nil {
513518
gNode.LogAndSetLastError(
514519
fmt.Errorf("remote config validation error: %w", err), "remote", remConf.Name)
515520
continue
516521
}
517-
rr, err := manager.processRemote(ctx, *remConf)
522+
rr, err := manager.processRemote(ctx, *remConf, gNode)
518523
if err != nil {
519524
gNode.LogAndSetLastError(
520525
fmt.Errorf("error connecting to remote: %w", err), "remote", remConf.Name)
@@ -573,14 +578,18 @@ func (manager *resourceManager) completeConfig(
573578
if !(resName.API.IsComponent() || resName.API.IsService()) {
574579
return
575580
}
581+
576582
var verb string
583+
conf := gNode.Config()
577584
if gNode.IsUninitialized() {
578585
verb = "configuring"
586+
gNode.InitializeLogger(
587+
manager.logger, resName.String(), conf.LogConfiguration.Level,
588+
)
579589
} else {
580590
verb = "reconfiguring"
581591
}
582592
manager.logger.CDebugw(ctx, fmt.Sprintf("now %s resource", verb), "resource", resName)
583-
conf := gNode.Config()
584593

585594
// this is done in config validation but partial start rules require us to check again
586595
if _, err := conf.Validate("", resName.API.Type.Name); err != nil {
@@ -722,10 +731,11 @@ func cleanAppImageEnv() error {
722731
func (manager *resourceManager) processRemote(
723732
ctx context.Context,
724733
config config.Remote,
734+
gNode *resource.GraphNode,
725735
) (*client.RobotClient, error) {
726736
dialOpts := remoteDialOptions(config, manager.opts)
727737
manager.logger.CDebugw(ctx, "connecting now to remote", "remote", config.Name)
728-
robotClient, err := dialRobotClient(ctx, config, manager.logger, dialOpts...)
738+
robotClient, err := dialRobotClient(ctx, config, gNode.Logger(), dialOpts...)
729739
if err != nil {
730740
if errors.Is(err, rpc.ErrInsecureWithCredentials) {
731741
if manager.opts.fromCommand {

robot/impl/resource_manager_test.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -1301,17 +1301,19 @@ func TestConfigRemoteAllowInsecureCreds(t *testing.T) {
13011301
tlsConfig: remoteTLSConfig,
13021302
}, logger)
13031303

1304-
_, err = manager.processRemote(context.Background(), remote)
1304+
gNode := resource.NewUninitializedNode()
1305+
gNode.InitializeLogger(logger, "remote", logger.GetLevel())
1306+
_, err = manager.processRemote(context.Background(), remote, gNode)
13051307
test.That(t, err, test.ShouldNotBeNil)
13061308
test.That(t, err.Error(), test.ShouldContainSubstring, "authentication required")
13071309

13081310
remote.Auth.Entity = "wrong"
1309-
_, err = manager.processRemote(context.Background(), remote)
1311+
_, err = manager.processRemote(context.Background(), remote, gNode)
13101312
test.That(t, err, test.ShouldNotBeNil)
13111313
test.That(t, err.Error(), test.ShouldContainSubstring, "authentication required")
13121314

13131315
remote.Auth.Entity = options.FQDN
1314-
_, err = manager.processRemote(context.Background(), remote)
1316+
_, err = manager.processRemote(context.Background(), remote, gNode)
13151317
test.That(t, err, test.ShouldNotBeNil)
13161318
test.That(t, err.Error(), test.ShouldContainSubstring, "authentication required")
13171319
}

0 commit comments

Comments
 (0)