“main” Ping

这是“main” 遥测 Ping 类型,其有效负载包含用于跟踪 Firefox 在野性能和健康状况的大多数测量数据。它包括直方图以及其他性能和诊断数据。

此 Ping 可能由于 reason 字段记录的多种原因之一而触发

  • aborted-session - 此 Ping 定期保存到磁盘(每 5 分钟),覆盖自身,并在关闭时删除。如果在启动时找到先前的 aborted-session Ping,则将其发送到服务器。第一个 aborted-session Ping 在遥测启动后立即生成

  • environment-change - 环境 已更改,因此会话测量已重置,并启动了一个新的子会话

  • shutdown - 浏览器会话结束时触发。对于第一个浏览会话,此 Ping 会保存到磁盘并在下一个浏览器重新启动时发送。从第二个浏览会话开始,此 Ping 会在关闭时立即使用 Ping 发送器 发送,除非操作系统正在关闭

  • daily - 在本地午夜以 24 小时间隔触发的会话拆分。如果在应发送时通过 environment-change Ping 生成,则 daily Ping 将重新安排到下一个午夜

  • saved-session - 涵盖整个浏览器会话的测量的“经典” 遥测有效负载(仅在 Android 上提交)

大多数原因会导致会话拆分,从而启动一个新的子会话。我们为这些子会话重置重要的测量数据。

在新的子会话拆分之后,internal-telemetry-after-subsession-split 主题会通知所有观察者。这是一个内部主题,仅供内部遥测使用。

注意

saved-session 使用不同的 Ping 类型(saved-session,而不是 main)发送,但在其他方面与此处讨论的格式相同。从 Firefox 61 开始,这仅在 Android 上发送。

结构

{
  version: 4,

  info: {
    reason: <string>, // what triggered this ping: "saved-session", "environment-change", "shutdown", ...
    revision: <string>, // the Histograms.json revision
    timezoneOffset: <integer>, // time-zone offset from UTC, in minutes, for the current locale
    previousBuildId: <string>, // null if this is the first run, or the previous build ID is unknown

    sessionId: <uuid>,  // random session id, shared by subsessions
    subsessionId: <uuid>,  // random subsession id
    previousSessionId: <uuid>, // session id of the previous session, null on first run.
    previousSubsessionId: <uuid>, // subsession id of the previous subsession (even if it was in a different session),
                                  // null on first run.

    subsessionCounter: <unsigned integer>, // the running no. of this subsession since the start of the browser session
    profileSubsessionCounter: <unsigned integer>, // the running no. of all subsessions for the whole profile life time

    sessionStartDate: <ISO date>, // hourly precision, ISO date in local time
    subsessionStartDate: <ISO date>, // hourly precision, ISO date in local time
    sessionLength: <integer>, // the session length until now in seconds, monotonic
    subsessionLength: <integer>, // the subsession length in seconds, monotonic

    addons: <string>, // obsolete, use ``environment.addons``
  },

  processes: {...},
  simpleMeasurements: {...},

  // The following properties may all be null if we fail to collect them.
  histograms: {...},
  keyedHistograms: {...},
  chromeHangs: {...}, // removed in firefox 62
  threadHangStats: [...], // obsolete in firefox 57, use the 'bhr' ping
  log: [...], // obsolete in firefox 61, use Event Telemetry or Scalars
  gc: {...},
  fileIOReports: {...},
  lateWrites: {...},
  addonDetails: {...},
  UIMeasurements: [...],  // Android only
  slowSQL: {...},
  slowSQLstartup: {...},
}

info

sessionLength

到目前为止,当前会话的长度(以秒为单位)。这使用单调时钟,因此这可能与其他非单调测量不匹配,例如基于 Date.now() 的计算。

请注意,这目前在我们的支持平台上并不始终如一

  • 在 Windows 上,这使用 GetTickCount64(),它确实在睡眠期间增加

  • 在 macOS 上,这使用 mach_absolute_time(),它在睡眠期间不会增加

  • 在 POSIX/Linux 上,这使用 clock_gettime(CLOCK_MONOTONIC, &ts),它不应该在睡眠期间增加

有关详细信息,请参阅 bug 1204823

subsessionLength

此子会话的长度(以秒为单位)。这使用单调时钟,因此这可能与其他非单调测量不匹配(例如,基于 Date.now())。

另请参阅关于平台一致性的 sessionLength 的说明。

processes

此部分包含每个进程的数据。

结构

"processes" : {
  // ... other processes ...
  "parent": {
    scalars: {...},
    keyedScalars: {...},
    // parent process histograms and keyedHistograms are in main payload
  },
  "content": {
    scalars: {...},
    keyedScalars: {...},
    histograms: {...},
    keyedHistograms: {...},
  },
  "gpu": {
    // ...
  }
}

histograms 和 keyedHistograms

此部分包含在内容进程上累积的直方图和键控直方图。在内容子进程上记录的直方图与父直方图具有不同的特征。例如,GC_MSprocesses.content 中会有很大不同,因为它必须与 Web 内容竞争,而 payload.histograms 中的实例只需要与浏览器 JS 竞争。此外,如果从未在内容子进程上记录某些直方图,则它们可能不存在(EVENTLOOP_UI_ACTIVITY 仅限父进程)。

此格式通过 bug 1218576 在 Firefox 51 中采用。

scalars 和 keyedScalars

此部分包含对当前平台有效的 标量。仅当向标量添加数据时才提交标量,并且仅在子会话 Ping 中报告。记录的标量在 Scalars.yaml 文件中进行了描述。info.revision 字段指示描述已报告标量文件的修订版。

simpleMeasurements

此部分包含简单测量或计数器的列表。除了下面突出显示的测量或计数器之外,还可以报告遥测时间戳(请参阅 此处此处)。

totalTime

表示会话已运行的秒数的非单调整数。

addonManager

仅在扩展的测量集中可用,它包含一组与附加组件相关的计数器。有关记录的测量的列表,请参阅 此处

UITelemetry

从 Firefox 61 开始,此部分不再存在。

仅在扩展的测量集中可用。有关更多信息,请参阅 UITelemetry 数据格式(已过时)

js

此部分包含来自 JavaScript 引擎的一系列计数器。

结构

"js" : {
  // ...
}

从 Firefox 59 开始,此部分不再包含任何条目,从 Firefox 61 开始,此部分已删除。

maximalNumberOfConcurrentThreads

表示在会话期间迄今为止遇到的线程数最多的整数。

startupSessionRestoreReadBytes

仅限 Windows 的整数,表示主进程读取的字节数,直到会话存储已完成窗口的恢复。

startupSessionRestoreWriteBytes

仅限 Windows 的整数,表示主进程写入的字节数,直到会话存储已完成窗口的恢复。

startupWindowVisibleReadBytes

仅限 Windows 的整数,表示主进程读取的字节数,直到 XUL 窗口可见之后。

startupWindowVisibleWriteBytes

仅限 Windows 的整数,表示主进程写入的字节数,直到 XUL 窗口可见之后。

debuggerAttached

如果调试器附加到主进程,则此布尔值设置为 true。

shutdownDuration

完成上次关闭所需的时间(以毫秒为单位)。

failedProfileLockCount

系统无法锁定用户配置文件的次数。

activeTicks

用户被视为“活跃”(向窗口发送 UI 事件)的五秒钟间隔(“刻度”)的整数计数。在用户在不活跃后变得活跃时,会立即触发一个额外的事件。这适用于某些鼠标和游戏手柄事件,以及所有触摸、键盘、滚轮和指针事件(请参阅 EventStateManager.cpp)。此测量可能有助于提供用户实际与浏览器交互的趋势,与整体会话持续时间相比。它不考虑窗口是否具有焦点或是否位于前台。只是它是否正在接收这些交互事件。请注意,在 main Ping 中,此测量会在子会话拆分时重置,而在 saved-session Ping 中,它涵盖整个浏览器会话。

histograms

本节包含当前平台有效的直方图。 Flag 直方图始终创建并提交,默认值为 false,除非在该时间段内记录了 true 的值。如果未向其他类型的直方图(请参阅 选择直方图类型)添加任何数据,则不会创建或提交这些直方图。报告的直方图的类型和格式由 Histograms.json 文件描述。其最新版本可 在此处 获取。 info.revision 字段指示描述报告直方图的文件的修订版本。

keyedHistograms

本节包含当前平台可用的键控直方图。

从 Firefox 48 开始,本节不再包含空键控直方图。

threadHangStats

从 Firefox 57 开始,本节不再存在,已被 bhr ping 替换。

包含主线程和后台线程中挂起统计信息。请注意,本节中的挂起捕获 标签栈 和不完整的 JS 栈,其精度并非 100%。对于特别严重的挂起,以及在 nightly 版本中,还会捕获未符号化的原生栈。被视为“严重”的时间量因线程而异,并在为该线程构造 BackgroundHangMonitor 时设置。不过,通常情况下,5-10 秒的挂起通常被视为严重。对于其他线程(合成器线程和仅在标签切换期间启用的挂起监视器),较短的挂起(1-2 秒)被视为严重。

为了避免提交过大的有效负载,会应用一些限制。

  • 相同的相邻“(chrome script)”或“(content script)”栈条目将合并在一起。如果栈被缩减,则“(reduced stack)”帧标记将被添加为最旧的帧。

  • 报告的标签栈深度限制为 11 个条目。此值表示遥测报告的线程挂起栈深度的第 99.9 个百分位数。

  • 原生栈的深度限制为 25 个栈帧。

结构

"threadHangStats" : [
  {
    "name" : "Gecko",
    "activity" : {...}, // a time histogram of all task run times
    "nativeStacks": { // captured for all hangs on nightly, or egregious hangs on beta
      "memoryMap": [
        ["wgdi32.pdb", "08A541B5942242BDB4AEABD8C87E4CFF2"],
        ["igd10iumd32.pdb", "D36DEBF2E78149B5BE1856B772F1C3991"],
        // ... other entries in the format ["module name", "breakpad identifier"] ...
      ],
      "stacks": [
        [
          [
            0, // the module index or -1 for invalid module indices
            190649 // the offset of this program counter in its module or an absolute pc
          ],
          [1, 2540075],
          // ... other frames ...
        ],
        // ... other stacks ...
      ]
    },
    "hangs" : [
      {
        "stack" : [
          "Startup::XRE_Main",
          "Timer::Fire",
          "(content script)",
          "IPDL::PPluginScriptableObject::SendGetChildProperty",
          ... up to 11 frames ...
        ],
        "nativeStack": 0, // index into nativeStacks.stacks array
        "histogram" : {...}, // the time histogram of the hang times
        "annotations" : [
          {
            "pluginName" : "Shockwave Flash",
            "pluginVersion" : "18.0.0.209"
          },
          ... other annotations ...
        ]
      },
    ],
  },
  ... other threads ...
]

chromeHangs

从 Firefox 62 开始,chromeHangs 已被移除。请查看 bhr ping 以获取类似的功能。

包含仅发生在父进程主线程上的挂起统计信息。报告精确的 C++ 栈。这仅在 Windows 上的 Nightly 版本中可用,当使用“–enable-profiling”开关构建时。

应用了一些限制。

  • 报告的 chrome 挂起栈的深度限制为 50 个条目。

  • 报告的栈的最大数量为 50 个。

模块名称可以包含 Unicode 字符。

结构

"chromeHangs" : {
  "memoryMap" : [
    ["wgdi32.pdb", "08A541B5942242BDB4AEABD8C87E4CFF2"],
    ["igd10iumd32.pdb", "D36DEBF2E78149B5BE1856B772F1C3991"],
    ... other entries in the format ["module name", "breakpad identifier"] ...
   ],
  "stacks" : [
    [
      [
        0, // the module index or -1 for invalid module indices
        190649 // the offset of this program counter in its module or an absolute pc
      ],
      [1, 2540075],
      ... other frames, up to 50 ...
     ],
     ... other stacks, up to 50 ...
  ],
  "durations" : [8, ...], // the hang durations (in seconds)
  "systemUptime" : [692, ...], // the system uptime (in minutes) at the time of the hang
  "firefoxUptime" : [672, ...], // the Firefox uptime (in minutes) at the time of the hang
  "annotations" : [
    [
      [0, ...], // the indices of the related hangs
      {
        "pluginName" : "Shockwave Flash",
        "pluginVersion" : "18.0.0.209",
        ... other annotations as key:value pairs ...
      }
    ],
    ...
  ]
},

log

从 Firefox 61 开始,本节不再存在,请使用 事件标量

本节包含通过遥测报告的重要或异常事件的日志。

结构

"log": [
  [
    "Event_ID",
    3785, // the timestamp (in milliseconds) for the log entry
    ... other data ...
  ],
  ...
]

目前,已知此节的一个用户是:遥测实验。

遥测实验使用它来记录实验何时启动和终止。

fileIOReports

包含执行期间记录的主线程 I/O 统计信息。目前仅报告 XRE 和配置文件目录的 I/O 统计信息,两者均未公开完整的本地路径。

结构

"fileIOReports": {
  "{xre}": [
    totalTime, // Accumulated duration of all operations
    creates, // Number of create/open operations
    reads, // Number of read operations
    writes, // Number of write operations
    fsyncs, // Number of fsync operations
    stats, // Number of stat operations
  ],
  "{profile}": [ ... ],
  ...
}

lateWrites

本节报告在关闭期间发生的写入文件系统操作。报告的数据包含写入发生时加载的库的栈和文件名。

加载的库的文件名可以包含 Unicode 字符。

结构

"lateWrites" : {
  "memoryMap" : [
    ["wgdi32.pdb", "08A541B5942242BDB4AEABD8C87E4CFF2"],
    ... other entries in the format ["module name", "breakpad identifier"] ...
   ],
  "stacks" : [
    [
      [
        0, // the module index or -1 for invalid module indices
        190649 // the offset of this program counter in its module or an absolute pc
      ],
      [1, 2540075],
      ... other frames ...
     ],
     ... other stacks ...
  ],
},

addonDetails

本节包含每个附加组件提供者报告的每个附加组件的遥测详细信息。在撰写本文时,XPI 提供者是唯一报告的提供者(请参阅 Searchfox)。遥测不会操纵或强制执行提供的提供者数据的特定格式。

结构

"addonDetails": {
  "XPI": {
    "[email protected]": {
      "location": "app-profile",
      "name": "ADB Helper",
      "creator": "Mozilla & Android Open Source Project",
    },
    ...
  },
  ...
}

slowSQL

本节包含主线程和其他线程的慢速 SQL 查询信息。如果 SQL 语句的执行在主线程上花费 50 毫秒或更长时间,或者在其他线程上花费 100 毫秒或更长时间,则认为该语句执行缓慢。慢速 SQL 语句将自动截断为 1000 个字符。此限制不包括在存储的语句末尾附加的省略号和数据库名称。

结构

"slowSQL": {
  "mainThread": {
    "Sanitized SQL Statement": [
      1, // the number of times this statement was hit
      200  // the total time (in milliseconds) that was spent on this statement
    ],
    ...
  },
  "otherThreads": {
    "VACUUM /* places.sqlite */": [
      1,
      330
    ],
    ...
  }
},

slowSQLStartup

本节包含启动时收集的慢速 SQL 语句(直到“sessionstore-windows-restored”事件触发)。本节的结构类似于 slowSQL 的结构。

UIMeasurements

本节仅适用于 Android,包含特定于 UI 的遥测度量和事件(请参阅此处)。

结构

"UIMeasurements": [
  {
    "type": "event", // either "session" or "event"
    "action": "action.1",
    "method": "menu",
    "sessions": [],
    "timestamp": 12345,
    "extras": "settings"
  },
  {
    "type": "session",
    "name": "awesomescreen.1",
    "reason": "commit",
    "start": 123,
    "end": 456
  }
  ...
],

版本历史