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)
}