From efeaa6da465112798bea58fbde08efe8e205e077 Mon Sep 17 00:00:00 2001 From: Wangjunqi123 Date: Thu, 31 Oct 2024 09:11:53 +0800 Subject: [PATCH] server: optimize errormanager module --- server/errormanager/errormanager.go | 102 ++++++++++++++++++---------- server/errormanager/meta.go | 41 +++++++---- server/main.go | 2 +- 3 files changed, 95 insertions(+), 50 deletions(-) diff --git a/server/errormanager/errormanager.go b/server/errormanager/errormanager.go index b547c18..a666c99 100644 --- a/server/errormanager/errormanager.go +++ b/server/errormanager/errormanager.go @@ -1,70 +1,98 @@ package errormanager import ( + "context" "fmt" "io" "os" - "strings" "gitee.com/openeuler/PilotGo-plugin-topology/server/conf" + "gitee.com/openeuler/PilotGo-plugin-topology/server/global" "gitee.com/openeuler/PilotGo/sdk/logger" "github.com/pkg/errors" ) -var Global_ErrorManager *ErrorManager +var ErrorManager *ErrorManagement -type ErrorManager struct { - ErrCh chan *Topoerror +type ErrorManagement struct { + ErrCh chan error - Out io.Writer + out io.Writer + + cancelCtx context.Context + cancelFunc context.CancelFunc } -func InitErrorManager() { - Global_ErrorManager = &ErrorManager{ - ErrCh: make(chan *Topoerror, 20), +func CreateErrorManager() { + ErrorManager = &ErrorManagement{ + ErrCh: make(chan error, 20), } + ErrorManager.cancelCtx, ErrorManager.cancelFunc = context.WithCancel(global.Global_cancelCtx) + switch conf.Global_Config.Logopts.Driver { case "stdout": - Global_ErrorManager.Out = os.Stdout + ErrorManager.out = os.Stdout case "file": logfile, err := os.OpenFile(conf.Global_Config.Logopts.Path, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { panic(err) } - Global_ErrorManager.Out = logfile + ErrorManager.out = logfile } - go func(ch <-chan *Topoerror) { - for topoerr := range ch { - if topoerr.Err != nil { - errarr := strings.Split(errors.Cause(topoerr.Err).Error(), "**") - if len(errarr) < 2 { - logger.Error("topoerror type required in root error (err: %+v)", topoerr.Err) - os.Exit(1) + global.Global_wg.Add(1) + go func(ch <-chan error) { + defer global.Global_wg.Done() + for { + select { + case <-ErrorManager.cancelCtx.Done(): + return + case _error := <-ch: + _terror, ok := _error.(*FinalError) + if !ok { + fmt.Fprintf(ErrorManager.out, "%+v\n", _error) + continue } - switch errarr[1] { - // 只打印最底层error的message,不展开错误链的调用栈 - case "debug": - logger.Debug("%+v\n", strings.Split(errors.Cause(topoerr.Err).Error(), "**")[0]) - // 只打印最底层error的message,不展开错误链的调用栈 - case "warn": - logger.Warn("%+v\n", strings.Split(errors.Cause(topoerr.Err).Error(), "**")[0]) - // 打印错误链的调用栈 - case "errstack": - fmt.Fprintf(Global_ErrorManager.Out, "%+v\n", topoerr.Err) - // errors.EORE(err) - // 打印错误链的调用栈,并结束程序 - case "errstackfatal": - fmt.Fprintf(Global_ErrorManager.Out, "%+v\n", topoerr.Err) - // errors.EORE(err) - topoerr.Cancel() - default: - fmt.Printf("only support \"debug warn errstack errstackfatal\" error type: %+v\n", topoerr.Err) - os.Exit(1) + if _terror.Err != nil { + if !_terror.PrintStack && !_terror.ExitAfterPrint { + switch _terror.Severity { + case "debug": + logger.Debug(errors.Cause(_terror.Err).Error()) + case "info": + logger.Info(errors.Cause(_terror.Err).Error()) + case "warn": + logger.Warn(errors.Cause(_terror.Err).Error()) + case "error": + logger.Error(errors.Cause(_terror.Err).Error()) + default: + logger.Error("only support \"debug info warn error\" type: %s\n", errors.Cause(_terror.Err).Error()) + } + } else if _terror.PrintStack && !_terror.ExitAfterPrint { + logger.ErrorStack("%+v", _terror.Err) + // errors.EORE(err) + } else if !_terror.PrintStack && _terror.ExitAfterPrint { + switch _terror.Severity { + case "debug": + logger.Debug(errors.Cause(_terror.Err).Error()) + case "info": + logger.Info(errors.Cause(_terror.Err).Error()) + case "warn": + logger.Warn(errors.Cause(_terror.Err).Error()) + case "error": + logger.Error(errors.Cause(_terror.Err).Error()) + default: + logger.Error("only support \"debug info warn error\" type: %s\n", errors.Cause(_terror.Err).Error()) + } + _terror.Cancel() + } else if _terror.PrintStack && _terror.ExitAfterPrint { + logger.ErrorStack("%+v", _terror.Err) + // errors.EORE(err) + _terror.Cancel() + } } } } - }(Global_ErrorManager.ErrCh) + }(ErrorManager.ErrCh) } diff --git a/server/errormanager/meta.go b/server/errormanager/meta.go index 79b0233..fdea675 100644 --- a/server/errormanager/meta.go +++ b/server/errormanager/meta.go @@ -8,9 +8,20 @@ import ( "gitee.com/openeuler/PilotGo/sdk/logger" ) -type Topoerror struct { - Err error +type FinalError struct { + Err error + + Severity string + Cancel context.CancelFunc + + PrintStack bool + + ExitAfterPrint bool +} + +func (e *FinalError) Error() string { + return e.Err.Error() } /* @@ -20,26 +31,32 @@ type Topoerror struct { @exit_after_print: 打印完错误链信息后是否结束主程序 */ -func ErrorTransmit(_ctx context.Context, _err error, _exit_after_print bool) { - if Global_ErrorManager == nil { +func ErrorTransmit(_severity string, _err error, _exit_after_print, _print_stack bool) { + if ErrorManager == nil { logger.Error("globalerrormanager is nil") global.Close() os.Exit(1) } if _exit_after_print { - cctx, cancelF := context.WithCancel(_ctx) - Global_ErrorManager.ErrCh <- &Topoerror{ - Err: _err, - Cancel: cancelF, + ctx, cancel := context.WithCancel(ErrorManager.cancelCtx) + ErrorManager.ErrCh <- &FinalError{ + Err: _err, + Cancel: cancel, + Severity: _severity, + PrintStack: _print_stack, + ExitAfterPrint: _exit_after_print, } - <-cctx.Done() - close(Global_ErrorManager.ErrCh) + <-ctx.Done() + close(ErrorManager.ErrCh) global.Close() os.Exit(1) } - Global_ErrorManager.ErrCh <- &Topoerror{ - Err: _err, + ErrorManager.ErrCh <- &FinalError{ + Err: _err, + PrintStack: _print_stack, + ExitAfterPrint: _exit_after_print, + Cancel: nil, } } diff --git a/server/main.go b/server/main.go index 529c123..8c20092 100755 --- a/server/main.go +++ b/server/main.go @@ -34,7 +34,7 @@ func main() { /* init error control */ - errormanager.InitErrorManager() + errormanager.CreateErrorManager() /* init agent manager -- Gitee