@@ -17,17 +17,22 @@ const (
1717 REASON_KEY = "reason"
1818 VARIANT_KEY = "variant"
1919 VALUE_KEY = "value"
20+ STAGE_KEY = "stage"
2021)
2122
23+ // LoggingHook is a [of.Hook] that logs the flag evaluation lifecycle.
2224type LoggingHook struct {
2325 includeEvaluationContext bool
2426 logger * slog.Logger
2527}
2628
29+ // NewLoggingHook returns a new [LoggingHook] with the default logger.
30+ // To provide a custom logger, use [NewCustomLoggingHook].
2731func NewLoggingHook (includeEvaluationContext bool ) (* LoggingHook , error ) {
2832 return NewCustomLoggingHook (includeEvaluationContext , slog .Default ())
2933}
3034
35+ // NewCustomLoggingHook returns a new [LoggingHook] with the provided logger.
3136func NewCustomLoggingHook (includeEvaluationContext bool , logger * slog.Logger ) (* LoggingHook , error ) {
3237 return & LoggingHook {
3338 logger : logger ,
@@ -40,57 +45,53 @@ type MarshaledEvaluationContext struct {
4045 Attributes map [string ]any
4146}
4247
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 ()),
5054 }
51- if l .includeEvaluationContext {
55+ if h .includeEvaluationContext {
5256 marshaledEvaluationContext := MarshaledEvaluationContext {
5357 TargetingKey : hookContext .EvaluationContext ().TargetingKey (),
5458 Attributes : hookContext .EvaluationContext ().Attributes (),
5559 }
56- args = append (args , EVALUATION_CONTEXT_KEY , marshaledEvaluationContext )
60+ args = append (args , slog . Any ( EVALUATION_CONTEXT_KEY , marshaledEvaluationContext ) )
5761 }
5862
59- return args , nil
63+ return args
6064}
6165
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 ... )
6970 return nil , nil
7071}
7172
7273func (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 ... )
8284 return nil
8385}
8486
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 ... )
9294}
9395
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 ) {
9697}
0 commit comments