diff --git a/update-orphaning/index-old.html b/update-orphaning/index-old.html deleted file mode 100644 index 95dc4c2..0000000 --- a/update-orphaning/index-old.html +++ /dev/null @@ -1,513 +0,0 @@ - - - -Update orphaning dashboard - - - - - - - -

Update orphaning dashboard

-Select the desired weekly report:
- -

-
-
-

-
-


-The users who are out of date with updates enabled encounter the following update ping codes:
-
-
Hover over a bar below to see a description of the value.

-
Sort values
-


-
Orphaned users are distributed across the following Firefox versions:

-
- -

-This dashboard is maintained by :mhowell.
-The Spark script for the weekly reports is scheduled to run every Wednesday and can be found here. - - - - diff --git a/update-orphaning/index.css b/update-orphaning/index.css index 90fb749..d069694 100644 --- a/update-orphaning/index.css +++ b/update-orphaning/index.css @@ -98,11 +98,16 @@ td:nth-child(3) { display: none; } .pie-chart { - height: 500px; + height: 490px; margin-top: 20px; } -#out-of-date-desc { - margin-top: 20px; +#version-dist-chart { + height: 530px; +} +#out-of-date-desc, +#not-min-reqs-desc { + margin-top: 10px; + margin-bottom: 10px; } #not-min-reqs-desc { margin-bottom: 20px; diff --git a/update-orphaning/index.html b/update-orphaning/index.html index 9ad4ea3..dbe29ef 100644 --- a/update-orphaning/index.html +++ b/update-orphaning/index.html @@ -19,23 +19,24 @@ Report Week:  

Firefox Application Update Out Of Date Dashboard

The data below is from the Telemetry longitudinal data source which contains approximately -1% of all Telemetry clients for each Firefox version. The period for the report is the 7 days prior -to the Report Week date. The old dashboard can be found here.

+1% of all Telemetry clients for each Firefox version on the release channel. The period for the +report is the 7 days prior to the selected Report Week date.

-
Clients are considered out of date, potentially of concern when +
+
Note: Clients are considered out of date, potentially of concern when they are out of date and haven't met the minimum requirements for there to be an expectation that the client should have updated. Since each client can match multuple criteria the order that they are applied affects the percentage of clients that match each criteria. The order that the -criteria are applied is the same order as they are listed below.
-
+criteria are applied is the same order as they are listed above.
+
Out of date, of concern client last update check code (check phase)
(hover over a bar for details below the chart)
@@ -97,8 +98,7 @@ criteria are applied is the same order as they are listed below.


This dashboard is maintained by :rstrong.
-The Spark Notebook for the weekly reports is scheduled to run every Sunday and can be found here. - +The Spark Notebook for this dashboard is scheduled to run on Monday and Tuesday every week since the longitudinal datasource isn't consistently available on Monday. The Spark Notebook can be found here.
Mozilla's Website Privacy Notice
diff --git a/update-orphaning/index.js b/update-orphaning/index.js index f9c50a8..9eb7198 100644 --- a/update-orphaning/index.js +++ b/update-orphaning/index.js @@ -128,10 +128,11 @@ const downloadCodeGeneralDetails = { "9": {code: "DWNLD_ERR_PATCH_SIZE_NOT_EQUAL", desc: "The size of the update file being downloaded does not equal the expected size."}, "10": {code: "DWNLD_ERR_BINDING_ABORTED", desc: "The download request was aborted with NS_BINDING_ABORTED."}, "11": {code: "DWNLD_ERR_ABORT", desc: "The download request was aborted with NS_ERROR_ABORT."}, - "12": {code: "DWNLD_ERR_DOCUMENT_NOT_CACHED", desc: "The download request was aborted with NS_ERROR_DOCUMENT_NOT_CACHED and the download will be retried as of Firefox 49 and greater (Bug 1272585)."}, + "12": {code: "DWNLD_ERR_DOCUMENT_NOT_CACHED", desc: "The download request was aborted. As of Firefox 49 the download will be continued (Bug 1272585) and as of Firefox 57 the error should rarely occur if at all."}, "13": {code: "DWNLD_ERR_VERIFY_NO_REQUEST", desc: "The download network request object no longer exists."}, "14": {code: "DWNLD_ERR_VERIFY_PATCH_SIZE_NOT_EQUAL", desc: "The size of the downloaded update file does not equal the expected size."}, - "15": {code: "DWNLD_ERR_VERIFY_NO_HASH_MATCH", desc: "The file hash does not equal the hash specified in the update xml file."}}; + "15": {code: "DWNLD_ERR_VERIFY_NO_HASH_MATCH", desc: "The file hash does not equal the hash specified in the update xml file."}, + "16": {code: "DWNLD_RESUME_FAILURE", desc: "The download in progress failed to resume."}}; // Download codes, names, and descriptions specific to UPDATE_DOWNLOAD_CODE_COMPLETE and UPDATE_DOWNLOAD_CODE_PARTIAL. const DOWNLOAD_CODE_DETAILS = { @@ -220,9 +221,15 @@ const stateFailureCodeGeneralDetails = { "46": {code: "DELETE_ERROR_EXPECTED_DIR", desc: "When attempting to delete a directory a file was found."}, "47": {code: "DELETE_ERROR_EXPECTED_FILE", desc: "When attempting to delete a file a directory was found."}, "48": {code: "RENAME_ERROR_EXPECTED_FILE", desc: "When attempting to rename a file a directory was found."}, - "49": {code: "SERVICE_COULD_NOT_COPY_UPDATER", desc: "Unable to copy the updater to a secure location (Windows only)."}, - "50": {code: "SERVICE_STILL_APPLYING_TERMINATED", desc: "The update is still in the applying state and the updater process was terminated (Windows only)."}, - "51": {code: "SERVICE_STILL_APPLYING_NO_EXIT_CODE", desc: "The update is still in the applying state and the updater process did not return an exit code (Windows only)."}, + "49": {code: "SERVICE_COULD_NOT_COPY_UPDATER", desc: "The maintenance service was unable to copy the updater to a secure location (Windows only)."}, + "50": {code: "SERVICE_STILL_APPLYING_TERMINATED", desc: "The update is still in the applying state and the updater process was terminated by the maintenance service (Windows only)."}, + "51": {code: "SERVICE_STILL_APPLYING_NO_EXIT_CODE", desc: "The update is still in the applying state and the updater process did not return an exit code to the maintenance service (Windows only)."}, + "52": {code: "SERVICE_INVALID_APPLYTO_DIR_STAGED_ERROR", desc: "The directory to apply the update to is not the same as or a child of the installation directory when checked by the maintenance service (Windows only)."}, + "53": {code: "SERVICE_CALC_REG_PATH_ERROR", desc: "The maintenance service was unable to calculate the registry path for the installation (Windows only)."}, + "54": {code: "SERVICE_INVALID_APPLYTO_DIR_ERROR", desc: "Installation directory and working directory were not the same for a non-staged update performed by the maintenance service (Windows only)."}, + "55": {code: "SERVICE_INVALID_INSTALL_DIR_PATH_ERROR", desc: "The installation directory path passed to the maintenance service is invalid (Windows only)."}, + "56": {code: "SERVICE_INVALID_WORKING_DIR_PATH_ERROR", desc: "The working directory path passed to the maintenance service is invalid (Windows only)."}, + "57": {code: "SERVICE_INSTALL_DIR_REG_ERROR", desc: "The installation directory specified in the registry and checked by the maintenance service is invalid (Windows only)."}, "61": {code: "WRITE_ERROR_FILE_COPY", desc: "Error copying a file."}, "62": {code: "WRITE_ERROR_DELETE_FILE", desc: "Error deleting a file."}, "63": {code: "WRITE_ERROR_OPEN_PATCH_FILE", desc: "Unable to create new file for patching."}, @@ -237,13 +244,21 @@ const stateFailureCodeGeneralDetails = { "72": {code: "INVALID_APPLYTO_DIR_STAGED_ERROR", desc: "The directory to apply the update to is not the same as or a child of the installation directory."}, "73": {code: "LOCK_ERROR_PATCH_FILE", desc: "Error locking a patch file (Windows only)."}, "74": {code: "INVALID_APPLYTO_DIR_ERROR", desc: "Installation directory and working directory were not the same for a non-staged update (Windows only)."}, + "75": {code: "INVALID_INSTALL_DIR_PATH_ERROR", desc: "The installation directory path is invalid."}, + "76": {code: "INVALID_WORKING_DIR_PATH_ERROR", desc: "The working directory path is invalid."}, + "77": {code: "INVALID_CALLBACK_PATH_ERROR", desc: "The application callback path is invalid."}, + "78": {code: "INVALID_CALLBACK_DIR_ERROR", desc: "The application callback directory is invalid."}, "80": {code: "FOTA_GENERAL_ERROR", desc: "General error from the recovery service (B2G only)."}, "81": {code: "FOTA_UNKNOWN_ERROR", desc: "Unexpected error from the recovery service (B2G only)."}, "82": {code: "FOTA_FILE_OPERATION_ERROR", desc: "File operation error (B2G only)"}, "83": {code: "FOTA_RECOVERY_ERROR", desc: "Error initializing the receovery service (B2G only)"}, "84": {code: "INVALID ERROR CODE", desc: "Invalid update state code."}, - "99": {code: "INVALID ERROR CODE", desc: "Invalid update state failed code."}, - "100": {code: "INVALID ERROR CODE", desc: "Unknown"}}; + "90": {code: "ERR_OLDER_VERSION_OR_SAME_BUILD", desc: "The update was for an older version or the same version and build ID."}, + "91": {code: "ERR_UPDATE_STATE_NONE", desc: "The update status file existed but didn't have a valid state."}, + "92": {code: "ERR_CHANNEL_CHANGE", desc: "The update was for a different channel."}, + "98": {code: "INVALID_UPDATER_STATE_CODE", desc: "Invalid update state code."}, + "99": {code: "INVALID_UPDATER_STATUS_CODE", desc: "Invalid update status code."}, + "100": {code: "INVALID ERROR CODE", desc: "100 is a test code and should not be reported to telemetry."}}; const CHECK_CODE_GOOD = [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]; const CHECK_CODE_BAD = [0, 5, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 30, 31, 32, 33, 34, 35, 36]; @@ -357,7 +372,7 @@ startDate.setMonth(9); // October startDate.setFullYear(2016); function getDetailsText(aText) { - var pos1 = aText.indexOf("<"); + var pos1 = aText.indexOf("Out of date, potentially of concern reason " + + "distribution chart below for details)."); if (outOfDateExcludedTotal) { distributionSlices.push({"label": termLabel, "value": outOfDateExcludedTotal, "color": "#DBD100"}); } @@ -805,7 +832,9 @@ function populateDashboard(event) { termLabel = "Out of date, of concern"; updateDetailsRow("summary-dist-details", 2, ofConcernTrue, totalUpdateData, termLabel, "the client meets the minimum requirements for there to be an " + - "expectation that the client should have updated."); + "expectation that the client should have updated (see the " + + "Out of date, of concern reason distribution " + + "chart below for details)."); if (ofConcernTrue) { distributionSlices.push({"label": termLabel, "value": ofConcernTrue, "color": "#D10000"}); } @@ -823,11 +852,11 @@ function populateDashboard(event) { NotMinReqsSlices.push({"label": termLabel, "value": hasOutOfDateMaxVersionFalse, "color": "#0065D1"}); } - termLabel = "No update pings"; - updateDetailsRow("not-min-reqs-details", 1, hasUpdatePingFalse, outOfDateExcludedTotal, termLabel, - "the client has never sent an update telemetry ping for any Firefox " + - "version. This can be caused by building without application update as " + - "Firefox distributions typically do."); + termLabel = "No update pings"; + updateDetailsRow("not-min-reqs-details", 1, hasUpdatePingFalse, outOfDateExcludedTotal, termLabel, + "the client has never sent an update telemetry ping for any Firefox " + + "version. This can be caused by building without application update as " + + "Firefox distributions typically do."); if (hasUpdatePingFalse) { NotMinReqsSlices.push({"label": termLabel, "value": hasUpdatePingFalse, "color": "#004949"}); } @@ -849,8 +878,9 @@ function populateDashboard(event) { weeksOfSubsessionData + " weeks. Since there is an update telemetry ping " + "every 12 hours and it happens within minutes after startup when the 12 " + "hours have elapsed this is equivalent to these clients only running " + - "Firefox on " + (minUpdatePingCount - 1) + " days or less during the "+ - "previous " + (weeksOfSubsessionData * 7) + " days."); + "Firefox on " + (minUpdatePingCount - 1) + " days or less over the "+ + "previous " + weeksOfSubsessionData + " weeks (" + (weeksOfSubsessionData * 7) + + " days)"); if (hasMinUpdatePingCountFalse) { NotMinReqsSlices.push({"label": termLabel, "value": hasMinUpdatePingCountFalse, "color": "#924900"}); } @@ -925,10 +955,10 @@ function populateDashboard(event) { b.textContent = "out of date"; outOfDateDesc.appendChild(b); textNode = document.createTextNode(" refers to Firefox 42 (first version with opt-out telemetry " + - "for 100% of the release population) through versions less " + - "than Firefox " + (latestVersion - upToDateReleases) + " (" + - (upToDateReleases + 1) + " versions prior to the latest " + - "Firefox version at the time this data was generated)."); + "for 100% of the release population) through versions less than Firefox " + + (latestVersion - upToDateReleases) + " (" + + (upToDateReleases + 1) + " versions prior to the latest Firefox " + + "version at the time this data was generated) on the release channel."); outOfDateDesc.appendChild(textNode); var ofConcernByVersion = data["ofConcernByVersion"]; @@ -950,13 +980,47 @@ function populateDashboard(event) { "#FFFF6D", // yellow "#24FF24", // light green "#000000"]; // black + var detailRows = []; var versionSlices = []; for (var v in ofConcernByVersion) { var labelName = v; var diff = (latestVersion - labelName.split(".")[0]) - 3; var color = versionColors[Math.min(diff, versionColors.length - 1)]; - if (labelName == "43.0.1" || labelName == "47.0.2") { - labelName = labelName + " (watershed)"; + switch (labelName) { + case "43.0.1": + labelName = labelName + " (SHA1 / SHA256 watershed)"; + detailRows[0] = {"labelName": labelName, "subset": ofConcernByVersion[v], + "desc": "a Windows only update watershed was required to change the binary " + + "signing certificate from SHA1 to SHA256 (see " + + "Bug 1079858)."}; + break; + case "47.0.2": + labelName = labelName + " (Websense watershed)"; + detailRows[1] = {"labelName": labelName, "subset": ofConcernByVersion[v], + "desc": "a Windows only update watershed was required to add detection for the " + + "Websense application (see " + + "Bug 1305847)."}; + break; + case "52.0.2": + labelName = labelName + " (XP / Vista EOL)"; + detailRows[2] = {"labelName": labelName, "subset": ofConcernByVersion[v], + "desc": "Windows XP / Vista / 2003 are no longer supported as of Firefox 53. These " + + "clients are being migrated to ESR52 by Release Engineering (see " + + "Bug 1130266)."}; + break; + case "56.0.2": + labelName = labelName + " (JAWS watershed)"; + detailRows[3] = {"labelName": labelName, "subset": ofConcernByVersion[v], + "desc": "a Windows only update watershed was required to add detection for the " + + "JAWS application (see " + + "Bug 617918)."}; + break; + case "57.0.2": + labelName = labelName + " (LZMA watershed)"; + detailRows[4] = {"labelName": labelName, "subset": ofConcernByVersion[v], + "desc": "an update watershed was added for LZMA update compression support (see " + + "Bug 641212)."}; + break; } versionSlices.push({"label": labelName, "value": ofConcernByVersion[v], "color": color}); @@ -964,6 +1028,19 @@ function populateDashboard(event) { displayD3Pie("version-dist-chart", "Out of date, of concern client distribution across Firefox versions", versionSlices, "label-asc"); + for (var i = 0; i < 5; i++) { + if (detailRows[i]) { + updateDetailsRow("version-dist-details", i, detailRows[i].subset, ofConcernTrue, detailRows[i].labelName, + detailRows[i].desc); + } + } + + var versionDetailsTable = document.getElementById("version-dist-details"); + for (var i = 4; i > -1; i--) { + if (!detailRows[i] && versionDetailsTable.rows[i]) { + versionDetailsTable.deleteRow(i); + } + } } var checkCodeNotifyOfConcern = data["checkCodeNotifyOfConcern"]; @@ -1021,7 +1098,9 @@ function populateDashboard(event) { }); updateBarChart(stateFailureCodeStartupData, "state-failure-code-startup", STATE_FAILURE_CODE_STARTUP_BAR_CLASS_FN, stateFailureCodeStartupOfConcern, stateFailureCodeGeneralDetails, null, false); + document.getElementById("weekly-dropdown").disabled = false; }).fail(function() { + document.getElementById("weekly-dropdown").disabled = false; if (firstLoad) { // Try to load the previous week's data in case the current week's data // isn't available yet.