使用Inject和在进程之间
最后更新于:2022-04-02 02:57:49
[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)
}
```
';