@@ -11,6 +11,7 @@ import (
1111 "context"
1212 "crypto/rand"
1313 "fmt"
14+ "log/slog"
1415 "math/big"
1516 "os"
1617 "path/filepath"
@@ -19,36 +20,40 @@ import (
1920 operatorOption "github.com/cilium/cilium/operator/option"
2021 "github.com/cilium/cilium/pkg/hive"
2122 k8sClient "github.com/cilium/cilium/pkg/k8s/client"
22- k8sversion "github.com/cilium/cilium/pkg/k8s/version"
2323 "github.com/cilium/cilium/pkg/logging"
2424 "github.com/cilium/cilium/pkg/logging/logfields"
2525 "github.com/cilium/cilium/pkg/metrics"
2626 "github.com/cilium/cilium/pkg/option"
2727 "github.com/cilium/hive/cell"
2828 "github.com/microsoft/retina/internal/buildinfo"
29+ "github.com/microsoft/retina/pkg/log"
2930 "github.com/pkg/errors"
30- "github.com/sirupsen/logrus"
3131 "github.com/spf13/viper"
32+ "go.uber.org/zap"
3233 "k8s.io/client-go/tools/leaderelection"
3334 "k8s.io/client-go/tools/leaderelection/resourcelock"
3435)
3536
3637var (
3738 // set logger field: subsys=retina-operator
3839 binaryName = filepath .Base (os .Args [0 ])
39- logger = logging .DefaultLogger . WithField (logfields .LogSubsys , binaryName )
40+ slogLogger = logging .DefaultSlogLogger . With (logfields .LogSubsys , binaryName )
4041 operatorIDLength = 10
4142)
4243
4344func Execute (h * hive.Hive ) {
4445 initEnv (h .Viper ())
4546
46- if err := h .Run (logging .DefaultSlogLogger ); err != nil {
47- logger .Fatal (err )
47+ // Use zap-backed slog logger for hive (routes to stdout + Application Insights)
48+ if err := h .Run (log .SlogLogger ()); err != nil {
49+ logging .Fatal (slogLogger , err .Error ())
4850 }
4951}
5052
51- func registerOperatorHooks (l logrus.FieldLogger , lc cell.Lifecycle , llc * LeaderLifecycle , clientset k8sClient.Clientset , shutdowner hive.Shutdowner ) {
53+ func registerOperatorHooks (
54+ l * slog.Logger , lc cell.Lifecycle , llc * LeaderLifecycle ,
55+ clientset k8sClient.Clientset , shutdowner hive.Shutdowner ,
56+ ) {
5257 var wg sync.WaitGroup
5358 lc .Append (cell.Hook {
5459 OnStart : func (cell.HookContext ) error {
@@ -77,19 +82,28 @@ func initEnv(vp *viper.Viper) {
7782 // the default values provided in option.Config or operatorOption.Config respectively.
7883 // The values will be overridden to the "zero value".
7984 // Maybe could create a cell.Config for these instead?
80- option .Config .Populate (vp )
81- operatorOption .Config .Populate (vp )
85+ // slogloggercheck: using default logger for configuration initialization
86+ option .Config .Populate (logging .DefaultSlogLogger , vp )
87+ operatorOption .Config .Populate (logging .DefaultSlogLogger , vp )
8288
83- // add hooks after setting up metrics in the option.Confog
84- logging .DefaultLogger . Hooks . Add (metrics .NewLoggingHook ())
89+ // add hooks after setting up metrics in the option.Config
90+ logging .AddHandlers (metrics .NewLoggingHook ())
8591
8692 // Logging should always be bootstrapped first. Do not add any code above this!
8793 if err := logging .SetupLogging (option .Config .LogDriver , logging .LogOptions (option .Config .LogOpt ), binaryName , option .Config .Debug ); err != nil {
88- logger .Fatal (err )
94+ logging .Fatal (slogLogger , err . Error () )
8995 }
9096
91- option .LogRegisteredOptions (vp , logger )
92- logger .Infof ("retina operator version: %s" , buildinfo .Version )
97+ // Set up zap logger with Application Insights telemetry
98+ _ , _ = log .SetupZapLogger (& log.LogOpts {
99+ Level : option .Config .LogOpt [logging .LevelOpt ],
100+ ApplicationInsightsID : buildinfo .ApplicationInsightsID ,
101+ EnableTelemetry : buildinfo .ApplicationInsightsID != "" ,
102+ }, zap .String ("version" , buildinfo .Version ))
103+ log .SetDefaultSlog ()
104+
105+ option .LogRegisteredSlogOptions (vp , slogLogger )
106+ slogLogger .Info ("retina operator version" , "version" , buildinfo .Version )
93107}
94108
95109func doCleanup () {
@@ -103,32 +117,20 @@ func doCleanup() {
103117// runOperator implements the logic of leader election for cilium-operator using
104118// built-in leader election capability in kubernetes.
105119// See: https://github.com/kubernetes/client-go/blob/master/examples/leader-election/main.go
106- func runOperator (l logrus. FieldLogger , lc * LeaderLifecycle , clientset k8sClient.Clientset , shutdowner hive.Shutdowner ) {
120+ func runOperator (l * slog. Logger , lc * LeaderLifecycle , clientset k8sClient.Clientset , shutdowner hive.Shutdowner ) {
107121 isLeader .Store (false )
108122
109123 leaderElectionCtx , leaderElectionCtxCancel = context .WithCancel (context .Background ())
110124
111- // We only support Operator in HA mode for Kubernetes Versions having support for
112- // LeasesResourceLock.
113- // See docs on capabilities.LeasesResourceLock for more context.
114- if ! k8sversion .Capabilities ().LeasesResourceLock {
115- l .Info ("Support for coordination.k8s.io/v1 not present, fallback to non HA mode" )
116-
117- if err := lc .Start (logging .DefaultSlogLogger , leaderElectionCtx ); err != nil {
118- l .WithError (err ).Fatal ("Failed to start leading" )
119- }
120- return
121- }
122-
123125 // Get hostname for identity name of the lease lock holder.
124126 // We identify the leader of the operator cluster using hostname.
125127 operatorID , err := os .Hostname ()
126128 if err != nil {
127- l . WithError ( err ). Fatal ("Failed to get hostname when generating lease lock identity" )
129+ logging . Fatal (l , "Failed to get hostname when generating lease lock identity" , logfields . Error , err )
128130 }
129131 operatorID , err = randomStringWithPrefix (operatorID + "-" , operatorIDLength )
130132 if err != nil {
131- l . WithError ( err ). Fatal ("Failed to generate random string for lease lock identity" )
133+ logging . Fatal (l , "Failed to generate random string for lease lock identity" , logfields . Error , err )
132134 }
133135
134136 leResourceLock , err := resourcelock .NewFromKubeconfig (
@@ -142,7 +144,7 @@ func runOperator(l logrus.FieldLogger, lc *LeaderLifecycle, clientset k8sClient.
142144 clientset .RestConfig (),
143145 operatorOption .Config .LeaderElectionRenewDeadline )
144146 if err != nil {
145- l . WithError ( err ). Fatal ("Failed to create resource lock for leader election" )
147+ logging . Fatal (l , "Failed to create resource lock for leader election" , logfields . Error , err )
146148 }
147149
148150 // Start the leader election for running cilium-operators
@@ -160,23 +162,20 @@ func runOperator(l logrus.FieldLogger, lc *LeaderLifecycle, clientset k8sClient.
160162 Callbacks : leaderelection.LeaderCallbacks {
161163 OnStartedLeading : func (ctx context.Context ) {
162164 if err := lc .Start (logging .DefaultSlogLogger , ctx ); err != nil {
163- l .WithError ( err ). Error ("Failed to start when elected leader, shutting down" )
165+ l .Error ("Failed to start when elected leader, shutting down" , logfields . Error , err )
164166 shutdowner .Shutdown (hive .ShutdownWithError (err ))
165167 }
166168 },
167169 OnStoppedLeading : func () {
168- l .WithField ( "operator-id" , operatorID ). Info ("Leader election lost" )
170+ l .Info ("Leader election lost" , "operator-id" , operatorID )
169171 // Cleanup everything here, and exit.
170172 shutdowner .Shutdown (hive .ShutdownWithError (errors .New ("Leader election lost" )))
171173 },
172174 OnNewLeader : func (identity string ) {
173175 if identity == operatorID {
174176 l .Info ("Leading the operator HA deployment" )
175177 } else {
176- l .WithFields (logrus.Fields {
177- "newLeader" : identity ,
178- "operatorID" : operatorID ,
179- }).Info ("Leader re-election complete" )
178+ l .Info ("Leader re-election complete" , "newLeader" , identity , "operatorID" , operatorID )
180179 }
181180 },
182181 },
0 commit comments