grpc服务如何添加sentry监控(添加中间件)

需求

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已经能正常收集到异常,如下

就是这么简单,喵~

posted @ 2020-09-16 11:58  雪山飞猪  阅读(211)  评论(0编辑  收藏