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

就是這麼簡單,喵~

Tags: