Skip to content

Commit 3e82f20

Browse files
authored
split out loggers (#92)
Signed-off-by: Alex Jones <[email protected]>
1 parent 6c7040d commit 3e82f20

File tree

9 files changed

+90
-48
lines changed

9 files changed

+90
-48
lines changed

cmd/start.go

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,19 @@ func findService(name string) (service.IService, error) {
3636
Port: servicePort,
3737
},
3838
GRPCService: &service.GRPCService{},
39+
Logger: log.WithFields(log.Fields{
40+
"service": "http",
41+
"component": "service",
42+
}),
3943
},
4044
"grpc": &service.GRPCService{
4145
GRPCServiceConfiguration: &service.GRPCServiceConfiguration{
4246
Port: servicePort,
4347
},
48+
Logger: log.WithFields(log.Fields{
49+
"service": "grpc",
50+
"component": "service",
51+
}),
4452
},
4553
}
4654

@@ -58,13 +66,21 @@ func findSync(name string) ([]sync.ISync, error) {
5866
registeredSync := map[string]sync.ISync{
5967
"filepath": &sync.FilePathSync{
6068
URI: u,
69+
Logger: log.WithFields(log.Fields{
70+
"sync": "filepath",
71+
"component": "sync",
72+
}),
6173
},
6274
"remote": &sync.HTTPSync{
6375
URI: u,
6476
BearerToken: bearerToken,
6577
Client: &http.Client{
6678
Timeout: time.Second * 10,
6779
},
80+
Logger: log.WithFields(log.Fields{
81+
"sync": "remote",
82+
"component": "sync",
83+
}),
6884
},
6985
}
7086
v, ok := registeredSync[name]
@@ -80,7 +96,12 @@ func findSync(name string) ([]sync.ISync, error) {
8096

8197
func findEvaluator(name string) (eval.IEvaluator, error) {
8298
registeredEvaluators := map[string]eval.IEvaluator{
83-
"json": &eval.JSONEvaluator{},
99+
"json": &eval.JSONEvaluator{
100+
Logger: log.WithFields(log.Fields{
101+
"evaluator": "json",
102+
"component": "evaluator",
103+
}),
104+
},
84105
}
85106

86107
v, ok := registeredEvaluators[name]
@@ -98,6 +119,10 @@ var startCmd = &cobra.Command{
98119
Short: "Start flagd",
99120
Long: ``,
100121
Run: func(cmd *cobra.Command, args []string) {
122+
// Configure loggers -------------------------------------------------------
123+
log.SetFormatter(&log.JSONFormatter{})
124+
log.SetOutput(os.Stdout)
125+
log.SetLevel(log.DebugLevel)
101126
// Configure service-provider impl------------------------------------------
102127
var serviceImpl service.IService
103128
foundService, err := findService(serviceProvider)
@@ -137,8 +162,9 @@ var startCmd = &cobra.Command{
137162
}()
138163
}()
139164

140-
go runtime.Start(ctx, syncImpl, serviceImpl, evalImpl)
141-
165+
go runtime.Start(ctx, syncImpl, serviceImpl, evalImpl, log.WithFields(log.Fields{
166+
"component": "runtime",
167+
}))
142168
err = <-errc
143169
if err != nil {
144170
cancel()

pkg/eval/json_evaluator.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ import (
1919
var schema string
2020

2121
type JSONEvaluator struct {
22-
state Flags
22+
state Flags
23+
Logger *log.Entry
2324
}
2425

2526
type constraints interface {
@@ -45,7 +46,7 @@ func (je *JSONEvaluator) SetState(state string) error {
4546
return err
4647
} else if !result.Valid() {
4748
err := errors.New("invalid JSON file")
48-
log.Error(err)
49+
je.Logger.Error(err)
4950
return err
5051
}
5152

@@ -140,21 +141,21 @@ func (je *JSONEvaluator) evaluateVariant(
140141
if targeting != nil {
141142
targetingBytes, err := targeting.MarshalJSON()
142143
if err != nil {
143-
log.Errorf("Error parsing rules for flag %s, %s", flagKey, err)
144+
je.Logger.Errorf("Error parsing rules for flag %s, %s", flagKey, err)
144145
return "", model.ErrorReason, err
145146
}
146147

147148
b, err := json.Marshal(context)
148149
if err != nil {
149-
log.Errorf("error parsing context for flag %s, %s, %v", flagKey, err, context)
150+
je.Logger.Errorf("error parsing context for flag %s, %s, %v", flagKey, err, context)
150151

151152
return "", model.ErrorReason, errors.New(model.ErrorReason)
152153
}
153154
var result bytes.Buffer
154155
// evaluate json-logic rules to determine the variant
155156
err = jsonlogic.Apply(bytes.NewReader(targetingBytes), bytes.NewReader(b), &result)
156157
if err != nil {
157-
log.Errorf("Error applying rules %s", err)
158+
je.Logger.Errorf("Error applying rules %s", err)
158159
return "", model.ErrorReason, err
159160
}
160161
// strip whitespace and quotes from the variant

pkg/eval/tests/json_evaluator_test.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,16 @@ import (
88

99
"github.com/open-feature/flagd/pkg/eval"
1010
"github.com/open-feature/flagd/pkg/model"
11+
log "github.com/sirupsen/logrus"
1112
"github.com/stretchr/testify/assert"
1213
"github.com/stretchr/testify/require"
1314
"google.golang.org/protobuf/types/known/structpb"
1415
)
1516

17+
var l = log.WithFields(log.Fields{
18+
"evaluator": "json",
19+
})
20+
1621
const InvalidFlags = `{
1722
"flags": {
1823
"invalidFlag": {
@@ -221,7 +226,7 @@ var Flags = fmt.Sprintf(`{
221226
ColorValue)
222227

223228
func TestGetState_Valid_ContainsFlag(t *testing.T) {
224-
evaluator := eval.JSONEvaluator{}
229+
evaluator := eval.JSONEvaluator{Logger: l}
225230
err := evaluator.SetState(ValidFlags)
226231
if err != nil {
227232
t.Fatalf("Expected no error")
@@ -241,7 +246,7 @@ func TestGetState_Valid_ContainsFlag(t *testing.T) {
241246
}
242247

243248
func TestSetState_Invalid_Error(t *testing.T) {
244-
evaluator := eval.JSONEvaluator{}
249+
evaluator := eval.JSONEvaluator{Logger: l}
245250

246251
// set state with an invalid flag definition
247252
err := evaluator.SetState(InvalidFlags)
@@ -251,7 +256,7 @@ func TestSetState_Invalid_Error(t *testing.T) {
251256
}
252257

253258
func TestSetState_Valid_NoError(t *testing.T) {
254-
evaluator := eval.JSONEvaluator{}
259+
evaluator := eval.JSONEvaluator{Logger: l}
255260

256261
// set state with a valid flag definition
257262
err := evaluator.SetState(ValidFlags)
@@ -274,7 +279,7 @@ func TestResolveBooleanValue(t *testing.T) {
274279
{MissingFlag, nil, StaticBoolValue, model.ErrorReason, model.FlagNotFoundErrorCode},
275280
}
276281

277-
evaluator := eval.JSONEvaluator{}
282+
evaluator := eval.JSONEvaluator{Logger: l}
278283
err := evaluator.SetState(Flags)
279284
if err != nil {
280285
t.Fatalf("Expected no error")
@@ -312,7 +317,7 @@ func TestResolveStringValue(t *testing.T) {
312317
{MissingFlag, nil, "", model.ErrorReason, model.FlagNotFoundErrorCode},
313318
}
314319

315-
evaluator := eval.JSONEvaluator{}
320+
evaluator := eval.JSONEvaluator{Logger: l}
316321
err := evaluator.SetState(Flags)
317322
if err != nil {
318323
t.Fatalf("Expected no error")
@@ -351,7 +356,7 @@ func TestResolveNumberValue(t *testing.T) {
351356
{MissingFlag, nil, 13, model.ErrorReason, model.FlagNotFoundErrorCode},
352357
}
353358

354-
evaluator := eval.JSONEvaluator{}
359+
evaluator := eval.JSONEvaluator{Logger: l}
355360
err := evaluator.SetState(Flags)
356361
if err != nil {
357362
t.Fatalf("Expected no error")
@@ -390,7 +395,7 @@ func TestResolveObjectValue(t *testing.T) {
390395
{MissingFlag, nil, "{}", model.ErrorReason, model.FlagNotFoundErrorCode},
391396
}
392397

393-
evaluator := eval.JSONEvaluator{}
398+
evaluator := eval.JSONEvaluator{Logger: l}
394399
err := evaluator.SetState(Flags)
395400
if err != nil {
396401
t.Fatalf("Expected no error")

pkg/runtime/runtime.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ func updateState(ctx context.Context, syncr sync.ISync) error {
3030
return nil
3131
}
3232

33-
func startSyncer(ctx context.Context, notifier chan sync.INotify, syncr sync.ISync) {
33+
func startSyncer(ctx context.Context, notifier chan sync.INotify, syncr sync.ISync, logger *log.Entry) {
3434
if err := updateState(ctx, syncr); err != nil {
35-
log.Error(err)
35+
logger.Error(err)
3636
}
3737

3838
go syncr.Notify(ctx, notifier)
@@ -45,30 +45,32 @@ func startSyncer(ctx context.Context, notifier chan sync.INotify, syncr sync.ISy
4545
case w := <-notifier:
4646
switch w.GetEvent().EventType {
4747
case sync.DefaultEventTypeCreate:
48-
log.Info("New configuration created")
48+
logger.Info("New configuration created")
4949
if err := updateState(ctx, syncr); err != nil {
5050
log.Error(err)
5151
}
5252
case sync.DefaultEventTypeModify:
53-
log.Info("Configuration modified")
53+
logger.Info("Configuration modified")
5454
if err := updateState(ctx, syncr); err != nil {
5555
log.Error(err)
5656
}
5757
case sync.DefaultEventTypeDelete:
58-
log.Info("Configuration deleted")
58+
logger.Info("Configuration deleted")
5959
}
6060
}
6161
}
6262
}()
6363
}
6464

65-
func Start(ctx context.Context, syncr []sync.ISync, server service.IService, evaluator eval.IEvaluator) {
65+
func Start(ctx context.Context, syncr []sync.ISync, server service.IService,
66+
evaluator eval.IEvaluator, logger *log.Entry,
67+
) {
6668
ev = evaluator
6769

6870
syncNotifier := make(chan sync.INotify)
6971

7072
for _, s := range syncr {
71-
startSyncer(ctx, syncNotifier, s)
73+
startSyncer(ctx, syncNotifier, s, logger)
7274
}
7375

7476
go func() { _ = server.Serve(ctx, ev) }()

pkg/service/grpc_service.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ type GRPCService struct {
2323
GRPCServiceConfiguration *GRPCServiceConfiguration
2424
eval eval.IEvaluator
2525
gen.UnimplementedServiceServer
26+
Logger *log.Entry
2627
}
2728

28-
func (s GRPCService) Serve(ctx context.Context, eval eval.IEvaluator) error {
29+
func (s *GRPCService) Serve(ctx context.Context, eval eval.IEvaluator) error {
2930
s.eval = eval
3031

3132
grpcServer := grpc.NewServer()
@@ -39,71 +40,71 @@ func (s GRPCService) Serve(ctx context.Context, eval eval.IEvaluator) error {
3940
}
4041

4142
// TODO: might be able to simplify some of this with generics.
42-
func (s GRPCService) ResolveBoolean(
43+
func (s *GRPCService) ResolveBoolean(
4344
ctx context.Context,
4445
req *gen.ResolveBooleanRequest,
4546
) (*gen.ResolveBooleanResponse, error) {
4647
res := gen.ResolveBooleanResponse{}
4748
result, variant, reason, err := s.eval.ResolveBooleanValue(req.GetFlagKey(), req.GetContext())
4849
if err != nil {
49-
return &res, HandleEvaluationError(err, reason)
50+
return &res, s.HandleEvaluationError(err, reason)
5051
}
5152
res.Reason = reason
5253
res.Value = result
5354
res.Variant = variant
5455
return &res, nil
5556
}
5657

57-
func (s GRPCService) ResolveString(
58+
func (s *GRPCService) ResolveString(
5859
ctx context.Context,
5960
req *gen.ResolveStringRequest,
6061
) (*gen.ResolveStringResponse, error) {
6162
res := gen.ResolveStringResponse{}
6263
result, variant, reason, err := s.eval.ResolveStringValue(req.GetFlagKey(), req.GetContext())
6364
if err != nil {
64-
return &res, HandleEvaluationError(err, reason)
65+
return &res, s.HandleEvaluationError(err, reason)
6566
}
6667
res.Reason = reason
6768
res.Value = result
6869
res.Variant = variant
6970
return &res, nil
7071
}
7172

72-
func (s GRPCService) ResolveNumber(
73+
func (s *GRPCService) ResolveNumber(
7374
ctx context.Context,
7475
req *gen.ResolveNumberRequest,
7576
) (*gen.ResolveNumberResponse, error) {
7677
res := gen.ResolveNumberResponse{}
7778
result, variant, reason, err := s.eval.ResolveNumberValue(req.GetFlagKey(), req.GetContext())
7879
if err != nil {
79-
return &res, HandleEvaluationError(err, reason)
80+
return &res, s.HandleEvaluationError(err, reason)
8081
}
8182
res.Reason = reason
8283
res.Value = result
8384
res.Variant = variant
8485
return &res, nil
8586
}
8687

87-
func (s GRPCService) ResolveObject(
88+
func (s *GRPCService) ResolveObject(
8889
ctx context.Context,
8990
req *gen.ResolveObjectRequest,
9091
) (*gen.ResolveObjectResponse, error) {
9192
res := gen.ResolveObjectResponse{}
9293
result, variant, reason, err := s.eval.ResolveObjectValue(req.GetFlagKey(), req.GetContext())
9394
if err != nil {
94-
return &res, HandleEvaluationError(err, reason)
95+
return &res, s.HandleEvaluationError(err, reason)
9596
}
9697
val, err := structpb.NewStruct(result)
9798
if err != nil {
98-
return &res, HandleEvaluationError(err, reason)
99+
return &res, s.HandleEvaluationError(err, reason)
99100
}
100101
res.Reason = reason
101102
res.Value = val
102103
res.Variant = variant
103104
return &res, nil
104105
}
105106

106-
func HandleEvaluationError(err error, reason string) error {
107+
func (s *GRPCService) HandleEvaluationError(err error, reason string) error {
107108
statusCode := codes.Internal
108109
message := err.Error()
109110
switch message {
@@ -118,7 +119,7 @@ func HandleEvaluationError(err error, reason string) error {
118119
Reason: "ERROR",
119120
})
120121
if err != nil {
121-
log.Error(err)
122+
s.Logger.Error(err)
122123
return st.Err()
123124
}
124125
return stWD.Err()

0 commit comments

Comments
 (0)