• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

开发技术 开发技术 3个月前 (09-16) 54次浏览
目录
  • 需求
  • 解决

需求

sentry是一款非常好用的工具,可以方便追踪线上的异常,在gin框架里边可以非常方便的使用Use添加中件间,grpc服务在网上搜索了一堆没一个能用的,只能硬着头皮看源码
终于搞定。

grpc服务有一个github.com/grpc-ecosystem/go-grpc-middleware的中间件插件,可以添加多个插件,使用如下,其实就是住里边追加中间件

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

grpc服务如何添加sentry监控(添加中间件)
分别是捕获正常方法和流式方法的请求

我们看看中间件的定义

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

将上面的中间件注册
grpc服务如何添加sentry监控(添加中间件)

再来找个代码试一试,这里我显式抛了一个异常chenqionghe test
grpc服务如何添加sentry监控(添加中间件)

调用后,发现sentry已经能正常收集到异常,如下
grpc服务如何添加sentry监控(添加中间件)

就是这么简单,喵~


喜欢 (0)