UNPKG

couchbase

Version:

The official Couchbase Node.js Client Library.

142 lines (141 loc) 4.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getOTelTracer = exports.OTelWrapperTracer = exports.OTelWrapperSpan = void 0; const observabilitytypes_1 = require("./observabilitytypes"); 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 Span that implements RequestSpan interface. */ class OTelWrapperSpan { /** * Creates an instance of OTelWrapperSpan. * * @param otelSpan - OpenTelemetry Span to wrap. * @param name - The name of the span. */ constructor(otelSpan, name) { this._otelSpan = otelSpan; this.name = name; } /** * Sets an attribute on the span. * * @param key - The attribute key. * @param value - The attribute value. */ setAttribute(key, value) { this._otelSpan.setAttribute(key, value); } /** * Adds an event to the span. * * @param key - The event key. * @param startTime - Optional timestamp for the event. */ addEvent(key, startTime) { this._otelSpan.addEvent(key, startTime); } /** * Sets the status of the span. * * @param status - The SpanStatus to set. */ setStatus(status) { // We use the non-null assertion (!) because this class cannot be // instantiated unless otelApi successfully loaded. let otelCode = otelApi.SpanStatusCode.UNSET; if (status.code === observabilitytypes_1.SpanStatusCode.OK) { otelCode = otelApi.SpanStatusCode.OK; } else if (status.code === observabilitytypes_1.SpanStatusCode.ERROR) { otelCode = otelApi.SpanStatusCode.ERROR; } this._otelSpan.setStatus({ code: otelCode, message: status.message, }); } /** * Ends the span. * * @param endTime - Optional timestamp for when the span ended. */ end(endTime) { this._otelSpan.end(endTime); } } exports.OTelWrapperSpan = OTelWrapperSpan; /** * Wrapper class for OpenTelemetry Tracer that implements RequestTracer interface. */ class OTelWrapperTracer { /** * Creates an instance of OTelWrapperTracer. * * @param tracer - OpenTelemetry Tracer to wrap. */ constructor(tracer) { this._tracer = tracer; } /** * Creates a new request span, optionally with a parent span. * * @param name - The name of the span. * @param parentSpan - Optional parent span for this request. * @param startTime - Optional timestamp for when the span started. * @returns A RequestSpan instance for the new span. */ requestSpan(name, parentSpan, startTime) { // Grab the current active context from OTel let context = otelApi.context.active(); // If the user passed in a parent span, and it is one of our wrappers, // extract the raw OTel span and inject it into a new context. if (parentSpan && parentSpan instanceof OTelWrapperSpan) { context = otelApi.trace.setSpan(context, parentSpan._otelSpan); } // Start the new span using the safely mapped inputs const span = this._tracer.startSpan(name, { startTime: startTime, kind: otelApi.SpanKind.CLIENT, }, context); return new OTelWrapperSpan(span, name); } } exports.OTelWrapperTracer = OTelWrapperTracer; /** * Creates an OpenTelemetry wrapper tracer. * Throws an Error if @opentelemetry/api is not installed. */ function getOTelTracer(tracerProvider) { if (!HAS_OTEL || !otelApi) { throw new Error('OpenTelemetry is not installed. Please install it with: ' + 'npm install @opentelemetry/api'); } const pkgName = `com.couchbase.client/nodejs`; const pkgVersion = version_1.SDK_VERSION; let tracer; if (tracerProvider) { // Use the explicit provider they passed in tracer = tracerProvider.getTracer(pkgName, pkgVersion); } else { // Fallback to the global OpenTelemetry provider tracer = otelApi.trace.getTracer(pkgName, pkgVersion); } return new OTelWrapperTracer(tracer); } exports.getOTelTracer = getOTelTracer;