コンテンツにスキップ

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* 2 つのコールバックに渡されるユーザーコンテキスト

!!! 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 を所有しません。これらのハンドルは、WinHttpResource オブジェクトよりも長期間有効である必要があります。

非同期 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_idguance_rum_stop_resource_ext に渡します。これらのフィールドを関連付けるのは、context.link_rum_data != 0 の場合のみです。

既存のリンクを継続する必要がある場合や、カスタムプロトコルに接続する場合は、context_provider を設定できます。SDK は初期化済みの guance_rum_trace_context を渡します。コールバックは Header、Trace ID、Span ID を入力した後、非 0 を返します。Header は最大で GUANCE_RUM_TRACE_MAX_HEADERS 個までサポートされます。プロバイダーが 0 を返すか、無効なデータを提供した場合、SDK はこの Trace コンテキストの生成をスキップしますが、ホストリクエスト自体は中断しません。C++ の例外が C ABI のコールバック境界を越えないようにしてください。

フィードバック

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