Skip to content

Commit 8743840

Browse files
committed
add log customizer, fix k/v pairs, enable json logs in e2e tests
Signed-off-by: Stefan Büringer [email protected]
1 parent 4c44d05 commit 8743840

File tree

33 files changed

+267
-94
lines changed

33 files changed

+267
-94
lines changed

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ logos/
99
scripts/
1010
**/*.md
1111
tilt-settings.json
12+
tilt-settings.yaml
1213
tilt.d/
1314
Tiltfile
1415
**/.tiltbuild

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,4 @@ out
7575
_releasenotes
7676

7777
# Helm
78-
.helm
78+
.helm

bootstrap/kubeadm/internal/controllers/kubeadmconfig_controller.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"fmt"
2222
"strconv"
23+
"strings"
2324
"time"
2425

2526
"github.com/blang/semver"
@@ -31,6 +32,7 @@ import (
3132
"k8s.io/apimachinery/pkg/runtime"
3233
"k8s.io/apimachinery/pkg/types"
3334
kerrors "k8s.io/apimachinery/pkg/util/errors"
35+
"k8s.io/klog/v2"
3436
"k8s.io/utils/pointer"
3537
ctrl "sigs.k8s.io/controller-runtime"
3638
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -48,6 +50,7 @@ import (
4850
"sigs.k8s.io/cluster-api/controllers/remote"
4951
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
5052
"sigs.k8s.io/cluster-api/feature"
53+
tlog "sigs.k8s.io/cluster-api/internal/log"
5154
"sigs.k8s.io/cluster-api/util"
5255
"sigs.k8s.io/cluster-api/util/annotations"
5356
"sigs.k8s.io/cluster-api/util/conditions"
@@ -110,9 +113,11 @@ func (r *KubeadmConfigReconciler) SetupWithManager(ctx context.Context, mgr ctrl
110113
r.TokenTTL = DefaultTokenTTL
111114
}
112115

116+
tr := tlog.Reconciler(r, "controllers.KubeadmConfigReconciler", "kubeadmconfig")
113117
b := ctrl.NewControllerManagedBy(mgr).
114118
For(&bootstrapv1.KubeadmConfig{}).
115119
WithOptions(options).
120+
WithLoggerCustomizer(tlog.LoggerCustomizer(mgr.GetLogger(), "kubeadmconfig", "kubeadmconfig")).
116121
Watches(
117122
&source.Kind{Type: &clusterv1.Machine{}},
118123
handler.EnqueueRequestsFromMapFunc(r.MachineToBootstrapMapFunc),
@@ -125,7 +130,7 @@ func (r *KubeadmConfigReconciler) SetupWithManager(ctx context.Context, mgr ctrl
125130
).WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(ctrl.LoggerFrom(ctx), r.WatchFilterValue))
126131
}
127132

128-
c, err := b.Build(r)
133+
c, err := b.Build(tr)
129134
if err != nil {
130135
return errors.Wrap(err, "failed setting up with a controller manager")
131136
}
@@ -172,7 +177,7 @@ func (r *KubeadmConfigReconciler) Reconcile(ctx context.Context, req ctrl.Reques
172177
if configOwner == nil {
173178
return ctrl.Result{}, nil
174179
}
175-
log = log.WithValues("kind", configOwner.GetKind(), "version", configOwner.GetResourceVersion(), "name", configOwner.GetName())
180+
log = log.WithValues(strings.ToLower(configOwner.GetKind()), klog.KRef(configOwner.GetNamespace(), configOwner.GetName()).String(), "version", configOwner.GetResourceVersion())
176181

177182
// Lookup the cluster the config owner is associated with
178183
cluster, err := util.GetClusterByName(ctx, r.Client, configOwner.GetNamespace(), configOwner.ClusterName())
@@ -190,6 +195,9 @@ func (r *KubeadmConfigReconciler) Reconcile(ctx context.Context, req ctrl.Reques
190195
return ctrl.Result{}, err
191196
}
192197

198+
log = log.WithValues("cluster", klog.KObj(cluster).String())
199+
ctx = ctrl.LoggerInto(ctx, log)
200+
193201
if annotations.IsPaused(cluster, config) {
194202
log.Info("Reconciliation is paused for this object")
195203
return ctrl.Result{}, nil

controlplane/kubeadm/internal/control_plane.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package internal
1919
import (
2020
"context"
2121

22-
"github.com/go-logr/logr"
2322
"github.com/pkg/errors"
2423
corev1 "k8s.io/api/core/v1"
2524
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -90,11 +89,6 @@ func NewControlPlane(ctx context.Context, client client.Client, cluster *cluster
9089
}, nil
9190
}
9291

93-
// Logger returns a logger with useful context.
94-
func (c *ControlPlane) Logger() logr.Logger {
95-
return Log.WithValues("namespace", c.KCP.Namespace, "name", c.KCP.Name, "cluster-name", c.Cluster.Name)
96-
}
97-
9892
// FailureDomains returns a slice of failure domain objects synced from the infrastructure provider into Cluster.Status.
9993
func (c *ControlPlane) FailureDomains() clusterv1.FailureDomains {
10094
if c.Cluster.Status.FailureDomains == nil {

controlplane/kubeadm/internal/controllers/controller.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2929
kerrors "k8s.io/apimachinery/pkg/util/errors"
3030
"k8s.io/client-go/tools/record"
31+
"k8s.io/klog/v2"
3132
"k8s.io/utils/pointer"
3233
ctrl "sigs.k8s.io/controller-runtime"
3334
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -43,6 +44,7 @@ import (
4344
"sigs.k8s.io/cluster-api/controlplane/kubeadm/internal"
4445
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
4546
"sigs.k8s.io/cluster-api/feature"
47+
tlog "sigs.k8s.io/cluster-api/internal/log"
4648
"sigs.k8s.io/cluster-api/util"
4749
"sigs.k8s.io/cluster-api/util/annotations"
4850
"sigs.k8s.io/cluster-api/util/collections"
@@ -77,12 +79,14 @@ type KubeadmControlPlaneReconciler struct {
7779
}
7880

7981
func (r *KubeadmControlPlaneReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error {
82+
tr := tlog.Reconciler(r, "controllers.KubeadmControlPlaneReconciler", "kubeadmcontrolplane")
8083
c, err := ctrl.NewControllerManagedBy(mgr).
8184
For(&controlplanev1.KubeadmControlPlane{}).
8285
Owns(&clusterv1.Machine{}).
8386
WithOptions(options).
87+
WithLoggerCustomizer(tlog.LoggerCustomizer(mgr.GetLogger(), "kubeadmcontrolplane", "kubeadmcontrolplane")).
8488
WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(ctrl.LoggerFrom(ctx), r.WatchFilterValue)).
85-
Build(r)
89+
Build(tr)
8690
if err != nil {
8791
return errors.Wrap(err, "failed setting up with a controller manager")
8892
}
@@ -142,7 +146,8 @@ func (r *KubeadmControlPlaneReconciler) Reconcile(ctx context.Context, req ctrl.
142146
log.Info("Cluster Controller has not yet set OwnerRef")
143147
return ctrl.Result{}, nil
144148
}
145-
log = log.WithValues("cluster", cluster.Name)
149+
log = log.WithValues("cluster", klog.KObj(cluster).String())
150+
ctx = ctrl.LoggerInto(ctx, log)
146151

147152
if annotations.IsPaused(cluster, kcp) {
148153
log.Info("Reconciliation is paused for this object")
@@ -247,8 +252,7 @@ func patchKubeadmControlPlane(ctx context.Context, patchHelper *patch.Helper, kc
247252

248253
// reconcile handles KubeadmControlPlane reconciliation.
249254
func (r *KubeadmControlPlaneReconciler) reconcile(ctx context.Context, cluster *clusterv1.Cluster, kcp *controlplanev1.KubeadmControlPlane) (res ctrl.Result, reterr error) {
250-
log := ctrl.LoggerFrom(ctx, "cluster", cluster.Name)
251-
log.Info("Reconcile KubeadmControlPlane")
255+
log := ctrl.LoggerFrom(ctx)
252256

253257
// Make sure to reconcile the external infrastructure reference.
254258
if err := r.reconcileExternalReference(ctx, cluster, &kcp.Spec.MachineTemplate.InfrastructureRef); err != nil {
@@ -407,7 +411,7 @@ func (r *KubeadmControlPlaneReconciler) reconcile(ctx context.Context, cluster *
407411
// The implementation does not take non-control plane workloads into consideration. This may or may not change in the future.
408412
// Please see https://github.com/kubernetes-sigs/cluster-api/issues/2064.
409413
func (r *KubeadmControlPlaneReconciler) reconcileDelete(ctx context.Context, cluster *clusterv1.Cluster, kcp *controlplanev1.KubeadmControlPlane) (ctrl.Result, error) {
410-
log := ctrl.LoggerFrom(ctx, "cluster", cluster.Name)
414+
log := ctrl.LoggerFrom(ctx)
411415
log.Info("Reconcile KubeadmControlPlane deletion")
412416

413417
// Gets all machines, not just control plane machines.
@@ -461,7 +465,7 @@ func (r *KubeadmControlPlaneReconciler) reconcileDelete(ctx context.Context, clu
461465
var errs []error
462466
for i := range machinesToDelete {
463467
m := machinesToDelete[i]
464-
logger := log.WithValues("machine", m)
468+
logger := log.WithValues("machine", klog.KObj(m).String())
465469
if err := r.Client.Delete(ctx, machinesToDelete[i]); err != nil && !apierrors.IsNotFound(err) {
466470
logger.Error(err, "Failed to cleanup owned machine")
467471
errs = append(errs, err)
@@ -525,7 +529,7 @@ func (r *KubeadmControlPlaneReconciler) reconcileControlPlaneConditions(ctx cont
525529
//
526530
// NOTE: this func uses KCP conditions, it is required to call reconcileControlPlaneConditions before this.
527531
func (r *KubeadmControlPlaneReconciler) reconcileEtcdMembers(ctx context.Context, controlPlane *internal.ControlPlane) (ctrl.Result, error) {
528-
log := ctrl.LoggerFrom(ctx, "cluster", controlPlane.Cluster.Name)
532+
log := ctrl.LoggerFrom(ctx)
529533

530534
// If etcd is not managed by KCP this is a no-op.
531535
if !controlPlane.IsEtcdManaged() {

controlplane/kubeadm/internal/controllers/scale.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
corev1 "k8s.io/api/core/v1"
2626
apierrors "k8s.io/apimachinery/pkg/api/errors"
2727
kerrors "k8s.io/apimachinery/pkg/util/errors"
28+
"k8s.io/klog/v2"
2829
ctrl "sigs.k8s.io/controller-runtime"
2930

3031
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -36,7 +37,7 @@ import (
3637
)
3738

3839
func (r *KubeadmControlPlaneReconciler) initializeControlPlane(ctx context.Context, cluster *clusterv1.Cluster, kcp *controlplanev1.KubeadmControlPlane, controlPlane *internal.ControlPlane) (ctrl.Result, error) {
39-
logger := controlPlane.Logger()
40+
logger := ctrl.LoggerFrom(ctx)
4041

4142
// Perform an uncached read of all the owned machines. This check is in place to make sure
4243
// that the controller cache is not misbehaving and we end up initializing the cluster more than once.
@@ -65,7 +66,7 @@ func (r *KubeadmControlPlaneReconciler) initializeControlPlane(ctx context.Conte
6566
}
6667

6768
func (r *KubeadmControlPlaneReconciler) scaleUpControlPlane(ctx context.Context, cluster *clusterv1.Cluster, kcp *controlplanev1.KubeadmControlPlane, controlPlane *internal.ControlPlane) (ctrl.Result, error) {
68-
logger := controlPlane.Logger()
69+
logger := ctrl.LoggerFrom(ctx)
6970

7071
// Run preflight checks to ensure that the control plane is stable before proceeding with a scale up/scale down operation; if not, wait.
7172
if result, err := r.preflightChecks(ctx, controlPlane); err != nil || !result.IsZero() {
@@ -92,7 +93,7 @@ func (r *KubeadmControlPlaneReconciler) scaleDownControlPlane(
9293
controlPlane *internal.ControlPlane,
9394
outdatedMachines collections.Machines,
9495
) (ctrl.Result, error) {
95-
logger := controlPlane.Logger()
96+
logger := ctrl.LoggerFrom(ctx)
9697

9798
// Pick the Machine that we should scale down.
9899
machineToDelete, err := selectMachineForScaleDown(controlPlane, outdatedMachines)
@@ -140,7 +141,7 @@ func (r *KubeadmControlPlaneReconciler) scaleDownControlPlane(
140141
return ctrl.Result{}, err
141142
}
142143

143-
logger = logger.WithValues("machine", machineToDelete.Name)
144+
logger = logger.WithValues("machine", klog.KObj(machineToDelete).String())
144145
if err := r.Client.Delete(ctx, machineToDelete); err != nil && !apierrors.IsNotFound(err) {
145146
logger.Error(err, "Failed to delete control plane machine")
146147
r.recorder.Eventf(kcp, corev1.EventTypeWarning, "FailedScaleDown",
@@ -160,8 +161,8 @@ func (r *KubeadmControlPlaneReconciler) scaleDownControlPlane(
160161
// If the control plane is not passing preflight checks, it requeue.
161162
//
162163
// NOTE: this func uses KCP conditions, it is required to call reconcileControlPlaneConditions before this.
163-
func (r *KubeadmControlPlaneReconciler) preflightChecks(_ context.Context, controlPlane *internal.ControlPlane, excludeFor ...*clusterv1.Machine) (ctrl.Result, error) { //nolint:unparam
164-
logger := controlPlane.Logger()
164+
func (r *KubeadmControlPlaneReconciler) preflightChecks(ctx context.Context, controlPlane *internal.ControlPlane, excludeFor ...*clusterv1.Machine) (ctrl.Result, error) { //nolint:unparam
165+
logger := ctrl.LoggerFrom(ctx)
165166

166167
// If there is no KCP-owned control-plane machines, then control-plane has not been initialized yet,
167168
// so it is considered ok to proceed.

controlplane/kubeadm/internal/controllers/upgrade.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func (r *KubeadmControlPlaneReconciler) upgradeControlPlane(
3737
controlPlane *internal.ControlPlane,
3838
machinesRequireUpgrade collections.Machines,
3939
) (ctrl.Result, error) {
40-
logger := controlPlane.Logger()
40+
logger := ctrl.LoggerFrom(ctx)
4141

4242
if kcp.Spec.RolloutStrategy == nil || kcp.Spec.RolloutStrategy.RollingUpdate == nil {
4343
return ctrl.Result{}, errors.New("rolloutStrategy is not set")

go.mod

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,3 +154,9 @@ require (
154154
sigs.k8s.io/kustomize/kyaml v0.13.0 // indirect
155155
sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect
156156
)
157+
158+
// pick up a klog version with the "v" fix
159+
replace k8s.io/klog/v2 => k8s.io/klog/v2 v2.40.2-0.20220216121836-84f3ebd27f1b
160+
161+
// pick up a CR version with the LoggerCustomizer
162+
replace sigs.k8s.io/controller-runtime => github.com/sbueringer/controller-runtime v0.2.0-beta.1.0.20220216141822-42d8935efb64

go.sum

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,6 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
221221
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
222222
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
223223
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
224-
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
225224
github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE=
226225
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
227226
github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk=
@@ -566,6 +565,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
566565
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
567566
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
568567
github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE=
568+
github.com/sbueringer/controller-runtime v0.2.0-beta.1.0.20220216141822-42d8935efb64 h1:96vdkD/aJhUesygierntSRE1w3oPmNIiB8MQT3bfY4k=
569+
github.com/sbueringer/controller-runtime v0.2.0-beta.1.0.20220216141822-42d8935efb64/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA=
569570
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
570571
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
571572
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
@@ -1190,10 +1191,8 @@ k8s.io/component-base v0.23.0/go.mod h1:DHH5uiFvLC1edCpvcTDV++NKULdYYU6pR9Tt3HIK
11901191
k8s.io/component-helpers v0.23.0/go.mod h1:liXMh6FZS4qamKtMJQ7uLHnFe3tlC86RX5mJEk/aerg=
11911192
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
11921193
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
1193-
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
1194-
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
1195-
k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw=
1196-
k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
1194+
k8s.io/klog/v2 v2.40.2-0.20220216121836-84f3ebd27f1b h1:WNBS7yqSdxZAO15Jp1e35mnWkEM/9LS2FAjlpVOQipI=
1195+
k8s.io/klog/v2 v2.40.2-0.20220216121836-84f3ebd27f1b/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
11971196
k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
11981197
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4=
11991198
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk=
@@ -1207,8 +1206,6 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8
12071206
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
12081207
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
12091208
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.25/go.mod h1:Mlj9PNLmG9bZ6BHFwFKDo5afkpWyUISkb9Me0GnK66I=
1210-
sigs.k8s.io/controller-runtime v0.11.1 h1:7YIHT2QnHJArj/dk9aUkYhfqfK5cIxPOX5gPECfdZLU=
1211-
sigs.k8s.io/controller-runtime v0.11.1/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA=
12121209
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
12131210
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
12141211
sigs.k8s.io/kustomize/api v0.10.1 h1:KgU7hfYoscuqag84kxtzKdEC3mKMb99DPI3a0eaV1d0=

hack/observability/grafana/values.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ datasources:
2424

2525
# Disable grafana test framework
2626
testFramework:
27-
enabled: false
27+
enabled: false

0 commit comments

Comments
 (0)