如何创建带有特定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
相关产品推荐
相关产品推荐

