故障排查¶
SDK 初始化异常校验¶
.NET / C# 配置校验¶
GuanceSdk.Init() 会立即校验关键配置:
| 异常信息 | 处理方式 |
|---|---|
RumAppId is required. |
设置控制台中创建的应用 ID。 |
ServiceName is required. |
设置非空 ServiceName。 |
Version is required. |
设置应用版本。 |
Env must be one of... |
使用 prod、gray、pre、common 或 local。 |
Either DatawayUrl or DatakitUrl is required. |
至少设置一个上报地址。 |
ClientToken is required when DatawayUrl is configured. |
公网 DataWay 模式补充 Client Token。 |
SampleRate must be between 0 and 1. |
将采样率调整到 0.0~1.0。 |
Native C/C++ 初始化或加载失败¶
- 确认应用、导入库和
guance_windows_native.dll使用相同架构。当前 vcpkg 端口只提供动态x64-windows;其他架构需要使用匹配架构的源码构建产物。 - 确认 DLL 位于应用目录或 Windows DLL 搜索路径中;NuGet 包中的 x86、x64 和 ARM64 Native 运行时资产供 .NET 包装层使用,不等同于 C/C++ 头文件和导入库。
- 先调用
guance_sdk_config_init(),再填写地址、Token、应用 ID、服务名、版本和环境。 - 公网 DataWay 需要地址和 Client Token;本地环境部署(Datakit)需要填写可访问的 Datakit 地址。
guance_sdk_init()返回空 Handle 时,检查必填项、缓存目录权限和进程架构。
SDK 正常运行但是没有数据¶
控制台没有 RUM 数据¶
依次检查:
- App ID 是否与当前工作空间中的“自定义”应用一致。
- 公网 DataWay 是否同时设置正确的基础地址和 Client Token。
- 本地环境部署(Datakit)是否可从应用进程访问,且 RUM 采集器已经启用。
- RUM
SampleRate或sample_rate是否大于0。 - 是否已经启动 View 或开启对应自动采集。
- 应用退出前是否等待或调用关闭 API。
var snapshot = GuanceSdk.GetDiagnosticsSnapshot();
Console.WriteLine(
$"sampled={snapshot.SessionSampled}, " +
$"enqueued={snapshot.RumEventsEnqueued}, " +
$"uploaded={snapshot.RumUploadSuccessCount}, " +
$"retry={snapshot.RumUploadRetryCount}, " +
$"terminal={snapshot.RumUploadTerminalFailureCount}, " +
$"lastStatus={snapshot.LastRumUploadStatusCode}, " +
$"lastError={snapshot.LastRumUploadError}");
guance_sdk_diagnostics diagnostics{};
if (guance_sdk_get_diagnostics(rum, &diagnostics)) {
printf("queued=%lld uploaded=%lld retries=%lld status=%lld error=%lld\n",
static_cast<long long>(diagnostics.rum_events_enqueued),
static_cast<long long>(diagnostics.rum_upload_success_count),
static_cast<long long>(diagnostics.rum_upload_retry_count),
static_cast<long long>(diagnostics.last_rum_upload_status_code),
static_cast<long long>(diagnostics.last_rum_upload_error_code));
}
入队计数为 0 时优先检查采样、View 和采集开关;重试持续增加时检查网络、代理、DNS 和上报地址;终止失败增加时检查 Token、权限和服务端状态码。
桌面 UI 没有 View 或 Action¶
WPF 和 WinForms¶
- 在第一个窗口创建前调用
EnableAutomaticInstrumentation()。 - 确认
EnableWpf或EnableWinForms没有关闭。 - 为关键控件设置稳定的
Name、标题或可访问性名称。 - 动态 WinForms 控件会在 Application Idle 扫描;消息循环长时间没有空闲时可能延迟发现。
WinUI 3¶
WinUI 3 窗口必须在 Activate() 前显式关联,多窗口应用需要逐个关联:
window = new MainWindow().UseGuanceRum("MainWindow");
// 或 GuanceSdk.AttachWinUIWindow(window, "MainWindow");
window.Activate();
Native C/C++¶
- 窗口创建后调用
guance_rum_start_view(),窗口关闭前调用guance_rum_stop_view()。 - Action 需要在命令、菜单或输入消息处理边界显式开始和结束。
- UI Watchdog 需要当前进程拥有的有效顶层
HWND。 - Native SDK 不安装通用窗口或控件 Hook,不会自动发现所有 MFC 或自定义框架事件。
没有 Log 数据¶
- 确认
GuanceConfig.Logging已设置,且EnableCustomLog = true。 - 检查
SampleRate、LevelFilters和消息是否超过 30 KiB UTF-8 上限。 System.Diagnostics.Trace输出不会被 SDK 自动转发;请在应用现有日志出口显式调用AddLog()或AddLogs()。- 读取
GetLogDiagnosticsSnapshot(),分别检查配置、采样、级别和容量丢弃计数。
- 先调用
guance_log_config_init(),再调用guance_log_configure()。 - 确认
enable_custom_log为1,并检查sample_rate与level_filter_mask。 - Native SDK 不自动拦截 Console、ETW 或第三方日志库,应在现有日志出口调用
guance_log_add()或guance_log_add_batch()。 - 使用
guance_log_get_diagnostics()检查入队、丢弃、重试和最后状态码。
Log 与 RUM 使用独立队列。RUM 正常不代表 Log 已启用,反之亦然。
请求没有 Trace Header¶
- 确认已开启
EnableAutoTrace或enable_auto_trace。 - 确认采样率不为
0,并检查目标 URL 是否通过ShouldTrace或should_trace。 - 检查服务端要求的传播格式与
TraceType或trace_type是否一致。 - Trace Header 由所选格式决定,不要只搜索名为
trace_id的 HTTP Header。 - 不要向不受信任的目标放行 Trace Header。
自动诊断订阅要求 AutomaticInstrumentationOptions.EnableHttpClient = true。自定义 HttpClient 管线可以显式使用 GuanceSdk.CreateHttpMessageHandler()。
WinHTTP 请求需要使用 guance_rum_winhttp.hpp 适配器;其他 HTTP 库需要调用 guance_trace_create_context() 并把返回 Header 写入请求。
如果请求已有同名 Trace Header,检查 HTTP 库或业务代码是否在 SDK 注入后覆盖了它。
Trace 或 Log 没有关联 RUM¶
- 分别开启 Trace/Log 配置中的
EnableLinkRumData或enable_link_rum_data。 - 在活动 View 或 Action 存在时发起请求或写入 Log;SDK 不回溯修改已经结束的上下文。
- Trace 关联信息写入匹配的 RUM Resource。Windows SDK 不独立上传 APM Span,因此在 Trace 控制台中没有 Span 不等于 Header 注入失败。
WebView2 没有页面数据¶
- 确认 WebView2 Runtime 已安装且控件可以完成
EnsureCoreWebView2Async()。 - 确认
EnableWebView = true,或显式调用AttachWebView()。 - 动态控件建议在初始化完成后显式关联。
- 控件被
Unloaded或Disposed后,需要在新实例上重新关联。 - 注册诊断监听器,检查
WebView2 initialization failed或did not succeed。
同一个控件重复调用 AttachWebView() 不会重复注入。若页面本身也初始化了 Browser RUM,不要再对同一页面事件进行重复手动上报。
Electron 没有数据¶
先确认应用采用哪种 Electron 接入方式,两种方式的 Session 和上传所有者不同,不能混用配置。
- 确认已配置 GuanceCloud vcpkg 注册表,并在清单中启用
guance-windows-native的electron-bridgeFeature;当前仅支持动态x64-windows。 - 开发环境检查
vcpkg_installed/x64-windows/tools/guance-windows-native/;打包环境检查resources/native/。两个目录都必须同时包含guance_windows_electron_bridge.exe和guance_windows_native.dll。 - 启动 Bridge 时将
cwd设置为 EXE 与 DLL 所在目录,设置完整 Native 配置,并检查 stdout 是否出现[Guance.RUM.NativeBridge] ready。退出码2表示缺少上报地址或 RUM Application ID,退出码3表示 Native Core 初始化或 Log 配置失败。 - Browser RUM/Logs 只在受监控 Renderer 中初始化;每个窗口都需要安装 Preload、注册可信
webContents,并执行一次最小初始化。Renderer 中只填写 Bridge 模式所需的占位参数,不填写真实 Token、应用 ID 或上报地址。 - Renderer DevTools Network 中不应出现 RUM、Log 或 Replay 直传请求。检查固定 IPC Channel 是否收到消息、Main Process 是否接受可信 Renderer,以及 Native Host stdin 是否可写。
- 检查 Native Host 的 RUM、Log、Replay 入队计数、上传状态码、重试和最终失败计数。应用退出时等待
shutdown()完成,避免丢失队列数据。
Bridge 不能自动捕获 Electron Main Process Crash。Renderer unresponsive 和 render-process-gone 需要由 Main Process 监听并转成可信 Bridge 命令。完整接入方式参考 Electron 监测。
- Browser RUM 只在 Renderer 中初始化,每个独立 Renderer 页面都需要初始化。
file://页面设置sessionPersistence: "local-storage"。- Main Process 不会自动把 RUM 实例传给远程页面。
- 检查 Browser RUM 的
applicationId、site/datakitOrigin、Token 和采样率。 - 该模式不启动 Windows Native Bridge,完整排查方式参考 Web RUM Electron 应用接入。
数据重复¶
- 应用启动过程中只初始化一次对应 SDK Handle。
.NET重复调用GuanceSdk.Init()会异步释放旧客户端,初始化边界重叠可能造成重复采集。- 自动采集已经覆盖的控件交互、
HttpClient或 WinHTTP 请求不要再次手动上报。 - WinUI 3 同一个窗口只使用一种关联写法。
- Electron renderer 应保证初始化入口只执行一次。
退出时仍有队列数据¶
不要只触发异步关闭后立即终止进程。Native 崩溃 Error 会在下一次启动时恢复并入队,不会在崩溃进程中执行网络上传。
开启 Debug 调试¶
在测试环境开启 Debug = true 或 debug = 1。C# 可通过 GuanceSdk.AddDiagnosticListener() 记录 SDK 级别、来源和消息。提交问题时提供:
- SDK 版本、运行时或编译器版本和 Windows 版本;
- UI 框架、进程架构和接入语言;
- 已脱敏的配置;
- RUM 与 Log 诊断计数、状态码;
- 可复现的最小步骤。
不要提交 Client Token、认证 Header、Cookie、用户敏感信息或本地绝对路径。