跳转至

Trace 配置

本文用于承载 C++ SDK 的 Trace 初始化配置与链路追踪说明。

初始化 Trace

FTTraceConfig tc;
tc.setTraceType(TraceType::DDTRACE)
  .setEnableLinkRUMData(true);
sdk->initTraceWithConfig(tc);
字段 类型 必须 说明
setSamplingRate float 采样率范围 [0,1]0 表示不采集,1 表示全采集,默认值为 1
setTraceType enum 默认为 DDTrace,支持 ZipkinJaegerDDTraceSkywalking(8.0+)、TraceParent(W3C)。如果接入 OpenTelemetry 选择对应链路类型时,请注意查阅支持类型及 agent 相关配置
setEnableLinkRUMData bool 是否与 RUM 数据关联,默认为 false

生成 Trace Header

链路追踪通过生成 Trace Header,并将 Header 写入 HTTP 请求头来实现。

/**
 * 按配置生成 Trace Header
 *
 * @param resourceId 资源 ID
 * @param url 网络地址
 * @return trace 数据
 */
PropagationHeader generateTraceHeader(const std::string resourceId, const std::string url);

示例:

RestClient::init();
RestClient::Connection* conn = new RestClient::Connection(url);
std::string resId = "resource-id";

RestClient::HeaderFields headers;
headers["Accept"] = "application/json";

auto headerWithRes = sdk->generateTraceHeader(resId, url);
for (auto& hd : headerWithRes) {
    headers[hd.first] = hd.second;
}
conn->SetHeaders(headers);

RestClient::Response r = conn->get("/get");
RestClient::disable();

Windows 原生 SDK 自动 Trace

链接 guance_rum_native.dll 的 Windows C/C++ 应用可以为 WinHTTP 请求自动生成并注入 Trace Header,同时自动采集对应的 RUM Resource。开启 RUM 关联后,同一组 trace_idspan_id 会写入 Resource 数据,用于在 RUM 与 APM 之间关联跳转。

!!! note

SDK 注入的是所选链路协议对应的请求头,不会额外添加名为 `trace_id` 或 `span_id` 的 HTTP Header。`trace_id`、`span_id` 只在 `enable_link_rum_data = 1` 时写入 RUM Resource 字段。

配置

guance_rum_init 成功后配置 Trace。配置结构必须先调用 guance_rum_trace_config_init 初始化:

#include "guance_rum_winhttp.hpp"

#include <string>

static int should_trace(const char* url, const char*, void*) {
    const std::string value = url == nullptr ? "" : url;
    return value == "https://api.example.com" ||
        value.rfind("https://api.example.com/", 0) == 0;
}

guance_rum_trace_config trace{};
guance_rum_trace_config_init(&trace);
trace.enable_auto_trace = 1;
trace.enable_link_rum_data = 1;
trace.sample_rate = 1.0;
trace.trace_type = GUANCE_RUM_TRACE_TRACEPARENT;
trace.should_trace = should_trace;

if (!guance_rum_configure_trace(rum, &trace)) {
    // 配置无效,Trace 自动传播未启用。
}
字段 类型 默认值 说明
enable_auto_trace int 0 是否为符合条件的 HTTP 请求自动生成 Trace 上下文
enable_link_rum_data int 0 是否将生成的 trace_idspan_id 写入对应的 RUM Resource
sample_rate double 1.0 Trace 采样决策比例,范围为 [0,1];该值控制传播协议中的采样标记,不替代 RUM 会话采样配置
trace_type guance_rum_trace_type GUANCE_RUM_TRACE_DDTRACE Trace Header 传播格式
service_name string RUM service_name SkyWalking sw8 使用的服务名;其他内置传播格式忽略此字段
should_trace callback 请求目标过滤回调;返回非 0 时才生成 Trace 上下文
context_provider callback 自定义 Trace 上下文提供器;设置后替代 SDK 内置的 Header、Trace ID 和 Span ID 生成逻辑
user_data void* 传递给两个回调的用户上下文

!!! warning

如果未设置 `should_trace`,所有传入自动 Trace API 的非空 URL 都可能收到 Trace Header。建议根据协议、主机名和端口构造明确的服务端白名单,避免将链路信息发送给第三方地址。

guance_rum_configure_trace 会复制字符串配置,但会保留回调与 user_data。它们必须在重新配置或 guance_rum_shutdown 前保持有效。回调为同步调用,并且可能由多个请求线程并发执行。

支持的传播格式

guance_rum_trace_type 协议 注入的 Header
GUANCE_RUM_TRACE_DDTRACE Datadog x-datadog-originx-datadog-sampling-priorityx-datadog-parent-idx-datadog-trace-id
GUANCE_RUM_TRACE_ZIPKIN_MULTI_HEADER Zipkin B3 Multi X-B3-TraceIdX-B3-SpanIdX-B3-Sampled
GUANCE_RUM_TRACE_ZIPKIN_SINGLE_HEADER Zipkin B3 Single b3
GUANCE_RUM_TRACE_TRACEPARENT W3C Trace Context traceparent
GUANCE_RUM_TRACE_SKYWALKING Apache SkyWalking sw8
GUANCE_RUM_TRACE_JAEGER Jaeger uber-trace-id

服务端或 Agent 必须支持所选传播格式。默认格式为 GUANCE_RUM_TRACE_DDTRACE

自动监测同步 WinHTTP 请求

先创建 WinHTTP Request Handle,再构造 guance::rum::WinHttpResource。构造函数会立即生成 Trace 上下文并将 Header 写入请求:

// request 是已通过 WinHttpOpenRequest 创建的 HINTERNET;target 为完整 URL。
guance::rum::WinHttpResource resource(
    rum,
    request,
    target.c_str(),
    "GET");

if (!resource.send()) {
    // 请求未发送。
}
if (!resource.receive()) {
    // 响应接收失败。
}

同步模式下,receive() 会读取响应状态、Content-Length 和 HTTP 版本,并结束 RUM Resource。WinHttpResource 不拥有 SDK Handle 或 WinHTTP Request Handle;两者必须比它存活更久。

异步 WinHTTP 请求需要传入 guance::rum::WinHttpRequestMode::asynchronous,保持 WinHttpResource 存活到终止回调,并在收到 WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE 后调用 complete_from_response()。对该对象的回调访问需要由应用串行化。

手动获取 Trace 上下文

非 WinHTTP 网络库可以通过 C ABI 生成上下文,再将所有 Header 写入请求:

guance_rum_trace_context context{};
guance_rum_trace_context_init(&context);

if (guance_rum_create_trace_context(
        rum,
        "https://api.example.com/v1/user",
        "GET",
        &context)) {
    for (uint32_t index = 0; index < context.header_count; ++index) {
        const char* name = context.headers[index].name;
        const char* value = context.headers[index].value;
        // 使用当前网络库将 name/value 写入请求 Header。
    }
}

如果自行采集 RUM Resource,请在结束 Resource 时将 context.trace_idcontext.span_id 传入 guance_rum_stop_resource_ext。只有 context.link_rum_data != 0 时才应关联这两个字段。

需要延续已有链路或接入自定义协议时,可以设置 context_provider。SDK 会传入一个已初始化的 guance_rum_trace_context;回调填充 Header、Trace ID、Span ID 后返回非 0。最多支持 GUANCE_RUM_TRACE_MAX_HEADERS 个 Header。提供器返回 0 或提供无效数据时,SDK 会跳过本次 Trace 上下文生成,但不会中断宿主请求。不要让 C++ 异常跨越 C ABI 回调边界。

文档评价

文档内容是否对您有帮助? ×