Skip to content

Commit 9b239ea

Browse files
ChunyiLyuansd
andauthored
Use logger from context in Reconcile() (#550)
* Use logger from context in Reconcile() - with controller-runtime 0.7, Reconcile() takes a context with a logger. The logger is pre populated with controller name, gvk, object name and namespace. * Use LoggerFrom alias Also, remove logger from method signatures since it's already part of context. * Remove redundant namespace and name from logs Co-authored-by: David Ansari <[email protected]>
1 parent c92a7dc commit 9b239ea

7 files changed

+53
-71
lines changed

controllers/rabbitmqcluster_controller.go

+18-31
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import (
1818
"strings"
1919
"time"
2020

21+
"github.com/go-logr/logr"
22+
2123
"github.com/rabbitmq/cluster-operator/internal/resource"
2224
"github.com/rabbitmq/cluster-operator/internal/status"
2325
"k8s.io/apimachinery/pkg/api/errors"
@@ -32,7 +34,6 @@ import (
3234

3335
"k8s.io/apimachinery/pkg/runtime"
3436

35-
"github.com/go-logr/logr"
3637
ctrl "sigs.k8s.io/controller-runtime"
3738
"sigs.k8s.io/controller-runtime/pkg/client"
3839

@@ -56,7 +57,6 @@ const (
5657
// RabbitmqClusterReconciler reconciles a RabbitmqCluster object
5758
type RabbitmqClusterReconciler struct {
5859
client.Client
59-
Log logr.Logger
6060
Scheme *runtime.Scheme
6161
Namespace string
6262
Recorder record.EventRecorder
@@ -82,7 +82,7 @@ type RabbitmqClusterReconciler struct {
8282
// +kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=rolebindings,verbs=get;list;watch;create;update
8383

8484
func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
85-
logger := r.Log
85+
logger := ctrl.LoggerFrom(ctx)
8686

8787
rabbitmqCluster, err := r.getRabbitmqCluster(ctx, req.NamespacedName)
8888

@@ -95,25 +95,19 @@ func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Requ
9595

9696
// Check if the resource has been marked for deletion
9797
if !rabbitmqCluster.ObjectMeta.DeletionTimestamp.IsZero() {
98-
logger.Info("Deleting RabbitmqCluster",
99-
"namespace", rabbitmqCluster.Namespace,
100-
"name", rabbitmqCluster.Name)
98+
logger.Info("Deleting")
10199
return ctrl.Result{}, r.prepareForDeletion(ctx, rabbitmqCluster)
102100
}
103101

104102
// exit if pause reconciliation label is set to true
105103
if v, ok := rabbitmqCluster.Labels[pauseReconciliationLabel]; ok && v == "true" {
106-
logger.Info("Not reconciling RabbitmqCluster",
107-
"namespace", rabbitmqCluster.Namespace,
108-
"name", rabbitmqCluster.Name)
104+
logger.Info("Not reconciling RabbitmqCluster")
109105
r.Recorder.Event(rabbitmqCluster, corev1.EventTypeWarning,
110106
"PausedReconciliation", fmt.Sprintf("label '%s' is set to true", pauseReconciliationLabel))
111107

112108
rabbitmqCluster.Status.SetCondition(status.NoWarnings, corev1.ConditionFalse, "reconciliation paused")
113109
if writerErr := r.Status().Update(ctx, rabbitmqCluster); writerErr != nil {
114-
r.Log.Error(writerErr, "Error trying to Update NoWarnings condition state",
115-
"namespace", rabbitmqCluster.Namespace,
116-
"name", rabbitmqCluster.Name)
110+
logger.Error(writerErr, "Error trying to Update NoWarnings condition state")
117111
}
118112
return ctrl.Result{}, nil
119113
}
@@ -147,9 +141,7 @@ func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Requ
147141
logger.Error(err, "Failed to marshal cluster spec")
148142
}
149143

150-
logger.Info("Start reconciling RabbitmqCluster",
151-
"namespace", rabbitmqCluster.Namespace,
152-
"name", rabbitmqCluster.Name,
144+
logger.Info("Start reconciling",
153145
"spec", string(instanceSpec))
154146

155147
resourceBuilder := resource.RabbitmqResourceBuilder{
@@ -176,33 +168,29 @@ func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Requ
176168
})
177169
return apiError
178170
})
179-
r.logAndRecordOperationResult(rabbitmqCluster, resource, operationResult, err)
171+
r.logAndRecordOperationResult(logger, rabbitmqCluster, resource, operationResult, err)
180172
if err != nil {
181173
rabbitmqCluster.Status.SetCondition(status.ReconcileSuccess, corev1.ConditionFalse, "Error", err.Error())
182174
if writerErr := r.Status().Update(ctx, rabbitmqCluster); writerErr != nil {
183-
r.Log.Error(writerErr, "Error trying to Update ReconcileSuccess condition state",
184-
"namespace", rabbitmqCluster.Namespace,
185-
"name", rabbitmqCluster.Name)
175+
logger.Error(writerErr, "Failed to update ReconcileSuccess condition state")
186176
}
187177
return ctrl.Result{}, err
188178
}
189179

190-
if err = r.annotateIfNeeded(ctx, builder, operationResult, rabbitmqCluster); err != nil {
180+
if err = r.annotateIfNeeded(ctx, logger, builder, operationResult, rabbitmqCluster); err != nil {
191181
return ctrl.Result{}, err
192182
}
193183
}
194184

195-
if requeueAfter, err := r.restartStatefulSetIfNeeded(ctx, rabbitmqCluster); err != nil || requeueAfter > 0 {
185+
if requeueAfter, err := r.restartStatefulSetIfNeeded(ctx, logger, rabbitmqCluster); err != nil || requeueAfter > 0 {
196186
return ctrl.Result{RequeueAfter: requeueAfter}, err
197187
}
198188

199189
// Set ReconcileSuccess to true here because all CRUD operations to Kube API related
200190
// to child resources returned no error
201191
rabbitmqCluster.Status.SetCondition(status.ReconcileSuccess, corev1.ConditionTrue, "Success", "Created or Updated all child resources")
202192
if writerErr := r.Status().Update(ctx, rabbitmqCluster); writerErr != nil {
203-
r.Log.Error(writerErr, "Error trying to Update Custom Resource status",
204-
"namespace", rabbitmqCluster.Namespace,
205-
"name", rabbitmqCluster.Name)
193+
logger.Error(writerErr, "Failed to Update Custom Resource status")
206194
}
207195

208196
if err := r.setDefaultUserStatus(ctx, rabbitmqCluster); err != nil {
@@ -215,16 +203,14 @@ func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Requ
215203
return ctrl.Result{RequeueAfter: requeueAfter}, err
216204
}
217205

218-
logger.Info("Finished reconciling RabbitmqCluster",
219-
"namespace", rabbitmqCluster.Namespace,
220-
"name", rabbitmqCluster.Name)
206+
logger.Info("Finished reconciling")
221207

222208
return ctrl.Result{}, nil
223209
}
224210

225211
// logAndRecordOperationResult - helper function to log and record events with message and error
226212
// it logs and records 'updated' and 'created' OperationResult, and ignores OperationResult 'unchanged'
227-
func (r *RabbitmqClusterReconciler) logAndRecordOperationResult(rmq runtime.Object, resource runtime.Object, operationResult controllerutil.OperationResult, err error) {
213+
func (r *RabbitmqClusterReconciler) logAndRecordOperationResult(logger logr.Logger, rmq runtime.Object, resource runtime.Object, operationResult controllerutil.OperationResult, err error) {
228214
if operationResult == controllerutil.OperationResultNone && err == nil {
229215
return
230216
}
@@ -239,18 +225,19 @@ func (r *RabbitmqClusterReconciler) logAndRecordOperationResult(rmq runtime.Obje
239225

240226
if err == nil {
241227
msg := fmt.Sprintf("%sd resource %s of Type %T", operation, resource.(metav1.Object).GetName(), resource.(metav1.Object))
242-
r.Log.Info(msg)
228+
logger.Info(msg)
243229
r.Recorder.Event(rmq, corev1.EventTypeNormal, fmt.Sprintf("Successful%s", strings.Title(operation)), msg)
244230
}
245231

246232
if err != nil {
247233
msg := fmt.Sprintf("failed to %s resource %s of Type %T", operation, resource.(metav1.Object).GetName(), resource.(metav1.Object))
248-
r.Log.Error(err, msg)
234+
logger.Error(err, msg)
249235
r.Recorder.Event(rmq, corev1.EventTypeWarning, fmt.Sprintf("Failed%s", strings.Title(operation)), msg)
250236
}
251237
}
252238

253239
func (r *RabbitmqClusterReconciler) updateStatus(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster) (time.Duration, error) {
240+
logger := ctrl.LoggerFrom(ctx)
254241
childResources, err := r.getChildResources(ctx, rmq)
255242
if err != nil {
256243
return 0, err
@@ -263,7 +250,7 @@ func (r *RabbitmqClusterReconciler) updateStatus(ctx context.Context, rmq *rabbi
263250
if !reflect.DeepEqual(rmq.Status.Conditions, oldConditions) {
264251
if err = r.Status().Update(ctx, rmq); err != nil {
265252
if errors.IsConflict(err) {
266-
r.Log.Info("failed to update status because of conflict; requeueing...",
253+
logger.Info("failed to update status because of conflict; requeueing...",
267254
"namespace", rmq.Namespace,
268255
"name", rmq.Name)
269256
return 2 * time.Second, nil

controllers/reconcile_cli.go

+11-21
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ import (
99
"github.com/rabbitmq/cluster-operator/internal/resource"
1010
appsv1 "k8s.io/api/apps/v1"
1111
corev1 "k8s.io/api/core/v1"
12+
ctrl "sigs.k8s.io/controller-runtime"
1213
"sigs.k8s.io/controller-runtime/pkg/client"
1314
)
1415

1516
const queueRebalanceAnnotation = "rabbitmq.com/queueRebalanceNeededAt"
1617

1718
func (r *RabbitmqClusterReconciler) runRabbitmqCLICommandsIfAnnotated(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster) (requeueAfter time.Duration, err error) {
19+
logger := ctrl.LoggerFrom(ctx)
1820
sts, err := r.statefulSet(ctx, rmq)
1921
if err != nil {
2022
return 0, err
2123
}
2224
if !allReplicasReadyAndUpdated(sts) {
23-
r.Log.Info("not all replicas ready yet; requeuing request to run RabbitMQ CLI commands",
24-
"namespace", rmq.Namespace,
25-
"name", rmq.Name)
25+
logger.Info("not all replicas ready yet; requeuing request to run RabbitMQ CLI commands")
2626
return 15 * time.Second, nil
2727
}
2828

@@ -39,9 +39,7 @@ func (r *RabbitmqClusterReconciler) runRabbitmqCLICommandsIfAnnotated(ctx contex
3939
// plugins configMap was updated very recently
4040
// give StatefulSet controller some time to trigger restart of StatefulSet if necessary
4141
// otherwise, there would be race conditions where we exec into containers losing the connection due to pods being terminated
42-
r.Log.Info("requeuing request to set plugins",
43-
"namespace", rmq.Namespace,
44-
"name", rmq.Name)
42+
logger.Info("requeuing request to set plugins")
4543
return 2 * time.Second, nil
4644
}
4745

@@ -69,22 +67,19 @@ func (r *RabbitmqClusterReconciler) runRabbitmqCLICommandsIfAnnotated(ctx contex
6967
}
7068

7169
func (r *RabbitmqClusterReconciler) runEnableFeatureFlagsCommand(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster, sts *appsv1.StatefulSet) error {
70+
logger := ctrl.LoggerFrom(ctx)
7271
podName := fmt.Sprintf("%s-0", rmq.ChildResourceName("server"))
7372
cmd := "set -eo pipefail; rabbitmqctl -s list_feature_flags name state stability | (grep 'disabled\\sstable$' || true) | cut -f 1 | xargs -r -n1 rabbitmqctl enable_feature_flag"
7473
stdout, stderr, err := r.exec(rmq.Namespace, podName, "rabbitmq", "bash", "-c", cmd)
7574
if err != nil {
76-
r.Log.Error(err, "failed to enable all feature flags",
77-
"namespace", rmq.Namespace,
78-
"name", rmq.Name,
75+
logger.Error(err, "failed to enable all feature flags",
7976
"pod", podName,
8077
"command", cmd,
8178
"stdout", stdout,
8279
"stderr", stderr)
8380
return err
8481
}
85-
r.Log.Info("successfully enabled all feature flags",
86-
"namespace", rmq.Namespace,
87-
"name", rmq.Name)
82+
logger.Info("successfully enabled all feature flags")
8883
return r.deleteAnnotation(ctx, sts, stsCreateAnnotation)
8984
}
9085

@@ -93,25 +88,22 @@ func (r *RabbitmqClusterReconciler) runEnableFeatureFlagsCommand(ctx context.Con
9388
// 2. When the plugins ConfigMap is changed, 'rabbitmq-plugins set' updates the plugins on every node (without the need to re-start the nodes).
9489
// This method implements the 2nd path.
9590
func (r *RabbitmqClusterReconciler) runSetPluginsCommand(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster, configMap *corev1.ConfigMap) error {
91+
logger := ctrl.LoggerFrom(ctx)
9692
plugins := resource.NewRabbitmqPlugins(rmq.Spec.Rabbitmq.AdditionalPlugins)
9793
for i := int32(0); i < *rmq.Spec.Replicas; i++ {
9894
podName := fmt.Sprintf("%s-%d", rmq.ChildResourceName("server"), i)
9995
cmd := fmt.Sprintf("rabbitmq-plugins set %s", plugins.AsString(" "))
10096
stdout, stderr, err := r.exec(rmq.Namespace, podName, "rabbitmq", "sh", "-c", cmd)
10197
if err != nil {
102-
r.Log.Error(err, "failed to set plugins",
103-
"namespace", rmq.Namespace,
104-
"name", rmq.Name,
98+
logger.Error(err, "failed to set plugins",
10599
"pod", podName,
106100
"command", cmd,
107101
"stdout", stdout,
108102
"stderr", stderr)
109103
return err
110104
}
111105
}
112-
r.Log.Info("successfully set plugins",
113-
"namespace", rmq.Namespace,
114-
"name", rmq.Name)
106+
logger.Info("successfully set plugins")
115107
return r.deleteAnnotation(ctx, configMap, pluginsUpdateAnnotation)
116108
}
117109

@@ -120,9 +112,7 @@ func (r *RabbitmqClusterReconciler) runQueueRebalanceCommand(ctx context.Context
120112
cmd := "rabbitmq-queues rebalance all"
121113
stdout, stderr, err := r.exec(rmq.Namespace, podName, "rabbitmq", "sh", "-c", cmd)
122114
if err != nil {
123-
r.Log.Error(err, "failed to run queue rebalance",
124-
"namespace", rmq.Namespace,
125-
"name", rmq.Name,
115+
ctrl.LoggerFrom(ctx).Error(err, "failed to run queue rebalance",
126116
"pod", podName,
127117
"command", cmd,
128118
"stdout", stdout,

controllers/reconcile_finalizer.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package controllers
33
import (
44
"context"
55
"fmt"
6+
67
rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
78
"github.com/rabbitmq/cluster-operator/internal/resource"
89
appsv1 "k8s.io/api/apps/v1"
910
corev1 "k8s.io/api/core/v1"
1011
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1112
"k8s.io/apimachinery/pkg/labels"
1213
clientretry "k8s.io/client-go/util/retry"
14+
ctrl "sigs.k8s.io/controller-runtime"
1315
"sigs.k8s.io/controller-runtime/pkg/client"
1416
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1517
)
@@ -58,11 +60,11 @@ func (r *RabbitmqClusterReconciler) prepareForDeletion(ctx context.Context, rabb
5860

5961
return nil
6062
}); err != nil {
61-
r.Log.Error(err, "RabbitmqCluster deletion")
63+
ctrl.LoggerFrom(ctx).Error(err, "RabbitmqCluster deletion")
6264
}
6365

6466
if err := r.removeFinalizer(ctx, rabbitmqCluster); err != nil {
65-
r.Log.Error(err, "Failed to remove finalizer for deletion")
67+
ctrl.LoggerFrom(ctx).Error(err, "Failed to remove finalizer for deletion")
6668
return err
6769
}
6870
}

controllers/reconcile_rabbitmq_configurations.go

+10-8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"fmt"
66
"time"
77

8+
"github.com/go-logr/logr"
9+
810
rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
911
"github.com/rabbitmq/cluster-operator/internal/resource"
1012
appsv1 "k8s.io/api/apps/v1"
@@ -25,7 +27,7 @@ const (
2527

2628
// Annotates an object depending on object type and operationResult.
2729
// These annotations are temporary markers used in later reconcile loops to perform some action (such as restarting the StatefulSet or executing RabbitMQ CLI commands)
28-
func (r *RabbitmqClusterReconciler) annotateIfNeeded(ctx context.Context, builder resource.ResourceBuilder, operationResult controllerutil.OperationResult, rmq *rabbitmqv1beta1.RabbitmqCluster) error {
30+
func (r *RabbitmqClusterReconciler) annotateIfNeeded(ctx context.Context, logger logr.Logger, builder resource.ResourceBuilder, operationResult controllerutil.OperationResult, rmq *rabbitmqv1beta1.RabbitmqCluster) error {
2931
var (
3032
obj client.Object
3133
objName string
@@ -64,19 +66,19 @@ func (r *RabbitmqClusterReconciler) annotateIfNeeded(ctx context.Context, builde
6466

6567
if err := r.updateAnnotation(ctx, obj, rmq.Namespace, objName, annotationKey, time.Now().Format(time.RFC3339)); err != nil {
6668
msg := "failed to annotate " + objName
67-
r.Log.Error(err, msg, "namespace", rmq.Namespace)
69+
logger.Error(err, msg)
6870
r.Recorder.Event(rmq, corev1.EventTypeWarning, "FailedUpdate", msg)
6971
return err
7072
}
7173

72-
r.Log.Info("successfully annotated", "namespace", rmq.Namespace, "name", objName)
74+
logger.Info("successfully annotated")
7375
return nil
7476
}
7577

7678
// Adds an arbitrary annotation to the sts PodTemplate to trigger a sts restart.
7779
// It compares annotation "rabbitmq.com/serverConfUpdatedAt" from server-conf configMap and annotation "rabbitmq.com/lastRestartAt" from sts
7880
// to determine whether to restart sts.
79-
func (r *RabbitmqClusterReconciler) restartStatefulSetIfNeeded(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster) (time.Duration, error) {
81+
func (r *RabbitmqClusterReconciler) restartStatefulSetIfNeeded(ctx context.Context, logger logr.Logger, rmq *rabbitmqv1beta1.RabbitmqCluster) (time.Duration, error) {
8082
serverConf, err := r.configMap(ctx, rmq, rmq.ChildResourceName(resource.ServerConfigMapName))
8183
if err != nil {
8284
// requeue request after 10s if unable to find server-conf configmap, else return the error
@@ -112,15 +114,15 @@ func (r *RabbitmqClusterReconciler) restartStatefulSetIfNeeded(ctx context.Conte
112114
sts.Spec.Template.ObjectMeta.Annotations[stsRestartAnnotation] = time.Now().Format(time.RFC3339)
113115
return r.Update(ctx, sts)
114116
}); err != nil {
115-
msg := fmt.Sprintf("failed to restart StatefulSet %s of Namespace %s; rabbitmq.conf configuration may be outdated", rmq.ChildResourceName("server"), rmq.Namespace)
116-
r.Log.Error(err, msg)
117+
msg := fmt.Sprintf("failed to restart StatefulSet %s; rabbitmq.conf configuration may be outdated", rmq.ChildResourceName("server"))
118+
logger.Error(err, msg)
117119
r.Recorder.Event(rmq, corev1.EventTypeWarning, "FailedUpdate", msg)
118120
// failed to restart sts; return error to requeue request
119121
return 0, err
120122
}
121123

122-
msg := fmt.Sprintf("restarted StatefulSet %s of Namespace %s", rmq.ChildResourceName("server"), rmq.Namespace)
123-
r.Log.Info(msg)
124+
msg := fmt.Sprintf("restarted StatefulSet %s", rmq.ChildResourceName("server"))
125+
logger.Info(msg)
124126
r.Recorder.Event(rmq, corev1.EventTypeNormal, "SuccessfulUpdate", msg)
125127

126128
return 0, nil

0 commit comments

Comments
 (0)