🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 跟踪RPC请求 使用Inject和在进程之间传递上下文Extract 为了继续跟踪过程边界和RPC调用,我们需要一种在线路上传播span上下文的方法。OpenTracing API在Tracer界面中提供了两个功能,分别是`Inject(spanContext, format, carrier)`和`Extract(format, carrier)` 该`format`参数引用OpenTracing API定义的三种标准编码之一: * TextMap,其中跨度上下文被编码为字符串键值对的集合, * 将span上下文编码为不透明字节数组的二进制文件, * HTTPHeaders,类似于TextMap,不同之处在于密钥必须安全才能用作HTTP头 这`carrier`是对基础RPC框架的抽象。例如,TextMap格式的载体是一个接口,该接口允许跟踪程序通过`Set(key, value)`函数写入键-值对,而Binary格式的载体只是一个`io.Writer`。 跟踪工具使用`Inject`和`Extract`通过RPC调用传递span上下文 ``` // Inject 注入 实例 carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) err := tracer.Inject( span.Context(), opentracing.HTTPHeaders, carrier) // Extract 提取实例 carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier) var serverSpan opentracing.Span if err == nil { span = tracer.StartSpan( rpcMethodName, ext.RPCServerOption(clientContext)) } else { span = tracer.StartSpan(rpcMethodName) } ```