跳转至

Electron 监测

本页保留 Windows 原生宿主、运行时、Replay 和打包说明。首次接入请从 Electron 应用接入选择方案;应用主体为 Electron 时先完成 managed 快速开始。

Windows SDK 通过 Native Bridge 接入 Electron:Renderer 中的 Browser RUM 和 Browser Logs 负责采集页面数据,Electron Main Process 将数据交给 Windows Native Core,由 Native Core 统一管理应用 ID、Session、采样、全局上下文、持久化队列和上传。

根据 Native SDK 的初始化所有者选择一种模式:

模式 适用场景 Native Runtime 来源 SDK 所有者
混合模式(external) C++ 桌面应用中嵌入 Electron 页面 宿主提供,例如 vcpkg 基础包 C++ 宿主
全量模式(managed) 应用本身是 Electron npm 安装时下载,也支持显式指定目录 Adapter 管理的 Bridge EXE

两种模式不能同时使用。页面侧共用相同的 Preload、attachWindow() 和 Renderer 初始化方式。

该方式不同于 Web RUM 的 Electron 独立接入。Windows SDK 集成中,Renderer 不直接上传数据,也不配置真实应用 ID、上报地址或 Client Token。

数据流如下:

Electron Renderer
  @cloudcare/browser-rum / @cloudcare/browser-logs 采集器
          |
          | FTWebViewJavascriptBridge.sendEvent(JSON)
          v
安全 Preload -> 白名单 IPC -> Electron Main Process
          |
          v
Windows Native Core(由 C++ 宿主或 Bridge EXE 初始化)
  原生 RUM / Log / 会话 / 采样 / 上下文 / 持久化 / 上传

集成 Electron

安装依赖

Electron Native Adapter 版本

应用主体为 Electron 时,按公共快速开始安装依赖并接入 Main、Preload 和 Renderer。Electron 版本要求见支持范围。

npm 安装和运行时安装器要求 Node.js 18+;打包后的应用用户无需另行安装 Node.js。Windows 支持 x64、x86(Electron/Node.js 中为 ia32)和 arm64,需要安装与运行时架构匹配的 Microsoft Visual C++ v14 Redistributable 和 Windows Universal CRT。

发布的 npm 包本身不内置 Native 二进制,但 postinstall 会按平台和架构下载并校验 Native Runtime,无需本地编译。全量模式默认自动定位该运行时,不需要先安装 vcpkg。Adapter 同时支持 macOS;本页介绍 Windows Native Bridge 接入。

重要版本节点

Adapter 0.1.0-alpha.3 增加 Windows x86/arm64 运行时选择、校验与打包支持,并将默认 Native Runtime 固定为 Windows SDK vcpkg_0.1.0-alpha.8、macOS SDK 1.6.8-alpha.6。这些是该版本的默认依赖,不代表后续版本始终使用相同 Native SDK。

Adapter、Windows SDK 和 macOS SDK 分别维护版本。实际默认值以所安装 npm 包的 package.json.nativeRuntime 为准。

Windows Replay 拆包接入要求 Adapter 0.1.0-alpha.5 和 Windows SDK vcpkg_0.1.0-alpha.10 或更高版本;alpha.5 默认使用该 Windows SDK。基础运行时默认不包含 Replay,需显式安装同版本、同架构的补充组件。

仅使用混合模式时,可在安装前设置 PowerShell 环境变量 $env:GUANCE_NATIVE_SKIP_DOWNLOAD = "1",跳过不使用的运行时下载;切换回全量模式安装前需清除此变量。

初始化 Native Bridge

全量模式

由 Electron Main Process 启动并管理 Bridge EXE,完整初始化与退出示例见 managed 快速开始。公共 native.settings 字段、采样单位及版本差异见 Main 配置。

Windows 需要自定义缓存目录时,可将 cachePath 设置为 path.join(app.getPath("userData"), "native-rum-cache"),其中 path 为 node:path 模块,app 为 Electron App。

其他可选配置:

位置 参数 说明
native.settings traceType 默认 w3c_traceparent
native.settings traceAllowedUrls Native Trace URL 规则字符串
native.settings httpTimeoutMs 上传超时,默认 10000 毫秒,范围 1..300000
native(managed) readyTimeoutMs、stopTimeoutMs 启动握手与退出等待时间,默认 10000、3000 毫秒
native(managed) onNativeOutput 接收 (stream, text),用于诊断 Bridge 标准输出和错误输出
native(external) timeoutMs、retryDelayMs 连接超时与重试间隔,默认 10000、100 毫秒
bootstrap() enableAppLaunch 默认 true,自动采集冷启动和热启动 Action
native mode managed 为全量模式,external 为混合模式
native(managed) directory 自定义 Native Runtime 目录;省略时自动定位
bootstrap() onError 接收异步传输和窗口处理错误

退出清理和公共 Client API 见生命周期与诊断。startFullMode() 与 connectMixedMode() 仅保留早期版本兼容,新接入统一使用 bootstrap()。

Adapter 默认启用 enableAppLaunch,会结合 Electron 应用生命周期、可信窗口首帧和 Browser View 上下文自动生成 launch_cold、launch_hot Action;不需要自动启动 Action 时设置为 false。为保证冷启动关联首个 Browser View,应尽早启动或连接 Bridge,并在创建窗口后立即调用 attachWindow()。

混合模式

C++ 宿主先初始化 Windows SDK,再将 Bridge Server 绑定到已有的 guance_sdk_handle:

guance_sdk_config_v2 config{};
guance_sdk_config_v2_init(&config);
config.datakit_url = "http://127.0.0.1:9529";
config.rum_app_id = "<rum-application-id>";
config.session_sampling_rate = 100.0f; // vcpkg 0.1.0-alpha.9 起支持
guance_sdk_handle sdk = guance_sdk_init_v2(&config);

guance_electron_bridge_server_options options{};
guance_electron_bridge_server_options_init(&options);
options.pipe_name = "my-app-rum";
options.logging_enabled = 1;
options.session_replay_enabled = 0;
options.replay_privacy_level = "mask";

guance_electron_bridge_server_handle bridge =
    guance_electron_bridge_server_start(sdk, &options);

// 应用退出时先停止 Bridge Server,再关闭 SDK。
guance_electron_bridge_server_stop(bridge);
guance_sdk_shutdown(sdk);

Electron Main Process 连接同名 named pipe:

const electron = require("electron");
const { bootstrap } = require("@cloudcare/electron-native-adapter");

const rumBridge = await bootstrap({
  electron,
  native: {
    mode: "external",
    pipeName: "my-app-rum",
  },
  enableAppLaunch: true,
});

混合模式下:

  • 不要启动 guance_windows_electron_bridge.exe,否则会创建第二个 SDK Handle;
  • Electron 不再传入应用 ID、DataKit/Dataway、缓存或上传配置;
  • C++ 宿主必须保证 SDK Handle 的生命周期长于 Bridge Server;
  • 采集 Browser Log 时,需要同时启用 Native 自定义日志,并将 logging_enabled 设为 1。

接入 Preload 与窗口

按 公共 Preload 配置安装桥接,再按窗口管理在加载页面前登记窗口;managed 与 external 共用此流程。

初始化 Renderer

按公共 Renderer 接入初始化页面 RUM、可选日志和 Replay。真实应用 ID、上传地址和凭据由 Native 管理。

Session Replay 是实验性且默认关闭的能力

仅当 Native SDK 和 Bridge 配置均启用 Replay,且匹配的 Replay 组件实际可用时,getCapabilities() 才返回 records。Renderer 必须根据该能力决定是否开始录制,不能单独强制启用。全量模式在 native.settings 中设置 replayEnabled: true;混合模式由宿主配置 Native SDK 与 Bridge Server,并管理录制生命周期。

安装可选 Replay 运行时

全量模式在开发或构建阶段安装 Replay 补充包,不在应用运行时下载 DLL。在应用根目录运行:

npx guance-electron-native --sdk-version vcpkg_0.1.0-alpha.10 --target win32-x64 --with-replay

CLI 输出的运行时目录在开发时传给 native.directory,打包时传给 stageWindowsRuntime() 的 nativeDirectory;打包后使用 resources/native 自动定位。x86、arm64 应分别选择 win32-x86、win32-arm64。也可在 npm 安装前设置 $env:GUANCE_NATIVE_INSTALL_REPLAY = "1",让 postinstall 将补充组件安装到 npm 包的运行时目录,随后按默认方式定位和打包。

离线安装需同时准备基础与 Replay 归档及各自的 .sha256 文件:

npx guance-electron-native --sdk-version vcpkg_0.1.0-alpha.10 --target win32-x64 --runtime-archive C:/sdk/runtime.tar.gz --replay-archive C:/sdk/replay.tar.gz

安装器会校验两个清单的 SDK 版本、架构和文件哈希,将 guance_windows_replay.dll 放到基础 DLL 同一目录。安装完成后仍需设置 replayEnabled: true。Replay 缺失或无法加载时,普通 RUM 继续工作,Renderer 不获得 records 能力。

混合模式的组件由 C++ 宿主通过 vcpkg replay Feature 提供,DLL 与宿主的基础 SDK 同目录;Electron Adapter 根据 Bridge Server 握手中的实际能力决定是否转发 Replay。详见可选组件安装。

打包资源

全量模式应在应用签名前调用公开的打包辅助函数,把完整运行时复制到 ASAR 之外:

const { stageWindowsRuntime } = require(
  "@cloudcare/electron-native-adapter/packaging/windows",
);

stageWindowsRuntime({
  resourcesDirectory: "release/MyApp-win32-x64/resources",
  arch: "x64",
});

辅助函数默认定位 npm 包内已安装的运行时,复制到 resources/native;目标目录必须为空。打包后的 managed 模式会自动定位该目录,无需设置 native.directory。Native EXE、DLL 和 manifest 等资源应完整保留,不能放入 app.asar。

已安装 Replay 时,stageWindowsRuntime() 会同时校验并复制补充 DLL 和 replay-manifest.json。基础运行时与 Replay 补充组件必须保持相同版本和架构。

跨架构打包时,先安装目标运行时,再显式传入目标 arch。Windows 支持 x64、x86 / ia32、arm64。CLI 安装的运行时须通过辅助函数的 nativeDirectory 指定。

手动使用 vcpkg 工具目录时,也可继续通过 electron-builder 的 extraResources 复制,并使用下文 vcpkg 小节的 sdkDirectory 指定资源位置:

{
  "build": {
    "extraResources": [
      {
        "from": "vcpkg_installed/x64-windows/tools/guance-windows-native",
        "to": "guance-windows-native"
      }
    ]
  }
}

全量模式必须交付同一 SDK 版本的 guance_windows_electron_bridge.exe 和相邻的 guance_windows_native.dll,同时由应用打包工具携带 @cloudcare/electron-native-adapter。混合模式不需要复制 vcpkg 工具目录;Native DLL 仍由 C++ 宿主原有的部署流程交付,JavaScript Adapter 仍由 npm 依赖提供。不要依赖当前工作目录或开发机绝对路径定位资源。

可选:由 vcpkg 提供 Native Runtime

宿主拥有 Native SDK,或需要自行构建运行时时,按照快速开始配置 SDK vcpkg 注册表。JavaScript Adapter 仍由 npm 单独安装。手动提供全量模式运行时时启用 electron-bridge:

{
  "dependencies": [
    {
      "name": "guance-windows-native",
      "default-features": false,
      "features": ["electron-bridge"]
    }
  ]
}

混合模式安装基础 Native 包;使用 Replay 时,在该依赖中添加 "features": ["replay"]。无需启用旧 electron-bridge Feature:

{
  "dependencies": [
    {
      "name": "guance-windows-native",
      "default-features": false
    }
  ]
}

在 vcpkg.json 所在目录执行:

vcpkg install --triplet x64-windows

以上 vcpkg 命令以 x64 为例。手动使用 vcpkg 工具目录时,将下面的 sdkDirectory 传入 native.directory;默认 npm 下载流程无需配置此项:

const path = require("node:path");
const { app } = require("electron");

const sdkDirectory = app.isPackaged
  ? path.join(process.resourcesPath, "guance-windows-native")
  : path.resolve(
      __dirname,
      "../../../vcpkg_installed/x64-windows/tools/guance-windows-native",
    );

开发目录的相对层级应按应用结构调整,不要依赖当前工作目录或写死开发机绝对路径。

自定义与离线运行时安装

若 npm 安装时使用了 --ignore-scripts,或需要其他目标架构,可在应用根目录运行:

npx guance-electron-native --sdk-version <sdk-tag> --target <target>

Windows 目标为 win32-x64、win32-x86、win32-arm64;macOS 为 darwin-universal。<sdk-tag> 使用 Native SDK Release 的完整标签,保留 vcpkg_、nuget_ 或 v 等已有前缀;标签下必须存在对应运行时资产。

离线安装需要 SDK .tar.gz 和相邻的 .tar.gz.sha256 校验文件:

npx guance-electron-native --sdk-version <sdk-tag> --target <target> --runtime-archive C:/sdk/runtime.tar.gz

CLI 将运行时安装到应用根目录下。开发时把输出目录传给 native.directory,打包时传给 stageWindowsRuntime() 的 nativeDirectory;打包后移除开发目录配置,使用自动定位的 resources/native。

npm postinstall 可使用以下环境变量(PowerShell 使用 $env:变量名 = "值" 设置):

环境变量 用途
GUANCE_NATIVE_RUNTIME_ARCHIVE 使用本地 SDK 压缩包及相邻校验文件,替代下载
GUANCE_NATIVE_INSTALL_REPLAY 设为 1,在 Windows postinstall 中显式安装 Replay 补充组件
GUANCE_NATIVE_REPLAY_ARCHIVE 使用本地 Replay 归档及相邻校验文件;通过 CLI 使用时隐含启用 Replay 安装
GUANCE_NATIVE_REPLAY_ASSET_NAME 覆盖 Replay 补充归档的下载文件名
GUANCE_NATIVE_RUNTIME_TARGET 指定目标平台和架构
GUANCE_NATIVE_SDK_VERSION 覆盖包中固定的 Native SDK 标签
GUANCE_NATIVE_RUNTIME_ASSET_NAME 覆盖下载资产文件名
GUANCE_NATIVE_RUNTIME_DOWNLOAD_BASE_URL 使用 HTTPS 镜像,目录结构为 /<sdk-tag>/<filename>
GUANCE_NATIVE_SKIP_DOWNLOAD 设为 1 跳过运行时安装,适用于 external 模式

压缩包必须与指定 SDK 版本和架构匹配。仅提供离线 Native Runtime 不代表 npm 完全离线;还需要提前准备 npm 包及其依赖缓存。私有源码 checkout 会跳过自动下载,本地 file: 依赖联调时需自行准备运行时。

集成边界

  • Main Process 只使用 @cloudcare/electron-native-adapter 导出的公开接口,不自行注册 SDK 内部 IPC Channel;
  • 不要将应用 ID、Client Token、DataKit/Dataway 地址、原生 Session 或完整 Native 配置暴露给 Renderer;
  • Main Process 只登记可信的 webContents。远程页面还需要限制导航、弹窗、权限和允许域名;
  • 全量模式通过 native.settings 配置 Native Trace,混合模式由宿主配置。Adapter 不向 Renderer 注入 Trace 配置,也不因此自动为页面请求添加 Trace Header;
  • Renderer JavaScript Error 和 Long Task 由 Browser RUM 采集;unresponsive、render-process-gone 和 Main Process Crash 不由 Bridge 自动上报,如有需要应单独接入 Electron crashReporter 或其他 Crashpad 服务。

验证集成

  1. 在 Renderer DevTools Network 中确认没有 RUM 或 Log 直传请求;
  2. 触发 View、Action、Resource、Error、Long Task 和一条 Browser Log,在控制台确认数据;
  3. 确认数据使用 Native 配置中的应用 ID、Session ID 和 sdk_name=df_windows_rum_sdk;
  4. 确认 Browser Log 的 warn 状态在 Native Log 中显示为 warning,且自定义属性被保留;
  5. Replay 关闭或组件缺失时,确认 getCapabilities() 不包含 records;组件安装并开启后,确认录制数据正常上报;
  6. 混合模式关闭 Electron 页面后,确认 C++ SDK 仍在运行;全量模式退出应用后,确认 Bridge EXE 正常关闭。

可参考 Windows SDK 仓库中的 Electron Native Adapter Consumer Acceptance 和 Electron Sample 完成验收。本地联调可以使用 npm file: 依赖;正式应用使用发布包,并通过应用的 lockfile 管理实际安装版本。

文档评价

文档内容是否对您有帮助?