Bug 1455270 - Instrument toolbox panel exit with event telemetry r?yulia
Another simple one... test to follow in
bug 1456087.
MozReview-Commit-ID: 9iupoeFwQQo
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -9,16 +9,17 @@ const SOURCE_MAP_WORKER = "resource://de
const MAX_ORDINAL = 99;
const SPLITCONSOLE_ENABLED_PREF = "devtools.toolbox.splitconsoleEnabled";
const SPLITCONSOLE_HEIGHT_PREF = "devtools.toolbox.splitconsoleHeight";
const DISABLE_AUTOHIDE_PREF = "ui.popup.disable_autohide";
const HOST_HISTOGRAM = "DEVTOOLS_TOOLBOX_HOST";
const SCREENSIZE_HISTOGRAM = "DEVTOOLS_SCREEN_RESOLUTION_ENUMERATED_PER_USER";
const CURRENT_THEME_SCALAR = "devtools.current_theme";
const HTML_NS = "http://www.w3.org/1999/xhtml";
+const REGEX_PANEL = /webconsole|inspector|jsdebugger|styleeditor|netmonitor|storage/;
var {Ci, Cc} = require("chrome");
var promise = require("promise");
var defer = require("devtools/shared/defer");
var Services = require("Services");
var ChromeUtils = require("ChromeUtils");
var {gDevTools} = require("devtools/client/framework/devtools");
var EventEmitter = require("devtools/shared/event-emitter");
@@ -1874,30 +1875,39 @@ Toolbox.prototype = {
this.emit("select", id);
this.emit(id + "-selected", panel);
return panel;
});
},
_pingTelemetrySelectTool(id, reason) {
const width = Math.ceil(this.win.outerWidth / 50) * 50;
-
- let panelName = id;
- if (!/webconsole|inspector|jsdebugger|styleeditor|netmonitor|storage/.test(id)) {
- panelName = "other";
- }
+ const panelName = this.getTelemetryPanelName(id);
+ const prevPanelName = this.getTelemetryPanelName(this.currentToolId);
this._telemetry.addEventProperties("devtools.main", "enter", panelName, null, {
"host": this._hostType,
"width": width,
"start_state": reason,
"panel_name": id,
"cold": !this.getPanel(id)
});
+ // On first load this.currentToolId === undefined so we need to skip sending
+ // a devtools.main.exit telemetry event.
+ if (this.currentToolId) {
+ this._telemetry.recordEvent("devtools.main", "exit", prevPanelName, null, {
+ "host": this._hostType,
+ "width": width,
+ "panel_name": prevPanelName,
+ "next_panel": id,
+ "reason": reason
+ });
+ }
+
const pending = ["host", "width", "start_state", "panel_name", "cold"];
if (id === "webconsole") {
pending.push("message_count");
}
this._telemetry.preparePendingEvent(
"devtools.main", "enter", panelName, null, pending);
this._telemetry.toolOpened(id);
},
@@ -2802,22 +2812,32 @@ Toolbox.prototype = {
this.toolbarButtons.forEach(button => {
if (typeof button.teardown == "function") {
// teardown arguments have already been bound in _createButtonState
button.teardown();
}
});
// We need to grab a reference to win before this._host is destroyed.
- let win = this.win;
+ const win = this.win;
+ const host = this._getTelemetryHostString();
+ const width = Math.ceil(win.outerWidth / 50) * 50;
+ const prevPanelName = this.getTelemetryPanelName(this.currentToolId);
this._telemetry.toolClosed("toolbox");
this._telemetry.recordEvent("devtools.main", "close", "tools", null, {
- host: this._getTelemetryHostString(),
- width: Math.ceil(win.outerWidth / 50) * 50
+ host: host,
+ width: width
+ });
+ this._telemetry.recordEvent("devtools.main", "exit", prevPanelName, null, {
+ "host": host,
+ "width": width,
+ "panel_name": this.currentToolId,
+ "next_panel": "none",
+ "reason": "toolbox_close"
});
this._telemetry.destroy();
// Finish all outstanding tasks (which means finish destroying panels and
// then destroying the host, successfully or not) before destroying the
// target.
deferred.resolve(settleAll(outstanding)
.catch(console.error)
@@ -3218,9 +3238,16 @@ Toolbox.prototype = {
* as active for the toolbox and has its related devtools about:config preference set
* to true.
* @see browser/components/extensions/ext-devtools.js
*/
isWebExtensionEnabled: function(extensionUUID) {
let extInfo = this._webExtensions.get(extensionUUID);
return extInfo && Services.prefs.getBoolPref(extInfo.pref, false);
},
+
+ getTelemetryPanelName: function(id) {
+ if (!REGEX_PANEL.test(id)) {
+ return "other";
+ }
+ return id;
+ }
};
--- a/toolkit/components/telemetry/Events.yaml
+++ b/toolkit/components/telemetry/Events.yaml
@@ -198,8 +198,22 @@ devtools.main:
expiry_version: never
extra_keys:
host: "Toolbox host (positioning): bottom, side, window or other."
width: Toolbox width rounded up to the nearest 50px.
message_count: The number of cached console messages.
start_state: debuggerStatement, breakpoint, exception, tab_switch, toolbox_show, initial_panel, toggle_settings_off, toggle_settings_on, key_shortcut, select_next_key, select_prev_key, tool_unloaded, inspect_dom, unknown etc.
panel_name: The name of the panel opened, webconsole, inspector, jsdebugger, styleeditor, netmonitor, storage or other
cold: Is this the first time the current panel has been opened in this toolbox?
+ exit:
+ objects: ["webconsole", "inspector", "jsdebugger", "styleeditor", "netmonitor", "storage", "other"]
+ bug_numbers: [1455270]
+ notification_emails: ["dev-developer-tools@lists.mozilla.org", "hkirschner@mozilla.com"]
+ record_in_processes: ["main"]
+ description: User closes a tool in the devtools toolbox.
+ release_channel_collection: opt-out
+ expiry_version: never
+ extra_keys:
+ host: "Toolbox host (positioning): bottom, side, window or other."
+ width: Toolbox width rounded up to the nearest 50px.
+ next_panel: The name of the panel closed, webconsole, inspector, jsdebugger, styleeditor, netmonitor, storage or other.
+ panel_name: The name of the panel opened, webconsole, inspector, jsdebugger, styleeditor, netmonitor, storage or other
+ reason: debuggerStatement, breakpoint, exception, tab_switch, toolbox_show, initial_panel, toggle_settings_off, toggle_settings_on, key_shortcut, select_next_key, select_prev_key, tool_unloaded, inspect_dom, toolbox_closed, unknown etc.