@@ -17,17 +17,22 @@ const (
17
17
REASON_KEY = "reason"
18
18
VARIANT_KEY = "variant"
19
19
VALUE_KEY = "value"
20
+ STAGE_KEY = "stage"
20
21
)
21
22
23
+ // LoggingHook is a [of.Hook] that logs the flag evaluation lifecycle.
22
24
type LoggingHook struct {
23
25
includeEvaluationContext bool
24
26
logger * slog.Logger
25
27
}
26
28
29
+ // NewLoggingHook returns a new [LoggingHook] with the default logger.
30
+ // To provide a custom logger, use [NewCustomLoggingHook].
27
31
func NewLoggingHook (includeEvaluationContext bool ) (* LoggingHook , error ) {
28
32
return NewCustomLoggingHook (includeEvaluationContext , slog .Default ())
29
33
}
30
34
35
+ // NewCustomLoggingHook returns a new [LoggingHook] with the provided logger.
31
36
func NewCustomLoggingHook (includeEvaluationContext bool , logger * slog.Logger ) (* LoggingHook , error ) {
32
37
return & LoggingHook {
33
38
logger : logger ,
@@ -40,57 +45,53 @@ type MarshaledEvaluationContext struct {
40
45
Attributes map [string ]any
41
46
}
42
47
43
- func (l LoggingHook ) buildArgs (hookContext of.HookContext ) ([]any , error ) {
44
-
45
- args := []any {
46
- DOMAIN_KEY , hookContext .ClientMetadata ().Domain (),
47
- PROVIDER_NAME_KEY , hookContext .ProviderMetadata ().Name ,
48
- FLAG_KEY_KEY , hookContext .FlagKey (),
49
- DEFAULT_VALUE_KEY , hookContext .DefaultValue (),
48
+ func (h * LoggingHook ) buildArgs (hookContext of.HookContext ) []slog.Attr {
49
+ args := []slog.Attr {
50
+ slog .String (DOMAIN_KEY , hookContext .ClientMetadata ().Domain ()),
51
+ slog .String (PROVIDER_NAME_KEY , hookContext .ProviderMetadata ().Name ),
52
+ slog .String (FLAG_KEY_KEY , hookContext .FlagKey ()),
53
+ slog .Any (DEFAULT_VALUE_KEY , hookContext .DefaultValue ()),
50
54
}
51
- if l .includeEvaluationContext {
55
+ if h .includeEvaluationContext {
52
56
marshaledEvaluationContext := MarshaledEvaluationContext {
53
57
TargetingKey : hookContext .EvaluationContext ().TargetingKey (),
54
58
Attributes : hookContext .EvaluationContext ().Attributes (),
55
59
}
56
- args = append (args , EVALUATION_CONTEXT_KEY , marshaledEvaluationContext )
60
+ args = append (args , slog . Any ( EVALUATION_CONTEXT_KEY , marshaledEvaluationContext ) )
57
61
}
58
62
59
- return args , nil
63
+ return args
60
64
}
61
65
62
- func (h * LoggingHook ) Before (ctx context.Context , hookContext of.HookContext ,
63
- hint of.HookHints ) (* of.EvaluationContext , error ) {
64
- var args , err = h .buildArgs (hookContext )
65
- if err != nil {
66
- return nil , err
67
- }
68
- h .logger .Debug ("Before stage" , args ... )
66
+ func (h * LoggingHook ) Before (ctx context.Context , hookContext of.HookContext , hookHints of.HookHints ) (* of.EvaluationContext , error ) {
67
+ args := h .buildArgs (hookContext )
68
+ args = append (args , slog .String (STAGE_KEY , "before" ))
69
+ h .logger .LogAttrs (ctx , slog .LevelDebug , "Before stage" , args ... )
69
70
return nil , nil
70
71
}
71
72
72
73
func (h * LoggingHook ) After (ctx context.Context , hookContext of.HookContext ,
73
- flagEvaluationDetails of.InterfaceEvaluationDetails , hookHints of.HookHints ) error {
74
- var args , err = h .buildArgs (hookContext )
75
- if err != nil {
76
- return err
77
- }
78
- args = append (args , REASON_KEY , flagEvaluationDetails .Reason )
79
- args = append (args , VARIANT_KEY , flagEvaluationDetails .Variant )
80
- args = append (args , VALUE_KEY , flagEvaluationDetails .Value )
81
- h .logger .Debug ("After stage" , args ... )
74
+ flagEvaluationDetails of.InterfaceEvaluationDetails , hookHints of.HookHints ,
75
+ ) error {
76
+ args := h .buildArgs (hookContext )
77
+ args = append (args ,
78
+ slog .String (REASON_KEY , string (flagEvaluationDetails .Reason )),
79
+ slog .String (VARIANT_KEY , flagEvaluationDetails .Variant ),
80
+ slog .Any (VALUE_KEY , flagEvaluationDetails .Value ),
81
+ slog .String (STAGE_KEY , "after" ),
82
+ )
83
+ h .logger .LogAttrs (ctx , slog .LevelDebug , "After stage" , args ... )
82
84
return nil
83
85
}
84
86
85
- func (h * LoggingHook ) Error (ctx context.Context , hookContext of.HookContext , err error , hint of.HookHints ) {
86
- args , buildArgsErr := h .buildArgs (hookContext )
87
- if buildArgsErr != nil {
88
- slog .Error ( "Error building args" , "error" , buildArgsErr )
89
- }
90
- args = append ( args , ERROR_MESSAGE_KEY , err )
91
- h .logger .Error ( "Error stage" , args ... )
87
+ func (h * LoggingHook ) Error (ctx context.Context , hookContext of.HookContext , err error , hookHints of.HookHints ) {
88
+ args := h .buildArgs (hookContext )
89
+ args = append ( args ,
90
+ slog .Any ( ERROR_MESSAGE_KEY , err ),
91
+ slog . String ( STAGE_KEY , "error" ),
92
+ )
93
+ h .logger .LogAttrs ( ctx , slog . LevelError , "Error stage" , args ... )
92
94
}
93
95
94
- func (h * LoggingHook ) Finally (ctx context.Context , hCtx of.HookContext , flagEvaluationDetails of.InterfaceEvaluationDetails , hint of.HookHints ) {
95
-
96
+ func (h * LoggingHook ) Finally (ctx context.Context , hookContext of.HookContext , flagEvaluationDetails of.InterfaceEvaluationDetails , hookHints of.HookHints ) {
96
97
}
0 commit comments