Merge pull request #9245 from chrmarti/chrmarti/filesearch
Collect telemetry for #55
This commit is contained in:
commit
6961b52e71
1 changed files with 55 additions and 4 deletions
|
@ -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
|
||||
};
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue