@vtex/api
Version:
VTEX I/O API client
107 lines (106 loc) • 4.97 kB
JavaScript
;
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;