text: /**
   * Copyright 2015 Google Inc. All Rights Reserved.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  /**
   * This file has been modified by Keymetrics
   */
  
  'use strict';
  
  var filesLoadedBeforeTrace = Object.keys(require.cache);
  
  // Load continuation-local-storage first to ensure the core async APIs get
  // patched before any user-land modules get loaded.
  require('continuation-local-storage');
  
  var Logger = require('./src/logger.js');
  var extend = require('extend');
  var constants = require('./src/constants.js');
  var traceUtil = require('./src/util.js');
  var TraceApi = require('./src/trace-api.js');
  var pluginLoader = require('./src/trace-plugin-loader.js');
  
  var modulesLoadedBeforeTrace = [];
  
  for (var i = 0; i < filesLoadedBeforeTrace.length; i++) {
    var moduleName = traceUtil.packageNameFromPath(filesLoadedBeforeTrace[i]);
    if (moduleName && moduleName !== 'vxx' &&
        modulesLoadedBeforeTrace.indexOf(moduleName) === -1) {
      modulesLoadedBeforeTrace.push(moduleName);
    }
  }
  
  var onUncaughtExceptionValues = ['ignore', 'flush', 'flushAndExit'];
  
  var initConfig = function(projectConfig) {
    var config = extend(true, {}, require('./config.js'), projectConfig);
    if (config.maximumLabelValueSize > constants.TRACE_SERVICE_LABEL_VALUE_LIMIT) {
      config.maximumLabelValueSize = constants.TRACE_SERVICE_LABEL_VALUE_LIMIT;
    }
    return config;
  };
  
  var traceApi = new TraceApi('Custom Span API');
  var agent;
  
  /**
   * Start the Trace agent that will make your application available for
   * tracing with Stackdriver Trace.
   *
   * @param {object=} config - Trace configuration
   *
   * @resource [Introductory video]{@link
   * https://www.youtube.com/watch?v=NCFDqeo7AeY}
   *
   * @example
   * trace.start();
   */
  function start(projectConfig) {
    var config = initConfig(projectConfig);
  
    if (traceApi.isActive() && !config.forceNewAgent_) { // already started.
      throw new Error('Cannot call start on an already started agent.');
    }
  
    if (!config.enabled) {
      return traceApi;
    }
  
    if (config.logLevel < 0) {
      config.logLevel = 0;
    } else if (config.logLevel >= Logger.LEVELS.length) {
      config.logLevel = Logger.LEVELS.length - 1;
    }
    var logger = new Logger(config.logLevel, config.logger === 'debug' ? 'vxx' : undefined);
  
    if (onUncaughtExceptionValues.indexOf(config.onUncaughtException) === -1) {
      logger.error('The value of onUncaughtException should be one of ',
        onUncaughtExceptionValues);
      throw new Error('Invalid value for onUncaughtException configuration.');
    }
  
    var headers = {};
    headers[constants.TRACE_AGENT_REQUEST_HEADER] = 1;
  
    if (modulesLoadedBeforeTrace.length > 0) {
      logger.warn('Tracing might not work as the following modules ' +
        'were loaded before the trace agent was initialized: ' +
        JSON.stringify(modulesLoadedBeforeTrace));
    }
  
    agent = require('./src/trace-agent.js').get(config, logger);
    traceApi.enable_(agent);
    pluginLoader.activate(agent);
  
    traceApi.getCls = function() {
      return agent.getCls();
    };
  
    traceApi.getBus = function() {
      return agent.traceWriter;
    };
  
    return traceApi;
  }
  
  function get() {
    return traceApi;
  }
  
  global._google_trace_agent = traceApi;
  module.exports = {
    start: start,
    get: get
  };
  
  // If the module was --require'd from the command line, start the agent.
  if (module.parent && module.parent.id === 'internal/preload') {
    module.exports.start();
  }
  