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 です。Zipkin、Jaeger、DDTrace、Skywalking(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_id、span_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_id、span_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-origin、x-datadog-sampling-priority、x-datadog-parent-id、x-datadog-trace-id |
GUANCE_RUM_TRACE_ZIPKIN_MULTI_HEADER |
Zipkin B3 Multi | X-B3-TraceId、X-B3-SpanId、X-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_id、context.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 を返します。Header は最大で GUANCE_RUM_TRACE_MAX_HEADERS 個までサポートされます。プロバイダーが 0 を返すか、無効なデータを提供した場合、SDK はこの Trace コンテキストの生成をスキップしますが、ホストリクエスト自体は中断しません。C++ の例外が C ABI のコールバック境界を越えないようにしてください。