首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在grpc-go的stat/HandleRPC中访问有关请求和响应有效负载的信息

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

Stack Overflow用户
提问于 2022-06-19 00:41:10
回答 1查看 76关注 0票数 2

当我收到stats/End数据时,我使用stats/HandleRPC()发出一些关于RPC持续时间的度量,并且我希望用一些可以从传入和传出有效载荷中提取的信息来标记这些度量。实现这一目标的最佳途径是什么?

代码语言:javascript
复制
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 
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-26 23:03:49

TagRPC的实现中,可以创建一个结构并添加指向上下文的指针。然后在对HandleRPC的连续调用中添加信息。因此,如果您需要有效负载中只有*stats.InPayload调用中可用的内容,可以将其提取出来并存储在添加到上下文的结构中,然后在HandleRPC再次被*stats.End调用时访问它

代码语言:javascript
复制
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 #
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72673612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档