Repository URL to install this package:
|
Version:
0.9.0 ▾
|
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
"use strict";const supportedTracingVersion=require("../tracing/supportedVersion"),constants=require("../tracing/constants");let logger;logger=require("../logger").getLogger("configuration",newLogger=>{logger=newLogger});const defaults={serviceName:null,tracing:{enabled:!0,automaticTracingEnabled:!0,http:{extraHttpHeadersToCapture:[]},stackTraceLength:10,disabledTracers:[],disableW3cTraceCorrelation:!1},secrets:{matcherMode:"contains-ignore-case",keywords:["key","pass","secret"]}},validSecretsMatcherModes=["equals-ignore-case","equals","contains-ignore-case","contains","regex","none"];function normalizeServiceName(config){null==config.serviceName&&process.env.SUPERMETER_SERVICE_NAME&&(config.serviceName=process.env.SUPERMETER_SERVICE_NAME);null==config.serviceName&&process.env.npm_package_name&&!["@supertenant/workspace","@supertenant/core","@supertenant/collector","@supertenant/supermeter"].includes(process.env.npm_package_name)&&(config.serviceName=process.env.npm_package_name),null!=config.serviceName&&"string"!=typeof config.serviceName&&(logger.warn("Invalid configuration: config.serviceName is not a string, the value will be ignored: "+config.serviceName),config.serviceName=defaults.serviceName)}function normalizeTracingConfig(config){null==config.tracing&&(config.tracing={}),normalizeTracingEnabled(config),normalizeAutomaticTracingEnabled(config),normalizeTracingHttp(config),normalizeTracingStackTraceLength(config),normalizeDisabledTracers(config),normalizeDisableW3cTraceCorrelation(config)}function normalizeTracingEnabled(config){!1===config.tracing.enabled?logger.info("Not enabling tracing as it is explicitly disabled via config."):!0!==config.tracing.enabled&&("true"===process.env.SUPERTENANT_SUPERMETER_DISABLE?(logger.info("Not enabling tracing as it is explicitly disabled via environment variable SUPERTENANT_SUPERMETER_DISABLE."),config.tracing.enabled=!1):config.tracing.enabled=defaults.tracing.enabled)}function normalizeAutomaticTracingEnabled(config){config.tracing.enabled?!1===config.tracing.automaticTracingEnabled?(logger.info("Not enabling automatic tracing as it is explicitly disabled via config."),config.tracing.automaticTracingEnabled=!1):"true"===process.env.SUPERTENANT_SUPERMETER_DISABLE_AUTO_INSTR?(logger.info("Not enabling automatic tracing as it is explicitly disabled via environment variable SUPERTENANT_SUPERMETER_DISABLE_AUTO_INSTR."),config.tracing.automaticTracingEnabled=!1):supportedTracingVersion(process.versions.node)?config.tracing.automaticTracingEnabled=defaults.tracing.automaticTracingEnabled:(logger.warn("Not enabling automatic tracing, this is an unsupported version of Node.js."),config.tracing.automaticTracingEnabled=!1):(logger.info("Not enabling automatic tracing as tracing in general is explicitly disabled via config."),config.tracing.automaticTracingEnabled=!1)}function normalizeTracingHttp(config){config.tracing.http=config.tracing.http||{};let fromEnvVar;process.env.SUPERTENANT_SUPERMETER_EXTRA_HTTP_HEADERS&&(fromEnvVar=parseHeadersEnvVar(process.env.SUPERTENANT_SUPERMETER_EXTRA_HTTP_HEADERS)),config.tracing.http.extraHttpHeadersToCapture||fromEnvVar?(!config.tracing.http.extraHttpHeadersToCapture&&fromEnvVar&&(config.tracing.http.extraHttpHeadersToCapture=fromEnvVar),Array.isArray(config.tracing.http.extraHttpHeadersToCapture)?config.tracing.http.extraHttpHeadersToCapture=config.tracing.http.extraHttpHeadersToCapture.map(s=>s.toLowerCase()):(logger.warn("Invalid configuration: config.tracing.http.extraHttpHeadersToCapture is not an array, the value will be ignored: "+JSON.stringify(config.tracing.http.extraHttpHeadersToCapture)),config.tracing.http.extraHttpHeadersToCapture=defaults.tracing.http.extraHttpHeadersToCapture)):config.tracing.http.extraHttpHeadersToCapture=defaults.tracing.http.extraHttpHeadersToCapture}function parseHeadersEnvVar(envVarValue){return envVarValue.split(/[;,]/).map(header=>header.trim()).filter(header=>""!==header)}function normalizeTracingStackTraceLength(config){null==config.tracing.stackTraceLength&&process.env.SUPERTENANT_SUPERMETER_STACK_TRACE_LENGTH&&parseStringStackTraceLength(config,process.env.SUPERTENANT_SUPERMETER_STACK_TRACE_LENGTH),null!=config.tracing.stackTraceLength?"number"==typeof config.tracing.stackTraceLength?config.tracing.stackTraceLength=normalizeNumericalStackTraceLength(config.tracing.stackTraceLength):"string"==typeof config.tracing.stackTraceLength?parseStringStackTraceLength(config,config.tracing.stackTraceLength):(logger.warn('The value of config.tracing.stackTraceLength has the non-supported type %s (the value is "%s"). Assuming the default stack trace length %s.',typeof config.tracing.stackTraceLength,config.tracing.stackTraceLength,defaults.tracing.stackTraceLength),config.tracing.stackTraceLength=defaults.tracing.stackTraceLength):config.tracing.stackTraceLength=defaults.tracing.stackTraceLength}function parseStringStackTraceLength(config,value){config.tracing.stackTraceLength=parseInt(value,10),isNaN(config.tracing.stackTraceLength)?(logger.warn('The value of config.tracing.stackTraceLength ("%s") has type string and cannot be parsed to a numerical value. Assuming the default stack trace length %s.',value,defaults.tracing.stackTraceLength),config.tracing.stackTraceLength=defaults.tracing.stackTraceLength):config.tracing.stackTraceLength=normalizeNumericalStackTraceLength(config.tracing.stackTraceLength)}function normalizeNumericalStackTraceLength(numericalLength){var normalized=Math.abs(Math.round(numericalLength));return normalized!==numericalLength&&logger.warn("Normalized the provided value of config.tracing.stackTraceLength (%s) to %s.",numericalLength,normalized),normalized}function normalizeDisabledTracers(config){null==config.tracing.disabledTracers&&process.env.SUPERTENANT_SUPERMETER_INTEGRATION_CIRCUIT_BREAKERS&&0<=process.env.SUPERTENANT_SUPERMETER_INTEGRATION_CIRCUIT_BREAKERS.trim().length&&(config.tracing.disabledTracers=process.env.SUPERTENANT_SUPERMETER_INTEGRATION_CIRCUIT_BREAKERS.split(",").map(key=>key.trim().toLowerCase()).filter(key=>0<=key.length)),config.tracing.disabledTracers||(config.tracing.disabledTracers=defaults.tracing.disabledTracers),Array.isArray(config.tracing.disabledTracers)?config.tracing.disabledTracers=config.tracing.disabledTracers.map(s=>s.toLowerCase()):(logger.warn("Invalid configuration: config.tracing.disabledTracers is not an array, the value will be ignored: "+JSON.stringify(config.tracing.disabledTracers)),config.tracing.disabledTracers=defaults.tracing.disabledTracers)}function normalizeDisableW3cTraceCorrelation(config){!0===config.tracing.disableW3cTraceCorrelation?logger.info("W3C trace correlation has been disabled via config."):process.env.SUPERTENANT_SUPERMETER_DISABLE_W3C_TRACE_CORRELATION?(logger.info("W3C trace correlation has been disabled via environment variable SUPERTENANT_SUPERMETER_DISABLE_W3C_TRACE_CORRELATION."),config.tracing.disableW3cTraceCorrelation=!0):config.tracing.disableW3cTraceCorrelation=defaults.tracing.disableW3cTraceCorrelation}function normalizeSecrets(config){null==config.secrets&&(config.secrets={});let fromEnvVar={};process.env.SUPERTENANT_SUPERMETER_SECRETS&&(fromEnvVar=parseSecretsEnvVar(process.env.SUPERTENANT_SUPERMETER_SECRETS)),config.secrets.matcherMode=config.secrets.matcherMode||fromEnvVar.matcherMode||defaults.secrets.matcherMode,config.secrets.keywords=config.secrets.keywords||fromEnvVar.keywords||defaults.secrets.keywords,"string"!=typeof config.secrets.matcherMode?(logger.warn('The value of config.secrets.matcherMode ("%s") is not a string. Assuming the default value %s.',config.secrets.matcherMode,defaults.secrets.matcherMode),config.secrets.matcherMode=defaults.secrets.matcherMode):validSecretsMatcherModes.indexOf(config.secrets.matcherMode)<0?(logger.warn("The value of config.secrets.matcherMode (or the matcher mode parsed from SUPERTENANT_SUPERMETER_SECRETS) (%s) is not a supported matcher mode. Assuming the default value %s.",config.secrets.matcherMode,defaults.secrets.matcherMode),config.secrets.matcherMode=defaults.secrets.matcherMode):Array.isArray(config.secrets.keywords)||(logger.warn("The value of config.secrets.keywords (%s) is not an array. Assuming the default value %s.",config.secrets.keywords,defaults.secrets.keywords),config.secrets.keywords=defaults.secrets.keywords),"none"===config.secrets.matcherMode&&(config.secrets.keywords=[])}function parseSecretsEnvVar(envVarValue){let[matcherMode,keywords]=envVarValue.split(":",2);var keywordsArray;return"none"===(matcherMode=matcherMode.trim().toLowerCase())?{matcherMode:matcherMode,keywords:[]}:keywords?(keywordsArray=keywords.split(",").map(word=>word.trim()),{matcherMode:matcherMode,keywords:keywordsArray}):(logger.warn("The value of SUPERTENANT_SUPERMETER_SECRETS (%s) cannot be parsed. Please use the following format: SUPERTENANT_SUPERMETER_SECRETS=<matcher>:<secret>[,<secret>]. This setting will be ignored.",envVarValue),{})}function normalizeSingleValue(configValue,defaultValue,configPath,envVarKey){var envVarVal=process.env[envVarKey];let originalValue=configValue;return null==configValue&&null==envVarVal?defaultValue:(null==configValue&&null!=envVarVal&&(originalValue=envVarVal,configValue=parseInt(originalValue,10)),"number"!=typeof configValue||isNaN(configValue)?(logger.warn('The value of %s (or %s) ("%s") is not numerical or cannot be parsed to a numerical value. Assuming the default value %s.',configPath,envVarKey,originalValue,defaultValue),defaultValue):configValue)}module.exports=function(config){return normalizeServiceName(config=null==config?{}:config),normalizeTracingConfig(config),normalizeSecrets(config),config};