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

    就是这么简单,喵~

  • 相关阅读:
    求正方形的面积和周长
    面向对象练习——校园管理系统
    python--面向对象(最全讲解)
    git删除远程仓库的文件或目录
    git设置忽略文件和目录
    计算器
    织梦标签整理
    比较恶心的360老年版浏览器 文件导出下载
    织梦文章列表样式多元化实现
    php函数整理
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/13678277.html
Copyright © 2020-2023  润新知