在grpc-go的stat/HandleRPC中访问有关请求和响应负载的信息

yfwxisqw  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(136)

我使用stats/HandleRPC()来发出一些关于RPC持续时间的指标,当我收到stats/End数据时,我想用一些可以从传入和传出的有效负载中提取的信息来标记这些指标。

func (h *myStatsHandler) HandleRPC(ctx context.Context, rpcStats stats.RPCStats) {
    switch stat := rpcStats.(type) {
    case *stats.End:
        durationMs := stat.EndTime.Sub(stat.BeginTime).Seconds() * 1000.0
        // Now before sending this value, I need to know, for example the value of a specific key in the request payload, or whether the response is nil or not 
    }
}
oyxsuwqo

oyxsuwqo1#

TagRPC的实现中,可以创建一个结构体,并将指向它的指针添加到上下文中。然后通过对HandleRPC的连续调用在其中添加信息。因此,如果需要从Payload中获得某些只在*stats.InPayload调用中可用的信息,可以将其提取出来并存储在添加到上下文中的结构体中。然后在以后使用*stats.End再次调用HandleRPC时访问它

type recorderCtxKey struct{}

type recorder struct {
    size   int64
}

func (sl *statsHandler) TagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context {
    return context.WithValue(ctx, rpcStatCtxKey{}, &recorder{})
}

func (h *statsHandler) HandleRPC(ctx context.Context, rpcStats stats.RPCStats) {
    switch stat := rpcStats.(type) {
    case *stats.InPayload:
        r, _ := ctx.Value(recorderContextKey{}).(*Recorder)
        r.size += stat.WireLength
    case *stats.End:
        durationMs := stat.EndTime.Sub(stat.BeginTime).Seconds() * 1000.0
        r, _ := ctx.Value(recorderContextKey{}).(*Recorder)
        # use r.size #
    }
}

相关问题