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  }