diff --git a/lib/DBSQLClient.ts b/lib/DBSQLClient.ts index 0d2dc479..5dcf8a48 100644 --- a/lib/DBSQLClient.ts +++ b/lib/DBSQLClient.ts @@ -90,6 +90,7 @@ export default class DBSQLClient extends EventEmitter implements IDBSQLClient, I useCloudFetch: true, // enabling cloud fetch by default. cloudFetchConcurrentDownloads: 10, + cloudFetchSpeedThresholdMBps: 0.1, useLZ4Compression: true, }; diff --git a/lib/contracts/IClientContext.ts b/lib/contracts/IClientContext.ts index 6a70878d..cc13d326 100644 --- a/lib/contracts/IClientContext.ts +++ b/lib/contracts/IClientContext.ts @@ -18,6 +18,7 @@ export interface ClientConfig { useCloudFetch: boolean; cloudFetchConcurrentDownloads: number; + cloudFetchSpeedThresholdMBps: number; useLZ4Compression: boolean; } diff --git a/lib/result/CloudFetchResultHandler.ts b/lib/result/CloudFetchResultHandler.ts index 5fcbe72d..63e62ae5 100644 --- a/lib/result/CloudFetchResultHandler.ts +++ b/lib/result/CloudFetchResultHandler.ts @@ -5,6 +5,7 @@ import IClientContext from '../contracts/IClientContext'; import IResultsProvider, { ResultsProviderFetchNextOptions } from './IResultsProvider'; import { ArrowBatch } from './utils'; import { LZ4 } from '../utils'; +import { LogLevel } from '../contracts/IDBSQLLogger'; export default class CloudFetchResultHandler implements IResultsProvider { private readonly context: IClientContext; @@ -68,17 +69,43 @@ export default class CloudFetchResultHandler implements IResultsProvider { if (Date.now() >= link.expiryTime.toNumber()) { throw new Error('CloudFetch link has expired'); } + const startTime = Date.now(); const response = await this.fetch(link.fileLink, { headers: link.httpHeaders }); if (!response.ok) { throw new Error(`CloudFetch HTTP error ${response.status} ${response.statusText}`); } const result = await response.arrayBuffer(); + const downloadTimeMs = Date.now() - startTime; + + this.logDownloadMetrics(link.fileLink, result.byteLength, downloadTimeMs); + return { batches: [Buffer.from(result)], rowCount: link.rowCount.toNumber(true),