用途:在 VS Code 中新增、修改或评审 A/B 实验时使用,涵盖实验控制型设置与通过 assignment service 读取的 treatment 两种形式。
主要能力与用法: 一、实验控制型设置。在设置 schema 中加入 experiment: { mode: 'auto' },或使用 mode: 'startup' 仅在启动时采用变更后的分配。ExP 通过 treatment config.<setting id>(或 experiment.name)设定该设置默认值,代码照常用 IConfigurationService 读取。用户自行设定的值仍然优先。适用于用户自己可以合理选择的行为。 二、Treatment。用 IWorkbenchAssignmentService.getTreatment<T>(name) 读取值;无分配时解析为 undefined,需保留回退,并在 onDidRefetchAssignments 时重新读取。适用于非用户偏好的值,如文案或变体名称。 三、本地试用分配。在用户设置中设置 experiments.override.<treatment name>,例如 "experiments.override.config.chat.mySetting.enabled": true。
触发事件(triggered scorecard):触发式记分卡只比较到达控制组与治疗组行为不同节点的用户。用 experimentTrigger.ts 中的助手记录该节点:logSettingExperimentTrigger(telemetryService, MY_SETTING_ID) 用于实验控制型设置,logExperimentTrigger(telemetryService, 'myTreatment') 用于 treatment。它们以 treatmentName 记录共享的 experimentTrigger 事件,每个窗口或进程最多一次。记分卡触发条件应基于该事件(monacoworkbench/experimentTrigger)及其 treatmentName,不要新增功能专属触发事件。
何时使用触发:只有当部分被分配用户在可识别时间点受影响时使用,例如某个动作、仅在特定情况出现的界面,或仅部分会话到达的代码路径。当几乎全部被分配用户都受影响、没有一个先于所有影响的统一时刻、或人群本身已受限(如 onboarding 实验)时不要使用。宁可不用触发,也不要使用近似的触发,偏差触发会产生错误结果。
触发时机:在代码决定控制组与治疗组行为之前、且各分支条件一致处触发。动作行为变化时在动作运行时触发;新增 UI 时在该 UI 将渲染时(各分支均检查)触发;文案或图标变化时在该 UI 渲染时触发;延迟变化时在倒计时开始时(而非延迟 UI 显示时)触发;可被覆盖的默认值变化时在默认值可见且无用户选择存储时触发;后台行为变化时在分歧代码路径运行时触发。
常见陷阱:仅治疗组写入的状态(如 dismissed、seen 标记),在触发前忽略;仅治疗组计算的数据(如只为指示器轮询的 CI 状态),使用与分支无关的超集或在触发前各分支都计算;遗漏曝光点,如无障碍标签、菜单或被设置抑制的功能,需找出设置或 treatment 改变行为的所有位置;排除无法受影响的用户(如动画的减少动态效果用户)在条件各分支一致时可以接受;Agent host 遥测只在 workbench 转发后才带分配上下文,需在此之前保留触发。
测试:使用 TestExperimentTriggerTelemetryService 在每个分支测试每个触发。新增或移动触发后,需启动新的实验迭代,因为较早的曝光没有触发事件。