github.com/kaydxh/golang@v0.0.131/pkg/middleware/grpc-middleware/monitor/prometheus/metric_server.interceptor.go (about) 1 /* 2 *Copyright (c) 2022, kaydxh 3 * 4 *Permission is hereby granted, free of charge, to any person obtaining a copy 5 *of this software and associated documentation files (the "Software"), to deal 6 *in the Software without restriction, including without limitation the rights 7 *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 *copies of the Software, and to permit persons to whom the Software is 9 *furnished to do so, subject to the following conditions: 10 * 11 *The above copyright notice and this permission notice shall be included in all 12 *copies or substantial portions of the Software. 13 * 14 *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 *SOFTWARE. 21 */ 22 package interceptorprometheus 23 24 import ( 25 "context" 26 "fmt" 27 28 grpc_ "github.com/kaydxh/golang/go/net/grpc" 29 time_ "github.com/kaydxh/golang/go/time" 30 logs_ "github.com/kaydxh/golang/pkg/logs" 31 "google.golang.org/grpc" 32 "google.golang.org/grpc/status" 33 ) 34 35 // UnaryServerInterceptorOfTimer returns a new unary server interceptors that timing request 36 func UnaryServerInterceptorOfTimer(enabledMetric bool) grpc.UnaryServerInterceptor { 37 38 return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { 39 40 tc := time_.New(true) 41 logger := logs_.GetLogger(ctx) 42 summary := func() { 43 tc.Tick(info.FullMethod) 44 if enabledMetric { 45 M.durationCost.WithLabelValues(info.FullMethod).Observe(float64(tc.Elapse().Milliseconds())) 46 } 47 48 logger.WithField("method", info.FullMethod).Infof(tc.String()) 49 } 50 defer summary() 51 52 return handler(ctx, req) 53 } 54 } 55 56 // UnaryServerInterceptorOfCodeMessage returns a new unary server interceptors that timing request 57 func UnaryServerInterceptorOfCodeMessage(enabledMetric bool) grpc.UnaryServerInterceptor { 58 59 return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { 60 61 peerAddr, _ := grpc_.GetIPFromContext(ctx) 62 var ( 63 resp interface{} 64 code uint32 65 message string 66 err error 67 ) 68 69 logger := logs_.GetLogger(ctx) 70 summary := func() { 71 codeMessage := fmt.Sprintf("%d:%s", code, message) 72 if enabledMetric { 73 metircLabels := map[string]string{ 74 MetircLabelMethod: info.FullMethod, 75 MetircLabelClientIP: peerAddr.String(), 76 MetircLabelCodeMessage: codeMessage, 77 } 78 M.calledTotal.With(metircLabels).Inc() 79 } 80 81 logger.WithField( 82 "method", 83 info.FullMethod, 84 ).WithField( 85 "code_messge", 86 codeMessage, 87 ).Infof( 88 "called by peer addr: %v", 89 peerAddr.String(), 90 ) 91 } 92 defer summary() 93 94 resp, err = handler(ctx, req) 95 grpcErr, ok := status.FromError(err) 96 if ok { 97 code = uint32(grpcErr.Code()) 98 message = grpcErr.Message() 99 100 } 101 return resp, err 102 } 103 }