在开放遥测中传播顶级跨度 ID



我正在尝试让OpenTelemetry跟踪与FastAPI和Request一起工作。目前,我的设置如下:

import requests
from opentelemetry.baggage.propagation import W3CBaggagePropagator
from opentelemetry.propagators.composite import CompositePropagator
from fastapi import FastAPI
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.requests import RequestsInstrumentor
from opentelemetry.propagate import set_global_textmap
from opentelemetry.propagators.b3 import B3MultiFormat
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
set_global_textmap(CompositePropagator([B3MultiFormat(), TraceContextTextMapPropagator(), W3CBaggagePropagator()]))
app = FastAPI()
FastAPIInstrumentor.instrument_app(app)
RequestsInstrumentor().instrument()
@app.get("/")
async def get_things():
r = requests.get("http://localhost:8081")
return {
"Hello": "world",
"result": r.json()
}

/端点只是对另一个服务执行GET,这个服务基本上看起来像这个服务,只是使用一些中间件来记录传入的头。

如果我发送这样的请求(httpie格式(,

http :8000 'x-b3-traceid: f8c83f4b5806299983da51de66d9a242' 'x-b3-spanid: ba24f165998dfd8f' 'x-b3-sampled: 1'

我希望下游服务,即requests.get("http://localhost:8081")请求的服务,能够接收类似的报头

{
"x-b3-traceid": "f8c83f4b5806299983da51de66d9a242",
"x-b3-spanid": "xxxxxxx",  # some generated value from the upstream service
"x-b3-parentspanid": "ba24f165998dfd8f", 
"x-b3-sampled": "1"
}

但我得到的基本上正是我发送给上游服务的内容:

{
"x-b3-traceid": "f8c83f4b5806299983da51de66d9a242",
"x-b3-spanid": "ba24f165998dfd8f",
"x-b3-sampled": "1"
}

我一定错过了一些显而易见的东西,但似乎不知道到底是什么。

发送W3Ctraceparent报头会导致完全相同的情况(只是在下游接收的报头中有traceparent(。任何建议都将不胜感激。

EDIT-我没有使用任何导出程序,因为在我们的环境中,Istio被配置为导出跟踪。所以我们现在只关心HTTP跟踪。

B3MultiFormat传播程序在将上下文序列化为HTTP标头时不考虑父span id字段,因为X-B3-ParentSpanId是可选标头https://github.com/openzipkin/b3-propagation#multiple-标头。您可以期望X-B3-TraceIdX-B3-SpanId始终存在,而不是剩余的。

编辑:

您正在设置具体的跟踪器提供程序吗?它看起来不像共享片段,但我不知道你是否是真正的应用程序代码。如果您不设置sdk跟踪程序提供程序,即在FastAPI服务中没有创建任何记录跨度,那么这一切都是无效的。请执行以下操作。

...
from opentelemetry.trace import set_tracer_provider
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.resources import Resource
set_tracer_provider(TracerProvider(
resource=Resource.create({"serice.name": "my-service"})
))
...

另一个编辑:

OpenTelemetry不在上下文中存储父跨度IDhttps://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#spancontext.OTEL中的上下文传播客户端库仅限于串行化和传递此信息。我认为你不能传播parentSpanId

最新更新