Go-micro异常捕获

1,279 阅读1分钟

Go-micro异常捕获

go-micro服务层,添加异常捕获机制,并发送报警。 本文提供的只是一种捕获异常的思路:通过添加Handler实现。

1.注入拦截器

初始化时,添加异常捕获Handler。 部分代码

...
//初始化服务
config.Service = grpc.NewService(
	micro.Name("MyService"),
	micro.Address(...),
	// 添加异常拦截
	micro.WrapHandler(utils.WxErrorHandler()),
)
...

2.拦截器

utils |---errorHandler.go

/**
 * @Description: 异常拦截器
 * @return server.HandlerWrapper
 */
func WxErrorHandler() server.HandlerWrapper {
	return func(h server.HandlerFunc) server.HandlerFunc {
		return func(ctx context.Context, req server.Request, rsp interface{}) error {
			defer func() {
				// 如果是崩溃导致的信号,发送报警
				err := recover()
				if err != nil {
				// 捕获后处理
					errorMsg := PanicTrace(1)
					.....
				}
			}()
			return h(ctx, req, rsp)
		}
	}
}

/**
 * @Description: 获取当前堆栈信息
 * @param kb 大小
 * @return string 堆栈信息
 */
func PanicTrace(kb int) string {
	s := []byte("/src/runtime/panic.go")
	e := []byte("\ngoroutine ")
	line := []byte("\n")
	stack := make([]byte, kb<<10) //4KB
	length := runtime.Stack(stack, true)
	start := bytes.Index(stack, s)
	stack = stack[start:length]
	start = bytes.Index(stack, line) + 1
	stack = stack[start:]
	end := bytes.LastIndex(stack, line)
	if end != -1 {
		stack = stack[:end]
	}
	end = bytes.Index(stack, e)
	if end != -1 {
		stack = stack[:end]
	}
	stack = bytes.TrimRight(stack, "\n")
	return string(stack)
}