You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建带有特定tracestate的根Span?

如何创建带有特定tracestate的根Span?

看起来你已经搞定了Tracer Provider、Tracer的初始化,还有从HTTP头提取上下文的配置,接下来咱们就一步步实现带自定义tracestate的根Span:

首先得明确:如果从HTTP头提取的上下文里没有有效的SpanContext(也就是当前请求需要创建根Span的场景),咱们就手动构建包含自定义tracestate的SpanContext,再基于它创建根Span。

下面是具体的C++代码实现,结合你已有的代码逻辑:

static opentelemetry::trace::propagation::HttpTraceContext propagator;

// 1. 从HTTP头提取上下文
opentelemetry::context::Context emptyContext;
const auto extractedContext = propagator.Extract(emptyContext, [&](nostd::string_view key) {
    // 这里是你获取HTTP头的逻辑,比如从request里取对应key的value
    return your_http_request_header_getter(key);
});

// 2. 获取提取到的SpanContext,判断是否有效
auto extractedSpanContext = opentelemetry::trace::GetSpan(extractedContext)->GetContext();

if (!extractedSpanContext.IsValid()) {
    // 3. 生成根Span需要的TraceId和SpanId(随机唯一值)
    opentelemetry::trace::TraceId traceId = opentelemetry::trace::TraceId::GenerateRandom();
    opentelemetry::trace::SpanId spanId = opentelemetry::trace::SpanId::GenerateRandom();
    
    // 4. 创建自定义Tracestate,添加你的键值对
    opentelemetry::trace::Tracestate tracestate;
    tracestate.Set("mysoft", "key:value");
    
    // 5. 构建根Span的SpanContext,采样标记设为kIsSampled表示采样
    opentelemetry::trace::SpanContext rootSpanContext(
        traceId,
        spanId,
        opentelemetry::trace::TraceFlags(kIsSampled),
        tracestate
    );
    
    // 6. 创建根Span并绑定到上下文
    auto rootSpan = tracer->StartSpan("your-root-span-name", {rootSpanContext});
    opentelemetry::context::Context rootContext = opentelemetry::trace::SetSpan(emptyContext, rootSpan);
    
    // 后续就可以通过rootContext操作这个根Span了,比如添加属性、结束Span
    rootSpan->SetAttribute("service.name", "your-service");
    // ... 业务逻辑 ...
    rootSpan->End();
} else {
    // 如果提取到了有效上下文,就创建子Span(这部分是可选的,根据你的需求)
    auto childSpan = tracer->StartSpan("your-child-span-name", {extractedSpanContext});
    // ... 子Span操作 ...
    childSpan->End();
}

简单解释下关键步骤:

  • 咱们先检查提取的SpanContext是否有效,有效就说明是要创建子Span,无效则创建根Span。
  • 自定义tracestate是通过Tracestate::Set方法添加键值对的,注意键名要符合OpenTelemetry的规范(不能有空格、特殊字符等)。
  • 构建根SpanContext时,TraceFlags(kIsSampled)表示这个Span会被采样上报,如果不需要采样可以改成TraceFlags(0)。

备注:内容来源于stack exchange,提问作者Meugiwara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:54:33