コンテンツにスキップ

Trace 設定

Windows SDK の Trace は、HTTP リクエストに分散トレーシング用のヘッダーを注入し、生成された trace_idspan_id を対応する RUM Resource に関連付けるために使用します。SDK は独立した APM Span を作成したりアップロードしたりしません。

Trace 初期化設定

GuanceSdk.Init(new GuanceConfig
{
    DatawayUrl = "https://openway.guance.com",
    ClientToken = "<client-token>",
    RumAppId = "<rum-app-id>",
    Trace = new TraceConfig
    {
        EnableAutoTrace = true,
        EnableLinkRumData = true,
        SampleRate = 1.0,
        TraceType = TraceType.TraceParent,
        ShouldTrace = uri =>
            uri.Scheme == Uri.UriSchemeHttps &&
            uri.Host == "api.example.com"
    }
});
#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_trace_config trace;
guance_trace_config_init(&trace);
trace.enable_auto_trace = 1;
trace.enable_link_rum_data = 1;
trace.sample_rate = 1.0;
trace.trace_type = GUANCE_TRACE_TRACEPARENT;
trace.should_trace = should_trace;

if (!guance_trace_configure(rum, &trace)) {
    // 設定が無効です。Trace は有効になりません。
}

設定パラメータ

意味 .NET / C# Native C/C++ デフォルト値
Trace コンテキストを自動生成 EnableAutoTrace enable_auto_trace false / 0
RUM Resource に関連付け EnableLinkRumData enable_link_rum_data false / 0
伝播サンプリングレート SampleRate sample_rate 1.0
伝播フォーマット TraceType trace_type DDTrace
ターゲットフィルター ShouldTrace should_trace
カスタムコンテキスト ContextProvider context_provider
コールバックコンテキスト クロージャ user_data

Trace サンプリングレートは伝播プロトコル内の sampled フラグのみを制御し、RUM Session サンプリングレートを代替するものではありません。

サポートされる伝播フォーマット

C# Native C/C++ Header
TraceType.DdTrace GUANCE_TRACE_DDTRACE x-datadog-*
TraceType.ZipkinMultiHeader GUANCE_TRACE_ZIPKIN_MULTI_HEADER X-B3-TraceIdX-B3-SpanIdX-B3-Sampled
TraceType.ZipkinSingleHeader GUANCE_TRACE_ZIPKIN_SINGLE_HEADER b3
TraceType.TraceParent GUANCE_TRACE_TRACEPARENT traceparent
TraceType.SkyWalking GUANCE_TRACE_SKYWALKING sw8
TraceType.Jaeger GUANCE_TRACE_JAEGER uber-trace-id

サーバーまたは Agent は、選択した伝播フォーマットをサポートしている必要があります。

Tracer ネットワーク分散トレーシング

HttpClient の自動収集を有効にすると、SDK はリクエスト送信前に Trace 設定を適用します:

GuanceSdk.EnableAutomaticInstrumentation(new AutomaticInstrumentationOptions
{
    EnableHttpClient = true
});

using var http = new HttpClient();
await http.GetAsync("https://api.example.com/items");

Handler を明示的に制御する必要がある場合は、以下を使用します:

using var http = new HttpClient(
    GuanceSdk.CreateHttpMessageHandler(new HttpClientHandler()));

C++ WinHTTP アプリケーションでは guance_rum_winhttp.hpp を使用します。アダプターは Header を生成し、リクエストを完了し、同じ ID を RUM Resource に書き込みます:

guance::rum::WinHttpResource resource(
    rum,
    request,
    "https://api.example.com/items",
    "GET");

if (resource.send()) {
    resource.receive();
}

非同期 WinHTTP では WinHttpRequestMode::asynchronous を使用し、オブジェクトを終了コールバックまで生存させ、Header が利用可能になった後に complete_from_response() を呼び出す必要があります。

カスタム Trace コンテキスト

ContextProvider を使用して、カスタム Header と関連 ID を返すことができます:

ContextProvider = request => new TraceContext(
    new Dictionary<string, string>
    {
        ["traceparent"] = CreateTraceParent()
    },
    traceId: currentTraceId,
    spanId: currentSpanId)

Provider が null または無効な Header を返した場合、SDK は今回の Trace をスキップし、ホストリクエストを中断しません。

WinHTTP 以外のネットワークライブラリでは、コンテキストを生成し、自身で Header に書き込むことができます:

guance_trace_context context;
guance_trace_context_init(&context);

if (guance_trace_create_context(
        rum,
        "https://api.example.com/items",
        "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;
        // 現在のネットワークライブラリを使用して Header を書き込みます。
    }
}

Resource を自身で収集する場合は、context.trace_idcontext.span_idguance_rum_stop_resource_ext() に渡します。関連付けは context.link_rum_data != 0 の場合にのみ行う必要があります。

セキュリティ境界

Trace Header のターゲットアドレスを制限

ターゲットフィルターが設定されていない場合、自動 Trace 収集の境界に入るすべての絶対 URL が Trace Header を受け取る可能性があります。本番環境では、プロトコル、ホスト名、ポートに基づいて明確な許可リストを設定し、リンクコンテキストがサードパーティに送信されるのを防ぐ必要があります。

Native 設定では文字列がコピーされますが、コールバックと user_data は保持されます。これらは、再設定されるか guance_sdk_shutdown() が呼び出されるまで有効である必要があります。コールバックは複数のリクエストスレッドから同時に呼び出される可能性があるため、C++ の例外が C ABI を越えないように注意してください。

フィードバック

このページは役に立ちましたか?