Skip to content

Commit bb01d02

Browse files
authored
perf: throttling telemetry event in context provider (#936)
* perf: throttling telemetry event * fix: update * fix: update * fix: update * fix: remove senderror * perf: remove useless code * perf: remove useless code * perf: remove useless code
1 parent 8c231a2 commit bb01d02

File tree

3 files changed

+183
-162
lines changed

3 files changed

+183
-162
lines changed

src/copilot/contextProvider.ts

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import {
1818
ContextResolverFunction,
1919
CopilotApi,
2020
ContextProviderRegistrationError,
21-
ContextProviderResolverError
21+
ContextProviderResolverError,
22+
sendContextResolutionTelemetry
2223
} from './utils';
2324

2425
export async function registerCopilotContextProviders(
@@ -70,70 +71,95 @@ function createJavaContextResolver(): ContextResolverFunction {
7071
};
7172
}
7273

73-
/**
74-
* Send telemetry data for Java context resolution
75-
*/
76-
function sendContextTelemetry(request: ResolveRequest, start: number, items: SupportedContextItem[], status: string, error?: string) {
77-
const duration = Math.round(performance.now() - start);
78-
const tokenCount = JavaContextProviderUtils.calculateTokenCount(items);
79-
const telemetryData: any = {
80-
"action": "resolveJavaContext",
81-
"completionId": request.completionId,
82-
"duration": duration,
83-
"itemCount": items.length,
84-
"tokenCount": tokenCount,
85-
"status": status
86-
};
87-
if (error) {
88-
telemetryData.error = error;
89-
}
90-
sendInfo("", telemetryData);
91-
}
92-
9374
async function resolveJavaContext(request: ResolveRequest, copilotCancel: vscode.CancellationToken): Promise<SupportedContextItem[]> {
9475
const items: SupportedContextItem[] = [];
9576
const start = performance.now();
77+
78+
let dependenciesResult: CopilotHelper.IResolveResult | undefined;
79+
let importsResult: CopilotHelper.IResolveResult | undefined;
80+
9681
try {
9782
// Check for cancellation before starting
9883
JavaContextProviderUtils.checkCancellation(copilotCancel);
84+
9985
// Resolve project dependencies and convert to context items
100-
const projectDependencyItems = await CopilotHelper.resolveAndConvertProjectDependencies(
86+
dependenciesResult = await CopilotHelper.resolveAndConvertProjectDependencies(
10187
vscode.window.activeTextEditor,
10288
copilotCancel,
10389
JavaContextProviderUtils.checkCancellation
10490
);
10591
JavaContextProviderUtils.checkCancellation(copilotCancel);
106-
items.push(...projectDependencyItems);
92+
items.push(...dependenciesResult.items);
10793

10894
JavaContextProviderUtils.checkCancellation(copilotCancel);
10995

11096
// Resolve local imports and convert to context items
111-
const localImportItems = await CopilotHelper.resolveAndConvertLocalImports(
97+
importsResult = await CopilotHelper.resolveAndConvertLocalImports(
11298
vscode.window.activeTextEditor,
11399
copilotCancel,
114100
JavaContextProviderUtils.checkCancellation
115101
);
116102
JavaContextProviderUtils.checkCancellation(copilotCancel);
117-
items.push(...localImportItems);
103+
items.push(...importsResult.items);
118104
} catch (error: any) {
119105
if (error instanceof CopilotCancellationError) {
120-
sendContextTelemetry(request, start, items, "cancelled_by_copilot");
106+
sendContextResolutionTelemetry(
107+
request,
108+
start,
109+
items,
110+
"cancelled_by_copilot",
111+
undefined,
112+
dependenciesResult?.emptyReason,
113+
importsResult?.emptyReason,
114+
dependenciesResult?.itemCount,
115+
importsResult?.itemCount
116+
);
121117
throw error;
122118
}
123119
if (error instanceof vscode.CancellationError || error.message === CancellationError.CANCELED) {
124-
sendContextTelemetry(request, start, items, "cancelled_internally");
120+
sendContextResolutionTelemetry(
121+
request,
122+
start,
123+
items,
124+
"cancelled_internally",
125+
undefined,
126+
dependenciesResult?.emptyReason,
127+
importsResult?.emptyReason,
128+
dependenciesResult?.itemCount,
129+
importsResult?.itemCount
130+
);
125131
throw new InternalCancellationError();
126132
}
127133

128134
// Send telemetry for general errors (but continue with partial results)
129-
sendContextTelemetry(request, start, items, "error_partial_results", error.message || "unknown_error");
135+
sendContextResolutionTelemetry(
136+
request,
137+
start,
138+
items,
139+
"error_partial_results",
140+
error.message || "unknown_error",
141+
dependenciesResult?.emptyReason,
142+
importsResult?.emptyReason,
143+
dependenciesResult?.itemCount,
144+
importsResult?.itemCount
145+
);
130146

131147
// Return partial results and log completion for error case
132148
return items;
133149
}
134150

135151
// Send telemetry data once at the end for success case
136-
sendContextTelemetry(request, start, items, "succeeded");
152+
sendContextResolutionTelemetry(
153+
request,
154+
start,
155+
items,
156+
"succeeded",
157+
undefined,
158+
dependenciesResult?.emptyReason,
159+
importsResult?.emptyReason,
160+
dependenciesResult?.itemCount,
161+
importsResult?.itemCount
162+
);
137163

138164
return items;
139165
}

0 commit comments

Comments
 (0)