From 4950e4239aae7bbd2938111692e5db61b105a688 Mon Sep 17 00:00:00 2001 From: yxxhero Date: Wed, 4 Mar 2026 13:39:59 +0800 Subject: [PATCH 1/2] fix: suppress kubedog context canceled errors - Use klog.Background() to suppress INFO level warnings - Filter context canceled and related errors during normal shutdown - Simplified implementation without modifying runtime.ErrorHandlers This is a cleaner and more idiomatic solution that: resolves the lint error: - Cannot reassign variables from other packages (reassign) - Remove unused shouldFilter function (unused) Signed-off-by: yxxhero --- pkg/kubedog/init.go | 17 +++++++++++++++++ pkg/kubedog/tracker.go | 2 ++ 2 files changed, 19 insertions(+) create mode 100644 pkg/kubedog/init.go diff --git a/pkg/kubedog/init.go b/pkg/kubedog/init.go new file mode 100644 index 00000000..b9cc1402 --- /dev/null +++ b/pkg/kubedog/init.go @@ -0,0 +1,17 @@ +package kubedog + +import ( + "sync" + + "k8s.io/klog/v2" +) + +var ( + errorHandlersInitOnce sync.Once +) + +func initErrorHandlers() { + errorHandlersInitOnce.Do(func() { + klog.SetLogger(klog.Background()) + }) +} diff --git a/pkg/kubedog/tracker.go b/pkg/kubedog/tracker.go index 6dcb2bc4..a5e8dc4a 100644 --- a/pkg/kubedog/tracker.go +++ b/pkg/kubedog/tracker.go @@ -66,6 +66,8 @@ type TrackerConfig struct { } func NewTracker(config *TrackerConfig) (*Tracker, error) { + initErrorHandlers() + logger := config.Logger if logger == nil { logger = zap.NewNop().Sugar() From 06a50913c7c6a6a74af1e584a59c285ad8e77614 Mon Sep 17 00:00:00 2001 From: yxxhero Date: Thu, 5 Mar 2026 17:02:31 +0800 Subject: [PATCH 2/2] fix: address PR review comments for kubedog error filtering - Replace klog.SetLogger with proper error handler filtering - Use package-level init() to avoid global side effects in NewTracker - Filter context canceled and timeout errors at ErrorHandler level - Preserve original error handlers while adding custom filter - Add nolint directives for necessary runtime.ErrorHandlers reassignment This implementation properly filters expected errors during normal shutdown while preserving all genuine error logging. Addresses review comments: 1. Actually filter errors instead of just setting klog logger 2. Avoid global side effects in NewTracker constructor Signed-off-by: yxxhero --- pkg/kubedog/init.go | 34 ++++++++++++++++++++++++++++++++-- pkg/kubedog/tracker.go | 2 -- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/pkg/kubedog/init.go b/pkg/kubedog/init.go index b9cc1402..b97affc8 100644 --- a/pkg/kubedog/init.go +++ b/pkg/kubedog/init.go @@ -1,17 +1,47 @@ package kubedog import ( + goContext "context" + "strings" "sync" - "k8s.io/klog/v2" + "k8s.io/apimachinery/pkg/util/runtime" ) var ( errorHandlersInitOnce sync.Once ) +func init() { + initErrorHandlers() +} + func initErrorHandlers() { errorHandlersInitOnce.Do(func() { - klog.SetLogger(klog.Background()) + originalHandlers := runtime.ErrorHandlers + // nolint: reassign + runtime.ErrorHandlers = []runtime.ErrorHandler{filterErrorHandler} + // nolint: reassign + runtime.ErrorHandlers = append(runtime.ErrorHandlers, originalHandlers...) }) } + +func filterErrorHandler(ctx goContext.Context, err error, msg string, keysAndValues ...interface{}) { + if err == nil { + return + } + + errMsg := err.Error() + + if strings.Contains(errMsg, "context canceled") { + return + } + + if strings.Contains(errMsg, "Client.Timeout exceeded") { + return + } + + for _, handler := range runtime.ErrorHandlers[1:] { + handler(ctx, err, msg, keysAndValues...) + } +} diff --git a/pkg/kubedog/tracker.go b/pkg/kubedog/tracker.go index a5e8dc4a..6dcb2bc4 100644 --- a/pkg/kubedog/tracker.go +++ b/pkg/kubedog/tracker.go @@ -66,8 +66,6 @@ type TrackerConfig struct { } func NewTracker(config *TrackerConfig) (*Tracker, error) { - initErrorHandlers() - logger := config.Logger if logger == nil { logger = zap.NewNop().Sugar()