UNPKG

couchbase

Version:

The official Couchbase Node.js Client Library.

101 lines (100 loc) 3.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getOTelMeter = exports.OTelWrapperMeter = exports.OTelValueRecorder = void 0; const version_1 = require("./version"); /* eslint-enable n/no-missing-import */ // Dynamic Runtime Require (Bundler-safe) let otelApi = null; let HAS_OTEL = false; try { // Hiding the string prevents Webpack/Vite from throwing missing dependency errors const moduleName = '@opentelemetry/api'; // eslint-disable-next-line @typescript-eslint/no-require-imports otelApi = require(moduleName); HAS_OTEL = true; } catch (_err) { HAS_OTEL = false; } /** * Wrapper class for OpenTelemetry Histogram that implements ValueRecorder interface. */ class OTelValueRecorder { /** * Creates an instance of OTelValueRecorder. * * @param histogram - OpenTelemetry Histogram to record values. * @param tags - Tags to associate with recorded values. * @param unit - Optional unit of measurement (e.g., 's' for seconds). If provided, it indicates that the recorded values * should be converted from microseconds to seconds. */ constructor(histogram, tags, unit) { this._histogram = histogram; this._tags = tags; this._unit = unit; } /** * Records a value with the associated tags. * * @param value - The numeric value to record. */ recordValue(value) { // The SDK records value in micros and will place a special __unit tag in the tags set to 's' // So self._unit == 's' is indication that we should convert from micros to seconds const finalValue = this._unit === 's' ? value / 1000000 : value; this._histogram.record(finalValue, this._tags); } } exports.OTelValueRecorder = OTelValueRecorder; /** * Wrapper class for OpenTelemetry Meter that implements Meter interface. */ class OTelWrapperMeter { /** * Creates an instance of OTelWrapperMeter. * * @param meter - OpenTelemetry Meter to wrap. */ constructor(meter) { this._otelMeter = meter; this._histograms = {}; } /** * Creates a ValueRecorder for recording metric values. * * @param name - The name of the metric. * @param tags - Tags to associate with recorded values. * @returns A ValueRecorder instance for recording metrics. */ valueRecorder(name, tags) { const localTags = tags ? { ...tags } : {}; const unit = localTags.__unit; delete localTags.__unit; if (!this._histograms[name]) { this._histograms[name] = this._otelMeter.createHistogram(name, { unit: unit, }); } const histogram = this._histograms[name]; return new OTelValueRecorder(histogram, localTags, unit); } } exports.OTelWrapperMeter = OTelWrapperMeter; /** * Creates an OpenTelemetry wrapper meter. * Throws an Error if @opentelemetry/api is not installed. */ function getOTelMeter(provider) { if (!HAS_OTEL || !otelApi) { throw new Error('OpenTelemetry is not installed. Please install it with: ' + 'npm install @opentelemetry/api'); } const pkgName = `${version_1.SDK_NAME}-nodejs-client`; const pkgVersion = version_1.SDK_VERSION; if (provider) { return new OTelWrapperMeter(provider.getMeter(pkgName, pkgVersion)); } // Fallback to the global OpenTelemetry metrics provider return new OTelWrapperMeter(otelApi.metrics.getMeter(pkgName, pkgVersion)); } exports.getOTelMeter = getOTelMeter;