在 OpenTelemetry 中传播 top-level 个跨度 ID
Propagate top-level span ID's in OpenTelemetry
我正在尝试让 OpenTelemetry 跟踪与 FastAPI 和请求一起使用。目前,我的设置如下所示:
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 操作,该服务看起来基本上与此类似,只是使用一些中间件来记录传入的 headers。
如果我发送这样的请求(httpie 格式),
http :8000 'x-b3-traceid: f8c83f4b5806299983da51de66d9a242' 'x-b3-spanid: ba24f165998dfd8f' 'x-b3-sampled: 1'
我希望下游服务(即 requests.get("http://localhost:8081")
请求的服务)接收 header 类似于
的服务
{
"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"
}
我一定是遗漏了一些明显的东西,但似乎无法弄清楚到底是什么。
发送 W3C traceparent
header 结果完全相同(只是 traceparent
在 header 下游接收)。任何指针将不胜感激。
编辑 - 我没有使用任何导出器,因为在我们的环境中,Istio 配置为导出跟踪。所以我们现在只关心 HTTP 跟踪。
B3MultiFormat
传播器在将上下文序列化为 HTTP header 时不考虑 parent span id 字段,因为 X-B3-ParentSpanId
是可选的 header https://github.com/openzipkin/b3-propagation#multiple-headers。您可以期望 X-B3-TraceId
和 X-B3-SpanId
始终存在,但不会出现其余的。
编辑:
您是否正在设置具体的跟踪器提供程序?它看起来不像共享代码段,但我不知道您是否是实际的应用程序代码。如果您不设置 sdk 跟踪器提供程序,则全部为 no-op,即在 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 不会将 parent 跨度 ID 存储在上下文 https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#spancontext 中。来自 OTEL 的上下文传播客户端库仅限于序列化并仅传递此信息。我认为您无法传播 parentSpanId
。
我正在尝试让 OpenTelemetry 跟踪与 FastAPI 和请求一起使用。目前,我的设置如下所示:
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 操作,该服务看起来基本上与此类似,只是使用一些中间件来记录传入的 headers。
如果我发送这样的请求(httpie 格式),
http :8000 'x-b3-traceid: f8c83f4b5806299983da51de66d9a242' 'x-b3-spanid: ba24f165998dfd8f' 'x-b3-sampled: 1'
我希望下游服务(即 requests.get("http://localhost:8081")
请求的服务)接收 header 类似于
{
"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"
}
我一定是遗漏了一些明显的东西,但似乎无法弄清楚到底是什么。
发送 W3C traceparent
header 结果完全相同(只是 traceparent
在 header 下游接收)。任何指针将不胜感激。
编辑 - 我没有使用任何导出器,因为在我们的环境中,Istio 配置为导出跟踪。所以我们现在只关心 HTTP 跟踪。
B3MultiFormat
传播器在将上下文序列化为 HTTP header 时不考虑 parent span id 字段,因为 X-B3-ParentSpanId
是可选的 header https://github.com/openzipkin/b3-propagation#multiple-headers。您可以期望 X-B3-TraceId
和 X-B3-SpanId
始终存在,但不会出现其余的。
编辑:
您是否正在设置具体的跟踪器提供程序?它看起来不像共享代码段,但我不知道您是否是实际的应用程序代码。如果您不设置 sdk 跟踪器提供程序,则全部为 no-op,即在 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 不会将 parent 跨度 ID 存储在上下文 https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#spancontext 中。来自 OTEL 的上下文传播客户端库仅限于序列化并仅传递此信息。我认为您无法传播 parentSpanId
。