Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
// (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;