Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: enrich error log #977

Merged
merged 8 commits into from
Dec 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions api/filter/authentication.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/gin-gonic/gin"

"github.com/apisix/manager-api/conf"
"github.com/apisix/manager-api/log"
)

func Authentication() gin.HandlerFunc {
Expand All @@ -42,27 +43,32 @@ func Authentication() gin.HandlerFunc {
}

if err != nil || !token.Valid {
log.Warnf("token validate failed: %s, %v", err, token.Valid)
c.AbortWithStatusJSON(http.StatusUnauthorized, errResp)
return
}

claims, ok := token.Claims.(*jwt.StandardClaims)
if !ok {
log.Warnf("token validate failed: %s, %v", err, token.Valid)
c.AbortWithStatusJSON(http.StatusUnauthorized, errResp)
return
}

if err := token.Claims.Valid(); err != nil {
log.Warnf("token claims validate failed: %s", err)
c.AbortWithStatusJSON(http.StatusUnauthorized, errResp)
return
}

if claims.Subject == "" {
log.Warn("token claims subject empty")
c.AbortWithStatusJSON(http.StatusUnauthorized, errResp)
return
}

if _, ok := conf.UserList[claims.Subject]; !ok {
log.Warnf("user not exists by token claims subject %s", claims.Subject)
c.AbortWithStatusJSON(http.StatusUnauthorized, errResp)
return
}
Expand Down
2 changes: 1 addition & 1 deletion api/internal/core/entity/format.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
func mapKV2Node(key string, val float64) (*Node, error) {
host, port, err := net.SplitHostPort(key)
if err != nil {
log.Warn("split host port fail: %s", err)
log.Errorf("split host port fail: %s", err)
return nil, err
}

Expand Down
26 changes: 19 additions & 7 deletions api/internal/core/storage/etcd.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@ import (
"fmt"
"time"

"go.etcd.io/etcd/clientv3"

"github.com/apisix/manager-api/conf"
"github.com/apisix/manager-api/internal/utils"
"go.etcd.io/etcd/clientv3"
"github.com/apisix/manager-api/log"
)

var (
Expand All @@ -41,7 +43,8 @@ func InitETCDClient(etcdConf *conf.Etcd) error {
Password: etcdConf.Password,
})
if err != nil {
return fmt.Errorf("init etcd failed: %w", err)
log.Errorf("init etcd failed: %s", err)
return fmt.Errorf("init etcd failed: %s", err)
}
Client = cli
utils.AppendToClosers(Close)
Expand All @@ -50,6 +53,7 @@ func InitETCDClient(etcdConf *conf.Etcd) error {

func Close() error {
if err := Client.Close(); err != nil {
log.Errorf("etcd client close failed: %s", err)
return err
}
return nil
Expand All @@ -58,9 +62,11 @@ func Close() error {
func (s *EtcdV3Storage) Get(ctx context.Context, key string) (string, error) {
resp, err := Client.Get(ctx, key)
if err != nil {
return "", fmt.Errorf("etcd get failed: %w", err)
log.Errorf("etcd get failed: %s", err)
return "", fmt.Errorf("etcd get failed: %s", err)
}
if resp.Count == 0 {
log.Warnf("key: %s is not found", key)
return "", fmt.Errorf("key: %s is not found", key)
}

Expand All @@ -70,7 +76,8 @@ func (s *EtcdV3Storage) Get(ctx context.Context, key string) (string, error) {
func (s *EtcdV3Storage) List(ctx context.Context, key string) ([]string, error) {
resp, err := Client.Get(ctx, key, clientv3.WithPrefix())
if err != nil {
return nil, fmt.Errorf("etcd get failed: %w", err)
log.Errorf("etcd get failed: %s", err)
return nil, fmt.Errorf("etcd get failed: %s", err)
}
var ret []string
for i := range resp.Kvs {
Expand All @@ -83,15 +90,17 @@ func (s *EtcdV3Storage) List(ctx context.Context, key string) ([]string, error)
func (s *EtcdV3Storage) Create(ctx context.Context, key, val string) error {
_, err := Client.Put(ctx, key, val)
if err != nil {
return fmt.Errorf("etcd put failed: %w", err)
log.Errorf("etcd put failed: %s", err)
return fmt.Errorf("etcd put failed: %s", err)
}
return nil
}

func (s *EtcdV3Storage) Update(ctx context.Context, key, val string) error {
_, err := Client.Put(ctx, key, val)
if err != nil {
return fmt.Errorf("etcd put failed: %w", err)
log.Errorf("etcd put failed: %s", err)
return fmt.Errorf("etcd put failed: %s", err)
}
return nil
}
Expand All @@ -100,9 +109,11 @@ func (s *EtcdV3Storage) BatchDelete(ctx context.Context, keys []string) error {
for i := range keys {
resp, err := Client.Delete(ctx, keys[i])
if err != nil {
return fmt.Errorf("delete etcd key[%s] failed: %w", keys[i], err)
log.Errorf("delete etcd key[%s] failed: %s", keys[i], err)
return fmt.Errorf("delete etcd key[%s] failed: %s", keys[i], err)
}
if resp.Deleted == 0 {
log.Warnf("key: %s is not found", keys[i])
return fmt.Errorf("key: %s is not found", keys[i])
}
}
Expand Down Expand Up @@ -132,6 +143,7 @@ func (s *EtcdV3Storage) Watch(ctx context.Context, key string) <-chan WatchRespo
output.Events = append(output.Events, e)
}
if output.Canceled {
log.Error("channel canceled")
output.Error = fmt.Errorf("channel canceled")
}
ch <- output
Expand Down
22 changes: 11 additions & 11 deletions api/internal/core/store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,23 +61,23 @@ type GenericStoreOption struct {

func NewGenericStore(opt GenericStoreOption) (*GenericStore, error) {
if opt.BasePath == "" {
log.Warn("base path empty")
log.Error("base path empty")
return nil, fmt.Errorf("base path can not be empty")
}
if opt.ObjType == nil {
log.Warn("object type is nil")
log.Errorf("object type is nil")
return nil, fmt.Errorf("object type can not be nil")
}
if opt.KeyFunc == nil {
log.Warn("key func is nil")
log.Error("key func is nil")
return nil, fmt.Errorf("key func can not be nil")
}

if opt.ObjType.Kind() == reflect.Ptr {
opt.ObjType = opt.ObjType.Elem()
}
if opt.ObjType.Kind() != reflect.Struct {
log.Warn("obj type is invalid")
log.Error("obj type is invalid")
return nil, fmt.Errorf("obj type is invalid")
}
s := &GenericStore{
Expand Down Expand Up @@ -111,15 +111,15 @@ func (s *GenericStore) Init() error {
go func() {
for event := range ch {
if event.Canceled {
log.Warnf("watch failed: %w", event.Error)
log.Warnf("watch failed: %s", event.Error)
}

for i := range event.Events {
switch event.Events[i].Type {
case storage.EventTypePut:
objPtr, err := s.StringToObjPtr(event.Events[i].Value)
if err != nil {
log.Warnf("value convert to obj failed: %w", err)
log.Warnf("value convert to obj failed: %s", err)
continue
}
s.cache.Store(event.Events[i].Key[len(s.opt.BasePath)+1:], objPtr)
Expand Down Expand Up @@ -221,7 +221,7 @@ func (s *GenericStore) List(input ListInput) (*ListOutput, error) {
func (s *GenericStore) ingestValidate(obj interface{}) (err error) {
if s.opt.Validator != nil {
if err := s.opt.Validator.Validate(obj); err != nil {
log.Infof("data validate fail: %w", err)
log.Errorf("data validate failed: %s", err)
return err
}
}
Expand Down Expand Up @@ -259,7 +259,7 @@ func (s *GenericStore) Create(ctx context.Context, obj interface{}) error {

bs, err := json.Marshal(obj)
if err != nil {
log.Warnf("json marshal failed: %s", err)
log.Errorf("json marshal failed: %s", err)
return fmt.Errorf("json marshal failed: %s", err)
}
if err := s.Stg.Create(ctx, s.GetObjStorageKey(obj), string(bs)); err != nil {
Expand Down Expand Up @@ -296,7 +296,7 @@ func (s *GenericStore) Update(ctx context.Context, obj interface{}, createIfNotE

bs, err := json.Marshal(obj)
if err != nil {
log.Warnf("json marshal failed: %s", err)
log.Errorf("json marshal failed: %s", err)
return fmt.Errorf("json marshal failed: %s", err)
}
if err := s.Stg.Update(ctx, s.GetObjStorageKey(obj), string(bs)); err != nil {
Expand Down Expand Up @@ -324,8 +324,8 @@ func (s *GenericStore) StringToObjPtr(str string) (interface{}, error) {
objPtr := reflect.New(s.opt.ObjType)
err := json.Unmarshal([]byte(str), objPtr.Interface())
if err != nil {
log.Warnf("json marshal failed: %s", err)
return nil, fmt.Errorf("json unmarshal failed: %w", err)
log.Errorf("json marshal failed: %s", err)
return nil, fmt.Errorf("json unmarshal failed: %s", err)
}

return objPtr.Interface(), nil
Expand Down
4 changes: 2 additions & 2 deletions api/internal/core/store/storehub.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ func InitStore(key HubKey, opt GenericStoreOption) error {
}
s, err := NewGenericStore(opt)
if err != nil {
log.Warnf("NewGenericStore error: %w", err)
log.Errorf("NewGenericStore error: %s", err)
return err
}
if err := s.Init(); err != nil {
log.Warnf("GenericStore init error: %w", err)
log.Errorf("GenericStore init error: %s", err)
return err
}

Expand Down
30 changes: 16 additions & 14 deletions api/internal/core/store/validate.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@ type JsonSchemaValidator struct {
func NewJsonSchemaValidator(jsonPath string) (Validator, error) {
bs, err := ioutil.ReadFile(jsonPath)
if err != nil {
return nil, fmt.Errorf("get abs path failed: %w", err)
return nil, fmt.Errorf("get abs path failed: %s", err)
}
s, err := gojsonschema.NewSchema(gojsonschema.NewStringLoader(string(bs)))
if err != nil {
return nil, fmt.Errorf("new schema failed: %w", err)
return nil, fmt.Errorf("new schema failed: %s", err)
}
return &JsonSchemaValidator{
schema: s,
Expand All @@ -54,7 +54,7 @@ func NewJsonSchemaValidator(jsonPath string) (Validator, error) {
func (v *JsonSchemaValidator) Validate(obj interface{}) error {
ret, err := v.schema.Validate(gojsonschema.NewGoLoader(obj))
if err != nil {
return fmt.Errorf("validate failed: %w", err)
return fmt.Errorf("validate failed: %s", err)
}

if !ret.Valid() {
Expand All @@ -77,14 +77,14 @@ type APISIXJsonSchemaValidator struct {
func NewAPISIXJsonSchemaValidator(jsonPath string) (Validator, error) {
schemaDef := conf.Schema.Get(jsonPath).String()
if schemaDef == "" {
log.Warnf("schema validate failed: schema not found, path: %s", jsonPath)
log.Errorf("schema validate failed: schema not found, path: %s", jsonPath)
return nil, fmt.Errorf("schema validate failed: schema not found, path: %s", jsonPath)
}

s, err := gojsonschema.NewSchema(gojsonschema.NewStringLoader(schemaDef))
if err != nil {
log.Warnf("new schema failed: %w", err)
return nil, fmt.Errorf("new schema failed: %w", err)
log.Errorf("new schema failed: %s", err)
return nil, fmt.Errorf("new schema failed: %s", err)
}
return &APISIXJsonSchemaValidator{
schema: s,
Expand Down Expand Up @@ -136,12 +136,12 @@ func cHashKeySchemaCheck(upstream *entity.UpstreamDef) error {

s, err := gojsonschema.NewSchema(gojsonschema.NewStringLoader(schemaDef))
if err != nil {
return fmt.Errorf("schema validate failed: %w", err)
return fmt.Errorf("schema validate failed: %s", err)
}

ret, err := s.Validate(gojsonschema.NewGoLoader(upstream.Key))
if err != nil {
return fmt.Errorf("schema validate failed: %w", err)
return fmt.Errorf("schema validate failed: %s", err)
}

if !ret.Valid() {
Expand Down Expand Up @@ -231,8 +231,8 @@ func checkConf(reqBody interface{}) error {
func (v *APISIXJsonSchemaValidator) Validate(obj interface{}) error {
ret, err := v.schema.Validate(gojsonschema.NewGoLoader(obj))
if err != nil {
log.Warnf("schema validate failed: %w", err)
return fmt.Errorf("schema validate failed: %w", err)
log.Errorf("schema validate failed: %s", err)
return fmt.Errorf("schema validate failed: %s", err)
}

if !ret.Valid() {
Expand All @@ -257,8 +257,9 @@ func (v *APISIXJsonSchemaValidator) Validate(obj interface{}) error {
if schemaValue == nil && schemaType == "consumer_schema" {
schemaValue = conf.Schema.Get("plugins." + pluginName + ".schema").Value()
}

if schemaValue == nil {
log.Warnf("schema validate failed: schema not found, %s, %s", "plugins."+pluginName, schemaType)
log.Errorf("schema validate failed: schema not found, %s, %s", "plugins."+pluginName, schemaType)
return fmt.Errorf("schema validate failed: schema not found, path: %s", "plugins."+pluginName)
}
schemaMap := schemaValue.(map[string]interface{})
Expand All @@ -270,8 +271,8 @@ func (v *APISIXJsonSchemaValidator) Validate(obj interface{}) error {

s, err := gojsonschema.NewSchema(gojsonschema.NewBytesLoader(schemaByte))
if err != nil {
log.Warnf("init schema validate failed: %w", err)
return fmt.Errorf("schema validate failed: %w", err)
log.Errorf("init schema validate failed: %s", err)
return fmt.Errorf("schema validate failed: %s", err)
}

// check property disable, if is bool, remove from json schema checking
Expand All @@ -288,7 +289,8 @@ func (v *APISIXJsonSchemaValidator) Validate(obj interface{}) error {
// check schema
ret, err := s.Validate(gojsonschema.NewGoLoader(conf))
if err != nil {
return fmt.Errorf("schema validate failed: %w", err)
log.Errorf("schema validate failed: %s", err)
return fmt.Errorf("schema validate failed: %s", err)
}

// put the value back to the property disable
Expand Down
2 changes: 1 addition & 1 deletion api/log/zap.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func init() {
logLevel := getLogLevel()
core := zapcore.NewCore(encoder, writeSyncer, logLevel)

zapLogger := zap.New(core, zap.AddCaller())
zapLogger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(2))

logger = zapLogger.Sugar()
}
Expand Down
7 changes: 4 additions & 3 deletions api/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ func main() {
newMws = append(newMws, mws[1:]...)
return newMws
}

if err := storage.InitETCDClient(conf.ETCDConfig); err != nil {
log.Errorf("init etcd client fail: %w", err)
panic(err)
Expand All @@ -63,15 +64,15 @@ func main() {
WriteTimeout: time.Duration(5000) * time.Millisecond,
}

log.Infof("The Manager API is listening on %s ", addr)
log.Infof("The Manager API is listening on %s", addr)

quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)

go func() {
if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed {
utils.CloseAll()
log.Fatalf("listen and serv fail: %w", err)
log.Fatalf("listen and serv fail: %s", err)
}
}()

Expand All @@ -82,7 +83,7 @@ func main() {
defer cancel()

if err := s.Shutdown(ctx); err != nil {
log.Errorf("Shutting down server error: %w", err)
log.Errorf("Shutting down server error: %s", err)
}

log.Infof("The Manager API server exited")
Expand Down
Loading