提交 d166de9a 编写于 作者: J Johannes Rieken

log/telemetry for completion durations, https://github.com/microsoft/vscode/issues/109167

上级 96d61842
......@@ -166,7 +166,7 @@ export function setSnippetSuggestSupport(support: modes.CompletionItemProvider):
}
export interface CompletionDurationEntry {
readonly provider: modes.CompletionItemProvider;
readonly providerName: string;
readonly elapsedProvider: number;
readonly elapsedOverall: number;
}
......@@ -228,7 +228,9 @@ export async function provideSuggestionItems(
if (isDisposable(container)) {
disposables.add(container);
}
durations.push({ provider, elapsedProvider: container.duration ?? -1, elapsedOverall: sw.elapsed() });
durations.push({
providerName: provider._debugDisplayName ?? 'unkown_provider', elapsedProvider: container.duration ?? -1, elapsedOverall: sw.elapsed()
});
};
// ask for snippets in parallel to asking "real" providers. Only do something if configured to
......
......@@ -30,7 +30,6 @@ import { State, SuggestModel } from './suggestModel';
import { ISelectedSuggestion, SuggestWidget } from './suggestWidget';
import { WordContextKey } from 'vs/editor/contrib/suggest/wordContextKey';
import { Event } from 'vs/base/common/event';
import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService';
import { IdleValue } from 'vs/base/common/async';
import { isObject, assertType } from 'vs/base/common/types';
import { CommitCharacterController } from './suggestCommitCharacters';
......@@ -43,7 +42,6 @@ import { MenuRegistry } from 'vs/platform/actions/common/actions';
import { CancellationTokenSource } from 'vs/base/common/cancellation';
import { ILogService } from 'vs/platform/log/common/log';
import { StopWatch } from 'vs/base/common/stopwatch';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
// sticky suggest widget which doesn't disappear on focus out and such
let _sticky = false;
......@@ -117,16 +115,14 @@ export class SuggestController implements IEditorContribution {
constructor(
editor: ICodeEditor,
@IEditorWorkerService editorWorker: IEditorWorkerService,
@ISuggestMemoryService private readonly _memoryService: ISuggestMemoryService,
@ICommandService private readonly _commandService: ICommandService,
@IContextKeyService private readonly _contextKeyService: IContextKeyService,
@IInstantiationService private readonly _instantiationService: IInstantiationService,
@ILogService private readonly _logService: ILogService,
@IClipboardService clipboardService: IClipboardService,
) {
this.editor = editor;
this.model = new SuggestModel(this.editor, editorWorker, clipboardService);
this.model = _instantiationService.createInstance(SuggestModel, this.editor,);
this.widget = this._toDispose.add(new IdleValue(() => {
......
......@@ -14,7 +14,7 @@ import { Selection } from 'vs/editor/common/core/selection';
import { ITextModel, IWordAtPosition } from 'vs/editor/common/model';
import { CompletionItemProvider, StandardTokenType, CompletionContext, CompletionProviderRegistry, CompletionTriggerKind, CompletionItemKind } from 'vs/editor/common/modes';
import { CompletionModel } from './completionModel';
import { CompletionItem, getSuggestionComparator, provideSuggestionItems, getSnippetSuggestSupport, SnippetSortOrder, CompletionOptions } from './suggest';
import { CompletionItem, getSuggestionComparator, provideSuggestionItems, getSnippetSuggestSupport, SnippetSortOrder, CompletionOptions, CompletionDurations } from './suggest';
import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2';
import { CancellationTokenSource } from 'vs/base/common/cancellation';
import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService';
......@@ -22,6 +22,9 @@ import { WordDistance } from 'vs/editor/contrib/suggest/wordDistance';
import { EditorOption } from 'vs/editor/common/config/editorOptions';
import { isLowSurrogate, isHighSurrogate } from 'vs/base/common/strings';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { generateUuid } from 'vs/base/common/uuid';
import { ILogService } from 'vs/platform/log/common/log';
export interface ICancelEvent {
readonly retrigger: boolean;
......@@ -117,8 +120,10 @@ export class SuggestModel implements IDisposable {
constructor(
private readonly _editor: ICodeEditor,
private readonly _editorWorkerService: IEditorWorkerService,
private readonly _clipboardService: IClipboardService
@IEditorWorkerService private readonly _editorWorkerService: IEditorWorkerService,
@IClipboardService private readonly _clipboardService: IClipboardService,
@ITelemetryService private readonly _telemetryService: ITelemetryService,
@ILogService private readonly _logService: ILogService,
) {
this._currentSelection = this._editor.getSelection() || new Selection(1, 1, 1, 1);
......@@ -249,10 +254,8 @@ export class SuggestModel implements IDisposable {
cancel(retrigger: boolean = false): void {
if (this._state !== State.Idle) {
this._triggerQuickSuggest.cancel();
if (this._requestToken) {
this._requestToken.cancel();
this._requestToken?.cancel();
this._requestToken = undefined;
}
this._state = State.Idle;
this._completionModel = undefined;
this._context = undefined;
......@@ -421,10 +424,10 @@ export class SuggestModel implements IDisposable {
break;
}
let itemKindFilter = SuggestModel._createItemKindFilter(this._editor);
let wordDistance = WordDistance.create(this._editorWorkerService, this._editor);
const itemKindFilter = SuggestModel._createItemKindFilter(this._editor);
const wordDistance = WordDistance.create(this._editorWorkerService, this._editor);
let completions = provideSuggestionItems(
const completions = provideSuggestionItems(
model,
this._editor.getPosition(),
new CompletionOptions(snippetSortOrder, itemKindFilter, onlyFrom),
......@@ -473,9 +476,42 @@ export class SuggestModel implements IDisposable {
this._onNewContext(ctx);
// finally report telemetry about durations
this._reportDurationsTelemetry(completions.durations);
}).catch(onUnexpectedError);
}
private _reportDurationsTelemetry(durations: CompletionDurations): void {
type DurationEntry = {
session: string;
providerName: string;
elapsedProvider: number;
elapsedOverall: number;
};
type Durations = {
session: string;
elapsedAll: number;
};
type PerformanceAndHealth<T> = { [P in keyof T]: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' } };
type DurationEntryClassification = PerformanceAndHealth<DurationEntry>;
type DurationsClassification = PerformanceAndHealth<Durations>;
setTimeout(() => {
this._logService.trace('suggest.durations', durations);
const session = generateUuid();
this._telemetryService.publicLog2<Durations, DurationsClassification>('suggest.durations.all', { session, elapsedAll: durations.elapsed });
for (let item of durations.entries) {
this._telemetryService.publicLog2<DurationEntry, DurationEntryClassification>('suggest.durations.entry', { session, ...item });
}
});
}
private static _createItemKindFilter(editor: ICodeEditor): Set<CompletionItemKind> {
// kind filter and snippet sort rules
const result = new Set<CompletionItemKind>();
......
......@@ -35,6 +35,7 @@ import { MockKeybindingService } from 'vs/platform/keybinding/test/common/mockKe
import { createTextModel } from 'vs/editor/test/common/editorTestUtils';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { mock } from 'vs/base/test/common/mock';
import { NullLogService } from 'vs/platform/log/common/log';
function createMockEditor(model: TextModel): ITestCodeEditor {
......@@ -201,7 +202,9 @@ suite('SuggestModel - TriggerAndCancelOracle', function () {
readText() {
return Promise.resolve('CLIPPY');
}
}
},
NullTelemetryService,
new NullLogService()
);
disposables.push(oracle, editor);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册