-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
client-go
sets a default handler for watching errors func DefaultWatchErrorHandler(r *Reflector, err error)
, see https://github.com/kubernetes/client-go/blob/23900f492969db045e8a36396852381fd189569b/tools/cache/reflector.go#L154. Right now, if it is included in the controller-runtime
it will use its logger klog
by default. This leads to inconsistent log output by default. Therefore, I propose that the controller-runtime
should overwrite this method, i.e., use its own handler.
This handler could look something like this:
func WatchErrorHandler(r *toolscache.Reflector, err error) {
log := ctrl.Log.WithValues("name", r.Name(), "description", r.TypeDescription())
switch {
case apierrors.IsResourceExpired(err) || apierrors.IsGone(err):
// Don't set LastSyncResourceVersionUnavailable - LIST call with ResourceVersion=RV already
// has a semantic that it returns data at least as fresh as provided RV.
// So first try to LIST with setting RV to resource version of last observed object.
log.Error(err, "watch closed")
case err == io.EOF:
// watch closed normally
case err == io.ErrUnexpectedEOF:
log.Error(err, "watch closed with unexpected EOF")
default:
utilruntime.HandleError(fmt.Errorf("%s: Failed to watch %v: %v", r.Name(), r.TypeDescription(), err))
}
}
As you can see, we would use a logger with two fields of the reflector now. I exposed these fields recently (see kubernetes/client-go@ce42c29), so the controller-runtime
can essentially redefine the default handler of client-go
, as the default handler also logs these fields.
I would like to implement this, if it gets your approval.