Skip to content

Commit 83d9407

Browse files
committed
chore: add metrics for eslint and jshint
1 parent c85ee19 commit 83d9407

File tree

4 files changed

+42
-6
lines changed

4 files changed

+42
-6
lines changed

src/extensions/default/JSLint/ESLint.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
define(function (require, exports, module) {
3030

3131
// Load dependent modules
32-
const CodeInspection = brackets.getModule("language/CodeInspection"),
32+
const CodeInspection = brackets.getModule("language/CodeInspection"),
3333
FileSystemError = brackets.getModule("filesystem/FileSystemError"),
3434
AppInit = brackets.getModule("utils/AppInit"),
3535
PreferencesManager = brackets.getModule("preferences/PreferencesManager"),
@@ -39,7 +39,8 @@ define(function (require, exports, module) {
3939
ProjectManager = brackets.getModule("project/ProjectManager"),
4040
FileSystem = brackets.getModule("filesystem/FileSystem"),
4141
LanguageManager = brackets.getModule("language/LanguageManager"),
42-
NodeUtils = brackets.getModule("utils/NodeUtils");
42+
NodeUtils = brackets.getModule("utils/NodeUtils"),
43+
Metrics = brackets.getModule("utils/Metrics");
4344

4445
let prefs = PreferencesManager.getExtensionPrefs("ESLint"),
4546
useESLintFromProject = false;
@@ -148,7 +149,9 @@ define(function (require, exports, module) {
148149
resolve({ errors: _getLintError(ESLINT_ONLY_IN_NATIVE_APP) });
149150
return;
150151
}
152+
const startTime = Date.now();
151153
NodeUtils.ESLintFile(text, fullPath, ProjectManager.getProjectRoot().fullPath).then(esLintResult =>{
154+
Metrics.logPerformanceTime("ESLint", Date.now() - startTime);
152155
const language = LanguageManager.getLanguageForPath(fullPath).getId();
153156
if(language === "jsx" && !_isEslintSupportsJSX(esLintResult.config)){
154157
resolve({isIgnored: true});
@@ -221,12 +224,17 @@ define(function (require, exports, module) {
221224
// Eg. in integ tests. do nothing as another scan for the new project will be in progress.
222225
return;
223226
}
227+
if(shouldESLintEnable) {
228+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "eslint", "config");
229+
}
224230
useESLintFromProject = shouldESLintEnable;
225231
CodeInspection.requestRun(Strings.ESLINT_NAME);
226-
}).catch(()=>{
232+
}).catch((err)=>{
233+
console.error(`ESLint reload options error: ${err}`);
227234
if(scanningProjectPath !== ProjectManager.getProjectRoot().fullPath){
228235
return;
229236
}
237+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "eslintErr", "project");
230238
useESLintFromProject = false;
231239
CodeInspection.requestRun(Strings.ESLINT_NAME);
232240
});

src/extensions/default/JSLint/JSHint.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ define(function (require, exports, module) {
3939
ProjectManager = brackets.getModule("project/ProjectManager"),
4040
FileSystem = brackets.getModule("filesystem/FileSystem"),
4141
IndexingWorker = brackets.getModule("worker/IndexingWorker"),
42+
Metrics = brackets.getModule("utils/Metrics"),
4243
ESLint = require("./ESLint");
4344

4445
if(Phoenix.isTestWindow) {
@@ -96,10 +97,12 @@ define(function (require, exports, module) {
9697

9798
let options = projectSpecificOptions || DEFAULT_OPTIONS;
9899

100+
const startTime = Date.now();
99101
IndexingWorker.execPeer("jsHint", {
100102
text,
101103
options
102104
}).then(jsHintErrors =>{
105+
Metrics.logPerformanceTime("JSHint", Date.now() - startTime);
103106
if (!jsHintErrors.lintResult && jsHintErrors.errors.length) {
104107
let errors = jsHintErrors.errors;
105108

@@ -222,13 +225,17 @@ define(function (require, exports, module) {
222225
// Eg. in integ tests. do nothing as another scan for the new project will be in progress.
223226
return;
224227
}
228+
if(config) {
229+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "jsHint", "config");
230+
}
225231
projectSpecificOptions = config;
226232
jsHintConfigFileErrorMessage = null;
227233
CodeInspection.requestRun(Strings.JSHINT_NAME);
228234
}).catch((err)=>{
229235
if(scanningProjectPath !== ProjectManager.getProjectRoot().fullPath){
230236
return;
231237
}
238+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "jsHintErr", "project");
232239
jsHintConfigFileErrorMessage = err;
233240
CodeInspection.requestRun(Strings.JSHINT_NAME);
234241
});

src/language/CodeInspection.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ define(function (require, exports, module) {
5757
PanelTemplate = require("text!htmlContent/problems-panel.html"),
5858
ResultsTemplate = require("text!htmlContent/problems-panel-table.html"),
5959
Mustache = require("thirdparty/mustache/mustache"),
60-
QuickViewManager = require("features/QuickViewManager");
60+
QuickViewManager = require("features/QuickViewManager"),
61+
Metrics = require("utils/Metrics");
6162

6263
const CODE_INSPECTION_GUTTER_PRIORITY = 500,
6364
CODE_INSPECTION_GUTTER = "code-inspection-gutter";
@@ -549,6 +550,7 @@ define(function (require, exports, module) {
549550
<br/>
550551
</div>`);
551552
$problemView.find(".fix-problem-btn").click(()=>{
553+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "fixClick", "quickView");
552554
scrollToProblem(pos.line);
553555
_fixProblem(fixID);
554556
});
@@ -580,6 +582,7 @@ define(function (require, exports, module) {
580582
}
581583
}
582584
if(quickViewPresent){
585+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "quickView", "shown");
583586
resolve({
584587
start: startPos,
585588
end: endPos,
@@ -1090,8 +1093,10 @@ define(function (require, exports, module) {
10901093
const editor = EditorManager.getCurrentFullEditor();
10911094
const maxOffset = editor.document.getText().length;
10921095
if(!editor || !fixDetails || editor.document.lastChangeTimestamp !== lastDocumentScanTimeStamp) {
1096+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "fixFail", "dialogShown");
10931097
Dialogs.showErrorDialog(Strings.CANNOT_FIX_TITLE, Strings.CANNOT_FIX_MESSAGE);
10941098
} else if(_isInvalidFix(fixDetails, maxOffset)){
1099+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "fixFail", "invalid");
10951100
console.error("Invalid fix:", fixDetails); // this should never happen as we filter the fix while inserting
10961101
} else {
10971102
const from = editor.posFromIndex(fixDetails.rangeOffset.start),
@@ -1139,7 +1144,10 @@ define(function (require, exports, module) {
11391144
problemsPanel = WorkspaceManager.createBottomPanel("errors", $(panelHtml), 100);
11401145
$problemsPanel = $("#problems-panel");
11411146
$fixAllBtn = $problemsPanel.find(".problems-fix-all-btn");
1142-
$fixAllBtn.click(_fixAllProblems);
1147+
$fixAllBtn.click(()=>{
1148+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "fixAllClick", "panel");
1149+
_fixAllProblems();
1150+
});
11431151

11441152
function checkSelectionInsideElement(range, element) {
11451153
if(!range || range.endOffset === range.startOffset) {
@@ -1169,6 +1177,7 @@ define(function (require, exports, module) {
11691177
}
11701178
if ($(e.target).hasClass('ph-fix-problem')) {
11711179
// Retrieve the message from the data attribute of the clicked element
1180+
Metrics.countEvent(Metrics.EVENT_TYPE.LINT, "fixClick", "panel");
11721181
_fixProblem("" + $(e.target).data("fixid"));
11731182
e.preventDefault();
11741183
e.stopPropagation();

src/utils/Metrics.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ define(function (require, exports, module) {
113113
NEW_PROJECT: "new-project",
114114
ERROR: "error",
115115
USER: "user",
116-
NODEJS: "node"
116+
NODEJS: "node",
117+
LINT: "lint"
117118
};
118119

119120
/**
@@ -385,6 +386,16 @@ define(function (require, exports, module) {
385386
}
386387
}
387388

389+
/**
390+
* Logs the performance time taken for a specific action.
391+
*
392+
* @param {string} action - The key representing the action being measured (e.g., 'startupTime').
393+
* @param {number} durationMs - The duration of the action in milliseconds.
394+
*/
395+
function logPerformanceTime(action, durationMs) {
396+
valueEvent(EVENT_TYPE.PERFORMANCE, "ms", action, Number(durationMs));
397+
}
398+
388399
// Define public API
389400
exports.init = init;
390401
exports.setDisabled = setDisabled;
@@ -393,6 +404,7 @@ define(function (require, exports, module) {
393404
exports.clearAuditData = clearAuditData;
394405
exports.countEvent = countEvent;
395406
exports.valueEvent = valueEvent;
407+
exports.logPerformanceTime = logPerformanceTime;
396408
exports.flushMetrics = flushMetrics;
397409
exports.EVENT_TYPE = EVENT_TYPE;
398410
exports.AUDIT_TYPE_COUNT = AUDIT_TYPE_COUNT;

0 commit comments

Comments
 (0)