"main" ping =========== This is the "main" Telemetry ping type, whose payload contains most of the measurements that are used to track the performance and health of Firefox in the wild. It includes the histograms and other performance and diagnostic data. This ping is triggered by different scenarios, which is documented by the ``reason`` field: * ``aborted-session`` - this ping is regularly saved to disk (every 5 minutes), overwriting itself, and deleted at shutdown. If a previous aborted session ping is found at startup, it gets sent to the server. The first aborted-session ping is generated as soon as Telemetry starts * ``environment-change`` - the :doc:`environment` changed, so the session measurements got reset and a new subsession starts * ``shutdown`` - triggered when the browser session ends * ``daily`` - a session split triggered in 24h hour intervals at local midnight. If an ``environment-change`` ping is generated by the time it should be sent, the daily ping is rescheduled for the next midnight * ``saved-session`` - the *"classic"* Telemetry payload with measurements covering the whole browser session (only submitted for a transition period) Most reasons lead to a session split, initiating a new *subsession*. We reset important measurements for those subsessions. *Note:* ``saved-session`` is sent with a different ping type (``saved-session``, not ``main``), but otherwise has the same format as discussed here. Structure:: { version: 4, info: { reason: , // what triggered this ping: "saved-session", "environment-change", "shutdown", ... revision: , // the Histograms.json revision timezoneOffset: , // time-zone offset from UTC, in minutes, for the current locale previousBuildId: , // null if this is the first run, or the previous build ID is unknown sessionId: , // random session id, shared by subsessions subsessionId: , // random subsession id previousSessionId: , // session id of the previous session, null on first run. previousSubsessionId: , // subsession id of the previous subsession (even if it was in a different session), // null on first run. subsessionCounter: , // the running no. of this subsession since the start of the browser session profileSubsessionCounter: , // the running no. of all subsessions for the whole profile life time sessionStartDate: , // daily precision subsessionStartDate: , // daily precision, ISO date in local time sessionLength: , // the session length until now in seconds, monotonic subsessionLength: , // the subsession length in seconds, monotonic }, childPayloads: {...}, // only present with e10s; a reduced payload from content processes simpleMeasurements: { ... }, histograms: {}, keyedHistograms: {}, chromeHangs: {}, threadHangStats: {}, log: [], fileIOReports: {...}, lateWrites: {...}, addonDetails: { ... }, addonHistograms: {...}, UIMeasurements: {...}, slowSQL: {...}, slowSQLstartup: {...}, } info ---- sessionLength ~~~~~~~~~~~~~ The length of the current session so far in seconds. This uses a monotonic clock, so this may mismatch with other measurements that are not monotonic like calculations based on ``Date.now()``. If the monotonic clock failed, this will be ``-1``. subsessionLength ~~~~~~~~~~~~~~~~ The length of this subsession in seconds. This uses a monotonic clock, so this may mismatch with other measurements that are not monotonic (e.g. based on Date.now()). If ``sessionLength`` is ``-1``, the monotonic clock is not working.