需求
sentry是一款非常好用的工具,可以方便追踪线上的异常,在gin框架里边可以使用Use添加中件间,但是grpc服务在网上搜索了一堆没一个能用的,只能硬着头皮看源码
终于搞定!
grpc服务有一个github.com/grpc-ecosystem/go-grpc-middleware的中间件插件,可以添加多个插件,使用如下,其实就是住里边追加中间件
分别是捕获正常方法和流式方法的请求
我们看看中间件的定义
type UnaryServerInterceptor func(ctx context.Context, req interface{}, info *UnaryServerInfo, handler UnaryHandler) (resp interface{}, err error)
我们只需要写一个类似的中间件就行了,talk is cheap,上代码!
解决
添加中间件
package middleware
import (
"errors"
"fmt"
"github.com/getsentry/sentry-go"
"golang.org/x/net/context"
"google.golang.org/grpc"
"time"
)
func SentryUnaryServerInterceptor() grpc.UnaryServerInterceptor {
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) {
defer func() {
if r := recover(); r != nil {
flushToSentry(r)
}
}()
return handler(ctx, req)
}
}
func SentryStreamServerInterceptor() grpc.StreamServerInterceptor {
return func(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) (err error) {
defer func() {
if r := recover(); r != nil {
flushToSentry(r)
}
}()
return handler(srv, stream)
}
}
func flushToSentry(v interface{}) {
sentry.CaptureException(errors.New(fmt.Sprintf("%v", v)))
sentry.Flush(time.Second * 5)
}
将上面的中间件注册
再来找个代码试一试,这里我显式抛了一个异常chenqionghe test
调用后,发现sentry已经能正常收集到异常,如下
就是这么简单,喵~