package grpc_conn import ( "context" "fmt" "google.golang.org/grpc/stats" ) // 1. 实现 stats.Handler 接口 type StatsHandler struct{} func (h *StatsHandler) TagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context { // 给 RPC 调用打标签(例如记录方法名) return context.WithValue(ctx, "rpc_method", info.FullMethodName) } func (h *StatsHandler) HandleRPC(ctx context.Context, s stats.RPCStats) { // 处理 RPC 统计信息 switch t := s.(type) { case *stats.Begin: fmt.Printf("RPC started: %s\n", ctx.Value("rpc_method")) case *stats.End: fmt.Printf("RPC finished: %s (duration: %v)\n", ctx.Value("rpc_method"), t.EndTime.Sub(t.BeginTime)) case *stats.InPayload: fmt.Printf("Received %d bytes\n", t.WireLength) case *stats.OutPayload: fmt.Printf("Sent %d bytes\n", t.WireLength) } } func (h *StatsHandler) TagConn(ctx context.Context, info *stats.ConnTagInfo) context.Context { // 给连接打标签 return ctx } func (h *StatsHandler) HandleConn(ctx context.Context, s stats.ConnStats) { // 处理连接事件 switch s.(type) { case *stats.ConnBegin: fmt.Println("Connection established") case *stats.ConnEnd: fmt.Println("Connection closed") } }