Bug 1278531 - Disallow adding new "scalar" histograms to Histograms.json. r?gfritzsche draft
authorAlessio Placitelli <alessio.placitelli@gmail.com>
Fri, 07 Apr 2017 14:56:35 +0200
changeset 559498 5207a86287fec9c2aba1669c18e1cec75f18fc34
parent 557688 10ea10d9993c9701e5525928257a589dea2c05d8
child 623410 83f0e66487dd3a51e4722b403ad32b64deb33e1d
push id53111
push useralessio.placitelli@gmail.com
push dateMon, 10 Apr 2017 07:37:36 +0000
reviewersgfritzsche
bugs1278531
milestone55.0a1
Bug 1278531 - Disallow adding new "scalar" histograms to Histograms.json. r?gfritzsche MozReview-Commit-ID: 1cYpF6N99Zi
toolkit/components/telemetry/histogram-whitelists.json
toolkit/components/telemetry/histogram_tools.py
--- a/toolkit/components/telemetry/histogram-whitelists.json
+++ b/toolkit/components/telemetry/histogram-whitelists.json
@@ -1854,10 +1854,300 @@
     "LOCALDOMSTORAGE_PRELOAD_PENDING_ON_FIRST_ACCESS",
     "DENIED_TRANSLATION_OFFERS",
     "XUL_CACHE_DISABLED",
     "PAGE_FAULTS_HARD",
     "BROWSERPROVIDER_XUL_IMPORT_BOOKMARKS",
     "PDF_VIEWER_USED",
     "NETWORK_DISK_CACHE_OPEN",
     "GEOLOCATION_WIN8_SOURCE_IS_MLS"
-    ]
+  ],
+  "kind": [
+    "A11Y_IATABLE_USAGE_FLAG",
+    "A11Y_INSTANTIATED_FLAG",
+    "A11Y_ISIMPLEDOM_USAGE_FLAG",
+    "ADDON_FORBIDDEN_CPOW_USAGE",
+    "ADDON_MANAGER_UPGRADE_UI_SHOWN",
+    "ALERTS_SERVICE_DND_SUPPORTED_FLAG",
+    "AUDIO_MFT_OUTPUT_NULL_SAMPLES",
+    "AUTO_REJECTED_TRANSLATION_OFFERS",
+    "BROWSER_SHIM_USAGE_BLOCKED",
+    "CANVAS_WEBGL_ACCL_FAILURE_ID",
+    "CANVAS_WEBGL_FAILURE_ID",
+    "CHANGES_OF_TARGET_LANGUAGE",
+    "CHARSET_OVERRIDE_USED",
+    "COMPONENTS_SHIM_ACCESSED_BY_CONTENT",
+    "CONTENT_DOCUMENTS_DESTROYED",
+    "CREATE_EVENT_BEFOREUNLOADEVENT",
+    "CREATE_EVENT_COMMANDEVENT",
+    "CREATE_EVENT_COMMANDEVENTS",
+    "CREATE_EVENT_COMPOSITIONEVENT",
+    "CREATE_EVENT_CUSTOMEVENT",
+    "CREATE_EVENT_DATACONTAINEREVENT",
+    "CREATE_EVENT_DATACONTAINEREVENTS",
+    "CREATE_EVENT_DEVICEMOTIONEVENT",
+    "CREATE_EVENT_DEVICEORIENTATIONEVENT",
+    "CREATE_EVENT_DRAGEVENT",
+    "CREATE_EVENT_DRAGEVENTS",
+    "CREATE_EVENT_ERROREVENT",
+    "CREATE_EVENT_EVENT",
+    "CREATE_EVENT_EVENTS",
+    "CREATE_EVENT_HASHCHANGEEVENT",
+    "CREATE_EVENT_HTMLEVENTS",
+    "CREATE_EVENT_KEYBOARDEVENT",
+    "CREATE_EVENT_KEYEVENTS",
+    "CREATE_EVENT_MESSAGEEVENT",
+    "CREATE_EVENT_MOUSEEVENT",
+    "CREATE_EVENT_MOUSEEVENTS",
+    "CREATE_EVENT_MOUSESCROLLEVENTS",
+    "CREATE_EVENT_MUTATIONEVENT",
+    "CREATE_EVENT_MUTATIONEVENTS",
+    "CREATE_EVENT_NOTIFYPAINTEVENT",
+    "CREATE_EVENT_PAGETRANSITION",
+    "CREATE_EVENT_POPSTATEEVENT",
+    "CREATE_EVENT_POPUPEVENTS",
+    "CREATE_EVENT_SCROLLAREAEVENT",
+    "CREATE_EVENT_SIMPLEGESTUREEVENT",
+    "CREATE_EVENT_STORAGEEVENT",
+    "CREATE_EVENT_SVGEVENT",
+    "CREATE_EVENT_SVGEVENTS",
+    "CREATE_EVENT_SVGZOOMEVENT",
+    "CREATE_EVENT_SVGZOOMEVENTS",
+    "CREATE_EVENT_TEXTEVENT",
+    "CREATE_EVENT_TEXTEVENTS",
+    "CREATE_EVENT_TIMEEVENT",
+    "CREATE_EVENT_TIMEEVENTS",
+    "CREATE_EVENT_TOUCHEVENT",
+    "CREATE_EVENT_UIEVENT",
+    "CREATE_EVENT_UIEVENTS",
+    "CREATE_EVENT_XULCOMMANDEVENT",
+    "CREATE_EVENT_XULCOMMANDEVENTS",
+    "CSP_DOCUMENTS_COUNT",
+    "CSP_UNSAFE_EVAL_DOCUMENTS_COUNT",
+    "CSP_UNSAFE_INLINE_DOCUMENTS_COUNT",
+    "CYCLE_COLLECTOR_OOM",
+    "CYCLE_COLLECTOR_WORKER_OOM",
+    "D3D11_COMPOSITING_FAILURE_ID",
+    "D3D11_SYNC_HANDLE_FAILURE",
+    "D3D9_COMPOSITING_FAILURE_ID",
+    "DECODER_INSTANTIATED_IBM866",
+    "DECODER_INSTANTIATED_ISO2022JP",
+    "DECODER_INSTANTIATED_ISO_8859_5",
+    "DECODER_INSTANTIATED_KOI8R",
+    "DECODER_INSTANTIATED_KOI8U",
+    "DECODER_INSTANTIATED_MACARABIC",
+    "DECODER_INSTANTIATED_MACCE",
+    "DECODER_INSTANTIATED_MACCROATIAN",
+    "DECODER_INSTANTIATED_MACCYRILLIC",
+    "DECODER_INSTANTIATED_MACDEVANAGARI",
+    "DECODER_INSTANTIATED_MACFARSI",
+    "DECODER_INSTANTIATED_MACGREEK",
+    "DECODER_INSTANTIATED_MACGUJARATI",
+    "DECODER_INSTANTIATED_MACGURMUKHI",
+    "DECODER_INSTANTIATED_MACHEBREW",
+    "DECODER_INSTANTIATED_MACICELANDIC",
+    "DECODER_INSTANTIATED_MACROMANIAN",
+    "DECODER_INSTANTIATED_MACTURKISH",
+    "DEDICATED_WORKER_SPAWN_GETS_QUEUED",
+    "DEFECTIVE_PERMISSIONS_SQL_REMOVED",
+    "DENIED_TRANSLATION_OFFERS",
+    "DEVTOOLS_ABOUTDEBUGGING_OPENED_COUNT",
+    "DEVTOOLS_ANIMATIONINSPECTOR_OPENED_COUNT",
+    "DEVTOOLS_BROWSERCONSOLE_OPENED_COUNT",
+    "DEVTOOLS_CANVASDEBUGGER_OPENED_COUNT",
+    "DEVTOOLS_COMPUTEDVIEW_OPENED_COUNT",
+    "DEVTOOLS_CUSTOM_OPENED_COUNT",
+    "DEVTOOLS_DEVELOPERTOOLBAR_OPENED_COUNT",
+    "DEVTOOLS_DOM_OPENED_COUNT",
+    "DEVTOOLS_EYEDROPPER_OPENED_COUNT",
+    "DEVTOOLS_FONTINSPECTOR_OPENED_COUNT",
+    "DEVTOOLS_GCLI_COMMANDS_KEYED",
+    "DEVTOOLS_INSPECTOR_OPENED_COUNT",
+    "DEVTOOLS_JSBROWSERDEBUGGER_OPENED_COUNT",
+    "DEVTOOLS_JSDEBUGGER_OPENED_COUNT",
+    "DEVTOOLS_JSPROFILER_OPENED_COUNT",
+    "DEVTOOLS_LAYOUTVIEW_OPENED_COUNT",
+    "DEVTOOLS_MEMORY_BREAKDOWN_CENSUS_COUNT",
+    "DEVTOOLS_MEMORY_BREAKDOWN_DOMINATOR_TREE_COUNT",
+    "DEVTOOLS_MEMORY_DOMINATOR_TREE_COUNT",
+    "DEVTOOLS_MEMORY_EXPORT_SNAPSHOT_COUNT",
+    "DEVTOOLS_MEMORY_IMPORT_SNAPSHOT_COUNT",
+    "DEVTOOLS_MEMORY_OPENED_COUNT",
+    "DEVTOOLS_MEMORY_TAKE_SNAPSHOT_COUNT",
+    "DEVTOOLS_MENU_EYEDROPPER_OPENED_COUNT",
+    "DEVTOOLS_NETMONITOR_OPENED_COUNT",
+    "DEVTOOLS_OPTIONS_OPENED_COUNT",
+    "DEVTOOLS_PAINTFLASHING_OPENED_COUNT",
+    "DEVTOOLS_PERFTOOLS_CONSOLE_RECORDING_COUNT",
+    "DEVTOOLS_PERFTOOLS_RECORDING_COUNT",
+    "DEVTOOLS_PERFTOOLS_RECORDING_EXPORT_FLAG",
+    "DEVTOOLS_PERFTOOLS_RECORDING_IMPORT_FLAG",
+    "DEVTOOLS_PICKER_EYEDROPPER_OPENED_COUNT",
+    "DEVTOOLS_RELOAD_ADDON_INSTALLED_COUNT",
+    "DEVTOOLS_RELOAD_ADDON_RELOAD_COUNT",
+    "DEVTOOLS_RESPONSIVE_OPENED_COUNT",
+    "DEVTOOLS_RULEVIEW_OPENED_COUNT",
+    "DEVTOOLS_SCRATCHPAD_OPENED_COUNT",
+    "DEVTOOLS_SCRATCHPAD_WINDOW_OPENED_COUNT",
+    "DEVTOOLS_SHADEREDITOR_OPENED_COUNT",
+    "DEVTOOLS_STORAGE_OPENED_COUNT",
+    "DEVTOOLS_STYLEEDITOR_OPENED_COUNT",
+    "DEVTOOLS_TILT_OPENED_COUNT",
+    "DEVTOOLS_TOOLBOX_OPENED_COUNT",
+    "DEVTOOLS_WEBAUDIOEDITOR_OPENED_COUNT",
+    "DEVTOOLS_WEBCONSOLE_OPENED_COUNT",
+    "DEVTOOLS_WEBIDE_IMPORT_PROJECT_COUNT",
+    "DEVTOOLS_WEBIDE_NEW_PROJECT_COUNT",
+    "DEVTOOLS_WEBIDE_OPENED_COUNT",
+    "DEVTOOLS_WEBIDE_PROJECT_EDITOR_OPENED_COUNT",
+    "DEVTOOLS_WEBIDE_PROJECT_EDITOR_SAVE_COUNT",
+    "DOCUMENT_WITH_EXPANDED_PRINCIPAL",
+    "DOM_SCRIPT_SRC_ENCODING",
+    "ENABLE_PRIVILEGE_EVER_CALLED",
+    "FENNEC_DISTRIBUTION_REFERRER_INVALID",
+    "FENNEC_ORBOT_INSTALLED",
+    "FENNEC_RESTORING_ACTIVITY",
+    "FENNEC_SESSIONSTORE_ALL_FILES_DAMAGED",
+    "FENNEC_SESSIONSTORE_DAMAGED_SESSION_FILE",
+    "FENNEC_SESSIONSTORE_RESTORING_FROM_BACKUP",
+    "FENNEC_SYNC11_MIGRATIONS_COMPLETED",
+    "FENNEC_SYNC11_MIGRATIONS_FAILED",
+    "FENNEC_SYNC11_MIGRATIONS_SUCCEEDED",
+    "FENNEC_SYNC11_MIGRATION_SENTINELS_SEEN",
+    "FENNEC_SYNC_NUMBER_OF_SYNCS_COMPLETED",
+    "FENNEC_SYNC_NUMBER_OF_SYNCS_FAILED",
+    "FENNEC_SYNC_NUMBER_OF_SYNCS_FAILED_BACKOFF",
+    "FENNEC_SYNC_NUMBER_OF_SYNCS_STARTED",
+    "FENNEC_WAS_KILLED",
+    "FILE_EMBEDDED_SERVICEWORKERS",
+    "FIPS_ENABLED",
+    "FXA_CONFIGURED",
+    "FX_BROWSER_FULLSCREEN_USED",
+    "FX_CONTENT_CRASH_DUMP_UNAVAILABLE",
+    "FX_CONTENT_CRASH_NOT_SUBMITTED",
+    "FX_CONTENT_CRASH_PRESENTED",
+    "FX_SESSION_RESTORE_SEND_UPDATE_CAUSED_OOM",
+    "FX_TOUCH_USED",
+    "GEOLOCATION_ERROR",
+    "JS_TELEMETRY_ADDON_EXCEPTIONS",
+    "MASTER_PASSWORD_ENABLED",
+    "MEDIA_CODEC_USED",
+    "MEDIA_DECODING_PROCESS_CRASH",
+    "NETWORK_CONNECTION_COUNT",
+    "NUMBER_OF_PROFILES",
+    "ONBEFOREUNLOAD_PROMPT_COUNT",
+    "OPENGL_COMPOSITING_FAILURE_ID",
+    "PERMISSIONS_SQL_CORRUPTED",
+    "PLUGIN_ACTIVATION_COUNT",
+    "PLUGIN_BLOCKED_FOR_STABILITY",
+    "PLUGIN_HANG_NOTICE_COUNT",
+    "PLUGIN_TINY_CONTENT",
+    "PRINT_COUNT",
+    "PRINT_DIALOG_OPENED_COUNT",
+    "PRINT_PREVIEW_OPENED_COUNT",
+    "PRINT_PREVIEW_SIMPLIFY_PAGE_OPENED_COUNT",
+    "PRINT_PREVIEW_SIMPLIFY_PAGE_UNAVAILABLE_COUNT",
+    "PROCESS_CRASH_SUBMIT_ATTEMPT",
+    "PUSH_API_NOTIFY",
+    "PWMGR_MANAGE_COPIED_PASSWORD",
+    "PWMGR_MANAGE_COPIED_USERNAME",
+    "PWMGR_MANAGE_DELETED",
+    "PWMGR_MANAGE_DELETED_ALL",
+    "PWMGR_MANAGE_SORTED",
+    "REJECTED_MESSAGE_MANAGER_MESSAGE",
+    "REMOTE_JAR_PROTOCOL_USED",
+    "REQUESTS_OF_ORIGINAL_CONTENT",
+    "SANDBOX_REJECTED_SYSCALLS",
+    "SEARCH_COUNTS",
+    "SEARCH_SERVICE_US_COUNTRY_MISMATCHED_TIMEZONE",
+    "SEARCH_SERVICE_US_TIMEZONE_MISMATCHED_COUNTRY",
+    "SERVICE_WORKER_CONTROLLED_DOCUMENTS",
+    "SERVICE_WORKER_REGISTRATIONS",
+    "SERVICE_WORKER_SPAWN_ATTEMPTS",
+    "SERVICE_WORKER_SPAWN_GETS_QUEUED",
+    "SERVICE_WORKER_UPDATED",
+    "SERVICE_WORKER_WAS_SPAWNED",
+    "SHARED_WORKER_COUNT",
+    "SHARED_WORKER_SPAWN_GETS_QUEUED",
+    "SHOULD_AUTO_DETECT_LANGUAGE",
+    "SHOULD_TRANSLATION_UI_APPEAR",
+    "SLOW_SCRIPT_NOTICE_COUNT",
+    "SLOW_SCRIPT_PAGE_COUNT",
+    "SOCIAL_ENABLED_ON_SESSION",
+    "STARTUP_CRASH_DETECTED",
+    "STORAGE_SYNC_REMOVE_OPS",
+    "SUBJECT_PRINCIPAL_ACCESSED_WITHOUT_SCRIPT_ON_STACK",
+    "SUBPROCESS_ABNORMAL_ABORT",
+    "SUBPROCESS_CRASHES_WITH_DUMP",
+    "SUBPROCESS_KILL_HARD",
+    "SUBPROCESS_LAUNCH_FAILURE",
+    "TELEMETRY_ARCHIVE_SESSION_PING_COUNT",
+    "TELEMETRY_ASSEMBLE_PAYLOAD_EXCEPTION",
+    "TELEMETRY_DISCARDED_CONTENT_PINGS_COUNT",
+    "TELEMETRY_INVALID_PAYLOAD_SUBMITTED",
+    "TELEMETRY_INVALID_PING_TYPE_SUBMITTED",
+    "TELEMETRY_PENDING_LOAD_FAILURE_PARSE",
+    "TELEMETRY_PENDING_LOAD_FAILURE_READ",
+    "TELEMETRY_PING_EVICTED_FOR_SERVER_ERRORS",
+    "TELEMETRY_PING_SIZE_EXCEEDED_ARCHIVED",
+    "TELEMETRY_PING_SIZE_EXCEEDED_PENDING",
+    "TELEMETRY_PING_SIZE_EXCEEDED_SEND",
+    "TELEMETRY_PING_SUBMISSION_WAITING_CLIENTID",
+    "TELEMETRY_SCHEDULER_TICK_EXCEPTION",
+    "TELEMETRY_SCHEDULER_WAKEUP",
+    "TELEMETRY_SESSIONDATA_FAILED_LOAD",
+    "TELEMETRY_SESSIONDATA_FAILED_PARSE",
+    "TELEMETRY_SESSIONDATA_FAILED_SAVE",
+    "TELEMETRY_SESSIONDATA_FAILED_VALIDATION",
+    "TELEMETRY_TEST_COUNT",
+    "TELEMETRY_TEST_COUNT2",
+    "TELEMETRY_TEST_COUNT_INIT_NO_RECORD",
+    "TELEMETRY_TEST_EXPIRED",
+    "TELEMETRY_TEST_FLAG",
+    "TELEMETRY_TEST_KEYED_COUNT",
+    "TELEMETRY_TEST_KEYED_COUNT_INIT_NO_RECORD",
+    "TELEMETRY_TEST_KEYED_FLAG",
+    "TELEMETRY_TEST_KEYED_RELEASE_OPTIN",
+    "TELEMETRY_TEST_KEYED_RELEASE_OPTOUT",
+    "TELEMETRY_TEST_RELEASE_OPTIN",
+    "TELEMETRY_TEST_RELEASE_OPTOUT",
+    "TOP_LEVEL_CONTENT_DOCUMENTS_DESTROYED",
+    "TOTAL_CONTAINERS_OPENED",
+    "TOTAL_SCROLL_Y",
+    "TRANSLATED_PAGES",
+    "TRANSLATED_PAGES_BY_LANGUAGE",
+    "UNIQUE_CONTAINERS_OPENED",
+    "UPDATE_CANNOT_STAGE_EXTERNAL",
+    "UPDATE_CANNOT_STAGE_NOTIFY",
+    "UPDATE_CHECK_EXTENDED_ERROR_EXTERNAL",
+    "UPDATE_CHECK_EXTENDED_ERROR_NOTIFY",
+    "UPDATE_CHECK_NO_UPDATE_EXTERNAL",
+    "UPDATE_CHECK_NO_UPDATE_NOTIFY",
+    "UPDATE_INVALID_LASTUPDATETIME_EXTERNAL",
+    "UPDATE_INVALID_LASTUPDATETIME_NOTIFY",
+    "UPDATE_NOT_PREF_UPDATE_AUTO_EXTERNAL",
+    "UPDATE_NOT_PREF_UPDATE_AUTO_NOTIFY",
+    "UPDATE_NOT_PREF_UPDATE_ENABLED_EXTERNAL",
+    "UPDATE_NOT_PREF_UPDATE_ENABLED_NOTIFY",
+    "UPDATE_NOT_PREF_UPDATE_SERVICE_ENABLED_EXTERNAL",
+    "UPDATE_NOT_PREF_UPDATE_SERVICE_ENABLED_NOTIFY",
+    "UPDATE_NOT_PREF_UPDATE_STAGING_ENABLED_EXTERNAL",
+    "UPDATE_NOT_PREF_UPDATE_STAGING_ENABLED_NOTIFY",
+    "UPDATE_PING_COUNT_EXTERNAL",
+    "UPDATE_PING_COUNT_NOTIFY",
+    "UPDATE_SERVICE_MANUALLY_UNINSTALLED_EXTERNAL",
+    "UPDATE_SERVICE_MANUALLY_UNINSTALLED_NOTIFY",
+    "UPDATE_UNABLE_TO_APPLY_EXTERNAL",
+    "UPDATE_UNABLE_TO_APPLY_NOTIFY",
+    "VIDEO_FASTSEEK_USED",
+    "WEAVE_ENGINE_SYNC_ERRORS",
+    "WEBFONT_PER_PAGE",
+    "WEBRTC_CALL_COUNT_2",
+    "WEBVTT_USED_VTT_CUES",
+    "WEB_NOTIFICATION_CLICKED",
+    "WEB_NOTIFICATION_EXCEPTIONS_OPENED",
+    "WEB_NOTIFICATION_SENDERS",
+    "WEB_NOTIFICATION_SHOWN",
+    "XUL_CACHE_DISABLED",
+    "YOUTUBE_NONREWRITABLE_EMBED_SEEN",
+    "YOUTUBE_REWRITABLE_EMBED_SEEN"
+  ]
 }
--- a/toolkit/components/telemetry/histogram_tools.py
+++ b/toolkit/components/telemetry/histogram_tools.py
@@ -238,16 +238,17 @@ associated with the histogram.  Returns 
         if not self._strict_type_checks:
             table['exponential'].append('extended_statistics_ok')
 
         table_dispatch(definition['kind'], table,
                        lambda allowed_keys: Histogram.check_keys(name, definition, allowed_keys))
 
         self.check_name(name)
         self.check_field_types(name, definition)
+        self.check_whitelisted_kind(name, definition)
         self.check_whitelistable_fields(name, definition)
         self.check_expiration(name, definition)
         self.check_label_values(name, definition)
 
     def check_name(self, name):
         if '#' in name:
             raise ValueError('"#" not permitted for %s' % (name))
 
@@ -299,16 +300,40 @@ associated with the histogram.  Returns 
         # To make it easier to generate C++ identifiers from this etc., we restrict
         # the label values to a strict pattern.
         pattern = '^[a-z][a-z0-9_]+[a-z0-9]$'
         invalid = filter(lambda l: not re.match(pattern, l, re.IGNORECASE), labels)
         if len(invalid) > 0:
             raise ValueError('Label values for %s are not matching pattern "%s": %s' %
                              (name, pattern, ', '.join(invalid)))
 
+    def check_whitelisted_kind(self, name, definition):
+        # We don't need to run any of these checks on the server.
+        if not self._strict_type_checks or whitelists is None:
+            return
+
+        DOC_URL = ("https://gecko.readthedocs.io/en/latest/toolkit/"
+                   "components/telemetry/telemetry/collection/scalars.html")
+
+        # Disallow "flag" and "count" histograms on desktop, suggest to use
+        # scalars instead. Allow using these histograms on Android, as we
+        # don't support scalars there yet.
+        hist_kind = definition.get("kind")
+        android_cpp_guard =\
+            definition.get("cpp_guard") in ["ANDROID", "MOZ_WIDGET_ANDROID"]
+
+        if not android_cpp_guard and \
+           hist_kind in ["flag", "count"] and \
+           name not in whitelists["kind"]:
+            raise KeyError(('New "%s" histograms are not supported on Desktop, you should'
+                            ' use scalars instead: %s'
+                            ' Are you trying to add a histogram on Android?'
+                            ' Add "cpp_guard": "ANDROID" to your histogram definition.')
+                           % (hist_kind, DOC_URL))
+
     # Check for the presence of fields that old histograms are whitelisted for.
     def check_whitelistable_fields(self, name, definition):
         # Use counters don't have any mechanism to add the fields checked here,
         # so skip the check for them.
         # We also don't need to run any of these checks on the server.
         if self._is_use_counter or not self._strict_type_checks:
             return