提交 6961b52e 编写于 作者: B Benjamin Pasero 提交者: GitHub

Merge pull request #9245 from chrmarti/chrmarti/filesearch

Collect telemetry for #55
......@@ -24,6 +24,7 @@ import * as openSymbolHandler from 'vs/workbench/parts/search/browser/openSymbol
/* tslint:enable:no-unused-variable */
import {IMessageService, Severity} from 'vs/platform/message/common/message';
import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation';
import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry';
import {IWorkspaceContextService} from 'vs/workbench/services/workspace/common/contextService';
import {IConfigurationService} from 'vs/platform/configuration/common/configuration';
......@@ -32,6 +33,22 @@ interface ISearchWithRange {
range: IRange;
}
interface ITimerEventData {
fromCache: boolean;
searchLength: number;
unsortedResultDuration: number;
sortedResultDuration: number;
numberOfResultEntries: number;
}
interface ITelemetryData {
fromCache: boolean;
searchLength: number;
unsortedResultTime: number;
sortedResultTime: number;
numberOfResultEntries: number;
}
// OpenSymbolHandler is used from an extension and must be in the main bundle file so it can load
export import OpenSymbolHandler = openSymbolHandler.OpenSymbolHandler;
......@@ -56,7 +73,8 @@ export class OpenAnythingHandler extends QuickOpenHandler {
@IMessageService private messageService: IMessageService,
@IWorkspaceContextService private contextService: IWorkspaceContextService,
@IInstantiationService instantiationService: IInstantiationService,
@IConfigurationService private configurationService: IConfigurationService
@IConfigurationService private configurationService: IConfigurationService,
@ITelemetryService private telemetryService: ITelemetryService
) {
super();
......@@ -76,6 +94,8 @@ export class OpenAnythingHandler extends QuickOpenHandler {
}
public getResults(searchValue: string): TPromise<QuickOpenModel> {
const timerEvent = this.telemetryService.timedPublicLog('openAnything');
const startTime = timerEvent.startTime ? timerEvent.startTime.getTime() : Date.now(); // startTime is undefined when telemetry is disabled
searchValue = searchValue.replace(/ /g, ''); // get rid of all whitespace
// Help Windows users to search for paths when using slash
......@@ -103,7 +123,10 @@ export class OpenAnythingHandler extends QuickOpenHandler {
// Check Cache first
let cachedResults = this.getResultsFromCache(searchValue, searchWithRange ? searchWithRange.range : null);
if (cachedResults) {
return TPromise.as(new QuickOpenModel(cachedResults));
const [viewResults, telemetry] = cachedResults;
timerEvent.data = this.createTimerEventData(startTime, telemetry);
timerEvent.stop();
return TPromise.as(new QuickOpenModel(viewResults));
}
// The throttler needs a factory for its promises
......@@ -148,6 +171,7 @@ export class OpenAnythingHandler extends QuickOpenHandler {
// Join and sort unified
this.pendingSearch = TPromise.join(resultPromises).then((results: QuickOpenModel[]) => {
const unsortedResultTime = Date.now();
this.pendingSearch = null;
// If the quick open widget has been closed meanwhile, ignore the result
......@@ -161,6 +185,7 @@ export class OpenAnythingHandler extends QuickOpenHandler {
// Sort
const normalizedSearchValue = strings.stripWildcards(searchValue).toLowerCase();
result.sort((elementA, elementB) => QuickOpenEntry.compareByScore(elementA, elementB, searchValue, normalizedSearchValue, this.scorerCache));
const sortedResultTime = Date.now();
// Apply Range
result.forEach((element) => {
......@@ -183,6 +208,14 @@ export class OpenAnythingHandler extends QuickOpenHandler {
}
});
timerEvent.data = this.createTimerEventData(startTime, {
fromCache: false,
searchLength: searchValue.length,
unsortedResultTime,
sortedResultTime,
numberOfResultEntries: result.length
});
timerEvent.stop();
return TPromise.as<QuickOpenModel>(new QuickOpenModel(viewResults));
}, (error: Error) => {
this.pendingSearch = null;
......@@ -244,7 +277,7 @@ export class OpenAnythingHandler extends QuickOpenHandler {
return null;
}
public getResultsFromCache(searchValue: string, range: IRange = null): QuickOpenEntry[] {
private getResultsFromCache(searchValue: string, range: IRange = null): [QuickOpenEntry[], ITelemetryData] {
if (paths.isAbsolute(searchValue)) {
return null; // bypass cache if user looks up an absolute path where matching goes directly on disk
}
......@@ -288,9 +321,11 @@ export class OpenAnythingHandler extends QuickOpenHandler {
results.push(entry);
}
const unsortedResultTime = Date.now();
// Sort
results.sort((elementA, elementB) => QuickOpenEntry.compareByScore(elementA, elementB, searchValue, normalizedSearchValueLowercase, this.scorerCache));
const sortedResultTime = Date.now();
// Apply Range
results.forEach((element) => {
......@@ -308,7 +343,13 @@ export class OpenAnythingHandler extends QuickOpenHandler {
entry.setHighlights(labelHighlights, descriptionHighlights);
});
return viewResults;
return [viewResults, {
fromCache: true,
searchLength: searchValue.length,
unsortedResultTime,
sortedResultTime,
numberOfResultEntries: results.length
}];
}
public getGroupLabel(): string {
......@@ -342,4 +383,14 @@ export class OpenAnythingHandler extends QuickOpenHandler {
this.pendingSearch = null;
}
}
private createTimerEventData(startTime: number, telemetry: ITelemetryData): ITimerEventData {
return {
fromCache: telemetry.fromCache,
searchLength: telemetry.searchLength,
unsortedResultDuration: telemetry.unsortedResultTime - startTime,
sortedResultDuration: telemetry.sortedResultTime - startTime,
numberOfResultEntries: telemetry.numberOfResultEntries
};
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册