UNPKG

@vtex/api

Version:
107 lines (106 loc) 4.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resetTelemetry = exports.initializeTelemetry = void 0; const instrumentation_koa_1 = require("@opentelemetry/instrumentation-koa"); const diagnostics_nodejs_1 = require("@vtex/diagnostics-nodejs"); const constants_1 = require("../../constants"); const hostMetrics_1 = require("../metrics/instruments/hostMetrics"); const APPLICATION_ID = constants_1.APP.ID || 'vtex-io-app'; class TelemetryClientSingleton { static getInstance() { if (!TelemetryClientSingleton.instance) { TelemetryClientSingleton.instance = new TelemetryClientSingleton(); } return TelemetryClientSingleton.instance; } constructor() { this.initializationPromise = undefined; this.initializeTracesClient = async (telemetryClient) => await telemetryClient.newTracesClient({ exporter: diagnostics_nodejs_1.Exporters.CreateExporter(diagnostics_nodejs_1.Exporters.CreateTracesExporterConfig({ endpoint: constants_1.OTEL_EXPORTER_OTLP_ENDPOINT, }), 'otlp'), }); this.initializeMetricsClient = async (telemetryClient) => await telemetryClient.newMetricsClient({ exporter: diagnostics_nodejs_1.Exporters.CreateExporter(diagnostics_nodejs_1.Exporters.CreateMetricsExporterConfig({ endpoint: constants_1.OTEL_EXPORTER_OTLP_ENDPOINT, interval: 60, temporality: 'delta', timeoutSeconds: 60, }), 'otlp'), }); this.initializeLogsClient = async (telemetryClient) => await telemetryClient.newLogsClient({ exporter: diagnostics_nodejs_1.Exporters.CreateExporter(diagnostics_nodejs_1.Exporters.CreateLogsExporterConfig({ endpoint: constants_1.OTEL_EXPORTER_OTLP_ENDPOINT, }), 'otlp'), loggerName: `node-vtex-api-${APPLICATION_ID}`, }); } async getTelemetryClients() { if (this.telemetryClients) { return this.telemetryClients; } if (this.initializationPromise) { return this.initializationPromise; } this.initializationPromise = this.initializeTelemetryClients(); return this.initializationPromise; } reset() { this.telemetryClients = undefined; this.initializationPromise = undefined; } async initializeTelemetryClients() { try { const telemetryClient = await (0, diagnostics_nodejs_1.NewTelemetryClient)(constants_1.DK_APP_ID, 'node-vtex-api', APPLICATION_ID, { additionalAttrs: { [constants_1.AttributeKeys.VTEX_IO_APP_ID]: APPLICATION_ID, 'vendor': constants_1.APP.VENDOR, 'version': constants_1.APP.VERSION || '', [constants_1.AttributeKeys.VTEX_IO_WORKSPACE_NAME]: constants_1.WORKSPACE, [constants_1.AttributeKeys.VTEX_IO_WORKSPACE_TYPE]: constants_1.PRODUCTION ? 'production' : 'development', }, // Use built-in no-op functionality when telemetry is disabled noop: !constants_1.DIAGNOSTICS_TELEMETRY_ENABLED, }); const [tracesClient, metricsClient, logsClient] = await Promise.all([ this.initializeTracesClient(telemetryClient), this.initializeMetricsClient(telemetryClient), this.initializeLogsClient(telemetryClient), ]); if (constants_1.DIAGNOSTICS_TELEMETRY_ENABLED) { console.log(`Telemetry enabled for app: ${constants_1.APP.ID} (vendor: ${constants_1.APP.VENDOR})`); const instrumentations = [ ...diagnostics_nodejs_1.Instrumentation.CommonInstrumentations.minimal(), new instrumentation_koa_1.KoaInstrumentation(), new hostMetrics_1.HostMetricsInstrumentation({ meterProvider: metricsClient.provider(), name: 'host-metrics-instrumentation', }), ]; telemetryClient.registerInstrumentations(instrumentations); } const clients = { logsClient, metricsClient, tracesClient, }; this.telemetryClients = clients; return clients; } catch (error) { console.error('Failed to initialize telemetry clients:', error); throw error; } finally { this.initializationPromise = undefined; } } } async function initializeTelemetry() { return TelemetryClientSingleton.getInstance().getTelemetryClients(); } exports.initializeTelemetry = initializeTelemetry; function resetTelemetry() { TelemetryClientSingleton.getInstance().reset(); } exports.resetTelemetry = resetTelemetry;