From cbf7d96a854084f268436848e35ea90fbaf00a7b Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 6 Mar 2023 21:37:31 +0100 Subject: [PATCH] garbagecollector: structured logging of objectReference When using JSON as output format, we want objectReference values to be represented as a struct. For example, "item" is such a value: {"ts":1678135015708.349,"caller":"garbagecollector/garbagecollector.go:595","msg":"classify object references","v":5,"item":{"name":"dra-test-driver-g4tkd","namespace":"dra-1830","apiVersion":"v1","uid":"c3f88616-7282-488c-887c-3f04291e6f4f"},"solid":null,"dangling":[{"apiVersion":"apps/v1","kind":"ReplicaSet","name":"dra-test-driver","uid":"dbe9a90c-9dfd-4ad0-8395-e5fa228f9851","controller":true,"blockOwnerDeletion":true}],"waitingForDependentsDeletion":null} --- pkg/controller/garbagecollector/graph.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pkg/controller/garbagecollector/graph.go b/pkg/controller/garbagecollector/graph.go index b2fd8002d5c..de017b4c40b 100644 --- a/pkg/controller/garbagecollector/graph.go +++ b/pkg/controller/garbagecollector/graph.go @@ -20,6 +20,8 @@ import ( "fmt" "sync" + "github.com/go-logr/logr" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" ) @@ -30,10 +32,29 @@ type objectReference struct { Namespace string } +// String is used when logging an objectReference in text format. func (s objectReference) String() string { return fmt.Sprintf("[%s/%s, namespace: %s, name: %s, uid: %s]", s.APIVersion, s.Kind, s.Namespace, s.Name, s.UID) } +// MarshalLog is used when logging an objectReference in JSON format. +func (s objectReference) MarshalLog() interface{} { + return struct { + Name string `json:"name"` + Namespace string `json:"namespace"` + APIVersion string `json:"apiVersion"` + UID types.UID `json:"uid"` + }{ + Namespace: s.Namespace, + Name: s.Name, + APIVersion: s.APIVersion, + UID: s.UID, + } +} + +var _ fmt.Stringer = objectReference{} +var _ logr.Marshaler = objectReference{} + // The single-threaded GraphBuilder.processGraphChanges() is the sole writer of the // nodes. The multi-threaded GarbageCollector.attemptToDeleteItem() reads the nodes. // WARNING: node has different locks on different fields. setters and getters