github.com/kaydxh/golang@v0.0.131/pkg/middleware/grpc-middleware/monitor/opentelemetry/metric_server.interceptor.go (about) 1 package interceptoropentelemetry 2 3 import ( 4 "context" 5 6 "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" 7 grpc_ "github.com/kaydxh/golang/go/net/grpc" 8 time_ "github.com/kaydxh/golang/go/time" 9 logs_ "github.com/kaydxh/golang/pkg/logs" 10 resource_ "github.com/kaydxh/golang/pkg/middleware/resource" 11 "google.golang.org/grpc" 12 ) 13 14 func UnaryServerMetricInterceptor() grpc.UnaryServerInterceptor { 15 16 return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { 17 18 return handleMetric(info, resource_.HandlerWithContext[any, any](handler))(ctx, req) 19 } 20 } 21 22 func HandleMetric[REQ any, RESP any]( 23 handler resource_.HandlerWithContext[REQ, RESP], 24 ) resource_.HandlerWithContext[REQ, RESP] { 25 return handleMetric(nil, handler) 26 } 27 28 func handleMetric[REQ any, RESP any]( 29 info *grpc.UnaryServerInfo, 30 handler resource_.HandlerWithContext[REQ, RESP], 31 ) resource_.HandlerWithContext[REQ, RESP] { 32 return func(ctx context.Context, req REQ) (RESP, error) { 33 34 tc := time_.New(true) 35 36 ctx = resource_.AddKeysContext(ctx, resource_.AddAttrKeysContext, resource_.AddMetricKeysContext) 37 38 resp, err := handler(ctx, req) 39 40 var method string 41 if info != nil { 42 method = info.FullMethod 43 } else { 44 method, _ = runtime.RPCMethod(ctx) 45 } 46 47 resource_.ReportMetric(ctx, 48 resource_.Dimension{ 49 CalleeMethod: method, 50 Error: err, 51 }, 52 tc.Elapse(), 53 ) 54 tc.Tick(method) 55 56 logger := logs_.GetLogger(ctx) 57 peerAddr, _ := grpc_.GetIPFromContext(ctx) 58 summary := func() { 59 logger.WithField("cost", tc.String()).Infof( 60 "called by peer addr: %v", 61 peerAddr.String(), 62 ) 63 } 64 defer summary() 65 66 return resp, err 67 } 68 }