Skip to content

Commit

Permalink
fix: zapetw core With fields (#3433)
Browse files Browse the repository at this point in the history
fix: zapetw core with fields

Signed-off-by: Evan Baker <[email protected]>
  • Loading branch information
rbtr authored Feb 20, 2025
1 parent 2451ac1 commit ca8da2f
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 19 deletions.
2 changes: 1 addition & 1 deletion cni/log/logger_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func etwCore(loggingLevel zapcore.Level) (zapcore.Core, error) {
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
jsonEncoder := zapcore.NewJSONEncoder(encoderConfig)

etwcore, err := zapetw.NewETWCore(etwCNIEventName, jsonEncoder, loggingLevel)
etwcore, _, err := zapetw.New("ACN-Monitoring", etwCNIEventName, jsonEncoder, loggingLevel)
if err != nil {
return nil, errors.Wrap(err, "failed to create ETW core")
}
Expand Down
2 changes: 1 addition & 1 deletion cns/logger/cnslogger_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ func getPlatformCores(loggingLevel zapcore.Level, encoder zapcore.Encoder) (zapc
}

func getETWCore(loggingLevel zapcore.Level, encoder zapcore.Encoder) (zapcore.Core, error) {
etwcore, err := zapetw.NewETWCore(etwCNSEventName, encoder, loggingLevel)
etwcore, _, err := zapetw.New("ACN-Monitoring", etwCNSEventName, encoder, loggingLevel)
if err != nil {
return nil, errors.Wrap(err, "failed to create ETW core")
}
Expand Down
40 changes: 23 additions & 17 deletions zapetw/core_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,48 +9,45 @@ import (
// <product_name>-<component_name>
const providername = "ACN-Monitoring"

type ETWCore struct {
type Core struct {
provider *etw.Provider
eventName string
encoder zapcore.Encoder
fields []zapcore.Field
zapcore.LevelEnabler
}

func NewETWCore(eventName string, encoder zapcore.Encoder, levelEnabler zapcore.LevelEnabler) (*ETWCore, error) {
provider, err := etw.NewProviderWithOptions(providername)
func New(providerName, eventName string, encoder zapcore.Encoder, levelEnabler zapcore.LevelEnabler) (zapcore.Core, func(), error) {
provider, err := etw.NewProviderWithOptions(providerName)
if err != nil {
return nil, errors.Wrap(err, "failed to create ETW provider")
return nil, func() { _ = provider.Close() }, errors.Wrap(err, "failed to create ETW provider")
}
return &ETWCore{
return &Core{
provider: provider,
eventName: eventName,
encoder: encoder,
LevelEnabler: levelEnabler,
}, nil
}, func() { _ = provider.Close() }, nil
}

func (core *ETWCore) With(fields []zapcore.Field) zapcore.Core {
return &ETWCore{
provider: core.provider,
eventName: core.eventName,
encoder: core.encoder,
LevelEnabler: core.LevelEnabler,
fields: append(core.fields, fields...),
func (core *Core) With(fields []zapcore.Field) zapcore.Core {
clone := core.clone()
for i := range fields {
fields[i].AddTo(clone.encoder)
}
return clone
}

// Check is an implementation of the zapcore.Core interface's Check method.
// Check determines whether the logger core is enabled at the supplied zapcore.Entry's Level.
// If enabled, it adds the core to the CheckedEntry and returns it, otherwise returns the CheckedEntry unchanged.
func (core *ETWCore) Check(entry zapcore.Entry, checkedEntry *zapcore.CheckedEntry) *zapcore.CheckedEntry {
func (core *Core) Check(entry zapcore.Entry, checkedEntry *zapcore.CheckedEntry) *zapcore.CheckedEntry {
if core.Enabled(entry.Level) {
return checkedEntry.AddCore(entry, core)
}
return checkedEntry
}

func (core *ETWCore) Write(entry zapcore.Entry, fields []zapcore.Field) error {
func (core *Core) Write(entry zapcore.Entry, fields []zapcore.Field) error {
etwLevel := zapLevelToETWLevel(entry.Level)

buffer, err := core.encoder.EncodeEntry(entry, fields)
Expand All @@ -70,10 +67,19 @@ func (core *ETWCore) Write(entry zapcore.Entry, fields []zapcore.Field) error {
return nil
}

func (core *ETWCore) Sync() error {
func (core *Core) Sync() error {
return nil
}

func (core *Core) clone() *Core {
return &Core{
provider: core.provider,
eventName: core.eventName,
encoder: core.encoder.Clone(),
LevelEnabler: core.LevelEnabler,
}
}

func zapLevelToETWLevel(level zapcore.Level) etw.Level {
switch level {
case zapcore.DebugLevel:
Expand Down

0 comments on commit ca8da2f

Please sign in to comment.