mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-20 22:51:17 -05:00
Add telemetry for open JS files (#23833)
* Add telemetry for open JS files * Send event every time * Keep stats even for closed files * Remove tsCheckCountForOpenFilesTelemetry * Use 'info.path' * Update API
This commit is contained in:
@@ -6,6 +6,7 @@ namespace ts.server {
|
||||
export const ConfigFileDiagEvent = "configFileDiag";
|
||||
export const ProjectLanguageServiceStateEvent = "projectLanguageServiceState";
|
||||
export const ProjectInfoTelemetryEvent = "projectInfo";
|
||||
export const OpenFileInfoTelemetryEvent = "openFileInfo";
|
||||
// tslint:enable variable-name
|
||||
|
||||
export interface ProjectsUpdatedInBackgroundEvent {
|
||||
@@ -55,6 +56,20 @@ namespace ts.server {
|
||||
readonly version: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Info that we may send about a file that was just opened.
|
||||
* Info about a file will only be sent once per session, even if the file changes in ways that might affect the info.
|
||||
* Currently this is only sent for '.js' files.
|
||||
*/
|
||||
export interface OpenFileInfoTelemetryEvent {
|
||||
readonly eventName: typeof OpenFileInfoTelemetryEvent;
|
||||
readonly data: OpenFileInfoTelemetryEventData;
|
||||
}
|
||||
|
||||
export interface OpenFileInfoTelemetryEventData {
|
||||
readonly info: OpenFileInfo;
|
||||
}
|
||||
|
||||
export interface ProjectInfoTypeAcquisitionData {
|
||||
readonly enable: boolean;
|
||||
// Actual values of include/exclude entries are scrubbed.
|
||||
@@ -70,7 +85,11 @@ namespace ts.server {
|
||||
readonly dts: number;
|
||||
}
|
||||
|
||||
export type ProjectServiceEvent = ProjectsUpdatedInBackgroundEvent | ConfigFileDiagEvent | ProjectLanguageServiceStateEvent | ProjectInfoTelemetryEvent;
|
||||
export interface OpenFileInfo {
|
||||
readonly checkJs: boolean;
|
||||
}
|
||||
|
||||
export type ProjectServiceEvent = ProjectsUpdatedInBackgroundEvent | ConfigFileDiagEvent | ProjectLanguageServiceStateEvent | ProjectInfoTelemetryEvent | OpenFileInfoTelemetryEvent;
|
||||
|
||||
export type ProjectServiceEventHandler = (event: ProjectServiceEvent) => void;
|
||||
|
||||
@@ -325,6 +344,9 @@ namespace ts.server {
|
||||
* Container of all known scripts
|
||||
*/
|
||||
private readonly filenameToScriptInfo = createMap<ScriptInfo>();
|
||||
// Set of all '.js' files ever opened.
|
||||
private readonly allJsFilesForOpenFileTelemetry = createMap<true>();
|
||||
|
||||
/**
|
||||
* Map to the real path of the infos
|
||||
*/
|
||||
@@ -2095,9 +2117,19 @@ namespace ts.server {
|
||||
|
||||
this.printProjects();
|
||||
|
||||
this.telemetryOnOpenFile(info);
|
||||
return { configFileName, configFileErrors };
|
||||
}
|
||||
|
||||
private telemetryOnOpenFile(scriptInfo: ScriptInfo): void {
|
||||
if (!this.eventHandler || !scriptInfo.isJavaScript() || !addToSeen(this.allJsFilesForOpenFileTelemetry, scriptInfo.path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const info: OpenFileInfo = { checkJs: !!scriptInfo.getDefaultProject().getSourceFile(scriptInfo.path).checkJsDirective };
|
||||
this.eventHandler({ eventName: OpenFileInfoTelemetryEvent, data: { info } });
|
||||
}
|
||||
|
||||
/**
|
||||
* Close file whose contents is managed by the client
|
||||
* @param filename is absolute pathname
|
||||
|
||||
@@ -6,9 +6,12 @@ namespace ts.server {
|
||||
External
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
export type Mutable<T> = { -readonly [K in keyof T]: T[K]; };
|
||||
|
||||
/* @internal */
|
||||
export function countEachFileTypes(infos: ScriptInfo[]): FileStats {
|
||||
const result = { js: 0, jsx: 0, ts: 0, tsx: 0, dts: 0 };
|
||||
const result: Mutable<FileStats> = { js: 0, jsx: 0, ts: 0, tsx: 0, dts: 0 };
|
||||
for (const info of infos) {
|
||||
switch (info.scriptKind) {
|
||||
case ScriptKind.JS:
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace ts.server {
|
||||
enqueueInstallTypingsRequest(p: Project, typeAcquisition: TypeAcquisition, unresolvedImports: SortedReadonlyArray<string>): void;
|
||||
attach(projectService: ProjectService): void;
|
||||
onProjectClosed(p: Project): void;
|
||||
readonly globalTypingsCacheLocation: string;
|
||||
readonly globalTypingsCacheLocation: string | undefined;
|
||||
}
|
||||
|
||||
export const nullTypingsInstaller: ITypingsInstaller = {
|
||||
|
||||
Reference in New Issue
Block a user