运行时指标定义子系统:JOG

对不起

为什么叫 JOG?因为它与……运行……时间有关。

由于各种原因(从实现简单到性能),注册指标的常规机制发生在编译时。但是,这并不支持以下用例

  • 工件构建(其中仅在构建时重新打包 Firefox 桌面版 JavaScript,因此没有编译环境)

  • 动态遥测(一种理论上用于在不发布代码的情况下检测 Firefox 桌面的系统)

  • Web 扩展(或者至少是那些无法或不会使用 Glean JS SDK 的扩展)

因此,我们需要一个支持运行时注册指标的子系统。我们称之为 JOG,它是在 bug 1698184 中实现的。

仅限 JavaScript

C++ 和 Rust 中的指标由标识符标识,我们无法在运行时交换这些标识符。因此,为了使指标更改对 C++ 或 Rust 中检测到的系统可见,您必须进行编译。

另一方面,对于 JavaScript,我们按需提供实例。它不仅支持推动此项目的特定用例,而且是 Firefox 桌面版中唯一可以从运行时指标定义中受益的环境。

设计

原始设计是在 bug 1662863 中完成的。从那时起,事情大多只是得到了改进。

架构

我们将尽可能多的子系统隔离到位于 toolkit/components/glean/bindings/jog/ 中的 jog 模块中。这包括指标构造工厂和指标实例及其名称和 ID 的存储。

不幸的是,为了使指标实例可以通过 FFI 访问,由 jog crate 创建的 Rust 指标实例存储在 fog crate 中。

说到 FFI,jog crate 正在使用 cbindgen 以便于 C++ 访问。

如果必要或方便,可能可以取消 C++ 存储,将类别集和指标 ID 映射移动到 Rust,并根据需要通过 FFI 移动信息。

测试方法从 nsIFOG 运行(以便我们可以在 xpcshell 的 JS 中使用它们)到静态 JOG:: 函数。

构建集成

如果 JOG 检测到我们是工件构建(通过检查 MOZ_ARTIFACT_BUILDS),它会生成 jogfile.json 并确保将其放置在 GreD(在 firefox 二进制文件旁边)。

jogfile.json 仅包含在运行时注册它们所需的指标和 Ping 信息。(它不知道标签或描述,只知道事物的形状和名称)

首次尝试从 Glean 全局变量获取指标类别或从 GleanPings 全局变量获取 Ping 时,会读取此文件。

是的,这是在主线程上。是的,这是同步的。是的,这是文件 I/O。

由于这是开发人员构建,我们认为为了支持工件构建,这样做是值得的。

如果我们对此判断错误,并且应该对 JOG 施加其他条件,请 联系我们

如果出现奇怪的情况,请删除 objdir/dist/bin/jogfile.json

有时,您添加的指标或 Ping 在运行 Firefox 时可能不会出现。对于这些和其他奇怪的情况,解决方案是相同的:从 objdir 的 dist/bin 目录中删除 jogfile.json,然后重试。

如果您将工件和非工件 objdir 分开(这是良好的实践),则这种情况不应发生。

如果尽管做了正确的事情,您仍然看到这种情况或其他奇怪的事情,那么这是一个错误。请 在 Toolkit :: Telemetry 中提交