diff --git a/pkg/certmonitor/certmonitor.go b/pkg/certmonitor/certmonitor.go index 9b17fc15d62..43b7f5202fe 100644 --- a/pkg/certmonitor/certmonitor.go +++ b/pkg/certmonitor/certmonitor.go @@ -50,7 +50,7 @@ func Setup(ctx context.Context, nodeConfig *daemonconfig.Node, dataDir string) e return err } - recorder := util.BuildControllerEventRecorder(client, controllerName, metav1.NamespaceDefault) + recorder := util.BuildControllerEventRecorder(ctx, client, controllerName, metav1.NamespaceDefault) // This is consistent with events attached to the node generated by the kubelet // https://github.com/kubernetes/kubernetes/blob/612130dd2f4188db839ea5c2dea07a96b0ad8d1c/pkg/kubelet/kubelet.go#L479-L485 diff --git a/pkg/cli/agent/agent.go b/pkg/cli/agent/agent.go index cb89e47141f..99439c195a5 100644 --- a/pkg/cli/agent/agent.go +++ b/pkg/cli/agent/agent.go @@ -49,7 +49,7 @@ func Run(clx *cli.Context) (rerr error) { } klog.EnableContextualLogging(true) - ctx := klog.NewContext(signals.SetupSignalContext(), logger.NewLogrusSink(nil).AsLogr()) + ctx := logger.NewContext(signals.SetupSignalContext(), version.Program) wg := &sync.WaitGroup{} // If exiting due to an error, ensure that contexts are cancelled so that the diff --git a/pkg/cli/server/server.go b/pkg/cli/server/server.go index 847a1d0c6d4..baa3047c2dd 100644 --- a/pkg/cli/server/server.go +++ b/pkg/cli/server/server.go @@ -11,7 +11,6 @@ import ( "time" systemd "github.com/coreos/go-systemd/v22/daemon" - "github.com/go-logr/logr" "github.com/k3s-io/k3s/pkg/agent" "github.com/k3s-io/k3s/pkg/agent/https" "github.com/k3s-io/k3s/pkg/agent/loadbalancer" @@ -79,7 +78,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont } klog.EnableContextualLogging(true) - ctx := logr.NewContext(signals.SetupSignalContext(), logger.NewLogrusSink(nil).AsLogr()) + ctx := logger.NewContext(signals.SetupSignalContext(), version.Program) wg := &sync.WaitGroup{} // If exiting due to an error, ensure that contexts are cancelled so that the diff --git a/pkg/cloudprovider/cloudprovider.go b/pkg/cloudprovider/cloudprovider.go index 54ec3134bd9..1e106249b20 100644 --- a/pkg/cloudprovider/cloudprovider.go +++ b/pkg/cloudprovider/cloudprovider.go @@ -6,6 +6,7 @@ import ( "io" "github.com/k3s-io/k3s/pkg/util" + "github.com/k3s-io/k3s/pkg/util/logger" "github.com/k3s-io/k3s/pkg/version" "github.com/rancher/wrangler/v3/pkg/apply" "github.com/rancher/wrangler/v3/pkg/generated/controllers/apps" @@ -82,13 +83,13 @@ func init() { } func (k *k3s) Initialize(clientBuilder cloudprovider.ControllerClientBuilder, stop <-chan struct{}) { - ctx := wait.ContextForChannel(stop) + ctx := logger.NewContext(wait.ContextForChannel(stop), controllerName) config := clientBuilder.ConfigOrDie(controllerName) k.client = kubernetes.NewForConfigOrDie(config) if k.LBEnabled { // Wrangler controller and caches are only needed if the load balancer controller is enabled. - k.recorder = util.BuildControllerEventRecorder(k.client, controllerName, meta.NamespaceAll) + k.recorder = util.BuildControllerEventRecorder(ctx, k.client, controllerName, meta.NamespaceAll) coreFactory := core.NewFactoryFromConfigOrDie(config) k.nodeCache = coreFactory.Core().V1().Node().Cache() diff --git a/pkg/deploy/controller.go b/pkg/deploy/controller.go index 398273f4991..932feb1839a 100644 --- a/pkg/deploy/controller.go +++ b/pkg/deploy/controller.go @@ -20,6 +20,7 @@ import ( "github.com/k3s-io/k3s/pkg/agent/util" pkgutil "github.com/k3s-io/k3s/pkg/util" "github.com/k3s-io/k3s/pkg/util/errors" + "github.com/k3s-io/k3s/pkg/util/logger" "github.com/rancher/wrangler/v3/pkg/apply" "github.com/rancher/wrangler/v3/pkg/kv" "github.com/rancher/wrangler/v3/pkg/objectset" @@ -83,7 +84,7 @@ type watcher struct { // start calls listFiles at regular intervals to trigger application of manifests that have changed on disk. func (w *watcher) start(ctx context.Context, client kubernetes.Interface) { - w.recorder = pkgutil.BuildControllerEventRecorder(client, ControllerName, metav1.NamespaceSystem) + w.recorder = pkgutil.BuildControllerEventRecorder(logger.NewContext(ctx, ControllerName), client, ControllerName, metav1.NamespaceSystem) force := true for { if err := w.listFiles(force); err == nil { diff --git a/pkg/server/context.go b/pkg/server/context.go index d734bb02714..a56a9243011 100644 --- a/pkg/server/context.go +++ b/pkg/server/context.go @@ -82,7 +82,7 @@ func NewContext(ctx context.Context, config *Config) (*Context, error) { Discovery: discovery.NewFactoryFromConfigOrDie(restConfig), Helm: hf, - Event: util.BuildControllerEventRecorder(k8s, version.Program+"-supervisor", metav1.NamespaceAll), + Event: util.BuildControllerEventRecorder(ctx, k8s, version.Program+"-supervisor", metav1.NamespaceAll), K8s: k8s, Ext: ext, } diff --git a/pkg/server/handlers/handlers_test.go b/pkg/server/handlers/handlers_test.go index 85ab74e215d..9b44bf1e1c5 100644 --- a/pkg/server/handlers/handlers_test.go +++ b/pkg/server/handlers/handlers_test.go @@ -1747,7 +1747,7 @@ func getMockedControl(t *testing.T) (*config.Control, context.CancelFunc) { control.Runtime.K8s = k8s // create event recorder - control.Runtime.Event = util.BuildControllerEventRecorder(control.Runtime.K8s, version.Program+"-supervisor", metav1.NamespaceAll) + control.Runtime.Event = util.BuildControllerEventRecorder(ctx, control.Runtime.K8s, version.Program+"-supervisor", metav1.NamespaceAll) // start the node password controller err = nodepassword.Register(ctx, control.Runtime.K8s, coreFactory.Core().V1().Secret(), coreFactory.Core().V1().Node()) diff --git a/pkg/server/handlers/secrets-encrypt.go b/pkg/server/handlers/secrets-encrypt.go index 4a446dacf00..6bf5f72e814 100644 --- a/pkg/server/handlers/secrets-encrypt.go +++ b/pkg/server/handlers/secrets-encrypt.go @@ -453,7 +453,7 @@ func updateSecrets(ctx context.Context, control *config.Control, nodeName string } // For backwards compatibility with the old controller, we use an event recorder instead of logrus - recorder := util.BuildControllerEventRecorder(k8s, "secrets-reencrypt", metav1.NamespaceDefault) + recorder := util.BuildControllerEventRecorder(ctx, k8s, "secrets-reencrypt", metav1.NamespaceDefault) secretPager := pager.New(pager.SimplePageFunc(func(opts metav1.ListOptions) (runtime.Object, error) { return k8s.CoreV1().Secrets(metav1.NamespaceAll).List(ctx, opts) diff --git a/pkg/server/server.go b/pkg/server/server.go index 6153d3575ae..d7feba38b4d 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -250,7 +250,7 @@ func coreControllers(ctx context.Context, sc *Context, config *Config) error { strconv.Itoa(config.ControlConfig.HTTPSPort), k8s, apply, - util.BuildControllerEventRecorder(k8s, helmcommon.Name, metav1.NamespaceAll), + util.BuildControllerEventRecorder(ctx, k8s, helmcommon.Name, metav1.NamespaceAll), helm.V1().HelmChart(), helm.V1().HelmChart().Cache(), helm.V1().HelmChartConfig(), diff --git a/pkg/spegel/spegel.go b/pkg/spegel/spegel.go index f64b15e1704..38c90d22077 100644 --- a/pkg/spegel/spegel.go +++ b/pkg/spegel/spegel.go @@ -154,7 +154,7 @@ func (c *Config) Start(ctx context.Context, nodeConfig *config.Node, criReadyCha c.ExternalAddress, c.RegistryPort, registries) // set up the various logging logging frameworks - ctx = logr.NewContext(ctx, logger.NewLogrusSink(nil).AsLogr().WithName("spegel")) + ctx = logger.NewContext(ctx, "spegel") level := ipfslog.LevelInfo if logrus.IsLevelEnabled(logrus.DebugLevel) { level = ipfslog.LevelDebug diff --git a/pkg/util/api.go b/pkg/util/api.go index ed0e0f98c5f..acf9acd2e27 100644 --- a/pkg/util/api.go +++ b/pkg/util/api.go @@ -249,9 +249,9 @@ func subjectAccessReview(authClient *authorizationv1client.AuthorizationV1Client } } -func BuildControllerEventRecorder(k8s clientset.Interface, controllerName, namespace string) record.EventRecorder { +func BuildControllerEventRecorder(ctx context.Context, k8s clientset.Interface, controllerName, namespace string) record.EventRecorder { logrus.Infof("Creating %s event broadcaster", controllerName) - eventBroadcaster := record.NewBroadcaster() + eventBroadcaster := record.NewBroadcaster(record.WithContext(ctx)) eventBroadcaster.StartStructuredLogging(0) eventBroadcaster.StartRecordingToSink(&coregetter.EventSinkImpl{Interface: k8s.CoreV1().Events(namespace)}) nodeName := os.Getenv("NODE_NAME") diff --git a/pkg/util/context.go b/pkg/util/context.go index 7ddf92f5993..aaa3e59a0db 100644 --- a/pkg/util/context.go +++ b/pkg/util/context.go @@ -3,6 +3,8 @@ package util import ( "context" "time" + + "github.com/go-logr/logr" ) const DefaultContextDelay = 5 * time.Second @@ -11,6 +13,9 @@ const DefaultContextDelay = 5 * time.Second // with a delay after the parent context has been cancelled. func DelayCancel(ctx context.Context, delay time.Duration) context.Context { dctx, dcancel := context.WithCancel(context.Background()) + if l, err := logr.FromContext(ctx); err == nil { + dctx = logr.NewContext(dctx, l) + } go func() { <-ctx.Done() time.Sleep(delay) diff --git a/pkg/util/logger/logger.go b/pkg/util/logger/logger.go index 3adcaa875ef..98197827d10 100644 --- a/pkg/util/logger/logger.go +++ b/pkg/util/logger/logger.go @@ -1,6 +1,7 @@ package logger import ( + "context" "fmt" "github.com/go-logr/logr" @@ -87,3 +88,14 @@ func (ls *LogrusSink) WithName(name string) logr.LogSink { } return ls.WithValues("logger", name) } + +func NewContext(ctx context.Context, name string) context.Context { + logger, err := logr.FromContext(ctx) + if err != nil { + logger = NewLogrusSink(nil).AsLogr() + } + if name != "" { + logger = logger.WithName(name) + } + return logr.NewContext(ctx, logger) +}