From bbcb9f081b9bb8b64f8ad9e3cb29c34360ea7b7a Mon Sep 17 00:00:00 2001 From: Wangjunqi123 Date: Fri, 24 May 2024 09:39:44 +0800 Subject: [PATCH] add errormanager module to the elk plugin --- elk/errormanager/errormanager.go | 66 ++++++++++++++++++++++++++++++++ elk/errormanager/meta.go | 42 ++++++++++++++++++++ elk/main.go | 6 +++ 3 files changed, 114 insertions(+) create mode 100644 elk/errormanager/errormanager.go create mode 100644 elk/errormanager/meta.go diff --git a/elk/errormanager/errormanager.go b/elk/errormanager/errormanager.go new file mode 100644 index 00000000..979dffc0 --- /dev/null +++ b/elk/errormanager/errormanager.go @@ -0,0 +1,66 @@ +package errormanager + +import ( + "fmt" + "io" + "os" + "strings" + + "gitee.com/openeuler/PilotGo-plugin-elk/conf" + "gitee.com/openeuler/PilotGo/sdk/logger" + "github.com/pkg/errors" +) + +var Global_ErrorManager *ErrorManager + +type ErrorManager struct { + ErrCh chan *Topoerror + + Out io.Writer +} + +func InitErrorManager() { + Global_ErrorManager = &ErrorManager{ + ErrCh: make(chan *Topoerror, 20), + } + + switch conf.Global_Config.Logopts.Driver { + case "stdout": + Global_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 + } + + 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) + } + + switch errarr[1] { + case "debug": // 只打印最底层error的message,不展开错误链的调用栈 + logger.Debug("%+v\n", strings.Split(errors.Cause(topoerr.Err).Error(), "**")[0]) + case "warn": // 只打印最底层error的message,不展开错误链的调用栈 + 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) + } + } + } + }(Global_ErrorManager.ErrCh) +} diff --git a/elk/errormanager/meta.go b/elk/errormanager/meta.go new file mode 100644 index 00000000..11196a58 --- /dev/null +++ b/elk/errormanager/meta.go @@ -0,0 +1,42 @@ +package errormanager + +import ( + "context" + "os" + + "gitee.com/openeuler/PilotGo/sdk/logger" +) + +type Topoerror struct { + Err error + Cancel context.CancelFunc +} + +/* +@ctx: 插件服务端初始上下文(默认为pluginclient.Global_Context) + +@err: 最终生成的error + +@exit_after_print: 打印完错误链信息后是否结束主程序 +*/ +func ErrorTransmit(ctx context.Context, err error, exit_after_print bool) { + if Global_ErrorManager == nil { + logger.Error("globalerrormanager is nil") + os.Exit(1) + } + + if exit_after_print { + cctx, cancelF := context.WithCancel(ctx) + Global_ErrorManager.ErrCh <- &Topoerror{ + Err: err, + Cancel: cancelF, + } + <-cctx.Done() + close(Global_ErrorManager.ErrCh) + os.Exit(1) + } + + Global_ErrorManager.ErrCh <- &Topoerror{ + Err: err, + } +} diff --git a/elk/main.go b/elk/main.go index 97de64fa..871678b2 100644 --- a/elk/main.go +++ b/elk/main.go @@ -3,6 +3,7 @@ package main import ( "gitee.com/openeuler/PilotGo-plugin-elk/conf" "gitee.com/openeuler/PilotGo-plugin-elk/pluginclient" + "gitee.com/openeuler/PilotGo-plugin-elk/errormanager" ) func main() { @@ -15,4 +16,9 @@ func main() { init plugin client */ pluginclient.InitPluginClient() + + /* + init error control + */ + errormanager.InitErrorManager() } -- Gitee