Skip to content

Commit 04566d5

Browse files
estebancamsEsteban Capillotimraymondrbtr
authored
implement zap for cni (#1933)
* feat: added logger package and replaced old log initialization for the new one * feat: changed all log lines to new zap logger * fix: typo * Update azure-ipam/logger/logger.go Co-authored-by: Timothy J. Raymond <[email protected]> * fix: adding constants to describe logger rotations constraints * Renamed logger New method * Replaced logAndSend method by log 1st and send then so we can use zap fields * minor fixes * added logger init for tests * replaced Any by Error * gci ipam_test * fixed govet errors * moved component to a zap field * fixed linit issues * added log mock * fix: gci * fix: added context for logger teardown * Update cni/log/logger.go Co-authored-by: Evan Baker <[email protected]> * moved logger init mock function * fix: lint findings --------- Co-authored-by: Esteban Capillo <[email protected]> Co-authored-by: Timothy J. Raymond <[email protected]> Co-authored-by: Evan Baker <[email protected]>
1 parent 3ad4c65 commit 04566d5

23 files changed

+582
-284
lines changed

azure-ipam/logger/logger.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ const (
1212
)
1313

1414
type Config struct {
15-
Level string // Debug by default
16-
Filepath string // default /var/log/azure-ipam.log
17-
MaxSizeInMB int // MegaBytes
18-
MaxBackups int // # of backups, no limitation by default
15+
Level string // Debug by default
16+
Filepath string // default /var/log/azure-ipam.log
17+
MaxSizeInMB int // MegaBytes
18+
MaxBackups int // # of backups, no limitation by default
1919
}
2020

2121
// NewLogger creates and returns a zap logger and a clean up function
@@ -34,13 +34,13 @@ func New(cfg *Config) (*zap.Logger, func(), error) {
3434
return logger, cleanup, nil
3535
}
3636

37-
// create and return a zap logger via lumbejack with rotation
38-
func newFileLogger(cfg *Config, logLevel zapcore.Level) (*zap.Logger) {
37+
// create and return a zap logger via lumberjack with rotation
38+
func newFileLogger(cfg *Config, logLevel zapcore.Level) *zap.Logger {
3939
// define a lumberjack fileWriter
4040
logFileWriter := zapcore.AddSync(&lumberjack.Logger{
41-
Filename: cfg.Filepath,
42-
MaxSize: cfg.MaxSizeInMB, // MegaBytes
43-
MaxBackups: cfg.MaxBackups,
41+
Filename: cfg.Filepath,
42+
MaxSize: cfg.MaxSizeInMB, // MegaBytes
43+
MaxBackups: cfg.MaxBackups,
4444
})
4545
// define the log encoding
4646
encoderConfig := zap.NewProductionEncoderConfig()

cni/api/api.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import (
55
"net"
66
"os"
77

8-
"github.com/Azure/azure-container-networking/log"
8+
"github.com/Azure/azure-container-networking/cni/log"
9+
"go.uber.org/zap"
910
)
1011

1112
type PodNetworkInterfaceInfo struct {
@@ -23,13 +24,13 @@ type AzureCNIState struct {
2324
func (a *AzureCNIState) PrintResult() error {
2425
b, err := json.MarshalIndent(a, "", " ")
2526
if err != nil {
26-
log.Errorf("Failed to unmarshall Azure CNI state, err:%v.\n", err)
27+
log.Logger.Error("Failed to unmarshall Azure CNI state", zap.Error(err))
2728
}
2829

2930
// write result to stdout to be captured by caller
3031
_, err = os.Stdout.Write(b)
3132
if err != nil {
32-
log.Printf("Failed to write response to stdout %v", err)
33+
log.Logger.Error("Failed to write response to stdout", zap.Error(err))
3334
return err
3435
}
3536

cni/ipam/ipam.go

+56-18
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import (
99
"strconv"
1010

1111
"github.com/Azure/azure-container-networking/cni"
12+
"github.com/Azure/azure-container-networking/cni/log"
1213
"github.com/Azure/azure-container-networking/common"
1314
"github.com/Azure/azure-container-networking/ipam"
14-
"github.com/Azure/azure-container-networking/log"
1515
"github.com/Azure/azure-container-networking/platform"
1616
cniSkel "github.com/containernetworking/cni/pkg/skel"
1717
cniTypes "github.com/containernetworking/cni/pkg/types"
1818
cniTypesCurr "github.com/containernetworking/cni/pkg/types/100"
19+
"go.uber.org/zap"
1920
)
2021

2122
const ipamV6 = "azure-vnet-ipamv6"
@@ -61,22 +62,29 @@ func (plugin *ipamPlugin) Start(config *common.PluginConfig) error {
6162
// Initialize base plugin.
6263
err := plugin.Initialize(config)
6364
if err != nil {
64-
log.Printf("[cni-ipam] Failed to initialize base plugin, err:%v.", err)
65+
log.Logger.Error("Failed to initialize base plugin.",
66+
zap.Error(err), zap.String("component", "cni-ipam"))
6567
return err
6668
}
6769

6870
// Log platform information.
69-
log.Printf("[cni-ipam] Plugin %v version %v.", plugin.Name, plugin.Version)
70-
log.Printf("[cni-ipam] Running on %v", platform.GetOSInfo())
71+
log.Logger.Info("Plugin version.", zap.String("name", plugin.Name),
72+
zap.String("version", plugin.Version),
73+
zap.String("component", "cni-ipam"))
74+
log.Logger.Info("Running on",
75+
zap.String("platform", platform.GetOSInfo()),
76+
zap.String("component", "cni-ipam"))
7177

7278
// Initialize address manager. rehyrdration not required on reboot for cni ipam plugin
7379
err = plugin.am.Initialize(config, false, plugin.Options)
7480
if err != nil {
75-
log.Printf("[cni-ipam] Failed to initialize address manager, err:%v.", err)
81+
log.Logger.Error("Failed to initialize address manager",
82+
zap.String("error", err.Error()),
83+
zap.String("component", "cni-ipam"))
7684
return err
7785
}
7886

79-
log.Printf("[cni-ipam] Plugin started.")
87+
log.Logger.Info("Plugin started", zap.String("component", "cni-ipam"))
8088

8189
return nil
8290
}
@@ -85,7 +93,7 @@ func (plugin *ipamPlugin) Start(config *common.PluginConfig) error {
8593
func (plugin *ipamPlugin) Stop() {
8694
plugin.am.Uninitialize()
8795
plugin.Uninitialize()
88-
log.Printf("[cni-ipam] Plugin stopped.")
96+
log.Logger.Info("Plugin stopped", zap.String("component", "cni-ipam"))
8997
}
9098

9199
// Configure parses and applies the given network configuration.
@@ -96,7 +104,9 @@ func (plugin *ipamPlugin) Configure(stdinData []byte) (*cni.NetworkConfig, error
96104
return nil, err
97105
}
98106

99-
log.Printf("[cni-ipam] Read network configuration %+v.", nwCfg)
107+
log.Logger.Info("Read network configuration",
108+
zap.Any("config", nwCfg),
109+
zap.String("component", "cni-ipam"))
100110

101111
// Apply IPAM configuration.
102112

@@ -135,10 +145,21 @@ func (plugin *ipamPlugin) Add(args *cniSkel.CmdArgs) error {
135145
var result *cniTypesCurr.Result
136146
var err error
137147

138-
log.Printf("[cni-ipam] Processing ADD command with args {ContainerID:%v Netns:%v IfName:%v Args:%v Path:%v StdinData:%s}.",
139-
args.ContainerID, args.Netns, args.IfName, args.Args, args.Path, args.StdinData)
148+
log.Logger.Info("Processing ADD command",
149+
zap.String("ContainerId", args.ContainerID),
150+
zap.String("Netns", args.Netns),
151+
zap.String("IfName", args.IfName),
152+
zap.String("Args", args.Args),
153+
zap.String("Path", args.Path),
154+
zap.ByteString("StdinData", args.StdinData),
155+
zap.String("component", "cni-ipam"))
140156

141-
defer func() { log.Printf("[cni-ipam] ADD command completed with result:%+v err:%v.", result, err) }()
157+
defer func() {
158+
log.Logger.Info("ADD command completed",
159+
zap.Any("result", result),
160+
zap.Any("error:", err),
161+
zap.String("component", "cni-ipam"))
162+
}()
142163

143164
// Parse network configuration from stdin.
144165
nwCfg, err := plugin.Configure(args.StdinData)
@@ -174,13 +195,18 @@ func (plugin *ipamPlugin) Add(args *cniSkel.CmdArgs) error {
174195
// On failure, release the address pool.
175196
defer func() {
176197
if err != nil && poolID != "" {
177-
log.Printf("[cni-ipam] Releasing pool %v.", poolID)
198+
log.Logger.Info("Releasing pool",
199+
zap.String("poolId", poolID),
200+
zap.String("component", "cni-ipam"))
178201
_ = plugin.am.ReleasePool(nwCfg.IPAM.AddrSpace, poolID)
179202
}
180203
}()
181204

182205
nwCfg.IPAM.Subnet = subnet
183-
log.Printf("[cni-ipam] Allocated address poolID %v with subnet %v.", poolID, subnet)
206+
log.Logger.Info("Allocated address with subnet",
207+
zap.String("poolId", poolID),
208+
zap.String("subnet", subnet),
209+
zap.String("component", "cni-ipam"))
184210
}
185211

186212
// Allocate an address for the endpoint.
@@ -193,12 +219,16 @@ func (plugin *ipamPlugin) Add(args *cniSkel.CmdArgs) error {
193219
// On failure, release the address.
194220
defer func() {
195221
if err != nil && address != "" {
196-
log.Printf("[cni-ipam] Releasing address %v.", address)
222+
log.Logger.Info("Releasing address",
223+
zap.String("address", address),
224+
zap.String("component", "cni-ipam"))
197225
_ = plugin.am.ReleaseAddress(nwCfg.IPAM.AddrSpace, nwCfg.IPAM.Subnet, address, options)
198226
}
199227
}()
200228

201-
log.Printf("[cni-ipam] Allocated address %v.", address)
229+
log.Logger.Info("Allocated address",
230+
zap.String("address", address),
231+
zap.String("component", "cni-ipam"))
202232

203233
// Parse IP address.
204234
ipAddress, err := platform.ConvertStringToIPNet(address)
@@ -263,10 +293,18 @@ func (plugin *ipamPlugin) Get(args *cniSkel.CmdArgs) error {
263293
func (plugin *ipamPlugin) Delete(args *cniSkel.CmdArgs) error {
264294
var err error
265295

266-
log.Printf("[cni-ipam] Processing DEL command with args {ContainerID:%v Netns:%v IfName:%v Args:%v Path:%v StdinData:%s}.",
267-
args.ContainerID, args.Netns, args.IfName, args.Args, args.Path, args.StdinData)
296+
log.Logger.Info("[cni-ipam] Processing DEL command",
297+
zap.String("ContainerId", args.ContainerID),
298+
zap.String("Netns", args.Netns),
299+
zap.String("IfName", args.IfName),
300+
zap.String("Args", args.Args),
301+
zap.String("Path", args.Path),
302+
zap.ByteString("StdinData", args.StdinData))
268303

269-
defer func() { log.Printf("[cni-ipam] DEL command completed with err:%v.", err) }()
304+
defer func() {
305+
log.Logger.Info("[cni-ipam] DEL command completed",
306+
zap.Error(err))
307+
}()
270308

271309
// Parse network configuration from stdin.
272310
nwCfg, err := plugin.Configure(args.StdinData)

cni/ipam/ipam_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ import (
1212
"testing"
1313
"time"
1414

15+
"github.com/Azure/azure-container-networking/cni/log"
16+
"github.com/Azure/azure-container-networking/common"
1517
cniSkel "github.com/containernetworking/cni/pkg/skel"
1618
cniTypesCurr "github.com/containernetworking/cni/pkg/types/100"
1719
"github.com/google/uuid"
1820
. "github.com/onsi/ginkgo"
1921
. "github.com/onsi/gomega"
20-
21-
"github.com/Azure/azure-container-networking/common"
2222
)
2323

2424
var (
@@ -97,6 +97,8 @@ var (
9797
Expect(err).NotTo(HaveOccurred())
9898

9999
arg = &cniSkel.CmdArgs{}
100+
101+
log.InitializeMock()
100102
})
101103

102104
_ = AfterSuite(func() {

cni/ipam/plugin/main.go

+15-10
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,40 @@
44
package main
55

66
import (
7+
"context"
78
"fmt"
89
"os"
910

1011
"github.com/Azure/azure-container-networking/cni"
1112
"github.com/Azure/azure-container-networking/cni/ipam"
13+
"github.com/Azure/azure-container-networking/cni/log"
1214
"github.com/Azure/azure-container-networking/common"
13-
"github.com/Azure/azure-container-networking/log"
15+
"go.uber.org/zap/zapcore"
1416
)
1517

1618
const (
17-
name = "azure-vnet-ipam"
19+
name = "azure-vnet-ipam"
20+
maxLogFileSizeInMb = 5
21+
maxLogFileCount = 8
1822
)
1923

2024
// Version is populated by make during build.
2125
var version string
2226

2327
// Main is the entry point for CNI IPAM plugin.
2428
func main() {
29+
ctx, cancel := context.WithCancel(context.Background())
2530
var config common.PluginConfig
2631
config.Version = version
27-
logDirectory := "" // Sets the current location as log directory
2832

29-
log.SetName(name)
30-
log.SetLevel(log.LevelInfo)
31-
if err := log.SetTargetLogDirectory(log.TargetLogfile, logDirectory); err != nil {
32-
fmt.Printf("Failed to setup cni logging: %v\n", err)
33-
return
33+
loggerCfg := &log.Config{
34+
Level: zapcore.DebugLevel,
35+
LogPath: log.LogPath + "azure-ipam.log",
36+
MaxSizeInMB: maxLogFileSizeInMb,
37+
MaxBackups: maxLogFileCount,
38+
Name: name,
3439
}
35-
36-
defer log.Close()
40+
log.Initialize(ctx, loggerCfg)
3741

3842
ipamPlugin, err := ipam.NewPlugin(name, &config)
3943
if err != nil {
@@ -65,6 +69,7 @@ func main() {
6569
err = ipamPlugin.Execute(cni.PluginApi(ipamPlugin))
6670

6771
ipamPlugin.Stop()
72+
cancel()
6873

6974
if err != nil {
7075
panic("ipam plugin fatal error")

cni/ipam/pluginv6/main.go

+15-10
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,40 @@
44
package main
55

66
import (
7+
"context"
78
"fmt"
89
"os"
910

1011
"github.com/Azure/azure-container-networking/cni"
1112
"github.com/Azure/azure-container-networking/cni/ipam"
13+
"github.com/Azure/azure-container-networking/cni/log"
1214
"github.com/Azure/azure-container-networking/common"
13-
"github.com/Azure/azure-container-networking/log"
15+
"go.uber.org/zap/zapcore"
1416
)
1517

1618
const (
17-
name = "azure-vnet-ipamv6"
19+
name = "azure-vnet-ipamv6"
20+
maxLogFileSizeInMb = 5
21+
maxLogFileCount = 8
1822
)
1923

2024
// Version is populated by make during build.
2125
var version string
2226

2327
// Main is the entry point for CNI IPAM plugin.
2428
func main() {
29+
ctx, cancel := context.WithCancel(context.Background())
2530
var config common.PluginConfig
2631
config.Version = version
27-
logDirectory := "" // Sets the current location as log directory
2832

29-
log.SetName(name)
30-
log.SetLevel(log.LevelInfo)
31-
if err := log.SetTargetLogDirectory(log.TargetLogfile, logDirectory); err != nil {
32-
fmt.Printf("Failed to setup cni logging: %v\n", err)
33-
return
33+
loggerCfg := &log.Config{
34+
Level: zapcore.DebugLevel,
35+
LogPath: log.LogPath + "azure-ipam.log",
36+
MaxSizeInMB: maxLogFileSizeInMb,
37+
MaxBackups: maxLogFileCount,
38+
Name: name,
3439
}
35-
36-
defer log.Close()
40+
log.Initialize(ctx, loggerCfg)
3741

3842
ipamPlugin, err := ipam.NewPlugin(name, &config)
3943
if err != nil {
@@ -65,6 +69,7 @@ func main() {
6569
err = ipamPlugin.Execute(cni.PluginApi(ipamPlugin))
6670

6771
ipamPlugin.Stop()
72+
cancel()
6873

6974
if err != nil {
7075
panic("ipam plugin fatal error")

0 commit comments

Comments
 (0)