@@ -8,6 +8,7 @@ import * as l10n from '@vscode/l10n';
88import crypto from 'crypto' ;
99import { CancellationToken } from 'vscode-languageserver-protocol' ;
1010import { Result } from '../../../../util/common/result' ;
11+ import { CallTracker } from '../../../../util/common/telemetryCorrelationId' ;
1112import { raceCancellationError } from '../../../../util/vs/base/common/async' ;
1213import { encodeBase64 , VSBuffer } from '../../../../util/vs/base/common/buffer' ;
1314import { CancellationError } from '../../../../util/vs/base/common/errors' ;
@@ -40,14 +41,15 @@ export interface IExternalIngestClient {
4041 filesetName : string ,
4142 currentCheckpoint : string | undefined ,
4243 allFiles : AsyncIterable < ExternalIngestFile > ,
44+ callTracker : CallTracker ,
4345 token : CancellationToken ,
4446 onProgress ?: ( message : string ) => void
4547 ) : Promise < Result < { checkpoint : string } , Error > > ;
4648
47- listFilesets ( token : CancellationToken ) : Promise < string [ ] > ;
48- deleteFileset ( filesetName : string , token : CancellationToken ) : Promise < void > ;
49+ listFilesets ( callTracker : CallTracker , token : CancellationToken ) : Promise < string [ ] > ;
50+ deleteFileset ( filesetName : string , callTracker : CallTracker , token : CancellationToken ) : Promise < void > ;
4951
50- searchFilesets ( filesetName : string , rootUri : URI , prompt : string , limit : number , token : CancellationToken ) : Promise < CodeSearchResult > ;
52+ searchFilesets ( filesetName : string , rootUri : URI , prompt : string , limit : number , callTracker : CallTracker , token : CancellationToken ) : Promise < CodeSearchResult > ;
5153
5254 /**
5355 * Quickly checks if a file can be ingested based on its path and size.
@@ -106,10 +108,10 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
106108 return headers ;
107109 }
108110
109- private async post ( authToken : string , path : string , body : unknown , options : { retries ?: number } , token : CancellationToken ) : Promise < Response > {
111+ private async post ( authToken : string , path : string , body : unknown , options : { retries ?: number } , callTracker : CallTracker , token : CancellationToken ) : Promise < Response > {
110112 const retries = options . retries ?? 0 ;
111113 const url = `${ ExternalIngestClient . baseUrl } ${ path } ` ;
112- const response = await this . apiClient . makeRequest ( url , this . getHeaders ( authToken ) , 'POST' , body , token ) ;
114+ const response = await this . apiClient . makeRequest ( url , this . getHeaders ( authToken ) , 'POST' , body , callTracker , token ) ;
113115
114116 // Retry on 500 errors as these are often transient
115117 const shouldRetry = response . status . toString ( ) . startsWith ( '5' ) && retries > 0 ;
@@ -127,7 +129,7 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
127129
128130 if ( shouldRetry ) {
129131 this . logService . warn ( `ExternalIngestClient::post(${ path } ): Got ${ response . status } , retrying... (${ retries } retries remaining)` ) ;
130- return this . post ( authToken , path , body , { retries : retries - 1 } , token ) ;
132+ return this . post ( authToken , path , body , { retries : retries - 1 } , callTracker , token ) ;
131133 }
132134
133135 if ( ! response . ok ) {
@@ -138,7 +140,8 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
138140 return response ;
139141 }
140142
141- async updateIndex ( filesetName : string , currentCheckpoint : string | undefined , allFiles : AsyncIterable < ExternalIngestFile > , token : CancellationToken , onProgress ?: ( message : string ) => void ) : Promise < Result < { checkpoint : string } , Error > > {
143+ async updateIndex ( filesetName : string , currentCheckpoint : string | undefined , allFiles : AsyncIterable < ExternalIngestFile > , inCallTracker : CallTracker , token : CancellationToken , onProgress ?: ( message : string ) => void ) : Promise < Result < { checkpoint : string } , Error > > {
144+ const callTracker = inCallTracker . add ( 'ExternalIngestClient::updateIndex' ) ;
142145 const authToken = await raceCancellationError ( this . getAuthToken ( ) , token ) ;
143146 if ( ! authToken ) {
144147 this . logService . warn ( 'ExternalIngestClient::updateIndex(): No auth token available' ) ;
@@ -196,7 +199,7 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
196199 new_checkpoint : newCheckpoint ,
197200 geo_filter : Buffer . from ( geoFilter . toBytes ( ) ) . toString ( 'base64' ) ,
198201 coded_symbols : codedSymbols ,
199- } , { } , token ) ;
202+ } , { } , callTracker , token ) ;
200203 } ;
201204
202205 let createIngestResponse : Response ;
@@ -211,7 +214,7 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
211214 this . logService . info ( 'ExternalIngestClient::updateIndex(): Got 429, cleaning up old filesets...' ) ;
212215 onProgress ?.( l10n . t ( "Too many filesets, cleaning up old ones..." ) ) ;
213216
214- await raceCancellationError ( this . cleanupOldFilesets ( authToken , filesetName , token ) , token ) ;
217+ await raceCancellationError ( this . cleanupOldFilesets ( authToken , filesetName , callTracker , token ) , token ) ;
215218
216219 // Retry the create ingest
217220 this . logService . info ( 'ExternalIngestClient::updateIndex(): Retrying create ingest after cleanup...' ) ;
@@ -281,6 +284,7 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
281284 coded_symbol_range : codedSymbolRange ,
282285 } ,
283286 { } ,
287+ callTracker ,
284288 token
285289 ) ;
286290 const body = await raceCancellationError ( pushCodedSymbolsResponse . json ( ) , token ) as { next_coded_symbol_range ?: CodedSymbolRange } ;
@@ -320,7 +324,7 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
320324 const getBatchResponse = await this . post ( authToken , '/external/code/ingest/batch' , {
321325 ingest_id : ingestId ,
322326 page_token : pageToken ,
323- } , { } , token ) ;
327+ } , { } , callTracker , token ) ;
324328
325329 const { doc_ids : docIds , next_page_token : nextPageToken } =
326330 await raceCancellationError ( getBatchResponse . json ( ) , token ) as { doc_ids : string [ ] | undefined ; next_page_token : string | undefined } ;
@@ -358,7 +362,7 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
358362 content,
359363 file_path : fileEntry . relativePath ,
360364 doc_id : requestedDocSha ,
361- } , { retries : 3 } , token ) ;
365+ } , { retries : 3 } , callTracker , token ) ;
362366 if ( ! res . ok ) {
363367 const requestId = res . headers . get ( githubHeaders . requestId ) ;
364368 const responseBody = await res . text ( ) ;
@@ -403,7 +407,7 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
403407 onProgress ?.( l10n . t ( 'Finalizing index...' ) ) ;
404408 const resp = await this . post ( authToken , '/external/code/ingest/finalize' , {
405409 ingest_id : ingestId ,
406- } , { } , token ) ;
410+ } , { } , callTracker , token ) ;
407411
408412 this . logService . info ( 'ExternalIngestClient::updateIndex(): Successfully finalized ingest.' ) ;
409413 const requestId = resp . headers . get ( 'x-github-request-id' ) ;
@@ -413,23 +417,24 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
413417 return Result . ok ( { checkpoint : newCheckpoint } ) ;
414418 }
415419
416- async listFilesets ( token : CancellationToken ) : Promise < string [ ] > {
420+ async listFilesets ( callTracker : CallTracker , token : CancellationToken ) : Promise < string [ ] > {
417421 const authToken = await this . getAuthToken ( ) ;
418422 if ( ! authToken ) {
419423 this . logService . warn ( 'ExternalIngestClient::listFilesets(): No auth token available' ) ;
420424 return [ ] ;
421425 }
422426
423- const filesets = await this . listFilesetsWithDetails ( authToken , token ) ;
427+ const filesets = await this . listFilesetsWithDetails ( authToken , callTracker . add ( 'ExternalIngestClient::listFilesets' ) , token ) ;
424428 return filesets . map ( x => x . name ) ;
425429 }
426430
427- private async listFilesetsWithDetails ( authToken : string , token : CancellationToken ) : Promise < Array < { name : string ; checkpoint : string ; status : string } > > {
431+ private async listFilesetsWithDetails ( authToken : string , callTracker : CallTracker , token : CancellationToken ) : Promise < Array < { name : string ; checkpoint : string ; status : string } > > {
428432 const resp = await this . apiClient . makeRequest (
429433 `${ ExternalIngestClient . baseUrl } /external/code/ingest` ,
430434 this . getHeaders ( authToken ) ,
431435 'GET' ,
432436 undefined ,
437+ callTracker . add ( 'ExternalIngestClient::listFilesetsWithDetails' ) ,
433438 token
434439 ) ;
435440
@@ -440,34 +445,36 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
440445 /**
441446 * Cleans up old filesets to make room for new ones.
442447 */
443- private async cleanupOldFilesets ( authToken : string , currentFilesetName : string , token : CancellationToken ) : Promise < void > {
444- const filesets = await this . listFilesetsWithDetails ( authToken , token ) ;
448+ private async cleanupOldFilesets ( authToken : string , currentFilesetName : string , inCallTracker : CallTracker , token : CancellationToken ) : Promise < void > {
449+ const callTracker = inCallTracker . add ( 'ExternalIngestClient::cleanupOldFilesets' ) ;
450+ const filesets = await this . listFilesetsWithDetails ( authToken , callTracker , token ) ;
445451
446452 const candidates = filesets . filter ( f => f . name !== currentFilesetName ) ;
447453 const toDelete = candidates . at ( - 1 ) ;
448454 if ( toDelete ) {
449- await this . deleteFilesetByName ( authToken , toDelete . name , token ) ;
455+ await this . deleteFilesetByName ( authToken , toDelete . name , callTracker , token ) ;
450456 }
451457 }
452458
453- async deleteFileset ( filesetName : string , token : CancellationToken ) : Promise < void > {
459+ async deleteFileset ( filesetName : string , callTracker : CallTracker , token : CancellationToken ) : Promise < void > {
454460 const authToken = await this . getAuthToken ( ) ;
455461 if ( ! authToken ) {
456462 this . logService . warn ( 'ExternalIngestClient::deleteFileset(): No auth token available' ) ;
457463 return ;
458464 }
459465
460- return this . deleteFilesetByName ( authToken , filesetName , token ) ;
466+ return this . deleteFilesetByName ( authToken , filesetName , callTracker . add ( 'ExternalIngestClient::deleteFileset' ) , token ) ;
461467 }
462468
463- async deleteFilesetByName ( authToken : string , fileSetName : string , token : CancellationToken ) : Promise < void > {
469+ async deleteFilesetByName ( authToken : string , fileSetName : string , callTracker : CallTracker , token : CancellationToken ) : Promise < void > {
464470 const resp = await this . apiClient . makeRequest (
465471 `${ ExternalIngestClient . baseUrl } /external/code/ingest` ,
466472 this . getHeaders ( authToken ) ,
467473 'DELETE' ,
468474 {
469475 fileset_name : fileSetName ,
470476 } ,
477+ callTracker . add ( 'ExternalIngestClient::deleteFilesetByName' ) ,
471478 token
472479 ) ;
473480 const requestId = resp . headers . get ( 'x-github-request-id' ) ;
@@ -476,7 +483,7 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
476483 this . logService . info ( `ExternalIngestClient::deleteFilesetByName(): Deleted: ${ fileSetName } ` ) ;
477484 }
478485
479- async searchFilesets ( filesetName : string , rootUri : URI , prompt : string , limit : number , token : CancellationToken ) : Promise < CodeSearchResult > {
486+ async searchFilesets ( filesetName : string , rootUri : URI , prompt : string , limit : number , callTracker : CallTracker , token : CancellationToken ) : Promise < CodeSearchResult > {
480487 const authToken = await this . getAuthToken ( ) ;
481488 if ( ! authToken ) {
482489 this . logService . warn ( 'ExternalIngestClient::searchFilesets(): No auth token available' ) ;
@@ -490,7 +497,7 @@ export class ExternalIngestClient extends Disposable implements IExternalIngestC
490497 scoping_query : `fileset:${ filesetName } ` ,
491498 embedding_model : embeddingType . id ,
492499 limit,
493- } , { } , token ) ;
500+ } , { } , callTracker . add ( 'ExternalIngestClient::searchFilesets' ) , token ) ;
494501
495502 const body = await resp . json ( ) as SearchFilesetsResponse ;
496503 return {
0 commit comments