From 750c5ab1bf21e2236aedeb69a43e6e19b05a2ef0 Mon Sep 17 00:00:00 2001 From: Owen Cabalceta Date: Wed, 9 Oct 2024 13:42:06 -0400 Subject: [PATCH] patch: improve setup and logging for wrp validators - improve logging structure for validator errors - error out during server setup if any validator metric fail to init --- go.mod | 2 +- primaryHandler.go | 48 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 6ab4715..749b4f1 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,6 @@ require ( github.com/xmidt-org/webpa-common/v2 v2.3.2 github.com/xmidt-org/wrp-go/v3 v3.5.2 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.54.0 - go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) @@ -115,6 +114,7 @@ require ( go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/dig v1.18.0 // indirect go.uber.org/fx v1.22.2 // indirect + go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.26.0 // indirect golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect golang.org/x/mod v0.17.0 // indirect diff --git a/primaryHandler.go b/primaryHandler.go index 58349a9..ce6eb8c 100644 --- a/primaryHandler.go +++ b/primaryHandler.go @@ -24,7 +24,6 @@ import ( "github.com/xmidt-org/clortho/clorthozap" "github.com/xmidt-org/touchstone" "go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux" - "go.uber.org/multierr" "go.uber.org/zap" "github.com/xmidt-org/webpa-common/secure/handler" @@ -69,6 +68,8 @@ const ( deviceID = "deviceID" enforceCheck = "enforce" + + zapWRPValidatorLabel = "wrp_validator_level" ) // Default values @@ -76,9 +77,10 @@ const ( UnknownPartner = "unknown" ) -var errNoDeviceName = errors.New("no device name") - -type validators []wrpvalidator.Validator +var ( + errNoDeviceName = errors.New("no device name") + errWRPValidatorConfigError = errors.New("failed to configure wrp validators") +) func authChain(v *viper.Viper, logger *zap.Logger, registry xmetrics.Registry, tf *touchstone.Factory) (alice.Chain, error) { if registry == nil { @@ -581,25 +583,31 @@ func validateWRP(v *viper.Viper, logger *zap.Logger, tf *touchstone.Factory) (fu if valsConig := v.Get(wrpValidatorConfigKey); valsConig != nil { if b, err := json.Marshal(valsConig); err != nil { - return nil, err + return nil, errors.Join(errWRPValidatorConfigError, err) } else if err = json.Unmarshal(b, &vals); err != nil { - return nil, err + return nil, errors.Join(errWRPValidatorConfigError, err) } labelNames := []string{wrpvalidator.ClientIDLabel, wrpvalidator.PartnerIDLabel, wrpvalidator.MessageTypeLabel} for _, v := range vals { if err := v.AddMetric(tf, labelNames...); err != nil { - errs = multierr.Append(errs, err) + errs = errors.Join(errs, err) } } } + if errs != nil { + return nil, errors.Join(errWRPValidatorConfigError, errs) + } + return func(delegate http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if msg, ok := wrpcontext.GetMessage(r.Context()); ok { var ( + infoErrors error warningErrors error failureError error + unknownError error satClientID = "N/A" partnerID = device.UnknownPartner ) @@ -628,19 +636,35 @@ func validateWRP(v *viper.Viper, logger *zap.Logger, tf *touchstone.Factory) (fu ) switch v.Level() { - case wrpvalidator.ErrorLevel: - failureError = multierr.Append(failureError, err) + case wrpvalidator.InfoLevel: + infoErrors = errors.Join(infoErrors, err) case wrpvalidator.WarningLevel: - warningErrors = multierr.Append(warningErrors, err) + warningErrors = errors.Join(warningErrors, err) + case wrpvalidator.ErrorLevel: + failureError = errors.Join(failureError, err) + default: + unknownError = errors.Join(unknownError, err) } } + if unknownError != nil { + logger.Warn("WRP message validation errors found", + zap.Error(unknownError), zap.String(zapWRPValidatorLabel, wrpvalidator.UnknownLevel.String())) + } + + if infoErrors != nil { + logger.Warn("WRP message validation errors found", + zap.Error(infoErrors), zap.String(zapWRPValidatorLabel, wrpvalidator.InfoLevel.String())) + } + if warningErrors != nil { - logger.Warn("WRP message validation warnings found", zap.Error(warningErrors)) + logger.Warn("WRP message validation errors found", + zap.Error(warningErrors), zap.String(zapWRPValidatorLabel, wrpvalidator.WarningLevel.String())) } if failureError != nil { - logger.Error("WRP message validation failures found", zap.Error(failureError)) + logger.Error("WRP message validation (failure error level) found", + zap.Error(failureError), zap.String(zapWRPValidatorLabel, wrpvalidator.ErrorLevel.String())) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(