"core" ping ============ This mobile-specific ping is intended to provide the most critical data in a concise format, allowing for frequent uploads. Since this ping is used to measure retention, it should be sent each time the browser is opened. Submission will be per the Edge server specification:: /submit/telemetry/docId/docType/appName/appVersion/appUpdateChannel/appBuildID * ``docId`` is a UUID for deduping * ``docType`` is “core” * ``appName`` is “Fennec” * ``appVersion`` is the version of the application (e.g. "46.0a1") * ``appUpdateChannel`` is “release”, “beta”, etc. * ``appBuildID`` is the build number Note: Counts below (e.g. search & usage times) are “since the last ping”, not total for the whole application lifetime. Structure:: { "v": 3, // ping format version "clientId": , // client id, e.g. // "c641eacf-c30c-4171-b403-f077724e848a" "seq": , // running ping counter, e.g. 3 "locale": , // application locale, e.g. "en-US" "os": , // OS name. "osversion": , // OS version. "device": , // Build.MANUFACTURER + " - " + Build.MODEL // where manufacturer is truncated to 12 characters // & model is truncated to 19 characters "arch": , // e.g. "arm", "x86" "profileDate": , // Profile creation date in days since // UNIX epoch. "defaultSearch": , // Identifier of the default search engine, // e.g. "yahoo". "experiments": [, …], // Optional, array of identifiers // for the active experiments } Field details ------------- device ~~~~~~ The ``device`` field is filled in with information specified by the hardware manufacturer. As such, it could be excessively long and use excessive amounts of limited user data. To avoid this, we limit the length of the field. We're more likely have collisions for models within a manufacturer (e.g. "Galaxy S5" vs. "Galaxy Note") than we are for shortened manufacturer names so we provide more characters for the model than the manufacturer. defaultSearch ~~~~~~~~~~~~~ On Android, this field may be ``null``. To get the engine, we rely on ``SearchEngineManager#getDefaultEngine``, which searches in several places in order to find the search engine identifier: * Shared Preferences * The distribution (if it exists) * The localized default engine If the identifier could not be retrieved, this field is ``null``. If the identifier is retrieved, we attempt to create an instance of the search engine from the search plugins (in order): * In the distribution * From the localized plugins shipped with the browser * The third-party plugins that are installed in the profile directory If the plugins fail to create a search engine instance, this field is also ``null``. profileDate ~~~~~~~~~~~ On Android, this value is created at profile creation time and retrieved or, for legacy profiles, taken from the package install time (note: this is not the same exact metric as profile creation time but we compromised in favor of ease of implementation). Additionally on Android, this field may be ``null`` in the unlikely event that all of the following events occur: #. The times.json file does not exist #. The package install date could not be persisted to disk The reason we don't just return the package install time even if the date could not be persisted to disk is to ensure the value doesn't change once we start sending it: we only want to send consistent values. Version history --------------- * v3: ``profileDate`` will return package install time when times.json is not available * v2: added ``defaultSearch`` * v1: initial version