Repository URL to install this package:
|
Version:
0.6.5 ▾
|
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
'use strict';
const { isNodeJsTooOld, minimumNodeJsVersion } = require('@supertenant/core/src/util/nodeJsVersionCheck');
if (isNodeJsTooOld()) {
// eslint-disable-next-line no-console
console.error(
`The package @supertenant/collector requires at least Node.js ${minimumNodeJsVersion} but this process is ` +
`running on Node.js ${process.version}. This process will not be monitored by SuperTenant.`
);
module.exports = function noOp() {};
// @ts-ignore TS1108 (return can only be used within a function body)
return;
}
let isMainThread = true;
try {
isMainThread = require('worker_threads').isMainThread;
} catch (err) {
// Worker threads are not available, so we know that this is the main thread.
}
const path = require('path');
const stNodeJsCore = require('@supertenant/core');
const stSharedMetrics = require('@supertenant/shared-metrics');
require('./tracing'); // load additional instrumentations
const log = require('./logger');
const normalizeConfig = require('./util/normalizeConfig');
const experimental = require('./experimental');
/** @type {import('./agentConnection')} */
let agentConnection;
/** @type {import('./util/normalizeConfig').CollectorConfig} */
let config;
/**
* @param {import('./util/normalizeConfig').CollectorConfig} [_config]
*/
function init(_config) {
// @ts-ignore: Property '__SUPERMETER_INITIALIZED' does not exist on type global
if (global.__SUPERMETER_INITIALIZED) {
// Prevent initializing @supertenant/collector multiple times for the same process: @supertenant/collector has already been
// initialized, potentially from a different installation of @supertenant/collector somewhere else in the file system.
// Find that module in the require cache and return its exports (this is necessary to make sure calls to our API
// work as expected).
let collectorIndexCacheKey = Object.keys(require.cache).find(
cacheKey => cacheKey.indexOf('/@supertenant/collector/src/index.js') >= 0
);
// Requiring the collector package twice in the test package using a relative path such as `../../..`
if (process.env.NODE_ENV === 'test') {
collectorIndexCacheKey = Object.keys(require.cache).find(
cacheKey => cacheKey.indexOf('collector/src/index.js') >= 0
);
}
if (collectorIndexCacheKey) {
return require.cache[collectorIndexCacheKey].exports;
} else {
// eslint-disable-next-line no-console
console.error(
"Warning: Supermeter has already been initialized but the module @supertenant/collector is not present in Node.js' " +
'module cache. The Supermeter API will not be available.'
);
return init;
}
}
// @ts-ignore: Property '__SUPERMETER_INITIALIZED' does not exist on type global
global.__SUPERMETER_INITIALIZED = true;
config = normalizeConfig(_config);
agentConnection = require('./agentConnection');
const agentOpts = require('./agent/opts');
const pidStore = require('./pidStore');
const uncaught = require('./uncaught');
let logger;
logger = log.getLogger('index', newLogger => {
logger = newLogger;
});
// NOTE: By default we set our instana internal bunyan logger
config.logger = logger;
agentOpts.init(config);
stNodeJsCore.init(config, agentConnection, pidStore);
stSharedMetrics.setLogger(logger);
if (isMainThread) {
uncaught.init(config, agentConnection, pidStore);
require('./metrics').init(config);
}
logger.info('@supertenant/collector module version:', require(path.join(__dirname, '..', 'package.json')).version);
// FIXME supertenant: remove this
if (process.env.ST_INSTANA_ENABLED === "true") {
require('./announceCycle').start();
}
return init;
}
init.currentSpan = function getHandleForCurrentSpan() {
return stNodeJsCore.tracing.getHandleForCurrentSpan();
};
init.isTracing = function isTracing() {
return stNodeJsCore.tracing.getCls() ? stNodeJsCore.tracing.getCls().isTracing() : false;
};
init.isConnected = function isConnected() {
return agentConnection && agentConnection.isConnected();
};
/**
* @param {import('@supertenant/core/src/logger').GenericLogger} logger
*/
init.setLogger = function setLogger(logger) {
// NOTE: Override our default logger with customer's logger
config.logger = logger;
log.init(config, stNodeJsCore.superbrainLogger, true);
};
init.core = stNodeJsCore;
init.sharedMetrics = stSharedMetrics;
init.experimental = experimental;
init.opentracing = stNodeJsCore.tracing.opentracing;
init.sdk = stNodeJsCore.tracing.sdk;
if (process.env.INSTANA_IMMEDIATE_INIT != null && process.env.INSTANA_IMMEDIATE_INIT.toLowerCase() === 'true') {
init();
} else if (
process.env.INSTANA_EARLY_INSTRUMENTATION != null &&
process.env.INSTANA_EARLY_INSTRUMENTATION.toLowerCase() === 'true'
) {
stNodeJsCore.preInit();
}
module.exports = init;