@databricks/sql
Advanced tools
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| import IClientContext from '../contracts/IClientContext'; | ||
| export declare enum CircuitBreakerState { | ||
| CLOSED = "CLOSED", | ||
| OPEN = "OPEN", | ||
| HALF_OPEN = "HALF_OPEN" | ||
| } | ||
| export interface CircuitBreakerConfig { | ||
| failureThreshold: number; | ||
| timeout: number; | ||
| successThreshold: number; | ||
| } | ||
| export declare const DEFAULT_CIRCUIT_BREAKER_CONFIG: Readonly<CircuitBreakerConfig>; | ||
| export declare const CIRCUIT_BREAKER_OPEN_CODE: "CIRCUIT_BREAKER_OPEN"; | ||
| /** | ||
| * Thrown when execute() is called while the breaker is OPEN or a HALF_OPEN | ||
| * probe is already in flight. Callers identify the condition via | ||
| * `instanceof CircuitBreakerOpenError` or `err.code === CIRCUIT_BREAKER_OPEN_CODE` | ||
| * rather than string-matching the message. | ||
| */ | ||
| export declare class CircuitBreakerOpenError extends Error { | ||
| readonly code: "CIRCUIT_BREAKER_OPEN"; | ||
| constructor(message?: string); | ||
| } | ||
| export declare class CircuitBreaker { | ||
| private context; | ||
| private state; | ||
| private failureCount; | ||
| private successCount; | ||
| private nextAttempt?; | ||
| private halfOpenInflight; | ||
| private readonly config; | ||
| constructor(context: IClientContext, config?: Partial<CircuitBreakerConfig>); | ||
| execute<T>(operation: () => Promise<T>): Promise<T>; | ||
| /** | ||
| * Synchronous admission check. Returning `null` means "reject". Returning | ||
| * an object means the caller is admitted; `wasHalfOpenProbe` indicates | ||
| * whether this admission consumed the single HALF_OPEN probe slot so the | ||
| * caller can decrement it in `finally`. | ||
| * | ||
| * Running this as a single synchronous block is what prevents the | ||
| * concurrent-probe race that existed in the previous implementation. | ||
| */ | ||
| private tryAdmit; | ||
| getState(): CircuitBreakerState; | ||
| getFailureCount(): number; | ||
| getSuccessCount(): number; | ||
| private onSuccess; | ||
| private onFailure; | ||
| } | ||
| export declare class CircuitBreakerRegistry { | ||
| private context; | ||
| private breakers; | ||
| constructor(context: IClientContext); | ||
| getCircuitBreaker(host: string, config?: Partial<CircuitBreakerConfig>): CircuitBreaker; | ||
| getAllBreakers(): Map<string, CircuitBreaker>; | ||
| removeCircuitBreaker(host: string): void; | ||
| clear(): void; | ||
| } |
| "use strict"; | ||
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.CircuitBreakerRegistry = exports.CircuitBreaker = exports.CircuitBreakerOpenError = exports.CIRCUIT_BREAKER_OPEN_CODE = exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = exports.CircuitBreakerState = void 0; | ||
| const IDBSQLLogger_1 = require("../contracts/IDBSQLLogger"); | ||
| var CircuitBreakerState; | ||
| (function (CircuitBreakerState) { | ||
| CircuitBreakerState["CLOSED"] = "CLOSED"; | ||
| CircuitBreakerState["OPEN"] = "OPEN"; | ||
| CircuitBreakerState["HALF_OPEN"] = "HALF_OPEN"; | ||
| })(CircuitBreakerState = exports.CircuitBreakerState || (exports.CircuitBreakerState = {})); | ||
| exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = Object.freeze({ | ||
| failureThreshold: 5, | ||
| timeout: 60000, | ||
| successThreshold: 2, | ||
| }); | ||
| exports.CIRCUIT_BREAKER_OPEN_CODE = 'CIRCUIT_BREAKER_OPEN'; | ||
| /** | ||
| * Thrown when execute() is called while the breaker is OPEN or a HALF_OPEN | ||
| * probe is already in flight. Callers identify the condition via | ||
| * `instanceof CircuitBreakerOpenError` or `err.code === CIRCUIT_BREAKER_OPEN_CODE` | ||
| * rather than string-matching the message. | ||
| */ | ||
| class CircuitBreakerOpenError extends Error { | ||
| constructor(message = 'Circuit breaker OPEN') { | ||
| super(message); | ||
| this.code = exports.CIRCUIT_BREAKER_OPEN_CODE; | ||
| this.name = 'CircuitBreakerOpenError'; | ||
| } | ||
| } | ||
| exports.CircuitBreakerOpenError = CircuitBreakerOpenError; | ||
| class CircuitBreaker { | ||
| constructor(context, config) { | ||
| this.context = context; | ||
| this.state = CircuitBreakerState.CLOSED; | ||
| this.failureCount = 0; | ||
| this.successCount = 0; | ||
| this.halfOpenInflight = 0; | ||
| this.config = { | ||
| ...exports.DEFAULT_CIRCUIT_BREAKER_CONFIG, | ||
| ...config, | ||
| }; | ||
| } | ||
| async execute(operation) { | ||
| const admitted = this.tryAdmit(); | ||
| if (!admitted) { | ||
| throw new CircuitBreakerOpenError(); | ||
| } | ||
| const { wasHalfOpenProbe } = admitted; | ||
| try { | ||
| const result = await operation(); | ||
| this.onSuccess(); | ||
| return result; | ||
| } | ||
| catch (error) { | ||
| this.onFailure(); | ||
| throw error; | ||
| } | ||
| finally { | ||
| if (wasHalfOpenProbe && this.halfOpenInflight > 0) { | ||
| this.halfOpenInflight -= 1; | ||
| } | ||
| } | ||
| } | ||
| /** | ||
| * Synchronous admission check. Returning `null` means "reject". Returning | ||
| * an object means the caller is admitted; `wasHalfOpenProbe` indicates | ||
| * whether this admission consumed the single HALF_OPEN probe slot so the | ||
| * caller can decrement it in `finally`. | ||
| * | ||
| * Running this as a single synchronous block is what prevents the | ||
| * concurrent-probe race that existed in the previous implementation. | ||
| */ | ||
| tryAdmit() { | ||
| const logger = this.context.getLogger(); | ||
| if (this.state === CircuitBreakerState.OPEN) { | ||
| if (this.nextAttempt && Date.now() < this.nextAttempt.getTime()) { | ||
| return null; | ||
| } | ||
| this.state = CircuitBreakerState.HALF_OPEN; | ||
| this.successCount = 0; | ||
| this.halfOpenInflight = 0; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, 'Circuit breaker transitioned to HALF_OPEN'); | ||
| } | ||
| if (this.state === CircuitBreakerState.HALF_OPEN) { | ||
| if (this.halfOpenInflight > 0) { | ||
| return null; | ||
| } | ||
| this.halfOpenInflight += 1; | ||
| return { wasHalfOpenProbe: true }; | ||
| } | ||
| return { wasHalfOpenProbe: false }; | ||
| } | ||
| getState() { | ||
| return this.state; | ||
| } | ||
| getFailureCount() { | ||
| return this.failureCount; | ||
| } | ||
| getSuccessCount() { | ||
| return this.successCount; | ||
| } | ||
| onSuccess() { | ||
| const logger = this.context.getLogger(); | ||
| this.failureCount = 0; | ||
| if (this.state === CircuitBreakerState.HALF_OPEN) { | ||
| this.successCount += 1; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Circuit breaker success in HALF_OPEN (${this.successCount}/${this.config.successThreshold})`); | ||
| if (this.successCount >= this.config.successThreshold) { | ||
| this.state = CircuitBreakerState.CLOSED; | ||
| this.successCount = 0; | ||
| this.nextAttempt = undefined; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, 'Circuit breaker transitioned to CLOSED'); | ||
| } | ||
| } | ||
| } | ||
| onFailure() { | ||
| const logger = this.context.getLogger(); | ||
| this.failureCount += 1; | ||
| this.successCount = 0; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Circuit breaker failure (${this.failureCount}/${this.config.failureThreshold})`); | ||
| if (this.state === CircuitBreakerState.HALF_OPEN || this.failureCount >= this.config.failureThreshold) { | ||
| this.state = CircuitBreakerState.OPEN; | ||
| this.nextAttempt = new Date(Date.now() + this.config.timeout); | ||
| logger.log(IDBSQLLogger_1.LogLevel.warn, `Telemetry circuit breaker OPEN after ${this.failureCount} failures (will retry after ${this.config.timeout}ms)`); | ||
| } | ||
| } | ||
| } | ||
| exports.CircuitBreaker = CircuitBreaker; | ||
| class CircuitBreakerRegistry { | ||
| constructor(context) { | ||
| this.context = context; | ||
| this.breakers = new Map(); | ||
| } | ||
| getCircuitBreaker(host, config) { | ||
| let breaker = this.breakers.get(host); | ||
| if (!breaker) { | ||
| breaker = new CircuitBreaker(this.context, config); | ||
| this.breakers.set(host, breaker); | ||
| const logger = this.context.getLogger(); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Created circuit breaker for host: ${host}`); | ||
| } | ||
| else if (config) { | ||
| const logger = this.context.getLogger(); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Circuit breaker for host ${host} already exists; provided config will be ignored`); | ||
| } | ||
| return breaker; | ||
| } | ||
| getAllBreakers() { | ||
| return new Map(this.breakers); | ||
| } | ||
| removeCircuitBreaker(host) { | ||
| this.breakers.delete(host); | ||
| const logger = this.context.getLogger(); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Removed circuit breaker for host: ${host}`); | ||
| } | ||
| clear() { | ||
| this.breakers.clear(); | ||
| } | ||
| } | ||
| exports.CircuitBreakerRegistry = CircuitBreakerRegistry; | ||
| //# sourceMappingURL=CircuitBreaker.js.map |
| {"version":3,"file":"CircuitBreaker.js","sourceRoot":"","sources":["../../lib/telemetry/CircuitBreaker.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| import IClientContext from '../contracts/IClientContext'; | ||
| import IAuthentication from '../connection/contracts/IAuthentication'; | ||
| import HiveDriverError from '../errors/HiveDriverError'; | ||
| import { TelemetryMetric } from './types'; | ||
| import { CircuitBreakerRegistry } from './CircuitBreaker'; | ||
| /** | ||
| * Thrown for non-credential terminal telemetry failures (e.g. refusal to | ||
| * export to an invalid host). Separate from `AuthenticationError` so the | ||
| * classifier can keep the "short-circuit, don't retry, count as breaker | ||
| * failure" contract without muddying the auth taxonomy used by the rest of | ||
| * the driver. | ||
| */ | ||
| export declare class TelemetryTerminalError extends HiveDriverError { | ||
| readonly terminal: true; | ||
| } | ||
| /** | ||
| * Exports telemetry metrics to the Databricks telemetry service. | ||
| * | ||
| * CRITICAL: export() never throws — all errors are swallowed and logged at | ||
| * LogLevel.debug (the one exception is a single warn on the first observed | ||
| * auth-missing, re-armed on recovery). | ||
| */ | ||
| export default class DatabricksTelemetryExporter { | ||
| private context; | ||
| private host; | ||
| private circuitBreakerRegistry; | ||
| private authProvider?; | ||
| private readonly circuitBreaker; | ||
| private readonly authenticatedUserAgent; | ||
| /** User-Agent used for the unauthenticated endpoint; strips any | ||
| * caller-supplied `userAgentEntry` that could identify the customer. */ | ||
| private readonly unauthenticatedUserAgent; | ||
| private authMissingWarned; | ||
| constructor(context: IClientContext, host: string, circuitBreakerRegistry: CircuitBreakerRegistry, authProvider?: IAuthentication | undefined); | ||
| /** | ||
| * Release the per-host circuit breaker. Intended for the owning client's | ||
| * close() path. | ||
| * | ||
| * NOTE: `CircuitBreakerRegistry` currently shares one breaker per host | ||
| * across consumers; calling this while another consumer is active will | ||
| * reset their failure-count memory. The owning-client is expected to be | ||
| * the last consumer on its host; multi-consumer refcounting on the | ||
| * registry will land in the consumer-wiring PR. | ||
| */ | ||
| dispose(): void; | ||
| export(metrics: TelemetryMetric[]): Promise<void>; | ||
| /** | ||
| * Retry wrapper shaped after HttpRetryPolicy: retries only on errors | ||
| * classified as retryable by ExceptionClassifier, stops on terminal ones, | ||
| * surfaces the last error to the circuit breaker. | ||
| * | ||
| * `maxRetries` is the number of retries *after* the first attempt (i.e. | ||
| * attempts = maxRetries + 1), matching HttpRetryPolicy's semantics. | ||
| */ | ||
| private exportWithRetry; | ||
| private exportInternal; | ||
| private getAuthHeaders; | ||
| private sendRequest; | ||
| private toTelemetryLog; | ||
| private sleep; | ||
| } |
| "use strict"; | ||
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| var desc = Object.getOwnPropertyDescriptor(m, k); | ||
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
| desc = { enumerable: true, get: function() { return m[k]; } }; | ||
| } | ||
| Object.defineProperty(o, k2, desc); | ||
| }) : (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| o[k2] = m[k]; | ||
| })); | ||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
| Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
| }) : function(o, v) { | ||
| o["default"] = v; | ||
| }); | ||
| var __importStar = (this && this.__importStar) || function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
| __setModuleDefault(result, mod); | ||
| return result; | ||
| }; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.TelemetryTerminalError = void 0; | ||
| const uuid_1 = require("uuid"); | ||
| const node_fetch_1 = __importStar(require("node-fetch")); | ||
| const IDBSQLLogger_1 = require("../contracts/IDBSQLLogger"); | ||
| const AuthenticationError_1 = __importDefault(require("../errors/AuthenticationError")); | ||
| const HiveDriverError_1 = __importDefault(require("../errors/HiveDriverError")); | ||
| const types_1 = require("./types"); | ||
| const CircuitBreaker_1 = require("./CircuitBreaker"); | ||
| const ExceptionClassifier_1 = __importDefault(require("./ExceptionClassifier")); | ||
| const telemetryUtils_1 = require("./telemetryUtils"); | ||
| const buildUserAgentString_1 = __importDefault(require("../utils/buildUserAgentString")); | ||
| /** | ||
| * Thrown for non-credential terminal telemetry failures (e.g. refusal to | ||
| * export to an invalid host). Separate from `AuthenticationError` so the | ||
| * classifier can keep the "short-circuit, don't retry, count as breaker | ||
| * failure" contract without muddying the auth taxonomy used by the rest of | ||
| * the driver. | ||
| */ | ||
| class TelemetryTerminalError extends HiveDriverError_1.default { | ||
| constructor() { | ||
| super(...arguments); | ||
| this.terminal = true; | ||
| } | ||
| } | ||
| exports.TelemetryTerminalError = TelemetryTerminalError; | ||
| /** | ||
| * Exports telemetry metrics to the Databricks telemetry service. | ||
| * | ||
| * CRITICAL: export() never throws — all errors are swallowed and logged at | ||
| * LogLevel.debug (the one exception is a single warn on the first observed | ||
| * auth-missing, re-armed on recovery). | ||
| */ | ||
| class DatabricksTelemetryExporter { | ||
| constructor(context, host, circuitBreakerRegistry, authProvider) { | ||
| this.context = context; | ||
| this.host = host; | ||
| this.circuitBreakerRegistry = circuitBreakerRegistry; | ||
| this.authProvider = authProvider; | ||
| this.authMissingWarned = false; | ||
| this.circuitBreaker = circuitBreakerRegistry.getCircuitBreaker(host); | ||
| const config = this.context.getConfig(); | ||
| this.authenticatedUserAgent = (0, buildUserAgentString_1.default)(config.userAgentEntry); | ||
| this.unauthenticatedUserAgent = (0, buildUserAgentString_1.default)(undefined); | ||
| } | ||
| /** | ||
| * Release the per-host circuit breaker. Intended for the owning client's | ||
| * close() path. | ||
| * | ||
| * NOTE: `CircuitBreakerRegistry` currently shares one breaker per host | ||
| * across consumers; calling this while another consumer is active will | ||
| * reset their failure-count memory. The owning-client is expected to be | ||
| * the last consumer on its host; multi-consumer refcounting on the | ||
| * registry will land in the consumer-wiring PR. | ||
| */ | ||
| dispose() { | ||
| this.circuitBreakerRegistry.removeCircuitBreaker(this.host); | ||
| } | ||
| async export(metrics) { | ||
| var _a; | ||
| if (!metrics || metrics.length === 0) { | ||
| return; | ||
| } | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| await this.circuitBreaker.execute(() => this.exportWithRetry(metrics)); | ||
| } | ||
| catch (error) { | ||
| if (error instanceof CircuitBreaker_1.CircuitBreakerOpenError) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, 'Circuit breaker OPEN - dropping telemetry'); | ||
| } | ||
| else if (error instanceof AuthenticationError_1.default) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Telemetry export auth failure: ${error.message}`); | ||
| } | ||
| else if (error instanceof TelemetryTerminalError) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Telemetry export refused: ${error.message}`); | ||
| } | ||
| else { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Telemetry export error: ${(_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error}`); | ||
| } | ||
| } | ||
| } | ||
| /** | ||
| * Retry wrapper shaped after HttpRetryPolicy: retries only on errors | ||
| * classified as retryable by ExceptionClassifier, stops on terminal ones, | ||
| * surfaces the last error to the circuit breaker. | ||
| * | ||
| * `maxRetries` is the number of retries *after* the first attempt (i.e. | ||
| * attempts = maxRetries + 1), matching HttpRetryPolicy's semantics. | ||
| */ | ||
| async exportWithRetry(metrics) { | ||
| var _a, _b, _c, _d, _e, _f; | ||
| const config = this.context.getConfig(); | ||
| const logger = this.context.getLogger(); | ||
| const rawMaxRetries = (_a = config.telemetryMaxRetries) !== null && _a !== void 0 ? _a : types_1.DEFAULT_TELEMETRY_CONFIG.maxRetries; | ||
| const maxRetries = Number.isFinite(rawMaxRetries) && rawMaxRetries >= 0 ? rawMaxRetries : types_1.DEFAULT_TELEMETRY_CONFIG.maxRetries; | ||
| const baseMs = (_b = config.telemetryBackoffBaseMs) !== null && _b !== void 0 ? _b : types_1.DEFAULT_TELEMETRY_CONFIG.backoffBaseMs; | ||
| const maxMs = (_c = config.telemetryBackoffMaxMs) !== null && _c !== void 0 ? _c : types_1.DEFAULT_TELEMETRY_CONFIG.backoffMaxMs; | ||
| const jitterMs = (_d = config.telemetryBackoffJitterMs) !== null && _d !== void 0 ? _d : types_1.DEFAULT_TELEMETRY_CONFIG.backoffJitterMs; | ||
| const totalAttempts = maxRetries + 1; | ||
| let lastError = null; | ||
| /* eslint-disable no-await-in-loop */ | ||
| for (let attempt = 0; attempt < totalAttempts; attempt += 1) { | ||
| try { | ||
| await this.exportInternal(metrics); | ||
| return; | ||
| } | ||
| catch (error) { | ||
| lastError = error; | ||
| if (error instanceof AuthenticationError_1.default || | ||
| error instanceof TelemetryTerminalError || | ||
| ExceptionClassifier_1.default.isTerminal(error)) { | ||
| throw error; | ||
| } | ||
| if (!ExceptionClassifier_1.default.isRetryable(error)) { | ||
| throw error; | ||
| } | ||
| if (attempt >= totalAttempts - 1) { | ||
| throw error; | ||
| } | ||
| const base = Math.min(baseMs * 2 ** attempt, maxMs); | ||
| const jitter = Math.random() * jitterMs; | ||
| const delay = Math.min(base + jitter, maxMs); | ||
| // Include the failing error so ops can see what's being retried, | ||
| // not just the cadence. | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Retrying telemetry export (attempt ${attempt + 1}/${totalAttempts}) after ${Math.round(delay)}ms: ${(_e = error === null || error === void 0 ? void 0 : error.statusCode) !== null && _e !== void 0 ? _e : ''} ${(0, telemetryUtils_1.redactSensitive)((_f = error === null || error === void 0 ? void 0 : error.message) !== null && _f !== void 0 ? _f : '')}`); | ||
| await this.sleep(delay); | ||
| } | ||
| } | ||
| /* eslint-enable no-await-in-loop */ | ||
| if (lastError) { | ||
| throw lastError; | ||
| } | ||
| } | ||
| async exportInternal(metrics) { | ||
| var _a; | ||
| const config = this.context.getConfig(); | ||
| const logger = this.context.getLogger(); | ||
| const authenticatedExport = (_a = config.telemetryAuthenticatedExport) !== null && _a !== void 0 ? _a : types_1.DEFAULT_TELEMETRY_CONFIG.authenticatedExport; | ||
| const endpoint = (0, telemetryUtils_1.buildTelemetryUrl)(this.host, authenticatedExport ? '/telemetry-ext' : '/telemetry-unauth'); | ||
| if (!endpoint) { | ||
| // Malformed / deny-listed host — drop the batch rather than letting | ||
| // it target an attacker-controlled destination. | ||
| throw new TelemetryTerminalError('Refusing telemetry export: host failed validation'); | ||
| } | ||
| const userAgent = authenticatedExport ? this.authenticatedUserAgent : this.unauthenticatedUserAgent; | ||
| let headers = { | ||
| 'Content-Type': 'application/json', | ||
| 'User-Agent': userAgent, | ||
| }; | ||
| if (authenticatedExport) { | ||
| headers = { ...headers, ...(await this.getAuthHeaders()) }; | ||
| if (!(0, telemetryUtils_1.hasAuthorization)(headers)) { | ||
| if (!this.authMissingWarned) { | ||
| this.authMissingWarned = true; | ||
| logger.log(IDBSQLLogger_1.LogLevel.warn, 'Telemetry: Authorization header missing — metrics will be dropped'); | ||
| } | ||
| throw new AuthenticationError_1.default('Telemetry export: missing Authorization header'); | ||
| } | ||
| } | ||
| const protoLogs = metrics.map((m) => this.toTelemetryLog(m, authenticatedExport, userAgent)); | ||
| const body = JSON.stringify({ | ||
| uploadTime: Date.now(), | ||
| items: [], | ||
| protoLogs: protoLogs.map((log) => JSON.stringify(log)), | ||
| }); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Exporting ${metrics.length} telemetry metrics to ${authenticatedExport ? 'authenticated' : 'unauthenticated'} endpoint`); | ||
| const response = await this.sendRequest(endpoint, { | ||
| method: 'POST', | ||
| headers, | ||
| body, | ||
| timeout: 10000, | ||
| }); | ||
| if (!response.ok) { | ||
| await response.text().catch(() => { }); | ||
| const error = new Error(`Telemetry export failed: ${response.status} ${response.statusText}`); | ||
| error.statusCode = response.status; | ||
| throw error; | ||
| } | ||
| await response.text().catch(() => { }); | ||
| // Successful round-trip re-arms the "auth missing" warn so operators see | ||
| // a fresh signal the next time auth breaks. | ||
| this.authMissingWarned = false; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Successfully exported ${metrics.length} telemetry metrics`); | ||
| } | ||
| async getAuthHeaders() { | ||
| var _a; | ||
| if (!this.authProvider) { | ||
| return {}; | ||
| } | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| return (0, telemetryUtils_1.normalizeHeaders)(await this.authProvider.authenticate()); | ||
| } | ||
| catch (error) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Telemetry: auth provider threw: ${(_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error}`); | ||
| return {}; | ||
| } | ||
| } | ||
| async sendRequest(url, init) { | ||
| const connectionProvider = await this.context.getConnectionProvider(); | ||
| const agent = await connectionProvider.getAgent(); | ||
| const retryPolicy = await connectionProvider.getRetryPolicy(); | ||
| const requestConfig = { agent, ...init }; | ||
| const result = await retryPolicy.invokeWithRetry(() => { | ||
| const request = new node_fetch_1.Request(url, requestConfig); | ||
| return (0, node_fetch_1.default)(request).then((response) => ({ request, response })); | ||
| }); | ||
| return result.response; | ||
| } | ||
| toTelemetryLog(metric, authenticatedExport, userAgent) { | ||
| var _a, _b; | ||
| // Unauthenticated export must not ship correlation IDs, fingerprint | ||
| // data, or raw error detail — an on-path observer could otherwise link | ||
| // sessions → workspaces → user activity without any auth. | ||
| const includeCorrelation = authenticatedExport; | ||
| const log = { | ||
| workspace_id: includeCorrelation ? metric.workspaceId : undefined, | ||
| frontend_log_event_id: (0, uuid_1.v4)(), | ||
| context: { | ||
| client_context: { | ||
| timestamp_millis: metric.timestamp, | ||
| user_agent: userAgent, | ||
| }, | ||
| }, | ||
| entry: { | ||
| sql_driver_log: { | ||
| session_id: includeCorrelation ? metric.sessionId : undefined, | ||
| sql_statement_id: includeCorrelation ? metric.statementId : undefined, | ||
| }, | ||
| }, | ||
| }; | ||
| if (metric.metricType === 'connection' && metric.driverConfig && includeCorrelation) { | ||
| // system_configuration is a high-entropy client fingerprint (OS, arch, | ||
| // locale, process, runtime). Only ship on the authenticated path. | ||
| log.entry.sql_driver_log.system_configuration = { | ||
| driver_version: metric.driverConfig.driverVersion, | ||
| driver_name: metric.driverConfig.driverName, | ||
| runtime_name: 'Node.js', | ||
| runtime_version: metric.driverConfig.nodeVersion, | ||
| runtime_vendor: metric.driverConfig.runtimeVendor, | ||
| os_name: metric.driverConfig.platform, | ||
| os_version: metric.driverConfig.osVersion, | ||
| os_arch: metric.driverConfig.osArch, | ||
| locale_name: metric.driverConfig.localeName, | ||
| char_set_encoding: metric.driverConfig.charSetEncoding, | ||
| process_name: (0, telemetryUtils_1.sanitizeProcessName)(metric.driverConfig.processName) || undefined, | ||
| }; | ||
| } | ||
| else if (metric.metricType === 'statement') { | ||
| log.entry.sql_driver_log.operation_latency_ms = metric.latencyMs; | ||
| if (metric.resultFormat || metric.chunkCount) { | ||
| log.entry.sql_driver_log.sql_operation = { | ||
| execution_result: metric.resultFormat, | ||
| }; | ||
| if (metric.chunkCount && metric.chunkCount > 0) { | ||
| log.entry.sql_driver_log.sql_operation.chunk_details = { | ||
| total_chunks_present: metric.chunkCount, | ||
| total_chunks_iterated: metric.chunkCount, | ||
| }; | ||
| } | ||
| } | ||
| } | ||
| else if (metric.metricType === 'error') { | ||
| const stackOrMessage = (_b = (_a = metric.errorStack) !== null && _a !== void 0 ? _a : metric.errorMessage) !== null && _b !== void 0 ? _b : ''; | ||
| log.entry.sql_driver_log.error_info = { | ||
| error_name: metric.errorName || 'UnknownError', | ||
| // Redact common secret shapes and cap length. On the unauth path we | ||
| // keep only the error class — no message body. | ||
| stack_trace: includeCorrelation ? (0, telemetryUtils_1.redactSensitive)(stackOrMessage) : '', | ||
| }; | ||
| } | ||
| return log; | ||
| } | ||
| sleep(ms) { | ||
| return new Promise((resolve) => { | ||
| setTimeout(resolve, ms); | ||
| }); | ||
| } | ||
| } | ||
| exports.default = DatabricksTelemetryExporter; | ||
| //# sourceMappingURL=DatabricksTelemetryExporter.js.map |
| {"version":3,"file":"DatabricksTelemetryExporter.js","sourceRoot":"","sources":["../../lib/telemetry/DatabricksTelemetryExporter.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| import IClientContext from '../contracts/IClientContext'; | ||
| import IAuthentication from '../connection/contracts/IAuthentication'; | ||
| export interface FeatureFlagContext { | ||
| telemetryEnabled?: boolean; | ||
| lastFetched?: Date; | ||
| refCount: number; | ||
| cacheDuration: number; | ||
| } | ||
| /** | ||
| * Per-host feature-flag cache used to gate telemetry emission. Responsibilities: | ||
| * - dedupe in-flight fetches (thundering-herd protection); | ||
| * - ref-count so context goes away when the last consumer closes; | ||
| * - clamp server-provided TTL into a safe band. | ||
| * | ||
| * Shares HTTP plumbing (agent, user agent) with DatabricksTelemetryExporter. | ||
| * Consumer wiring lands in a later PR in this stack (see PR description). | ||
| */ | ||
| export default class FeatureFlagCache { | ||
| private context; | ||
| private authProvider?; | ||
| private contexts; | ||
| private fetchPromises; | ||
| private readonly userAgent; | ||
| private readonly CACHE_DURATION_MS; | ||
| private readonly MIN_CACHE_DURATION_S; | ||
| private readonly MAX_CACHE_DURATION_S; | ||
| private readonly FEATURE_FLAG_NAME; | ||
| constructor(context: IClientContext, authProvider?: IAuthentication | undefined); | ||
| getOrCreateContext(host: string): FeatureFlagContext; | ||
| releaseContext(host: string): void; | ||
| isTelemetryEnabled(host: string): Promise<boolean>; | ||
| /** | ||
| * Strips the `-oss` suffix the feature-flag API does not accept. The server | ||
| * keys off the SemVer triplet only, so anything appended would 404. | ||
| */ | ||
| private getDriverVersion; | ||
| private fetchFeatureFlag; | ||
| /** | ||
| * Retries transient network errors once before giving up. Without a retry | ||
| * a single hiccup would leave telemetry disabled for the full cache TTL | ||
| * (15 min). One retry gives an ephemeral DNS / connection-reset failure | ||
| * a second chance without pushing sustained load at a broken endpoint. | ||
| */ | ||
| private fetchWithRetry; | ||
| private getAuthHeaders; | ||
| } |
| "use strict"; | ||
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| var desc = Object.getOwnPropertyDescriptor(m, k); | ||
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
| desc = { enumerable: true, get: function() { return m[k]; } }; | ||
| } | ||
| Object.defineProperty(o, k2, desc); | ||
| }) : (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| o[k2] = m[k]; | ||
| })); | ||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
| Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
| }) : function(o, v) { | ||
| o["default"] = v; | ||
| }); | ||
| var __importStar = (this && this.__importStar) || function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
| __setModuleDefault(result, mod); | ||
| return result; | ||
| }; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const node_fetch_1 = __importStar(require("node-fetch")); | ||
| const IDBSQLLogger_1 = require("../contracts/IDBSQLLogger"); | ||
| const telemetryUtils_1 = require("./telemetryUtils"); | ||
| const buildUserAgentString_1 = __importDefault(require("../utils/buildUserAgentString")); | ||
| const version_1 = __importDefault(require("../version")); | ||
| /** | ||
| * Per-host feature-flag cache used to gate telemetry emission. Responsibilities: | ||
| * - dedupe in-flight fetches (thundering-herd protection); | ||
| * - ref-count so context goes away when the last consumer closes; | ||
| * - clamp server-provided TTL into a safe band. | ||
| * | ||
| * Shares HTTP plumbing (agent, user agent) with DatabricksTelemetryExporter. | ||
| * Consumer wiring lands in a later PR in this stack (see PR description). | ||
| */ | ||
| class FeatureFlagCache { | ||
| constructor(context, authProvider) { | ||
| this.context = context; | ||
| this.authProvider = authProvider; | ||
| this.fetchPromises = new Map(); | ||
| this.CACHE_DURATION_MS = 15 * 60 * 1000; | ||
| this.MIN_CACHE_DURATION_S = 60; | ||
| this.MAX_CACHE_DURATION_S = 3600; | ||
| this.FEATURE_FLAG_NAME = 'databricks.partnerplatform.clientConfigsFeatureFlags.enableTelemetryForNodeJs'; | ||
| this.contexts = new Map(); | ||
| this.userAgent = (0, buildUserAgentString_1.default)(this.context.getConfig().userAgentEntry); | ||
| } | ||
| getOrCreateContext(host) { | ||
| let ctx = this.contexts.get(host); | ||
| if (!ctx) { | ||
| ctx = { | ||
| refCount: 0, | ||
| cacheDuration: this.CACHE_DURATION_MS, | ||
| }; | ||
| this.contexts.set(host, ctx); | ||
| } | ||
| ctx.refCount += 1; | ||
| return ctx; | ||
| } | ||
| releaseContext(host) { | ||
| const ctx = this.contexts.get(host); | ||
| if (ctx) { | ||
| ctx.refCount -= 1; | ||
| if (ctx.refCount <= 0) { | ||
| this.contexts.delete(host); | ||
| this.fetchPromises.delete(host); | ||
| } | ||
| } | ||
| } | ||
| async isTelemetryEnabled(host) { | ||
| var _a; | ||
| const logger = this.context.getLogger(); | ||
| const ctx = this.contexts.get(host); | ||
| if (!ctx) { | ||
| return false; | ||
| } | ||
| const isExpired = !ctx.lastFetched || Date.now() - ctx.lastFetched.getTime() > ctx.cacheDuration; | ||
| if (isExpired) { | ||
| if (!this.fetchPromises.has(host)) { | ||
| const fetchPromise = this.fetchFeatureFlag(host) | ||
| .then((enabled) => { | ||
| ctx.telemetryEnabled = enabled; | ||
| ctx.lastFetched = new Date(); | ||
| return enabled; | ||
| }) | ||
| .catch((error) => { | ||
| var _a; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Error fetching feature flag: ${error.message}`); | ||
| return (_a = ctx.telemetryEnabled) !== null && _a !== void 0 ? _a : false; | ||
| }) | ||
| .finally(() => { | ||
| this.fetchPromises.delete(host); | ||
| }); | ||
| this.fetchPromises.set(host, fetchPromise); | ||
| } | ||
| await this.fetchPromises.get(host); | ||
| } | ||
| return (_a = ctx.telemetryEnabled) !== null && _a !== void 0 ? _a : false; | ||
| } | ||
| /** | ||
| * Strips the `-oss` suffix the feature-flag API does not accept. The server | ||
| * keys off the SemVer triplet only, so anything appended would 404. | ||
| */ | ||
| getDriverVersion() { | ||
| return version_1.default.replace(/-oss$/, ''); | ||
| } | ||
| async fetchFeatureFlag(host) { | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| const endpoint = (0, telemetryUtils_1.buildTelemetryUrl)(host, `/api/2.0/connector-service/feature-flags/NODEJS/${this.getDriverVersion()}`); | ||
| if (!endpoint) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Feature flag fetch skipped: invalid host ${host}`); | ||
| return false; | ||
| } | ||
| const headers = { | ||
| 'Content-Type': 'application/json', | ||
| 'User-Agent': this.userAgent, | ||
| ...(await this.getAuthHeaders()), | ||
| }; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Fetching feature flags from ${endpoint}`); | ||
| const response = await this.fetchWithRetry(endpoint, { | ||
| method: 'GET', | ||
| headers, | ||
| timeout: 10000, | ||
| }); | ||
| if (!response.ok) { | ||
| await response.text().catch(() => { }); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Feature flag fetch failed: ${response.status} ${response.statusText}`); | ||
| return false; | ||
| } | ||
| const data = await response.json(); | ||
| if (data && data.flags && Array.isArray(data.flags)) { | ||
| const ctx = this.contexts.get(host); | ||
| if (ctx && typeof data.ttl_seconds === 'number' && data.ttl_seconds > 0) { | ||
| const clampedTtl = Math.max(this.MIN_CACHE_DURATION_S, Math.min(this.MAX_CACHE_DURATION_S, data.ttl_seconds)); | ||
| ctx.cacheDuration = clampedTtl * 1000; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Updated cache duration to ${clampedTtl} seconds`); | ||
| } | ||
| const flag = data.flags.find((f) => f.name === this.FEATURE_FLAG_NAME); | ||
| if (flag) { | ||
| const enabled = String(flag.value).toLowerCase() === 'true'; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Feature flag ${this.FEATURE_FLAG_NAME}: ${enabled}`); | ||
| return enabled; | ||
| } | ||
| } | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Feature flag ${this.FEATURE_FLAG_NAME} not found in response`); | ||
| return false; | ||
| } | ||
| catch (error) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Error fetching feature flag from ${host}: ${error.message}`); | ||
| return false; | ||
| } | ||
| } | ||
| /** | ||
| * Retries transient network errors once before giving up. Without a retry | ||
| * a single hiccup would leave telemetry disabled for the full cache TTL | ||
| * (15 min). One retry gives an ephemeral DNS / connection-reset failure | ||
| * a second chance without pushing sustained load at a broken endpoint. | ||
| */ | ||
| async fetchWithRetry(url, init) { | ||
| const connectionProvider = await this.context.getConnectionProvider(); | ||
| const agent = await connectionProvider.getAgent(); | ||
| const retryPolicy = await connectionProvider.getRetryPolicy(); | ||
| const requestConfig = { agent, ...init }; | ||
| const result = await retryPolicy.invokeWithRetry(() => { | ||
| const request = new node_fetch_1.Request(url, requestConfig); | ||
| return (0, node_fetch_1.default)(request).then((response) => ({ request, response })); | ||
| }); | ||
| return result.response; | ||
| } | ||
| async getAuthHeaders() { | ||
| var _a; | ||
| if (!this.authProvider) { | ||
| return {}; | ||
| } | ||
| try { | ||
| return (0, telemetryUtils_1.normalizeHeaders)(await this.authProvider.authenticate()); | ||
| } | ||
| catch (error) { | ||
| this.context.getLogger().log(IDBSQLLogger_1.LogLevel.debug, `Feature flag auth failed: ${(_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error}`); | ||
| return {}; | ||
| } | ||
| } | ||
| } | ||
| exports.default = FeatureFlagCache; | ||
| //# sourceMappingURL=FeatureFlagCache.js.map |
| {"version":3,"file":"FeatureFlagCache.js","sourceRoot":"","sources":["../../lib/telemetry/FeatureFlagCache.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| import IClientContext from '../contracts/IClientContext'; | ||
| import { TelemetryEvent } from './types'; | ||
| import DatabricksTelemetryExporter from './DatabricksTelemetryExporter'; | ||
| /** | ||
| * Aggregates telemetry events by statement_id and manages batching/flushing. | ||
| * | ||
| * Overflow policy — when the pending buffer hits `maxPendingMetrics`, error | ||
| * metrics are preserved preferentially over connection/statement metrics. | ||
| * The first-failure error is usually the most valuable signal in post-mortem | ||
| * debugging; dropping it FIFO would defeat the purpose of capture. | ||
| */ | ||
| export default class MetricsAggregator { | ||
| private context; | ||
| private exporter; | ||
| private statementMetrics; | ||
| private pendingMetrics; | ||
| private flushTimer; | ||
| private closed; | ||
| private closing; | ||
| private batchSize; | ||
| private flushIntervalMs; | ||
| private maxPendingMetrics; | ||
| private maxErrorsPerStatement; | ||
| private statementTtlMs; | ||
| constructor(context: IClientContext, exporter: DatabricksTelemetryExporter); | ||
| processEvent(event: TelemetryEvent): void; | ||
| private processConnectionEvent; | ||
| private processErrorEvent; | ||
| private pushBoundedError; | ||
| private processStatementEvent; | ||
| private getOrCreateStatementDetails; | ||
| /** | ||
| * Drop entries older than `statementTtlMs`, emitting their buffered error | ||
| * events as standalone metrics first so the first-failure signal survives | ||
| * the eviction. Called from the periodic flush timer so idle clients | ||
| * don't leak orphan entries. | ||
| */ | ||
| private evictExpiredStatements; | ||
| completeStatement(statementId: string): void; | ||
| /** | ||
| * Append `metric` to the pending buffer, enforcing `maxPendingMetrics`. | ||
| * | ||
| * Overflow drops the oldest non-error entry (single `splice` — no new | ||
| * allocation). Under an all-error buffer it falls back to dropping the | ||
| * oldest entry at index 0. | ||
| */ | ||
| private addPendingMetric; | ||
| private findDropIndex; | ||
| /** | ||
| * Drain the pending buffer and return a promise that resolves when the | ||
| * exporter finishes with the drained batch. `close()` awaits this so | ||
| * `process.exit()` after `client.close()` doesn't truncate the POST. | ||
| */ | ||
| flush(resetTimer?: boolean): Promise<void>; | ||
| private startFlushTimer; | ||
| close(): Promise<void>; | ||
| } |
| "use strict"; | ||
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const IDBSQLLogger_1 = require("../contracts/IDBSQLLogger"); | ||
| const types_1 = require("./types"); | ||
| /** | ||
| * Aggregates telemetry events by statement_id and manages batching/flushing. | ||
| * | ||
| * Overflow policy — when the pending buffer hits `maxPendingMetrics`, error | ||
| * metrics are preserved preferentially over connection/statement metrics. | ||
| * The first-failure error is usually the most valuable signal in post-mortem | ||
| * debugging; dropping it FIFO would defeat the purpose of capture. | ||
| */ | ||
| class MetricsAggregator { | ||
| constructor(context, exporter) { | ||
| var _a, _b, _c, _d, _e; | ||
| this.context = context; | ||
| this.exporter = exporter; | ||
| this.statementMetrics = new Map(); | ||
| this.pendingMetrics = []; | ||
| this.flushTimer = null; | ||
| this.closed = false; | ||
| this.closing = false; | ||
| try { | ||
| const config = context.getConfig(); | ||
| this.batchSize = (_a = config.telemetryBatchSize) !== null && _a !== void 0 ? _a : types_1.DEFAULT_TELEMETRY_CONFIG.batchSize; | ||
| this.flushIntervalMs = (_b = config.telemetryFlushIntervalMs) !== null && _b !== void 0 ? _b : types_1.DEFAULT_TELEMETRY_CONFIG.flushIntervalMs; | ||
| this.maxPendingMetrics = (_c = config.telemetryMaxPendingMetrics) !== null && _c !== void 0 ? _c : types_1.DEFAULT_TELEMETRY_CONFIG.maxPendingMetrics; | ||
| this.maxErrorsPerStatement = | ||
| (_d = config.telemetryMaxErrorsPerStatement) !== null && _d !== void 0 ? _d : types_1.DEFAULT_TELEMETRY_CONFIG.maxErrorsPerStatement; | ||
| this.statementTtlMs = (_e = config.telemetryStatementTtlMs) !== null && _e !== void 0 ? _e : types_1.DEFAULT_TELEMETRY_CONFIG.statementTtlMs; | ||
| this.startFlushTimer(); | ||
| } | ||
| catch (error) { | ||
| const logger = this.context.getLogger(); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `MetricsAggregator constructor error: ${error.message}`); | ||
| this.batchSize = types_1.DEFAULT_TELEMETRY_CONFIG.batchSize; | ||
| this.flushIntervalMs = types_1.DEFAULT_TELEMETRY_CONFIG.flushIntervalMs; | ||
| this.maxPendingMetrics = types_1.DEFAULT_TELEMETRY_CONFIG.maxPendingMetrics; | ||
| this.maxErrorsPerStatement = types_1.DEFAULT_TELEMETRY_CONFIG.maxErrorsPerStatement; | ||
| this.statementTtlMs = types_1.DEFAULT_TELEMETRY_CONFIG.statementTtlMs; | ||
| } | ||
| } | ||
| processEvent(event) { | ||
| if (this.closed) | ||
| return; | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| if (event.eventType === types_1.TelemetryEventType.CONNECTION_OPEN) { | ||
| this.processConnectionEvent(event); | ||
| return; | ||
| } | ||
| if (event.eventType === types_1.TelemetryEventType.ERROR) { | ||
| this.processErrorEvent(event); | ||
| return; | ||
| } | ||
| if (event.statementId) { | ||
| this.processStatementEvent(event); | ||
| } | ||
| } | ||
| catch (error) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `MetricsAggregator.processEvent error: ${error.message}`); | ||
| } | ||
| } | ||
| processConnectionEvent(event) { | ||
| const metric = { | ||
| metricType: 'connection', | ||
| timestamp: event.timestamp, | ||
| sessionId: event.sessionId, | ||
| workspaceId: event.workspaceId, | ||
| driverConfig: event.driverConfig, | ||
| }; | ||
| this.addPendingMetric(metric); | ||
| } | ||
| processErrorEvent(event) { | ||
| const logger = this.context.getLogger(); | ||
| // `isTerminal` is carried on the event by the emitter (it knows the | ||
| // call site's taxonomy). If callers ever drop it we default to | ||
| // retryable — buffering by statement is the safer choice. | ||
| const isTerminal = event.isTerminal === true; | ||
| if (isTerminal) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, 'Terminal error detected - flushing immediately'); | ||
| if (event.statementId && this.statementMetrics.has(event.statementId)) { | ||
| const details = this.statementMetrics.get(event.statementId); | ||
| this.pushBoundedError(details, event); | ||
| this.completeStatement(event.statementId); | ||
| } | ||
| else { | ||
| const metric = { | ||
| metricType: 'error', | ||
| timestamp: event.timestamp, | ||
| sessionId: event.sessionId, | ||
| statementId: event.statementId, | ||
| workspaceId: event.workspaceId, | ||
| errorName: event.errorName, | ||
| errorMessage: event.errorMessage, | ||
| errorStack: event.errorStack, | ||
| }; | ||
| this.addPendingMetric(metric); | ||
| } | ||
| // Fire-and-forget on the terminal-error path so customer code doesn't | ||
| // stall on telemetry HTTP. Do NOT reset the periodic flush timer: | ||
| // under burst failures that would keep the tail-drain timer from | ||
| // ever firing. | ||
| Promise.resolve(this.flush(false)).catch((err) => { | ||
| var _a; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Terminal-error flush failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`); | ||
| }); | ||
| } | ||
| else if (event.statementId) { | ||
| const details = this.getOrCreateStatementDetails(event); | ||
| this.pushBoundedError(details, event); | ||
| } | ||
| } | ||
| pushBoundedError(details, event) { | ||
| if (details.errors.length >= this.maxErrorsPerStatement) { | ||
| details.errors.shift(); | ||
| } | ||
| details.errors.push(event); | ||
| } | ||
| processStatementEvent(event) { | ||
| var _a, _b, _c, _d; | ||
| const details = this.getOrCreateStatementDetails(event); | ||
| switch (event.eventType) { | ||
| case types_1.TelemetryEventType.STATEMENT_START: | ||
| details.operationType = event.operationType; | ||
| details.startTime = event.timestamp; | ||
| break; | ||
| case types_1.TelemetryEventType.STATEMENT_COMPLETE: | ||
| details.executionLatencyMs = event.latencyMs; | ||
| details.resultFormat = event.resultFormat; | ||
| details.chunkCount = (_a = event.chunkCount) !== null && _a !== void 0 ? _a : 0; | ||
| details.bytesDownloaded = (_b = event.bytesDownloaded) !== null && _b !== void 0 ? _b : 0; | ||
| details.pollCount = (_c = event.pollCount) !== null && _c !== void 0 ? _c : 0; | ||
| break; | ||
| case types_1.TelemetryEventType.CLOUDFETCH_CHUNK: | ||
| details.chunkCount += 1; | ||
| details.bytesDownloaded += (_d = event.bytes) !== null && _d !== void 0 ? _d : 0; | ||
| if (event.compressed !== undefined) { | ||
| details.compressionEnabled = event.compressed; | ||
| } | ||
| break; | ||
| default: | ||
| break; | ||
| } | ||
| } | ||
| getOrCreateStatementDetails(event) { | ||
| const statementId = event.statementId; | ||
| if (!this.statementMetrics.has(statementId)) { | ||
| this.statementMetrics.set(statementId, { | ||
| statementId, | ||
| sessionId: event.sessionId, | ||
| workspaceId: event.workspaceId, | ||
| startTime: event.timestamp, | ||
| chunkCount: 0, | ||
| bytesDownloaded: 0, | ||
| pollCount: 0, | ||
| errors: [], | ||
| }); | ||
| } | ||
| return this.statementMetrics.get(statementId); | ||
| } | ||
| /** | ||
| * Drop entries older than `statementTtlMs`, emitting their buffered error | ||
| * events as standalone metrics first so the first-failure signal survives | ||
| * the eviction. Called from the periodic flush timer so idle clients | ||
| * don't leak orphan entries. | ||
| */ | ||
| evictExpiredStatements() { | ||
| const cutoff = Date.now() - this.statementTtlMs; | ||
| let evicted = 0; | ||
| for (const [id, details] of this.statementMetrics) { | ||
| if (details.startTime < cutoff) { | ||
| for (const errorEvent of details.errors) { | ||
| this.addPendingMetric({ | ||
| metricType: 'error', | ||
| timestamp: errorEvent.timestamp, | ||
| sessionId: details.sessionId, | ||
| statementId: details.statementId, | ||
| workspaceId: details.workspaceId, | ||
| errorName: errorEvent.errorName, | ||
| errorMessage: errorEvent.errorMessage, | ||
| errorStack: errorEvent.errorStack, | ||
| }); | ||
| } | ||
| this.statementMetrics.delete(id); | ||
| evicted += 1; | ||
| } | ||
| } | ||
| if (evicted > 0) { | ||
| this.context | ||
| .getLogger() | ||
| .log(IDBSQLLogger_1.LogLevel.debug, `Evicted ${evicted} abandoned statement(s) past ${this.statementTtlMs}ms TTL`); | ||
| } | ||
| } | ||
| completeStatement(statementId) { | ||
| if (this.closed) | ||
| return; | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| const details = this.statementMetrics.get(statementId); | ||
| if (!details) { | ||
| return; | ||
| } | ||
| const metric = { | ||
| metricType: 'statement', | ||
| timestamp: details.startTime, | ||
| sessionId: details.sessionId, | ||
| statementId: details.statementId, | ||
| workspaceId: details.workspaceId, | ||
| latencyMs: details.executionLatencyMs, | ||
| resultFormat: details.resultFormat, | ||
| chunkCount: details.chunkCount, | ||
| bytesDownloaded: details.bytesDownloaded, | ||
| pollCount: details.pollCount, | ||
| }; | ||
| this.addPendingMetric(metric); | ||
| for (const errorEvent of details.errors) { | ||
| const errorMetric = { | ||
| metricType: 'error', | ||
| timestamp: errorEvent.timestamp, | ||
| sessionId: details.sessionId, | ||
| statementId: details.statementId, | ||
| workspaceId: details.workspaceId, | ||
| errorName: errorEvent.errorName, | ||
| errorMessage: errorEvent.errorMessage, | ||
| errorStack: errorEvent.errorStack, | ||
| }; | ||
| this.addPendingMetric(errorMetric); | ||
| } | ||
| this.statementMetrics.delete(statementId); | ||
| } | ||
| catch (error) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `MetricsAggregator.completeStatement error: ${error.message}`); | ||
| } | ||
| } | ||
| /** | ||
| * Append `metric` to the pending buffer, enforcing `maxPendingMetrics`. | ||
| * | ||
| * Overflow drops the oldest non-error entry (single `splice` — no new | ||
| * allocation). Under an all-error buffer it falls back to dropping the | ||
| * oldest entry at index 0. | ||
| */ | ||
| addPendingMetric(metric) { | ||
| if (this.closed) | ||
| return; | ||
| this.pendingMetrics.push(metric); | ||
| if (this.pendingMetrics.length > this.maxPendingMetrics) { | ||
| const dropIndex = this.findDropIndex(); | ||
| this.pendingMetrics.splice(dropIndex, 1); | ||
| const logger = this.context.getLogger(); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Dropped 1 oldest non-error telemetry metric (buffer full at ${this.maxPendingMetrics})`); | ||
| } | ||
| if (this.pendingMetrics.length >= this.batchSize && !this.closing) { | ||
| // resetTimer=false so the periodic tail-drain keeps its cadence even | ||
| // under sustained batch-size bursts. | ||
| const logger = this.context.getLogger(); | ||
| Promise.resolve(this.flush(false)).catch((err) => { | ||
| var _a; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Batch-trigger flush failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`); | ||
| }); | ||
| } | ||
| } | ||
| findDropIndex() { | ||
| for (let i = 0; i < this.pendingMetrics.length; i += 1) { | ||
| if (this.pendingMetrics[i].metricType !== 'error') { | ||
| return i; | ||
| } | ||
| } | ||
| return 0; | ||
| } | ||
| /** | ||
| * Drain the pending buffer and return a promise that resolves when the | ||
| * exporter finishes with the drained batch. `close()` awaits this so | ||
| * `process.exit()` after `client.close()` doesn't truncate the POST. | ||
| */ | ||
| async flush(resetTimer = true) { | ||
| var _a; | ||
| const logger = this.context.getLogger(); | ||
| let exportPromise = null; | ||
| try { | ||
| if (this.pendingMetrics.length === 0) { | ||
| if (resetTimer && !this.closed) { | ||
| this.startFlushTimer(); | ||
| } | ||
| return; | ||
| } | ||
| const metricsToExport = this.pendingMetrics; | ||
| this.pendingMetrics = []; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Flushing ${metricsToExport.length} telemetry metrics`); | ||
| exportPromise = this.exporter.export(metricsToExport); | ||
| if (resetTimer && !this.closed) { | ||
| this.startFlushTimer(); | ||
| } | ||
| } | ||
| catch (error) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `MetricsAggregator.flush error: ${error.message}`); | ||
| } | ||
| if (exportPromise) { | ||
| try { | ||
| await exportPromise; | ||
| } | ||
| catch (err) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Unexpected export error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`); | ||
| } | ||
| } | ||
| } | ||
| startFlushTimer() { | ||
| if (this.closed) | ||
| return; | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| if (this.flushTimer) { | ||
| clearInterval(this.flushTimer); | ||
| } | ||
| this.flushTimer = setInterval(() => { | ||
| var _a; | ||
| // Idle eviction: run before the flush so orphan-error metrics have | ||
| // a chance to batch into this drain rather than wait for the next. | ||
| try { | ||
| this.evictExpiredStatements(); | ||
| } | ||
| catch (err) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `evictExpiredStatements error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`); | ||
| } | ||
| Promise.resolve(this.flush(false)).catch((err) => { | ||
| var _a; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Periodic flush failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`); | ||
| }); | ||
| }, this.flushIntervalMs); | ||
| this.flushTimer.unref(); | ||
| } | ||
| catch (error) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `MetricsAggregator.startFlushTimer error: ${error.message}`); | ||
| } | ||
| } | ||
| async close() { | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| // Suppress batch-triggered fire-and-forget flushes from addPendingMetric | ||
| // so no promises escape past the single awaited flush below. | ||
| this.closing = true; | ||
| if (this.flushTimer) { | ||
| clearInterval(this.flushTimer); | ||
| this.flushTimer = null; | ||
| } | ||
| // closed is still false here so completeStatement → addPendingMetric works normally. | ||
| const remainingStatements = [...this.statementMetrics.keys()]; | ||
| for (const statementId of remainingStatements) { | ||
| this.completeStatement(statementId); | ||
| } | ||
| this.closed = true; | ||
| await this.flush(false); | ||
| } | ||
| catch (error) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `MetricsAggregator.close error: ${error.message}`); | ||
| } | ||
| } | ||
| } | ||
| exports.default = MetricsAggregator; | ||
| //# sourceMappingURL=MetricsAggregator.js.map |
| {"version":3,"file":"MetricsAggregator.js","sourceRoot":"","sources":["../../lib/telemetry/MetricsAggregator.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| import IClientContext from '../contracts/IClientContext'; | ||
| /** | ||
| * Telemetry client for a specific host. | ||
| * Managed by TelemetryClientProvider with reference counting. | ||
| * One client instance is shared across all connections to the same host. | ||
| */ | ||
| declare class TelemetryClient { | ||
| private context; | ||
| private host; | ||
| private closed; | ||
| constructor(context: IClientContext, host: string); | ||
| /** | ||
| * Gets the host associated with this client. | ||
| */ | ||
| getHost(): string; | ||
| /** | ||
| * Checks if the client has been closed. | ||
| */ | ||
| isClosed(): boolean; | ||
| /** | ||
| * Closes the telemetry client and releases resources. | ||
| * Should only be called by TelemetryClientProvider when reference count reaches zero. | ||
| */ | ||
| close(): void; | ||
| } | ||
| export default TelemetryClient; |
| "use strict"; | ||
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const IDBSQLLogger_1 = require("../contracts/IDBSQLLogger"); | ||
| /** | ||
| * Telemetry client for a specific host. | ||
| * Managed by TelemetryClientProvider with reference counting. | ||
| * One client instance is shared across all connections to the same host. | ||
| */ | ||
| class TelemetryClient { | ||
| constructor(context, host) { | ||
| this.context = context; | ||
| this.host = host; | ||
| this.closed = false; | ||
| const logger = context.getLogger(); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Created TelemetryClient for host: ${host}`); | ||
| } | ||
| /** | ||
| * Gets the host associated with this client. | ||
| */ | ||
| getHost() { | ||
| return this.host; | ||
| } | ||
| /** | ||
| * Checks if the client has been closed. | ||
| */ | ||
| isClosed() { | ||
| return this.closed; | ||
| } | ||
| /** | ||
| * Closes the telemetry client and releases resources. | ||
| * Should only be called by TelemetryClientProvider when reference count reaches zero. | ||
| */ | ||
| close() { | ||
| if (this.closed) { | ||
| return; | ||
| } | ||
| try { | ||
| this.context.getLogger().log(IDBSQLLogger_1.LogLevel.debug, `Closing TelemetryClient for host: ${this.host}`); | ||
| } | ||
| catch (_a) { | ||
| // swallow | ||
| } | ||
| finally { | ||
| this.closed = true; | ||
| } | ||
| } | ||
| } | ||
| exports.default = TelemetryClient; | ||
| //# sourceMappingURL=TelemetryClient.js.map |
| {"version":3,"file":"TelemetryClient.js","sourceRoot":"","sources":["../../lib/telemetry/TelemetryClient.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAGH,4DAAqD;AAErD;;;;GAIG;AACH,MAAM,eAAe;IAGnB,YAAoB,OAAuB,EAAU,IAAY;QAA7C,YAAO,GAAP,OAAO,CAAgB;QAAU,SAAI,GAAJ,IAAI,CAAQ;QAFzD,WAAM,GAAY,KAAK,CAAC;QAG9B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,uBAAQ,CAAC,KAAK,EAAE,qCAAqC,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO;SACR;QACD,IAAI;YACF,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,uBAAQ,CAAC,KAAK,EAAE,qCAAqC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;SAChG;QAAC,WAAM;YACN,UAAU;SACX;gBAAS;YACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;SACpB;IACH,CAAC;CACF;AAED,kBAAe,eAAe,CAAC"} |
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| import IClientContext from '../contracts/IClientContext'; | ||
| import TelemetryClient from './TelemetryClient'; | ||
| /** | ||
| * Manages one telemetry client per host. | ||
| * Prevents rate limiting by sharing clients across connections to the same host. | ||
| * Instance-based (not singleton), stored in DBSQLClient. | ||
| * | ||
| * Reference counts are incremented and decremented synchronously, and | ||
| * `close()` is sync today, so there is no await between map mutation and | ||
| * client teardown. The map entry is removed before `close()` runs so a | ||
| * concurrent `getOrCreateClient` call for the same host gets a fresh | ||
| * instance rather than receiving this closing one. When `close()` becomes | ||
| * async (e.g. HTTP flush in [5/7]) the flow will need to `await` after the | ||
| * delete to preserve the same invariant. | ||
| */ | ||
| declare class TelemetryClientProvider { | ||
| private context; | ||
| private clients; | ||
| private softLimitWarned; | ||
| constructor(context: IClientContext); | ||
| /** | ||
| * Canonicalize host so aliases (scheme, default port, trailing slash, case, | ||
| * trailing dot, surrounding whitespace) map to the same entry. Kept to a | ||
| * lightweight lexical normalization — `buildTelemetryUrl` still performs | ||
| * the strict security validation when a request is actually built. | ||
| */ | ||
| private static normalizeHostKey; | ||
| /** | ||
| * Gets or creates a telemetry client for the specified host. | ||
| * Increments the reference count for the client. | ||
| * | ||
| * @param host The host identifier (e.g., "workspace.cloud.databricks.com") | ||
| * @returns The telemetry client for the host | ||
| */ | ||
| getOrCreateClient(host: string): TelemetryClient; | ||
| /** | ||
| * Releases a telemetry client for the specified host. | ||
| * Decrements the reference count and closes the client when it reaches zero. | ||
| * | ||
| * @param host The host identifier | ||
| */ | ||
| releaseClient(host: string): void; | ||
| /** | ||
| * @internal Exposed for testing only. | ||
| */ | ||
| getRefCount(host: string): number; | ||
| /** | ||
| * @internal Exposed for testing only. | ||
| */ | ||
| getActiveClients(): Map<string, TelemetryClient>; | ||
| } | ||
| export default TelemetryClientProvider; |
| "use strict"; | ||
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const IDBSQLLogger_1 = require("../contracts/IDBSQLLogger"); | ||
| const TelemetryClient_1 = __importDefault(require("./TelemetryClient")); | ||
| // Soft cap on distinct host entries. Above this the provider warns once so a | ||
| // misconfigured caller (per-request hosts, unnormalized aliases) is visible in | ||
| // logs rather than silently growing the map. | ||
| const MAX_CLIENTS_SOFT_LIMIT = 128; | ||
| /** | ||
| * Manages one telemetry client per host. | ||
| * Prevents rate limiting by sharing clients across connections to the same host. | ||
| * Instance-based (not singleton), stored in DBSQLClient. | ||
| * | ||
| * Reference counts are incremented and decremented synchronously, and | ||
| * `close()` is sync today, so there is no await between map mutation and | ||
| * client teardown. The map entry is removed before `close()` runs so a | ||
| * concurrent `getOrCreateClient` call for the same host gets a fresh | ||
| * instance rather than receiving this closing one. When `close()` becomes | ||
| * async (e.g. HTTP flush in [5/7]) the flow will need to `await` after the | ||
| * delete to preserve the same invariant. | ||
| */ | ||
| class TelemetryClientProvider { | ||
| constructor(context) { | ||
| this.context = context; | ||
| this.softLimitWarned = false; | ||
| this.clients = new Map(); | ||
| const logger = context.getLogger(); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, 'Created TelemetryClientProvider'); | ||
| } | ||
| /** | ||
| * Canonicalize host so aliases (scheme, default port, trailing slash, case, | ||
| * trailing dot, surrounding whitespace) map to the same entry. Kept to a | ||
| * lightweight lexical normalization — `buildTelemetryUrl` still performs | ||
| * the strict security validation when a request is actually built. | ||
| */ | ||
| static normalizeHostKey(host) { | ||
| return host | ||
| .trim() | ||
| .toLowerCase() | ||
| .replace(/^https?:\/\//, '') | ||
| .replace(/\/+$/, '') | ||
| .replace(/\.$/, '') | ||
| .replace(/:443$/, ''); | ||
| } | ||
| /** | ||
| * Gets or creates a telemetry client for the specified host. | ||
| * Increments the reference count for the client. | ||
| * | ||
| * @param host The host identifier (e.g., "workspace.cloud.databricks.com") | ||
| * @returns The telemetry client for the host | ||
| */ | ||
| getOrCreateClient(host) { | ||
| const logger = this.context.getLogger(); | ||
| const key = TelemetryClientProvider.normalizeHostKey(host); | ||
| let holder = this.clients.get(key); | ||
| if (!holder) { | ||
| const client = new TelemetryClient_1.default(this.context, key); | ||
| holder = { | ||
| client, | ||
| refCount: 0, | ||
| }; | ||
| this.clients.set(key, holder); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Created new TelemetryClient for host: ${host}`); | ||
| if (!this.softLimitWarned && this.clients.size > MAX_CLIENTS_SOFT_LIMIT) { | ||
| this.softLimitWarned = true; | ||
| logger.log(IDBSQLLogger_1.LogLevel.warn, `TelemetryClientProvider has ${this.clients.size} distinct hosts — possible alias or leak`); | ||
| } | ||
| } | ||
| holder.refCount += 1; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `TelemetryClient reference count for ${host}: ${holder.refCount}`); | ||
| return holder.client; | ||
| } | ||
| /** | ||
| * Releases a telemetry client for the specified host. | ||
| * Decrements the reference count and closes the client when it reaches zero. | ||
| * | ||
| * @param host The host identifier | ||
| */ | ||
| releaseClient(host) { | ||
| const logger = this.context.getLogger(); | ||
| const key = TelemetryClientProvider.normalizeHostKey(host); | ||
| const holder = this.clients.get(key); | ||
| if (!holder) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `No TelemetryClient found for host: ${host}`); | ||
| return; | ||
| } | ||
| // Guard against double-release: a caller releasing more times than it got | ||
| // would otherwise drive refCount negative and close a client another | ||
| // caller is still holding. Warn loudly and refuse to decrement further. | ||
| if (holder.refCount <= 0) { | ||
| logger.log(IDBSQLLogger_1.LogLevel.warn, `Unbalanced release for TelemetryClient host: ${host}`); | ||
| return; | ||
| } | ||
| holder.refCount -= 1; | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `TelemetryClient reference count for ${host}: ${holder.refCount}`); | ||
| // Close and remove client when reference count reaches zero. | ||
| // Remove from map before calling close so a concurrent getOrCreateClient | ||
| // creates a fresh client rather than receiving this closing one. | ||
| if (holder.refCount <= 0) { | ||
| this.clients.delete(key); | ||
| try { | ||
| holder.client.close(); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Closed and removed TelemetryClient for host: ${host}`); | ||
| } | ||
| catch (error) { | ||
| const msg = error instanceof Error ? error.message : String(error); | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Error releasing TelemetryClient: ${msg}`); | ||
| } | ||
| } | ||
| } | ||
| /** | ||
| * @internal Exposed for testing only. | ||
| */ | ||
| getRefCount(host) { | ||
| const holder = this.clients.get(TelemetryClientProvider.normalizeHostKey(host)); | ||
| return holder ? holder.refCount : 0; | ||
| } | ||
| /** | ||
| * @internal Exposed for testing only. | ||
| */ | ||
| getActiveClients() { | ||
| const result = new Map(); | ||
| for (const [host, holder] of this.clients.entries()) { | ||
| result.set(host, holder.client); | ||
| } | ||
| return result; | ||
| } | ||
| } | ||
| exports.default = TelemetryClientProvider; | ||
| //# sourceMappingURL=TelemetryClientProvider.js.map |
| {"version":3,"file":"TelemetryClientProvider.js","sourceRoot":"","sources":["../../lib/telemetry/TelemetryClientProvider.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| /// <reference types="node" /> | ||
| import { EventEmitter } from 'events'; | ||
| import IClientContext from '../contracts/IClientContext'; | ||
| import { DriverConfiguration } from './types'; | ||
| /** | ||
| * EventEmitter for driver telemetry. | ||
| * Emits events at key driver operations. | ||
| * | ||
| * CRITICAL REQUIREMENT: ALL exceptions must be caught and logged at LogLevel.debug ONLY | ||
| * (never warn/error) to avoid customer anxiety. NO console logging allowed - only IDBSQLLogger. | ||
| * | ||
| * All emit methods are wrapped in try-catch blocks that swallow exceptions completely. | ||
| * Event emission respects the telemetryEnabled flag from context config. | ||
| */ | ||
| export default class TelemetryEventEmitter extends EventEmitter { | ||
| private context; | ||
| private enabled; | ||
| constructor(context: IClientContext); | ||
| /** | ||
| * Emit a connection open event. | ||
| * | ||
| * @param data Connection event data including sessionId, workspaceId, and driverConfig | ||
| */ | ||
| emitConnectionOpen(data: { | ||
| sessionId: string; | ||
| workspaceId: string; | ||
| driverConfig: DriverConfiguration; | ||
| }): void; | ||
| /** | ||
| * Emit a statement start event. | ||
| * | ||
| * @param data Statement start data including statementId, sessionId, and operationType | ||
| */ | ||
| emitStatementStart(data: { | ||
| statementId: string; | ||
| sessionId: string; | ||
| operationType?: string; | ||
| }): void; | ||
| /** | ||
| * Emit a statement complete event. | ||
| * | ||
| * @param data Statement completion data including latency, result format, and metrics | ||
| */ | ||
| emitStatementComplete(data: { | ||
| statementId: string; | ||
| sessionId: string; | ||
| latencyMs?: number; | ||
| resultFormat?: string; | ||
| chunkCount?: number; | ||
| bytesDownloaded?: number; | ||
| pollCount?: number; | ||
| }): void; | ||
| /** | ||
| * Emit a CloudFetch chunk download event. | ||
| * | ||
| * @param data CloudFetch chunk data including chunk index, latency, bytes, and compression | ||
| */ | ||
| emitCloudFetchChunk(data: { | ||
| statementId: string; | ||
| chunkIndex: number; | ||
| latencyMs?: number; | ||
| bytes: number; | ||
| compressed?: boolean; | ||
| }): void; | ||
| /** | ||
| * Emit an error event. | ||
| * | ||
| * @param data Error event data including error details and terminal status | ||
| */ | ||
| emitError(data: { | ||
| statementId?: string; | ||
| sessionId?: string; | ||
| errorName: string; | ||
| errorMessage: string; | ||
| errorStack?: string; | ||
| isTerminal: boolean; | ||
| }): void; | ||
| } |
| "use strict"; | ||
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const events_1 = require("events"); | ||
| const IDBSQLLogger_1 = require("../contracts/IDBSQLLogger"); | ||
| const types_1 = require("./types"); | ||
| /** | ||
| * EventEmitter for driver telemetry. | ||
| * Emits events at key driver operations. | ||
| * | ||
| * CRITICAL REQUIREMENT: ALL exceptions must be caught and logged at LogLevel.debug ONLY | ||
| * (never warn/error) to avoid customer anxiety. NO console logging allowed - only IDBSQLLogger. | ||
| * | ||
| * All emit methods are wrapped in try-catch blocks that swallow exceptions completely. | ||
| * Event emission respects the telemetryEnabled flag from context config. | ||
| */ | ||
| class TelemetryEventEmitter extends events_1.EventEmitter { | ||
| constructor(context) { | ||
| var _a; | ||
| super(); | ||
| this.context = context; | ||
| // Check if telemetry is enabled from config | ||
| // Default to false for safe rollout | ||
| const config = context.getConfig(); | ||
| this.enabled = (_a = config.telemetryEnabled) !== null && _a !== void 0 ? _a : false; | ||
| } | ||
| /** | ||
| * Emit a connection open event. | ||
| * | ||
| * @param data Connection event data including sessionId, workspaceId, and driverConfig | ||
| */ | ||
| emitConnectionOpen(data) { | ||
| if (!this.enabled) | ||
| return; | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| const event = { | ||
| eventType: types_1.TelemetryEventType.CONNECTION_OPEN, | ||
| timestamp: Date.now(), | ||
| sessionId: data.sessionId, | ||
| workspaceId: data.workspaceId, | ||
| driverConfig: data.driverConfig, | ||
| }; | ||
| this.emit(types_1.TelemetryEventType.CONNECTION_OPEN, event); | ||
| } | ||
| catch (error) { | ||
| // Swallow all exceptions - log at debug level only | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Error emitting connection event: ${error.message}`); | ||
| } | ||
| } | ||
| /** | ||
| * Emit a statement start event. | ||
| * | ||
| * @param data Statement start data including statementId, sessionId, and operationType | ||
| */ | ||
| emitStatementStart(data) { | ||
| if (!this.enabled) | ||
| return; | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| const event = { | ||
| eventType: types_1.TelemetryEventType.STATEMENT_START, | ||
| timestamp: Date.now(), | ||
| statementId: data.statementId, | ||
| sessionId: data.sessionId, | ||
| operationType: data.operationType, | ||
| }; | ||
| this.emit(types_1.TelemetryEventType.STATEMENT_START, event); | ||
| } | ||
| catch (error) { | ||
| // Swallow all exceptions - log at debug level only | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Error emitting statement start: ${error.message}`); | ||
| } | ||
| } | ||
| /** | ||
| * Emit a statement complete event. | ||
| * | ||
| * @param data Statement completion data including latency, result format, and metrics | ||
| */ | ||
| emitStatementComplete(data) { | ||
| if (!this.enabled) | ||
| return; | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| const event = { | ||
| eventType: types_1.TelemetryEventType.STATEMENT_COMPLETE, | ||
| timestamp: Date.now(), | ||
| statementId: data.statementId, | ||
| sessionId: data.sessionId, | ||
| latencyMs: data.latencyMs, | ||
| resultFormat: data.resultFormat, | ||
| chunkCount: data.chunkCount, | ||
| bytesDownloaded: data.bytesDownloaded, | ||
| pollCount: data.pollCount, | ||
| }; | ||
| this.emit(types_1.TelemetryEventType.STATEMENT_COMPLETE, event); | ||
| } | ||
| catch (error) { | ||
| // Swallow all exceptions - log at debug level only | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Error emitting statement complete: ${error.message}`); | ||
| } | ||
| } | ||
| /** | ||
| * Emit a CloudFetch chunk download event. | ||
| * | ||
| * @param data CloudFetch chunk data including chunk index, latency, bytes, and compression | ||
| */ | ||
| emitCloudFetchChunk(data) { | ||
| if (!this.enabled) | ||
| return; | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| const event = { | ||
| eventType: types_1.TelemetryEventType.CLOUDFETCH_CHUNK, | ||
| timestamp: Date.now(), | ||
| statementId: data.statementId, | ||
| chunkIndex: data.chunkIndex, | ||
| latencyMs: data.latencyMs, | ||
| bytes: data.bytes, | ||
| compressed: data.compressed, | ||
| }; | ||
| this.emit(types_1.TelemetryEventType.CLOUDFETCH_CHUNK, event); | ||
| } | ||
| catch (error) { | ||
| // Swallow all exceptions - log at debug level only | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Error emitting cloudfetch chunk: ${error.message}`); | ||
| } | ||
| } | ||
| /** | ||
| * Emit an error event. | ||
| * | ||
| * @param data Error event data including error details and terminal status | ||
| */ | ||
| emitError(data) { | ||
| if (!this.enabled) | ||
| return; | ||
| const logger = this.context.getLogger(); | ||
| try { | ||
| const event = { | ||
| eventType: types_1.TelemetryEventType.ERROR, | ||
| timestamp: Date.now(), | ||
| statementId: data.statementId, | ||
| sessionId: data.sessionId, | ||
| errorName: data.errorName, | ||
| errorMessage: data.errorMessage, | ||
| errorStack: data.errorStack, | ||
| isTerminal: data.isTerminal, | ||
| }; | ||
| this.emit(types_1.TelemetryEventType.ERROR, event); | ||
| } | ||
| catch (error) { | ||
| // Swallow all exceptions - log at debug level only | ||
| logger.log(IDBSQLLogger_1.LogLevel.debug, `Error emitting error event: ${error.message}`); | ||
| } | ||
| } | ||
| } | ||
| exports.default = TelemetryEventEmitter; | ||
| //# sourceMappingURL=TelemetryEventEmitter.js.map |
| {"version":3,"file":"TelemetryEventEmitter.js","sourceRoot":"","sources":["../../lib/telemetry/TelemetryEventEmitter.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| /** | ||
| * Build an HTTPS telemetry URL from a host and a path. | ||
| * | ||
| * Refuses anything beyond a bare `host[:port]` so a compromised or mistyped | ||
| * host cannot redirect the authenticated request to an attacker-controlled | ||
| * endpoint. Defeated historical bypasses include: | ||
| * - protocol-relative prefix: `//attacker.com` | ||
| * - zero-width / ASCII whitespace in the host | ||
| * - userinfo (`user:pass@host`) | ||
| * - path/query/fragment | ||
| * - CRLF (header injection on some fetch backends) | ||
| * - loopback / link-local / RFC1918 / cloud-metadata addresses | ||
| * | ||
| * Returns `null` when the host fails any check; callers drop the batch. | ||
| */ | ||
| export declare function buildTelemetryUrl(host: string, path: string): string | null; | ||
| /** | ||
| * Strips common secret shapes from a free-form error string and caps length. | ||
| * Applied before anything is shipped off-box. Redaction happens before | ||
| * truncation so a long stack cannot bury a secret past the cap; truncation | ||
| * then runs a second pass to catch anything that appeared only in the tail. | ||
| */ | ||
| export declare function redactSensitive(value: string | undefined, maxLen?: number): string; | ||
| /** | ||
| * Normalises any `HeadersInit` shape (`Headers`, `[string,string][]`, or | ||
| * `Record<string, string>`) into a plain string dictionary. Non-string | ||
| * values are dropped. Shared by the exporter and FeatureFlagCache so there | ||
| * is one source of truth for auth-header handling. | ||
| */ | ||
| export declare function normalizeHeaders(raw: unknown): Record<string, string>; | ||
| /** | ||
| * Case-insensitive check for a non-empty `Authorization` header. | ||
| */ | ||
| export declare function hasAuthorization(headers: Record<string, string>): boolean; | ||
| /** | ||
| * Returns a safe `process_name` value: the basename of the first whitespace- | ||
| * delimited token, with trailing whitespace trimmed. This defeats both the | ||
| * absolute-path PII leak (`/home/<user>/app.js`) and the argv-leak shape | ||
| * (`node --db-password=X app.js`) that some producers pass in. | ||
| */ | ||
| export declare function sanitizeProcessName(name: string | undefined): string; |
| "use strict"; | ||
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.sanitizeProcessName = exports.hasAuthorization = exports.normalizeHeaders = exports.redactSensitive = exports.buildTelemetryUrl = void 0; | ||
| /** | ||
| * Hosts we always refuse to send authenticated telemetry to. Targeted at the | ||
| * `/api/2.0/sql/telemetry-ext` exfil vector: an attacker-influenced `host` | ||
| * (env var, tampered config, etc.) must not be able to redirect the Bearer | ||
| * token to a loopback/IMDS/RFC1918 endpoint. | ||
| */ | ||
| const BLOCKED_HOST_PATTERNS = [ | ||
| /^(?:127\.|0\.|10\.|169\.254\.|172\.(?:1[6-9]|2[0-9]|3[01])\.|192\.168\.)/, | ||
| /^(?:localhost|metadata\.google\.internal|metadata\.azure\.com)$/i, | ||
| /^\[?::1\]?$/, | ||
| /^\[?(?:fc|fd)[0-9a-f]{2}:/i, | ||
| /^\[?::ffff:(?:127|10|0|169\.254)\./i, | ||
| ]; | ||
| /** | ||
| * Build an HTTPS telemetry URL from a host and a path. | ||
| * | ||
| * Refuses anything beyond a bare `host[:port]` so a compromised or mistyped | ||
| * host cannot redirect the authenticated request to an attacker-controlled | ||
| * endpoint. Defeated historical bypasses include: | ||
| * - protocol-relative prefix: `//attacker.com` | ||
| * - zero-width / ASCII whitespace in the host | ||
| * - userinfo (`user:pass@host`) | ||
| * - path/query/fragment | ||
| * - CRLF (header injection on some fetch backends) | ||
| * - loopback / link-local / RFC1918 / cloud-metadata addresses | ||
| * | ||
| * Returns `null` when the host fails any check; callers drop the batch. | ||
| */ | ||
| function buildTelemetryUrl(host, path) { | ||
| if (typeof host !== 'string' || host.length === 0) { | ||
| return null; | ||
| } | ||
| // Reject ASCII whitespace + common zero-width/BOM codepoints that JS `\s` | ||
| // does not cover but `new URL` silently strips. | ||
| if (/[\s\u200b-\u200f\u2060\ufeff]/.test(host)) { | ||
| return null; | ||
| } | ||
| const cleanHost = host.replace(/^https?:\/\//, '').replace(/\/+$/, ''); | ||
| if (cleanHost.length === 0) { | ||
| return null; | ||
| } | ||
| // Reject anything that looks like userinfo / path / protocol-relative | ||
| // prefix before URL parsing. `new URL('https://' + '//x')` would otherwise | ||
| // normalise the doubled slash and accept `x` as the host. | ||
| if (/[/\\@]/.test(cleanHost)) { | ||
| return null; | ||
| } | ||
| let parsed; | ||
| try { | ||
| parsed = new URL(`https://${cleanHost}`); | ||
| } | ||
| catch (_a) { | ||
| return null; | ||
| } | ||
| if (parsed.pathname !== '/' || | ||
| parsed.search !== '' || | ||
| parsed.hash !== '' || | ||
| parsed.username !== '' || | ||
| parsed.password !== '') { | ||
| return null; | ||
| } | ||
| // Defence in depth: ensure `new URL` did not silently rewrite the host we | ||
| // validated (e.g. by stripping a codepoint we missed above). `new URL` | ||
| // normalises away the default :443 for https, so compare using the | ||
| // port-stripped hostname instead of .host. | ||
| const expectedHost = cleanHost.toLowerCase().replace(/:443$/, ''); | ||
| const actualHost = parsed.host.toLowerCase().replace(/:443$/, ''); | ||
| if (actualHost !== expectedHost) { | ||
| return null; | ||
| } | ||
| if (BLOCKED_HOST_PATTERNS.some((r) => r.test(parsed.hostname))) { | ||
| return null; | ||
| } | ||
| return `https://${parsed.host}${path}`; | ||
| } | ||
| exports.buildTelemetryUrl = buildTelemetryUrl; | ||
| /** | ||
| * Prefixes the Databricks driver uses for internal token formats. Kept in | ||
| * sync with `lib/utils/buildUserAgentString.ts`'s `redactInternalToken`. | ||
| * Extending one list should extend the other. | ||
| */ | ||
| const DATABRICKS_TOKEN_PREFIXES = ['dkea', 'dskea', 'dapi', 'dsapi', 'dose']; | ||
| const SECRET_PATTERNS = [ | ||
| // `Authorization: Bearer <token>` / `Bearer <token>` anywhere in a stack. | ||
| [/Bearer\s+[A-Za-z0-9._\-+/=]+/gi, 'Bearer <REDACTED>'], | ||
| // `Authorization: Basic <base64>`. | ||
| [/Basic\s+[A-Za-z0-9+/=]+/gi, 'Basic <REDACTED>'], | ||
| // URL userinfo: `https://user:pass@host/…`. | ||
| [/([a-z][a-z0-9+.-]*:\/\/)[^/\s:@]+:[^/\s@]+@/gi, '$1<REDACTED>@'], | ||
| // Databricks PATs / service-token prefixes without `Bearer`, e.g. | ||
| // `token is dapi0123…` — appears in error stacks that echo the raw value. | ||
| [new RegExp(`\\b(?:${DATABRICKS_TOKEN_PREFIXES.join('|')})[A-Za-z0-9]{8,}`, 'g'), '<REDACTED>'], | ||
| // JWTs (three base64url segments separated by dots). | ||
| [/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g, '<REDACTED_JWT>'], | ||
| // JSON-encoded secrets: `"client_secret":"..."`, `"access_token":"..."` etc. | ||
| [ | ||
| /"(password|token|client_secret|refresh_token|access_token|id_token|secret|api[_-]?key|apikey)"\s*:\s*"[^"]*"/gi, | ||
| '"$1":"<REDACTED>"', | ||
| ], | ||
| // Form-URL-encoded / key=value secrets. | ||
| [ | ||
| /\b(token|password|client_secret|refresh_token|access_token|id_token|secret|api[_-]?key|apikey)=[^\s&"']+/gi, | ||
| '$1=<REDACTED>', | ||
| ], | ||
| ]; | ||
| /** | ||
| * Strips common secret shapes from a free-form error string and caps length. | ||
| * Applied before anything is shipped off-box. Redaction happens before | ||
| * truncation so a long stack cannot bury a secret past the cap; truncation | ||
| * then runs a second pass to catch anything that appeared only in the tail. | ||
| */ | ||
| function redactSensitive(value, maxLen = 2048) { | ||
| if (!value) { | ||
| return ''; | ||
| } | ||
| let redacted = value; | ||
| for (const [pattern, replacement] of SECRET_PATTERNS) { | ||
| redacted = redacted.replace(pattern, replacement); | ||
| } | ||
| if (redacted.length > maxLen) { | ||
| redacted = `${redacted.slice(0, maxLen)}…[truncated]`; | ||
| for (const [pattern, replacement] of SECRET_PATTERNS) { | ||
| redacted = redacted.replace(pattern, replacement); | ||
| } | ||
| } | ||
| return redacted; | ||
| } | ||
| exports.redactSensitive = redactSensitive; | ||
| /** | ||
| * Normalises any `HeadersInit` shape (`Headers`, `[string,string][]`, or | ||
| * `Record<string, string>`) into a plain string dictionary. Non-string | ||
| * values are dropped. Shared by the exporter and FeatureFlagCache so there | ||
| * is one source of truth for auth-header handling. | ||
| */ | ||
| function normalizeHeaders(raw) { | ||
| if (!raw || typeof raw !== 'object') { | ||
| return {}; | ||
| } | ||
| // Avoid importing node-fetch here; use structural check. | ||
| if (typeof raw.forEach === 'function' && !Array.isArray(raw)) { | ||
| const out = {}; | ||
| raw.forEach((value, key) => { | ||
| if (typeof key === 'string' && typeof value === 'string') { | ||
| out[key] = value; | ||
| } | ||
| }); | ||
| return out; | ||
| } | ||
| if (Array.isArray(raw)) { | ||
| const out = {}; | ||
| for (const entry of raw) { | ||
| if (Array.isArray(entry) && entry.length === 2 && typeof entry[0] === 'string' && typeof entry[1] === 'string') { | ||
| const [key, value] = entry; | ||
| out[key] = value; | ||
| } | ||
| } | ||
| return out; | ||
| } | ||
| const out = {}; | ||
| for (const [k, v] of Object.entries(raw)) { | ||
| if (typeof v === 'string') { | ||
| out[k] = v; | ||
| } | ||
| } | ||
| return out; | ||
| } | ||
| exports.normalizeHeaders = normalizeHeaders; | ||
| /** | ||
| * Case-insensitive check for a non-empty `Authorization` header. | ||
| */ | ||
| function hasAuthorization(headers) { | ||
| for (const key of Object.keys(headers)) { | ||
| if (key.toLowerCase() === 'authorization' && headers[key]) { | ||
| return true; | ||
| } | ||
| } | ||
| return false; | ||
| } | ||
| exports.hasAuthorization = hasAuthorization; | ||
| /** | ||
| * Returns a safe `process_name` value: the basename of the first whitespace- | ||
| * delimited token, with trailing whitespace trimmed. This defeats both the | ||
| * absolute-path PII leak (`/home/<user>/app.js`) and the argv-leak shape | ||
| * (`node --db-password=X app.js`) that some producers pass in. | ||
| */ | ||
| function sanitizeProcessName(name) { | ||
| if (!name) { | ||
| return ''; | ||
| } | ||
| const trimmed = name.trim(); | ||
| if (trimmed.length === 0) { | ||
| return ''; | ||
| } | ||
| // Drop argv tail: anything after the first whitespace — argv[0] shouldn't | ||
| // contain spaces, but producers sometimes pass `argv.join(' ')`. | ||
| const firstToken = trimmed.split(/\s/, 1)[0]; | ||
| if (!firstToken) { | ||
| return ''; | ||
| } | ||
| const lastSep = Math.max(firstToken.lastIndexOf('/'), firstToken.lastIndexOf('\\')); | ||
| return lastSep < 0 ? firstToken : firstToken.slice(lastSep + 1); | ||
| } | ||
| exports.sanitizeProcessName = sanitizeProcessName; | ||
| //# sourceMappingURL=telemetryUtils.js.map |
| {"version":3,"file":"telemetryUtils.js","sourceRoot":"","sources":["../../lib/telemetry/telemetryUtils.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| /** | ||
| * Build full URL from host and path, handling protocol correctly. | ||
| * @param host The hostname (with or without protocol) | ||
| * @param path The path to append (should start with /) | ||
| * @returns Full URL with protocol | ||
| */ | ||
| export declare function buildUrl(host: string, path: string): string; |
| "use strict"; | ||
| /** | ||
| * Copyright (c) 2025 Databricks Contributors | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.buildUrl = void 0; | ||
| /** | ||
| * Build full URL from host and path, handling protocol correctly. | ||
| * @param host The hostname (with or without protocol) | ||
| * @param path The path to append (should start with /) | ||
| * @returns Full URL with protocol | ||
| */ | ||
| // eslint-disable-next-line import/prefer-default-export | ||
| function buildUrl(host, path) { | ||
| // Check if host already has protocol | ||
| if (host.startsWith('http://') || host.startsWith('https://')) { | ||
| return `${host}${path}`; | ||
| } | ||
| // Add https:// if no protocol present | ||
| return `https://${host}${path}`; | ||
| } | ||
| exports.buildUrl = buildUrl; | ||
| //# sourceMappingURL=urlUtils.js.map |
| {"version":3,"file":"urlUtils.js","sourceRoot":"","sources":["../../lib/telemetry/urlUtils.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH;;;;;GAKG;AACH,wDAAwD;AACxD,SAAgB,QAAQ,CAAC,IAAY,EAAE,IAAY;IACjD,qCAAqC;IACrC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;QAC7D,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;KACzB;IACD,sCAAsC;IACtC,OAAO,WAAW,IAAI,GAAG,IAAI,EAAE,CAAC;AAClC,CAAC;AAPD,4BAOC"} |
| /** | ||
| * Detects whether the Node.js SQL driver is being invoked by an AI coding agent | ||
| * by checking for well-known environment variables that agents set in their | ||
| * spawned shell processes. | ||
| * | ||
| * Detection only succeeds when exactly one agent environment variable is present, | ||
| * to avoid ambiguous attribution when multiple agent environments overlap. | ||
| * | ||
| * Adding a new agent requires only a new entry in `knownAgents`. | ||
| * | ||
| * References for each environment variable: | ||
| * - ANTIGRAVITY_AGENT: Closed source. Google Antigravity sets this variable. | ||
| * - CLAUDECODE: https://github.com/anthropics/claude-code (sets CLAUDECODE=1) | ||
| * - CLINE_ACTIVE: https://github.com/cline/cline (shipped in v3.24.0) | ||
| * - CODEX_CI: https://github.com/openai/codex (part of UNIFIED_EXEC_ENV array in codex-rs) | ||
| * - CURSOR_AGENT: Closed source. Referenced in a gist by johnlindquist. | ||
| * - GEMINI_CLI: https://google-gemini.github.io/gemini-cli/docs/tools/shell.html (sets GEMINI_CLI=1) | ||
| * - OPENCODE: https://github.com/opencode-ai/opencode (sets OPENCODE=1) | ||
| */ | ||
| export default function detectAgent(env?: Record<string, string | undefined>): string; |
| "use strict"; | ||
| /** | ||
| * Detects whether the Node.js SQL driver is being invoked by an AI coding agent | ||
| * by checking for well-known environment variables that agents set in their | ||
| * spawned shell processes. | ||
| * | ||
| * Detection only succeeds when exactly one agent environment variable is present, | ||
| * to avoid ambiguous attribution when multiple agent environments overlap. | ||
| * | ||
| * Adding a new agent requires only a new entry in `knownAgents`. | ||
| * | ||
| * References for each environment variable: | ||
| * - ANTIGRAVITY_AGENT: Closed source. Google Antigravity sets this variable. | ||
| * - CLAUDECODE: https://github.com/anthropics/claude-code (sets CLAUDECODE=1) | ||
| * - CLINE_ACTIVE: https://github.com/cline/cline (shipped in v3.24.0) | ||
| * - CODEX_CI: https://github.com/openai/codex (part of UNIFIED_EXEC_ENV array in codex-rs) | ||
| * - CURSOR_AGENT: Closed source. Referenced in a gist by johnlindquist. | ||
| * - GEMINI_CLI: https://google-gemini.github.io/gemini-cli/docs/tools/shell.html (sets GEMINI_CLI=1) | ||
| * - OPENCODE: https://github.com/opencode-ai/opencode (sets OPENCODE=1) | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const knownAgents = [ | ||
| { envVar: 'ANTIGRAVITY_AGENT', product: 'antigravity' }, | ||
| { envVar: 'CLAUDECODE', product: 'claude-code' }, | ||
| { envVar: 'CLINE_ACTIVE', product: 'cline' }, | ||
| { envVar: 'CODEX_CI', product: 'codex' }, | ||
| { envVar: 'CURSOR_AGENT', product: 'cursor' }, | ||
| { envVar: 'GEMINI_CLI', product: 'gemini-cli' }, | ||
| { envVar: 'OPENCODE', product: 'opencode' }, | ||
| ]; | ||
| function detectAgent(env = process.env) { | ||
| const detected = knownAgents.filter((a) => env[a.envVar]).map((a) => a.product); | ||
| if (detected.length === 1) { | ||
| return detected[0]; | ||
| } | ||
| return ''; | ||
| } | ||
| exports.default = detectAgent; | ||
| //# sourceMappingURL=agentDetector.js.map |
| {"version":3,"file":"agentDetector.js","sourceRoot":"","sources":["../../lib/utils/agentDetector.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;AAEH,MAAM,WAAW,GAA+C;IAC9D,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,EAAE;IACvD,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE;IAChD,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE;IAC5C,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE;IACxC,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE;IAC7C,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE;IAC/C,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE;CAC5C,CAAC;AAEF,SAAwB,WAAW,CAAC,MAA0C,OAAO,CAAC,GAAG;IACvF,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEhF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;KACpB;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAPD,8BAOC"} |
| /** | ||
| * Serializes a query tags dictionary into a string for use in confOverlay. | ||
| * | ||
| * Format: comma-separated key:value pairs, e.g. "key1:value1,key2:value2" | ||
| * - If a value is null or undefined, the key is included without a colon or value | ||
| * - Backslashes in keys are escaped; other special characters in keys are not escaped | ||
| * - Special characters (backslash, colon, comma) in values are backslash-escaped | ||
| * | ||
| * @param queryTags - dictionary of query tag key-value pairs | ||
| * @returns serialized string, or undefined if input is empty/null/undefined | ||
| */ | ||
| export default function serializeQueryTags(queryTags: Record<string, string | null | undefined> | null | undefined): string | undefined; |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| /** | ||
| * Serializes a query tags dictionary into a string for use in confOverlay. | ||
| * | ||
| * Format: comma-separated key:value pairs, e.g. "key1:value1,key2:value2" | ||
| * - If a value is null or undefined, the key is included without a colon or value | ||
| * - Backslashes in keys are escaped; other special characters in keys are not escaped | ||
| * - Special characters (backslash, colon, comma) in values are backslash-escaped | ||
| * | ||
| * @param queryTags - dictionary of query tag key-value pairs | ||
| * @returns serialized string, or undefined if input is empty/null/undefined | ||
| */ | ||
| function serializeQueryTags(queryTags) { | ||
| if (queryTags == null) { | ||
| return undefined; | ||
| } | ||
| const keys = Object.keys(queryTags); | ||
| if (keys.length === 0) { | ||
| return undefined; | ||
| } | ||
| return keys | ||
| .map((key) => { | ||
| const escapedKey = key.replace(/\\/g, '\\\\'); | ||
| const value = queryTags[key]; | ||
| if (value == null) { | ||
| return escapedKey; | ||
| } | ||
| const escapedValue = value.replace(/[\\:,]/g, (c) => `\\${c}`); | ||
| return `${escapedKey}:${escapedValue}`; | ||
| }) | ||
| .join(','); | ||
| } | ||
| exports.default = serializeQueryTags; | ||
| //# sourceMappingURL=queryTags.js.map |
| {"version":3,"file":"queryTags.js","sourceRoot":"","sources":["../../lib/utils/queryTags.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;GAUG;AACH,SAAwB,kBAAkB,CACxC,SAAuE;IAEvE,IAAI,SAAS,IAAI,IAAI,EAAE;QACrB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,OAAO,UAAU,CAAC;SACnB;QACD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,GAAG,UAAU,IAAI,YAAY,EAAE,CAAC;IACzC,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAvBD,qCAuBC"} |
@@ -24,5 +24,12 @@ import IDBSQLLogger from './IDBSQLLogger'; | ||
| telemetryMaxRetries?: number; | ||
| telemetryBackoffBaseMs?: number; | ||
| telemetryBackoffMaxMs?: number; | ||
| telemetryBackoffJitterMs?: number; | ||
| telemetryAuthenticatedExport?: boolean; | ||
| telemetryCircuitBreakerThreshold?: number; | ||
| telemetryCircuitBreakerTimeout?: number; | ||
| telemetryMaxPendingMetrics?: number; | ||
| telemetryMaxErrorsPerStatement?: number; | ||
| telemetryStatementTtlMs?: number; | ||
| userAgentEntry?: string; | ||
| } | ||
@@ -29,0 +36,0 @@ export default interface IClientContext { |
@@ -55,2 +55,8 @@ import IDBSQLLogger from './IDBSQLLogger'; | ||
| }; | ||
| /** | ||
| * Session-level query tags as key-value pairs. Serialized and passed via session configuration | ||
| * as "QUERY_TAGS". Values may be null/undefined to include a key without a value. | ||
| * If both queryTags and configuration.QUERY_TAGS are specified, queryTags takes precedence. | ||
| */ | ||
| queryTags?: Record<string, string | null | undefined>; | ||
| } | ||
@@ -57,0 +63,0 @@ export default interface IDBSQLClient { |
@@ -23,2 +23,8 @@ import Int64 from 'node-int64'; | ||
| ordinalParameters?: Array<DBSQLParameter | DBSQLParameterValue>; | ||
| /** | ||
| * Per-statement query tags as key-value pairs. Serialized and passed via confOverlay | ||
| * as "query_tags". Values may be null/undefined to include a key without a value. | ||
| * These tags apply only to this statement and do not persist across queries. | ||
| */ | ||
| queryTags?: Record<string, string | null | undefined>; | ||
| }; | ||
@@ -25,0 +31,0 @@ export type TypeInfoRequest = { |
@@ -60,2 +60,10 @@ /// <reference types="node" /> | ||
| getDriver(): Promise<IDriver>; | ||
| /** | ||
| * Returns the authentication provider associated with this client, if any. | ||
| * Intended for internal telemetry/feature-flag call sites that need to | ||
| * obtain auth headers directly without routing through `IClientContext`. | ||
| * | ||
| * @internal Not part of the public API. May change without notice. | ||
| */ | ||
| getAuthProvider(): IAuthentication | undefined; | ||
| } |
+25
-0
@@ -185,2 +185,7 @@ "use strict"; | ||
| } | ||
| // Persist userAgentEntry so telemetry and feature-flag call sites reuse | ||
| // the same value as the primary Thrift connection's User-Agent. | ||
| if (options.userAgentEntry !== undefined) { | ||
| this.config.userAgentEntry = options.userAgentEntry; | ||
| } | ||
| this.authProvider = this.createAuthProvider(options, authProvider); | ||
@@ -231,2 +236,12 @@ this.connectionProvider = this.createConnectionProvider(options); | ||
| } | ||
| // Serialize queryTags dict and set in configuration; takes precedence over configuration.QUERY_TAGS | ||
| if (request.queryTags !== undefined) { | ||
| const serialized = (0, utils_1.serializeQueryTags)(request.queryTags); | ||
| if (serialized) { | ||
| configuration.QUERY_TAGS = serialized; | ||
| } | ||
| else { | ||
| delete configuration.QUERY_TAGS; | ||
| } | ||
| } | ||
| const response = await this.driver.openSession({ | ||
@@ -280,4 +295,14 @@ client_protocol_i64: new node_int64_1.default(TCLIService_types_1.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8), | ||
| } | ||
| /** | ||
| * Returns the authentication provider associated with this client, if any. | ||
| * Intended for internal telemetry/feature-flag call sites that need to | ||
| * obtain auth headers directly without routing through `IClientContext`. | ||
| * | ||
| * @internal Not part of the public API. May change without notice. | ||
| */ | ||
| getAuthProvider() { | ||
| return this.authProvider; | ||
| } | ||
| } | ||
| exports.default = DBSQLClient; | ||
| //# sourceMappingURL=DBSQLClient.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"DBSQLClient.js","sourceRoot":"","sources":["../lib/DBSQLClient.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"DBSQLClient.js","sourceRoot":"","sources":["../lib/DBSQLClient.ts"],"names":[],"mappings":"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"} |
@@ -184,2 +184,6 @@ "use strict"; | ||
| } | ||
| const serializedQueryTags = (0, utils_1.serializeQueryTags)(options.queryTags); | ||
| if (serializedQueryTags !== undefined) { | ||
| request.confOverlay = { ...request.confOverlay, query_tags: serializedQueryTags }; | ||
| } | ||
| if (utils_1.ProtocolVersion.supportsCloudFetch(this.serverProtocolVersion)) { | ||
@@ -186,0 +190,0 @@ request.canDownloadResult = (_a = options.useCloudFetch) !== null && _a !== void 0 ? _a : clientConfig.useCloudFetch; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"DBSQLSession.js","sourceRoot":"","sources":["../lib/DBSQLSession.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"DBSQLSession.js","sourceRoot":"","sources":["../lib/DBSQLSession.ts"],"names":[],"mappings":"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"} |
+2
-0
@@ -15,2 +15,4 @@ import './polyfills'; | ||
| export type { default as ITokenProvider } from './connection/auth/tokenProvider/ITokenProvider'; | ||
| export { CircuitBreakerOpenError, CIRCUIT_BREAKER_OPEN_CODE } from './telemetry/CircuitBreaker'; | ||
| export { TelemetryTerminalError } from './telemetry/DatabricksTelemetryExporter'; | ||
| export declare const auth: { | ||
@@ -17,0 +19,0 @@ PlainHttpAuthentication: typeof PlainHttpAuthentication; |
+8
-1
@@ -6,3 +6,3 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.LogLevel = exports.DBSQLLogger = exports.DBSQLParameterType = exports.DBSQLParameter = exports.DBSQLSession = exports.DBSQLClient = exports.utils = exports.thrift = exports.connections = exports.TProtocolExceptionType = exports.TProtocolException = exports.TApplicationExceptionType = exports.TApplicationException = exports.TException = exports.auth = void 0; | ||
| exports.LogLevel = exports.DBSQLLogger = exports.DBSQLParameterType = exports.DBSQLParameter = exports.DBSQLSession = exports.DBSQLClient = exports.utils = exports.thrift = exports.connections = exports.TProtocolExceptionType = exports.TProtocolException = exports.TApplicationExceptionType = exports.TApplicationException = exports.TException = exports.auth = exports.TelemetryTerminalError = exports.CIRCUIT_BREAKER_OPEN_CODE = exports.CircuitBreakerOpenError = void 0; | ||
| // Don't move this import - it should be placed before any other | ||
@@ -28,2 +28,9 @@ require("./polyfills"); | ||
| Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return IDBSQLLogger_1.LogLevel; } }); | ||
| // Re-export telemetry error classes so consumers can instanceof-check rather | ||
| // than string-matching error messages. | ||
| var CircuitBreaker_1 = require("./telemetry/CircuitBreaker"); | ||
| Object.defineProperty(exports, "CircuitBreakerOpenError", { enumerable: true, get: function () { return CircuitBreaker_1.CircuitBreakerOpenError; } }); | ||
| Object.defineProperty(exports, "CIRCUIT_BREAKER_OPEN_CODE", { enumerable: true, get: function () { return CircuitBreaker_1.CIRCUIT_BREAKER_OPEN_CODE; } }); | ||
| var DatabricksTelemetryExporter_1 = require("./telemetry/DatabricksTelemetryExporter"); | ||
| Object.defineProperty(exports, "TelemetryTerminalError", { enumerable: true, get: function () { return DatabricksTelemetryExporter_1.TelemetryTerminalError; } }); | ||
| exports.auth = { | ||
@@ -30,0 +37,0 @@ PlainHttpAuthentication: PlainHttpAuthentication_1.default, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAgE;AAChE,uBAAqB;AAErB,mCAAgC;AAChC,wEAAgD;AAChD,oFAA4D;AAC5D,gEAAwC;AA+C/B,sBA/CF,qBAAW,CA+CE;AA9CpB,kEAA0C;AA8CpB,uBA9Cf,sBAAY,CA8Ce;AA7ClC,qDAAsE;AA6ClC,+FA7C3B,+BAAc,OA6C2B;AAAE,mGA7C3B,mCAAkB,OA6C2B;AA5CtE,gEAAwC;AA4CgC,sBA5CjE,qBAAW,CA4CiE;AA3CnF,wGAAgF;AAChF,mEAMyC;AACzC,6FAAqE;AACrE,mCAAyC;AACzC,2DAAoD;AAiCiC,yFAjC5E,uBAAQ,OAiC4E;AA5BhF,QAAA,IAAI,GAAG;IAClB,uBAAuB,EAAvB,iCAAuB;IACvB,mDAAmD;IACnD,KAAK,EAAL,qBAAK;IACL,mBAAmB,EAAnB,mCAAmB;IACnB,qBAAqB,EAArB,qCAAqB;IACrB,mBAAmB,EAAnB,mCAAmB;IACnB,kBAAkB,EAAlB,kCAAkB;CACnB,CAAC;AAEF,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,GAChH,eAAM,CAAC;AAEA,gCAAU;AAAE,sDAAqB;AAAE,8DAAyB;AAAE,gDAAkB;AAAE,wDAAsB;AAEpG,QAAA,WAAW,GAAG;IACzB,cAAc,EAAd,wBAAc;CACf,CAAC;AAEW,QAAA,MAAM,GAAG;IACpB,WAAW,EAAX,qBAAW;IACX,iBAAiB,EAAjB,2BAAiB;CAClB,CAAC;AAEW,QAAA,KAAK,GAAG;IACnB,cAAc,EAAd,sBAAc;CACf,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAgE;AAChE,uBAAqB;AAErB,mCAAgC;AAChC,wEAAgD;AAChD,oFAA4D;AAC5D,gEAAwC;AAoD/B,sBApDF,qBAAW,CAoDE;AAnDpB,kEAA0C;AAmDpB,uBAnDf,sBAAY,CAmDe;AAlDlC,qDAAsE;AAkDlC,+FAlD3B,+BAAc,OAkD2B;AAAE,mGAlD3B,mCAAkB,OAkD2B;AAjDtE,gEAAwC;AAiDgC,sBAjDjE,qBAAW,CAiDiE;AAhDnF,wGAAgF;AAChF,mEAMyC;AACzC,6FAAqE;AACrE,mCAAyC;AACzC,2DAAoD;AAsCiC,yFAtC5E,uBAAQ,OAsC4E;AAjC7F,6EAA6E;AAC7E,uCAAuC;AACvC,6DAAgG;AAAvF,yHAAA,uBAAuB,OAAA;AAAE,2HAAA,yBAAyB,OAAA;AAC3D,uFAAiF;AAAxE,qIAAA,sBAAsB,OAAA;AAElB,QAAA,IAAI,GAAG;IAClB,uBAAuB,EAAvB,iCAAuB;IACvB,mDAAmD;IACnD,KAAK,EAAL,qBAAK;IACL,mBAAmB,EAAnB,mCAAmB;IACnB,qBAAqB,EAArB,qCAAqB;IACrB,mBAAmB,EAAnB,mCAAmB;IACnB,kBAAkB,EAAlB,kCAAkB;CACnB,CAAC;AAEF,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,GAChH,eAAM,CAAC;AAEA,gCAAU;AAAE,sDAAqB;AAAE,8DAAyB;AAAE,gDAAkB;AAAE,wDAAsB;AAEpG,QAAA,WAAW,GAAG;IACzB,cAAc,EAAd,wBAAc;CACf,CAAC;AAEW,QAAA,MAAM,GAAG;IACpB,WAAW,EAAX,qBAAW;IACX,iBAAiB,EAAjB,2BAAiB;CAClB,CAAC;AAEW,QAAA,KAAK,GAAG;IACnB,cAAc,EAAd,sBAAc;CACf,CAAC"} |
@@ -83,2 +83,14 @@ "use strict"; | ||
| } | ||
| // Transient network errors. Notably does NOT include `ENOTFOUND`: | ||
| // DNS "not found" usually indicates a misconfigured host, not a transient | ||
| // fault. Retrying pushes load at the resolver without any expectation of | ||
| // success; circuit-breaker failure accounting is the better response. | ||
| const errorCode = error.code; | ||
| if (errorCode === 'ECONNREFUSED' || | ||
| errorCode === 'ECONNRESET' || | ||
| errorCode === 'EHOSTUNREACH' || | ||
| errorCode === 'ETIMEDOUT' || | ||
| errorCode === 'EAI_AGAIN') { | ||
| return true; | ||
| } | ||
| // Check for HTTP status codes in error properties | ||
@@ -85,0 +97,0 @@ // Supporting both 'statusCode' and 'status' property names for flexibility |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"ExceptionClassifier.js","sourceRoot":"","sources":["../../lib/telemetry/ExceptionClassifier.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;AAEH,wFAAgE;AAChE,sEAA8C;AAE9C;;;;;;;;;GASG;AACH,MAAqB,mBAAmB;IACtC;;;;;;;;;OASG;IACH,MAAM,CAAC,UAAU,CAAC,KAAY;;QAC5B,2CAA2C;QAC3C,IAAI,KAAK,YAAY,6BAAmB,EAAE;YACxC,OAAO,IAAI,CAAC;SACb;QAED,kDAAkD;QAClD,2EAA2E;QAC3E,MAAM,UAAU,GAAG,MAAC,KAAa,CAAC,UAAU,mCAAK,KAAa,CAAC,MAAM,CAAC;QAEtE,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAClC,8BAA8B;YAC9B,6CAA6C;YAC7C,+CAA+C;YAC/C,sCAAsC;YACtC,4CAA4C;YAC5C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,CAAC;SAC7F;QAED,2CAA2C;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,WAAW,CAAC,KAAY;;QAC7B,8CAA8C;QAC9C,IAAI,KAAK,YAAY,oBAAU,EAAE;YAC/B,OAAO,IAAI,CAAC;SACb;QAED,mCAAmC;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YACtE,OAAO,IAAI,CAAC;SACb;QAED,kDAAkD;QAClD,2EAA2E;QAC3E,MAAM,UAAU,GAAG,MAAC,KAAa,CAAC,UAAU,mCAAK,KAAa,CAAC,MAAM,CAAC;QAEtE,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAClC,+BAA+B;YAC/B,0CAA0C;YAC1C,8BAA8B;YAC9B,oBAAoB;YACpB,4BAA4B;YAC5B,wBAAwB;YACxB,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,CAAC;SACnH;QAED,2CAA2C;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAvED,sCAuEC"} | ||
| {"version":3,"file":"ExceptionClassifier.js","sourceRoot":"","sources":["../../lib/telemetry/ExceptionClassifier.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;AAEH,wFAAgE;AAChE,sEAA8C;AAE9C;;;;;;;;;GASG;AACH,MAAqB,mBAAmB;IACtC;;;;;;;;;OASG;IACH,MAAM,CAAC,UAAU,CAAC,KAAY;;QAC5B,2CAA2C;QAC3C,IAAI,KAAK,YAAY,6BAAmB,EAAE;YACxC,OAAO,IAAI,CAAC;SACb;QAED,kDAAkD;QAClD,2EAA2E;QAC3E,MAAM,UAAU,GAAG,MAAC,KAAa,CAAC,UAAU,mCAAK,KAAa,CAAC,MAAM,CAAC;QAEtE,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAClC,8BAA8B;YAC9B,6CAA6C;YAC7C,+CAA+C;YAC/C,sCAAsC;YACtC,4CAA4C;YAC5C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,CAAC;SAC7F;QAED,2CAA2C;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,WAAW,CAAC,KAAY;;QAC7B,8CAA8C;QAC9C,IAAI,KAAK,YAAY,oBAAU,EAAE;YAC/B,OAAO,IAAI,CAAC;SACb;QAED,mCAAmC;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YACtE,OAAO,IAAI,CAAC;SACb;QAED,kEAAkE;QAClE,0EAA0E;QAC1E,yEAAyE;QACzE,sEAAsE;QACtE,MAAM,SAAS,GAAI,KAAa,CAAC,IAAI,CAAC;QACtC,IACE,SAAS,KAAK,cAAc;YAC5B,SAAS,KAAK,YAAY;YAC1B,SAAS,KAAK,cAAc;YAC5B,SAAS,KAAK,WAAW;YACzB,SAAS,KAAK,WAAW,EACzB;YACA,OAAO,IAAI,CAAC;SACb;QAED,kDAAkD;QAClD,2EAA2E;QAC3E,MAAM,UAAU,GAAG,MAAC,KAAa,CAAC,UAAU,mCAAK,KAAa,CAAC,MAAM,CAAC;QAEtE,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAClC,+BAA+B;YAC/B,0CAA0C;YAC1C,8BAA8B;YAC9B,oBAAoB;YACpB,4BAA4B;YAC5B,wBAAwB;YACxB,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,CAAC;SACnH;QAED,2CAA2C;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAtFD,sCAsFC"} |
@@ -17,2 +17,6 @@ /** | ||
| /** | ||
| * Driver name constant for telemetry | ||
| */ | ||
| export declare const DRIVER_NAME = "nodejs-sql-driver"; | ||
| /** | ||
| * Event types emitted by the telemetry system | ||
@@ -25,3 +29,3 @@ */ | ||
| CLOUDFETCH_CHUNK = "cloudfetch.chunk", | ||
| ERROR = "error" | ||
| ERROR = "telemetry.error" | ||
| } | ||
@@ -38,4 +42,10 @@ /** | ||
| flushIntervalMs?: number; | ||
| /** Maximum retry attempts for export */ | ||
| /** Maximum retry attempts for export (attempts *after* the initial call) */ | ||
| maxRetries?: number; | ||
| /** Minimum backoff delay in ms for retry backoff */ | ||
| backoffBaseMs?: number; | ||
| /** Maximum backoff delay in ms (includes jitter) */ | ||
| backoffMaxMs?: number; | ||
| /** Upper bound of added jitter in ms */ | ||
| backoffJitterMs?: number; | ||
| /** Whether to use authenticated export endpoint */ | ||
@@ -47,2 +57,8 @@ authenticatedExport?: boolean; | ||
| circuitBreakerTimeout?: number; | ||
| /** Maximum number of pending metrics buffered before dropping oldest */ | ||
| maxPendingMetrics?: number; | ||
| /** Maximum number of error events buffered per statement before dropping oldest */ | ||
| maxErrorsPerStatement?: number; | ||
| /** TTL in ms after which abandoned statement aggregations are evicted */ | ||
| statementTtlMs?: number; | ||
| } | ||
@@ -52,3 +68,3 @@ /** | ||
| */ | ||
| export declare const DEFAULT_TELEMETRY_CONFIG: Required<TelemetryConfiguration>; | ||
| export declare const DEFAULT_TELEMETRY_CONFIG: Readonly<Required<TelemetryConfiguration>>; | ||
| /** | ||
@@ -59,3 +75,3 @@ * Runtime telemetry event emitted by the driver | ||
| /** Type of the event */ | ||
| eventType: TelemetryEventType | string; | ||
| eventType: TelemetryEventType; | ||
| /** Timestamp when the event occurred (milliseconds since epoch) */ | ||
@@ -93,2 +109,4 @@ timestamp: number; | ||
| errorMessage?: string; | ||
| /** Stack trace, captured at emission site; redacted before export */ | ||
| errorStack?: string; | ||
| /** Whether the error is terminal (non-retryable) */ | ||
@@ -127,2 +145,4 @@ isTerminal?: boolean; | ||
| errorMessage?: string; | ||
| /** Stack trace, captured at emission site; redacted before export */ | ||
| errorStack?: string; | ||
| } | ||
@@ -143,2 +163,15 @@ /** | ||
| osVersion: string; | ||
| /** OS architecture (x64, arm64, etc.) */ | ||
| osArch: string; | ||
| /** Runtime vendor (Node.js Foundation) */ | ||
| runtimeVendor: string; | ||
| /** Locale name (e.g., en_US) */ | ||
| localeName: string; | ||
| /** Character set encoding (e.g., UTF-8) */ | ||
| charSetEncoding: string; | ||
| /** | ||
| * Process name. Producers MUST pass only a basename (no absolute path) — | ||
| * `sanitizeProcessName()` is applied at export time as a defence in depth. | ||
| */ | ||
| processName: string; | ||
| /** Whether CloudFetch is enabled */ | ||
@@ -145,0 +178,0 @@ cloudFetchEnabled: boolean; |
@@ -18,4 +18,8 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.DEFAULT_TELEMETRY_CONFIG = exports.TelemetryEventType = void 0; | ||
| exports.DEFAULT_TELEMETRY_CONFIG = exports.TelemetryEventType = exports.DRIVER_NAME = void 0; | ||
| /** | ||
| * Driver name constant for telemetry | ||
| */ | ||
| exports.DRIVER_NAME = 'nodejs-sql-driver'; | ||
| /** | ||
| * Event types emitted by the telemetry system | ||
@@ -29,3 +33,3 @@ */ | ||
| TelemetryEventType["CLOUDFETCH_CHUNK"] = "cloudfetch.chunk"; | ||
| TelemetryEventType["ERROR"] = "error"; | ||
| TelemetryEventType["ERROR"] = "telemetry.error"; | ||
| })(TelemetryEventType = exports.TelemetryEventType || (exports.TelemetryEventType = {})); | ||
@@ -35,3 +39,3 @@ /** | ||
| */ | ||
| exports.DEFAULT_TELEMETRY_CONFIG = { | ||
| exports.DEFAULT_TELEMETRY_CONFIG = Object.freeze({ | ||
| enabled: false, | ||
@@ -41,6 +45,12 @@ batchSize: 100, | ||
| maxRetries: 3, | ||
| backoffBaseMs: 100, | ||
| backoffMaxMs: 1000, | ||
| backoffJitterMs: 100, | ||
| authenticatedExport: true, | ||
| circuitBreakerThreshold: 5, | ||
| circuitBreakerTimeout: 60000, // 1 minute | ||
| }; | ||
| circuitBreakerTimeout: 60000, | ||
| maxPendingMetrics: 500, | ||
| maxErrorsPerStatement: 50, | ||
| statementTtlMs: 60 * 60 * 1000, // 1 hour | ||
| }); | ||
| //# sourceMappingURL=types.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/telemetry/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH;;GAEG;AACH,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC5B,yDAAmC,CAAA;IACnC,yDAAmC,CAAA;IACnC,+DAAyC,CAAA;IACzC,2DAAqC,CAAA;IACrC,qCAAe,CAAA;AACjB,CAAC,EANW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAM7B;AA4BD;;GAEG;AACU,QAAA,wBAAwB,GAAqC;IACxE,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,GAAG;IACd,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,CAAC;IACb,mBAAmB,EAAE,IAAI;IACzB,uBAAuB,EAAE,CAAC;IAC1B,qBAAqB,EAAE,KAAK,EAAE,WAAW;CAC1C,CAAC"} | ||
| {"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/telemetry/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH;;GAEG;AACU,QAAA,WAAW,GAAG,mBAAmB,CAAC;AAE/C;;GAEG;AACH,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC5B,yDAAmC,CAAA;IACnC,yDAAmC,CAAA;IACnC,+DAAyC,CAAA;IACzC,2DAAqC,CAAA;IACrC,+CAAyB,CAAA;AAC3B,CAAC,EANW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAM7B;AA8CD;;GAEG;AACU,QAAA,wBAAwB,GAA+C,MAAM,CAAC,MAAM,CAAC;IAChG,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,GAAG;IACd,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,GAAG;IAClB,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,GAAG;IACpB,mBAAmB,EAAE,IAAI;IACzB,uBAAuB,EAAE,CAAC;IAC1B,qBAAqB,EAAE,KAAK;IAC5B,iBAAiB,EAAE,GAAG;IACtB,qBAAqB,EAAE,EAAE;IACzB,cAAc,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS;CAC1C,CAAC,CAAC"} |
@@ -8,2 +8,3 @@ "use strict"; | ||
| const version_1 = __importDefault(require("../version")); | ||
| const agentDetector_1 = __importDefault(require("./agentDetector")); | ||
| const productName = 'NodejsDatabricksSqlConnector'; | ||
@@ -30,5 +31,10 @@ function getNodeVersion() { | ||
| const extra = [userAgentEntry, getNodeVersion(), getOperatingSystemVersion()].filter(Boolean); | ||
| return `${productName}/${version_1.default} (${extra.join('; ')})`; | ||
| let ua = `${productName}/${version_1.default} (${extra.join('; ')})`; | ||
| const agentProduct = (0, agentDetector_1.default)(); | ||
| if (agentProduct) { | ||
| ua += ` agent/${agentProduct}`; | ||
| } | ||
| return ua; | ||
| } | ||
| exports.default = buildUserAgentString; | ||
| //# sourceMappingURL=buildUserAgentString.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"buildUserAgentString.js","sourceRoot":"","sources":["../../lib/utils/buildUserAgentString.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,yDAAwC;AAExC,MAAM,WAAW,GAAG,8BAA8B,CAAC;AAEnD,SAAS,cAAc;IACrB,OAAO,WAAW,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,yBAAyB;IAChC,OAAO,GAAG,YAAE,CAAC,IAAI,EAAE,IAAI,YAAE,CAAC,OAAO,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,cAAsB;IACjD,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACzE,KAAK,MAAM,MAAM,IAAI,qBAAqB,EAAE;QAC1C,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACrC,OAAO,YAAY,CAAC;SACrB;KACF;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAwB,oBAAoB,CAAC,cAAuB;IAClE,IAAI,cAAc,EAAE;QAClB,cAAc,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;KACtD;IAED,MAAM,KAAK,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9F,OAAO,GAAG,WAAW,IAAI,iBAAc,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAClE,CAAC;AAPD,uCAOC"} | ||
| {"version":3,"file":"buildUserAgentString.js","sourceRoot":"","sources":["../../lib/utils/buildUserAgentString.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,yDAAwC;AACxC,oEAA0C;AAE1C,MAAM,WAAW,GAAG,8BAA8B,CAAC;AAEnD,SAAS,cAAc;IACrB,OAAO,WAAW,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,yBAAyB;IAChC,OAAO,GAAG,YAAE,CAAC,IAAI,EAAE,IAAI,YAAE,CAAC,OAAO,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,cAAsB;IACjD,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACzE,KAAK,MAAM,MAAM,IAAI,qBAAqB,EAAE;QAC1C,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACrC,OAAO,YAAY,CAAC;SACrB;KACF;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAwB,oBAAoB,CAAC,cAAuB;IAClE,IAAI,cAAc,EAAE;QAClB,cAAc,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;KACtD;IAED,MAAM,KAAK,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9F,IAAI,EAAE,GAAG,GAAG,WAAW,IAAI,iBAAc,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAElE,MAAM,YAAY,GAAG,IAAA,uBAAW,GAAE,CAAC;IACnC,IAAI,YAAY,EAAE;QAChB,EAAE,IAAI,UAAU,YAAY,EAAE,CAAC;KAChC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAdD,uCAcC"} |
@@ -6,2 +6,3 @@ import definedOrError from './definedOrError'; | ||
| import * as ProtocolVersion from './protocolVersion'; | ||
| export { definedOrError, buildUserAgentString, formatProgress, ProgressUpdateTransformer, LZ4, ProtocolVersion }; | ||
| import serializeQueryTags from './queryTags'; | ||
| export { definedOrError, buildUserAgentString, formatProgress, ProgressUpdateTransformer, LZ4, ProtocolVersion, serializeQueryTags, }; |
@@ -29,3 +29,3 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.ProtocolVersion = exports.LZ4 = exports.ProgressUpdateTransformer = exports.formatProgress = exports.buildUserAgentString = exports.definedOrError = void 0; | ||
| exports.serializeQueryTags = exports.ProtocolVersion = exports.LZ4 = exports.ProgressUpdateTransformer = exports.formatProgress = exports.buildUserAgentString = exports.definedOrError = void 0; | ||
| const definedOrError_1 = __importDefault(require("./definedOrError")); | ||
@@ -42,2 +42,4 @@ exports.definedOrError = definedOrError_1.default; | ||
| exports.ProtocolVersion = ProtocolVersion; | ||
| const queryTags_1 = __importDefault(require("./queryTags")); | ||
| exports.serializeQueryTags = queryTags_1.default; | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAA8C;AAMrC,yBANF,wBAAc,CAME;AALvB,kFAA0D;AAKjC,+BALlB,8BAAoB,CAKkB;AAJ7C,mEAA6E;AAI9B,yBAJxC,wBAAc,CAIwC;AAAE,0GAJtC,0CAAyB,OAIsC;AAHxF,gDAAwB;AAGkE,cAHnF,aAAG,CAGmF;AAF7F,mEAAqD;AAE0C,0CAAe"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAA8C;AAQ5C,yBARK,wBAAc,CAQL;AAPhB,kFAA0D;AAQxD,+BARK,8BAAoB,CAQL;AAPtB,mEAA6E;AAQ3E,yBARK,wBAAc,CAQL;AACd,0GATuB,0CAAyB,OASvB;AAR3B,gDAAwB;AAStB,cATK,aAAG,CASL;AARL,mEAAqD;AASnD,0CAAe;AARjB,4DAA6C;AAS3C,6BATK,mBAAkB,CASL"} |
@@ -1,2 +0,2 @@ | ||
| declare const _default: "1.13.0"; | ||
| declare const _default: "1.14.0"; | ||
| export default _default; |
+1
-1
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.default = '1.13.0'; | ||
| exports.default = '1.14.0'; | ||
| //# sourceMappingURL=version.js.map |
+1
-1
| { | ||
| "name": "@databricks/sql", | ||
| "version": "1.13.0", | ||
| "version": "1.14.0", | ||
| "description": "Driver for connection to Databricks SQL via Thrift API.", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
Network access
Supply chain riskThis module accesses the network.
Found 3 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 3 instances in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
1036598
17.32%308
12%23253
12.1%15
150%44
15.79%