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(
    `[supertenant-supermeter] ERROR: @supertenant/collector requires at least Node.js ${minimumNodeJsVersion} but this process is ` +
    `running Node.js ${process.version}.`
  );
  module.exports = function noOp() {};
} else {
  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');

  require('./tracing'); // load additional instrumentations
  const log = require('./logger');
  const normalizeConfig = require('./util/normalizeConfig');

    /** @type {import('./util/normalizeConfig').CollectorConfig} */
  let config;

  /**
   * @param {import('./util/normalizeConfig').CollectorConfig} [_config]
   */
  // eslint-disable-next-line no-inner-declarations
  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(
          "[supertenant-supermeter] WARNING: Supermeter has already been initialized but the module @supertenant/collector is not present in Node.js' " +
            'module cache.'
        );
        return init;
      }
    }
    // @ts-ignore: Property '__SUPERMETER_INITIALIZED' does not exist on type global
    global.__SUPERMETER_INITIALIZED = true;
    config = normalizeConfig(_config);

    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;

    stNodeJsCore.init(config, pidStore);

    if (isMainThread) {
      uncaught.init(config);
    }

    logger.info('@supertenant/collector module version:', require(path.join(__dirname, '..', 'package.json')).version);

    return init;
  }

  init.currentSpan = function getHandleForCurrentSpan() {
    return stNodeJsCore.tracing.getHandleForCurrentSpan();
  };

  init.isTracing = function isTracing() {
    return stNodeJsCore.tracing.getCls() ? stNodeJsCore.tracing.getCls().isTracing() : false;
  };

  /**
   * @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.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;
}