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를 사용할 때 해당 링크 유형을 선택하는 경우, 지원 유형 및 에이전트 관련 구성을 확인하십시오. |
setEnableLinkRUMData |
bool | 아니요 | RUM 데이터와 연결 여부, 기본값은 false |
Trace Header 생성¶
분산 추적은 Trace Header를 생성하고 HTTP 요청 헤더에 Header를 삽입하여 구현됩니다.
/**
* 구성에 따라 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* | 빈 값 | 두 콜백에 전달되는 사용자 컨텍스트입니다. |
!!! 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 |
서버 또는 에이전트는 선택한 전파 형식을 지원해야 합니다. 기본 형식은 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이 아닌 값을 반환합니다. 최대 GUANCE_RUM_TRACE_MAX_HEADERS개의 Header를 지원합니다. 제공자가 0을 반환하거나 유효하지 않은 데이터를 제공하는 경우 SDK는 이번 Trace 컨텍스트 생성을 건너뛰지만 호스트 요청을 중단하지는 않습니다. C++ 예외가 C ABI 콜백 경계를 넘지 않도록 하십시오.