The Firefox Health Report is a daily client ping that uploads basic product usage information.
Currently, the Firefox Health Report is submitted as a compressed JSON document. The root JSON element is an object. A version field defines the version of the payload which in turn defines the expected contents the object.
As of 2013-07-03, desktop submits Version 2, and Firefox for Android submits Version 3 payloads.
Version 3 is a complete rebuild of the document format. Events are tracked in an “environment”. Environments are computed from a large swath of local data (e.g., add-ons, CPU count, versions), and a new environment comes into being when one of its attributes changes.
Client documents, then, will include descriptions of many environments, and measurements will be attributed to one particular environment.
A map of environments is present at the top level of the document, with the current named “current” in the map. Each environment has a hash identifier and a set of attributes. The current environment is completely described, and has its hash present in a “hash” attribute. All other environments are represented as a tree diff from the current environment, with their hash as the key in the “environments” object.
A removed add-on has the value ‘null’.
There is no “last” data at present.
Daily data is hierarchical: by day, then by environment, and then by measurement, and is present in “data”, just as in v2.
Leading by example:
{
"lastPingDate": "2013-06-29",
"thisPingDate": "2013-07-03",
"version": 3,
"environments": {
"current": {
"org.mozilla.sysinfo.sysinfo": {
"memoryMB": 1567,
"cpuCount": 4,
"architecture": "armeabi-v7a",
"_v": 1,
"version": "4.1.2",
"name": "Android"
},
"org.mozilla.profile.age": {
"_v": 1,
"profileCreation": 15827
},
"org.mozilla.addons.active": {
"QuitNow@TWiGSoftware.com": {
"appDisabled": false,
"userDisabled": false,
"scope": 1,
"updateDay": 15885,
"foreignInstall": false,
"hasBinaryComponents": false,
"blocklistState": 0,
"type": "extension",
"installDay": 15885,
"version": "1.18.02"
},
"{dbbf9331-b713-6eda-1006-205efead09dc}": {
"appDisabled": false,
"userDisabled": "askToActivate",
"scope": 8,
"updateDay": 15779,
"foreignInstall": true,
"blocklistState": 0,
"type": "plugin",
"installDay": 15779,
"version": "11.1 r115"
},
"desktopbydefault@bnicholson.mozilla.org": {
"appDisabled": false,
"userDisabled": true,
"scope": 1,
"updateDay": 15870,
"foreignInstall": false,
"hasBinaryComponents": false,
"blocklistState": 0,
"type": "extension",
"installDay": 15870,
"version": "1.1"
},
"{6e092a7f-ba58-4abb-88c1-1a4e50b217e4}": {
"appDisabled": false,
"userDisabled": false,
"scope": 1,
"updateDay": 15828,
"foreignInstall": false,
"hasBinaryComponents": false,
"blocklistState": 0,
"type": "extension",
"installDay": 15828,
"version": "1.1.0"
},
"{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}": {
"appDisabled": false,
"userDisabled": true,
"scope": 1,
"updateDay": 15879,
"foreignInstall": false,
"hasBinaryComponents": false,
"blocklistState": 0,
"type": "extension",
"installDay": 15879,
"version": "1.3.2"
},
"_v": 1
},
"org.mozilla.appInfo.appinfo": {
"isTelemetryEnabled": 1,
"_v": 2,
"isBlocklistEnabled": 1
},
"geckoAppInfo": {
"updateChannel": "nightly",
"id": "{aa3c5121-dab2-40e2-81ca-7ea25febc110}",
"os": "Android",
"platformBuildID": "20130703031323",
"platformVersion": "25.0a1",
"vendor": "Mozilla",
"name": "fennec",
"xpcomabi": "arm-eabi-gcc3",
"appBuildID": "20130703031323",
"_v": 1,
"version": "25.0a1"
},
"hash": "tB4Pnnep9yTxnMDymc3dAB2RRB0=",
"org.mozilla.addons.counts": {
"extension": 4,
"plugin": 1,
"_v": 1,
"theme": 0
}
},
"k2O3hlreMeS7L1qtxeMsYWxgWWQ=": {
"geckoAppInfo": {
"platformBuildID": "20130630031138",
"appBuildID": "20130630031138",
"_v": 1
}
},
"1+KN9TutMpzdl4TJEl+aCxK+xcw=": {
"geckoAppInfo": {
"platformBuildID": "20130626031100",
"appBuildID": "20130626031100",
"_v": 1
},
"org.mozilla.addons.active": {
"QuitNow@TWiGSoftware.com": null,
"{dbbf9331-b713-6eda-1006-205efead09dc}": null,
"desktopbydefault@bnicholson.mozilla.org": null,
"{6e092a7f-ba58-4abb-88c1-1a4e50b217e4}": null,
"{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}": null,
"_v": 1
},
"org.mozilla.addons.counts": {
"extension": 0,
"plugin": 0,
"_v": 1
}
}
},
"data": {
"last": {},
"days": {
"2013-07-03": {
"tB4Pnnep9yTxnMDymc3dAB2RRB0=": {
"org.mozilla.appSessions": {
"normal": [
{
"r": "P",
"d": 2,
"sj": 653
},
{
"r": "P",
"d": 22
},
{
"r": "P",
"d": 5
},
{
"r": "P",
"d": 0
},
{
"r": "P",
"sg": 3560,
"d": 171,
"sj": 518
},
{
"r": "P",
"d": 16
},
{
"r": "P",
"d": 1079
}
],
"_v": "4"
}
},
"k2O3hlreMeS7L1qtxeMsYWxgWWQ=": {
"org.mozilla.appSessions": {
"normal": [
{
"r": "P",
"d": 27
},
{
"r": "P",
"d": 19
},
{
"r": "P",
"d": 55
}
],
"_v": "4"
},
"org.mozilla.searches.counts": {
"bartext": {
"google": 1
},
"_v": "4"
}
}
}
}
}
}
Sessions are divided into “normal” and “abnormal”. Session objects are stored as discrete JSON:
"org.mozilla.appSessions": {
_v: 4,
"normal": [
{"r":"P", "d": 123},
],
"abnormal": [
{"r":"A", "oom": true, "stopped": false}
]
}
Keys are:
Abnormal terminations will be missing a duration and will feature these keys:
Version 2 is the same as version 1 with the exception that it has an additional top-level field, geckoAppInfo, which contains basic application info.
This field is an object that is a simple map of string keys and values describing basic application metadata. It is very similar to the appinfo measurement in the last section. The difference is this field is almost certainly guaranteed to exist whereas the one in the data part of the payload may be omitted in certain scenarios (such as catastrophic client error).
Its keys are as follows:
The main JSON object contains the following properties:
The bulk of the health report is contained within the data object. This object has the following keys:
The value of days and last are objects mapping measurement names to that measurement’s values. The values are always objects. Each object contains a _v property. This property defines the version of this measurement. Additional non-underscore-prefixed properties are defined by the measurement itself (see sections below).
Here is an example JSON document for version 1:
{
"version": 1,
"thisPingDate": "2013-03-11",
"lastPingDate": "2013-03-10",
"data": {
"last": {
"org.mozilla.addons.active": {
"masspasswordreset@johnathan.nightingale": {
"userDisabled": false,
"appDisabled": false,
"version": "1.05",
"type": "extension",
"scope": 1,
"foreignInstall": false,
"hasBinaryComponents": false,
"installDay": 14973,
"updateDay": 15317
},
"places-maintenance@bonardo.net": {
"userDisabled": false,
"appDisabled": false,
"version": "1.3",
"type": "extension",
"scope": 1,
"foreignInstall": false,
"hasBinaryComponents": false,
"installDay": 15268,
"updateDay": 15379
},
"_v": 1
},
"org.mozilla.appInfo.appinfo": {
"_v": 1,
"appBuildID": "20130309030841",
"distributionID": "",
"distributionVersion": "",
"hotfixVersion": "",
"id": "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}",
"locale": "en-US",
"name": "Firefox",
"os": "Darwin",
"platformBuildID": "20130309030841",
"platformVersion": "22.0a1",
"updateChannel": "nightly",
"vendor": "Mozilla",
"version": "22.0a1",
"xpcomabi": "x86_64-gcc3"
},
"org.mozilla.profile.age": {
"_v": 1,
"profileCreation": 12444
},
"org.mozilla.appSessions.current": {
"_v": 3,
"startDay": 15773,
"activeTicks": 522,
"totalTime": 70858,
"main": 1245,
"firstPaint": 2695,
"sessionRestored": 3436
},
"org.mozilla.sysinfo.sysinfo": {
"_v": 1,
"cpuCount": 8,
"memoryMB": 16384,
"architecture": "x86-64",
"name": "Darwin",
"version": "12.2.1"
}
},
"days": {
"2013-03-11": {
"org.mozilla.addons.counts": {
"_v": 1,
"extension": 15,
"plugin": 12,
"theme": 1
},
"org.mozilla.places.places": {
"_v": 1,
"bookmarks": 757,
"pages": 104858
},
"org.mozilla.appInfo.appinfo": {
"_v": 1,
"isDefaultBrowser": 1
}
},
"2013-03-10": {
"org.mozilla.addons.counts": {
"_v": 1,
"extension": 15,
"plugin": 12,
"theme": 1
},
"org.mozilla.places.places": {
"_v": 1,
"bookmarks": 757,
"pages": 104857
},
"org.mozilla.searches.counts": {
"_v": 1,
"google.urlbar": 4
},
"org.mozilla.appInfo.appinfo": {
"_v": 1,
"isDefaultBrowser": 1
}
}
}
}
}
The bulk of payloads consists of measurement data. An individual measurement is merely a collection of related values e.g. statistics about the Places database or system information.
Each measurement has an integer version number attached. When the fields in a measurement or the semantics of data within that measurement change, the version number is incremented.
All measurements are defined alphabetically in the sections below.
This measurement contains information about the currently-installed add-ons.
The measurement object is a mapping of add-on IDs to objects containing add-on metadata.
Each add-on contains the following properties:
With the exception of installDay and updateDay, all these properties come direct from the Addon instance. See https://developer.mozilla.org/en-US/docs/Addons/Add-on_Manager/Addon. installDay and updateDay are the number of days since UNIX epoch of the add-ons installDate and updateDate properties, respectively.
Add-ons that have opted out of AMO updates via the extensions._id_.getAddons.cache.enabled preference are, since Bug 868306 (Firefox 24), included in the list of submitted add-ons.
"org.mozilla.addons.active": {
"_v": 1,
"SQLiteManager@mrinalkant.blogspot.com": {
"userDisabled": false,
"appDisabled": false,
"version": "0.7.7",
"type": "extension",
"scope": 1,
"foreignInstall": false,
"hasBinaryComponents": false,
"installDay": 15196,
"updateDay": 15307
},
"testpilot@labs.mozilla.com": {
"userDisabled": false,
"appDisabled": false,
"version": "1.2.2",
"type": "extension",
"scope": 1,
"foreignInstall": false,
"hasBinaryComponents": false,
"installDay": 15176,
"updateDay": 15595
}
}
This measurement contains information about historical add-on counts.
The measurement object consists of counts of different add-on types. The properties are:
Add-ons opted out of AMO updates are included in the counts. This differs from the behavior of the active add-ons measurement.
If no add-ons of a particular type are installed, the property for that type will not be present (as opposed to an explicit property with value of 0).
"2013-03-14": {
"org.mozilla.addons.counts": {
"_v": 1,
"extension": 21,
"plugin": 4,
"theme": 1
}
}
This measurement contains basic XUL application and Gecko platform information. It is reported in the last section.
In addition to fields present in version 1, this version has the following fields appearing in the days section:
The measurement object contains mostly string values describing the current application and build. The properties are:
All of the properties appear in the last section except for isDefaultBrowser, which appears under days.
This example comes from an official OS X Nightly build:
"org.mozilla.appInfo.appinfo": {
"_v": 1,
"appBuildID": "20130311030946",
"distributionID": "",
"distributionVersion": "",
"hotfixVersion": "",
"id": "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}",
"locale": "en-US",
"name": "Firefox",
"os": "Darwin",
"platformBuildID": "20130311030946",
"platformVersion": "22.0a1",
"updateChannel": "nightly",
"vendor": "Mozilla",
"version": "22.0a1",
"xpcomabi": "x86_64-gcc3"
},
This measurement contains information about the application update mechanism in the application.
The following daily values are reported:
This measurement was merged to mozilla-central for JS FHR on 2013-07-15.
"2013-07-15": {
"org.mozilla.appInfo.update": {
"_v": 1,
"enabled": 1,
"autoDownload": 1,
}
}
This measurement contains a history of application version numbers.
Version 2 reports more fields than version 1 and is not backwards compatible. The following fields are present in version 2:
When the application is upgraded, the new version and/or build IDs are appended to their appropriate fields.
When the application version (version from org.mozilla.appinfo.appinfo) changes, we record the new version on the day the change was seen. The new versions for a day are recorded in an array under the version property.
If the application isn’t upgraded, this measurement will not be present. This means this measurement will not be present for most days if a user is on the release channel (since updates are typically released every 6 weeks). However, users on the Nightly and Aurora channels will likely have a lot of these entries since those builds are updated every day.
Values for this measurement are collected when performing the daily collection (typically occurs at upload time). As a result, it’s possible the actual upgrade day may not be attributed to the proper day - the reported day may lag behind.
The app and platform versions and build IDs should be identical for most clients. If they are different, we are possibly looking at a Frankenfox.
"2013-03-27": {
"org.mozilla.appInfo.versions": {
"_v": 2,
"appVersion": [
"22.0.0"
],
"appBuildID": [
"20130325031100"
],
"platformVersion": [
"22.0.0"
],
"platformBuildID": [
"20130325031100"
]
}
}
This measurement contains information about the currently running XUL application’s session.
This measurement has the following properties:
"org.mozilla.appSessions.current": {
"_v": 3,
"startDay": 15775,
"activeTicks": 4282,
"totalTime": 249422,
"main": 851,
"firstPaint": 3271,
"sessionRestored": 5998
}
This measurement contains information about previous XUL application sessions.
This measurement contains per-day lists of all the sessions started on that day. The following properties may be present:
Sessions are recorded on the date on which they began.
If a session was aborted/crashed, the total time may be less than the actual total time. This is because we don’t always update total time during periods of inactivity and the abort/crash could occur after a long period of idle, before we’ve updated the total time.
The lengths of the arrays for {cleanActiveTicks, cleanTotalTime}, {abortedActiveTicks, abortedTotalTime}, and {main, firstPaint, sessionRestored} should all be identical.
The length of the clean sessions plus the length of the aborted sessions should be equal to the length of the {main, firstPaint, sessionRestored} properties.
It is not possible to distinguish the main, firstPaint, and sessionRestored values from a clean vs aborted session: they are all lumped together.
For sessions spanning multiple UTC days, it’s not possible to know which days the session was active for. It’s possible a week long session only had activity for 2 days and there’s no way for us to tell which days.
"org.mozilla.appSessions.previous": {
"_v": 3,
"cleanActiveTicks": [
78,
1785
],
"cleanTotalTime": [
4472,
88908
],
"main": [
32,
952
],
"firstPaint": [
2755,
3497
],
"sessionRestored": [
5149,
5520
]
}
This measurement contains a historical record of application crashes.
This measurement will be reported on each day there was a crash. The following properties are reported:
Crashes are typically submitted immediately after they occur (by checking a box in the crash reporter, which should appear automatically after a crash). If the crash reporter submits the crash successfully, we get a submitted crash. Else, we leave it as pending.
A pending crash does not mean it will eventually be submitted.
Pending crash reports can be submitted post-crash by going to about:crashes.
If a pending crash is submitted via about:crashes, the submitted count increments but the pending count does not decrement. This is because FHR does not know which pending crash was just submitted and therefore it does not know which day’s pending crash to decrement.
"org.mozilla.crashes.crashes": {
"_v": 1,
"pending": 1,
"submitted": 2
}
This measurement contains a history of FHR’s own data submission activity. It was added in Firefox 23 in early May 2013.
Daily counts of upload events are recorded.
The result for an upload attempt is always attributed to the same day as the attempt, even if the result occurred on a different day from the attempt. Therefore, the sum of the result counts should equal the result of the attempt counts.
This measurement contains information about the Places database (where Firefox stores its history and bookmarks).
Daily counts of items in the database are reported in the following properties:
"org.mozilla.places.places": {
"_v": 1,
"bookmarks": 388,
"pages": 94870
}
This measurement contains information about the current profile’s age.
A single profileCreation property is present. It defines the integer days since UNIX epoch that the current profile was created.
It is somewhat difficult to obtain a reliable profile born date due to a number of factors.
"org.mozilla.profile.age": {
"_v": 1,
"profileCreation": 15176
}
This measurement contains information about searches performed in the application.
This behaves like version 1 except we added all search engines that Mozilla has a partner agreement with. Like version 1, we concatenate a search engine ID with a search origin.
Another difference with version 2 is we should no longer misattribute a search to the other bucket if the search engine name is localized.
The set of search engine providers is:
And of course, other.
The sources for searches remain:
The measurement will only be populated with providers and sources that occurred that day.
If a user switches locales, searches from default providers on the older locale will still be supported. However, if that same search engine is added by the user to the new build and is not a default search engine provider, its searches will be attributed to the other bucket.
We record counts of performed searches grouped by search engine and search origin. Only search engines with which Mozilla has a business relationship are explicitly counted. All other search engines are grouped into an other bucket.
The following search engines are explicitly counted:
The following search origins are distinguished:
Due to the localization of search engine names, non en-US locales may wrongly attribute searches to the other bucket. This is fixed in version 2.
"org.mozilla.searches.counts": {
"_v": 1,
"google.searchbar": 3,
"google.urlbar": 7
},
This measurement contains basic information about the system the application is running on.
The following properties may be available:
"org.mozilla.sysinfo.sysinfo": {
"_v": 1,
"cpuCount": 8,
"memoryMB": 8192,
"architecture": "x86-64",
"name": "Darwin",
"version": "12.2.0"
}