| /*! |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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. |
| * |
| */ |
| |
| import * as os from 'os'; |
| |
| export type AgentConfig = { |
| serviceName?: string; |
| serviceInstance?: string; |
| collectorAddress?: string; |
| secure?: boolean; |
| authorization?: string; |
| maxBufferSize?: number; |
| coldEndpoint?: boolean; |
| disablePlugins?: string; |
| ignoreSuffix?: string; |
| traceIgnorePath?: string; |
| httpIgnoreMethod?: string; |
| sqlTraceParameters?: boolean; |
| sqlParametersMaxLength?: number; |
| mongoTraceParameters?: boolean; |
| mongoParametersMaxLength?: number; |
| awsLambdaFlush?: number; |
| awsLambdaChain?: boolean; |
| awsSQSCheckBody?: boolean; |
| // the following is internal state computed from config values |
| reDisablePlugins?: RegExp; |
| reIgnoreOperation?: RegExp; |
| reHttpIgnoreMethod?: RegExp; |
| traceTimeout?: number; |
| runtimeMetricsReporterActive?: boolean; |
| runtimeMetricsCollectPeriod?: number; |
| runtimeMetricsReportPeriod?: number; |
| runtimeMetricsBufferSize?: number; |
| /** @deprecated use runtimeMetricsReporterActive */ |
| nvmMetricsReporterActive?: boolean; |
| /** @deprecated use runtimeMetricsCollectPeriod */ |
| nvmMetricsCollectPeriod?: number; |
| /** @deprecated use runtimeMetricsReportPeriod */ |
| nvmMetricsReportPeriod?: number; |
| /** @deprecated use runtimeMetricsBufferSize */ |
| nvmMetricsBufferSize?: number; |
| /** @deprecated use runtimeMetricsReporterActive */ |
| nvmJvmReporterActive?: boolean; |
| /** @deprecated use runtimeMetricsCollectPeriod */ |
| nvmJvmMetricsCollectPeriod?: number; |
| /** @deprecated use runtimeMetricsReportPeriod */ |
| nvmJvmMetricsReportPeriod?: number; |
| /** @deprecated use runtimeMetricsBufferSize */ |
| nvmJvmMetricsBufferSize?: number; |
| }; |
| |
| export function normalizeDeprecatedRuntimeMetricOptions(options: AgentConfig): AgentConfig { |
| const normalized = { ...options }; |
| |
| if (normalized.runtimeMetricsReporterActive === undefined) { |
| const reporterActive = normalized.nvmMetricsReporterActive ?? normalized.nvmJvmReporterActive; |
| if (reporterActive !== undefined) { |
| normalized.runtimeMetricsReporterActive = reporterActive; |
| } |
| } |
| delete normalized.nvmMetricsReporterActive; |
| delete normalized.nvmJvmReporterActive; |
| |
| if (normalized.runtimeMetricsCollectPeriod === undefined) { |
| const collectPeriod = normalized.nvmMetricsCollectPeriod ?? normalized.nvmJvmMetricsCollectPeriod; |
| if (collectPeriod !== undefined) { |
| normalized.runtimeMetricsCollectPeriod = collectPeriod; |
| } |
| } |
| delete normalized.nvmMetricsCollectPeriod; |
| delete normalized.nvmJvmMetricsCollectPeriod; |
| |
| if (normalized.runtimeMetricsReportPeriod === undefined) { |
| const reportPeriod = normalized.nvmMetricsReportPeriod ?? normalized.nvmJvmMetricsReportPeriod; |
| if (reportPeriod !== undefined) { |
| normalized.runtimeMetricsReportPeriod = reportPeriod; |
| } |
| } |
| delete normalized.nvmMetricsReportPeriod; |
| delete normalized.nvmJvmMetricsReportPeriod; |
| |
| if (normalized.runtimeMetricsBufferSize === undefined) { |
| const bufferSize = normalized.nvmMetricsBufferSize ?? normalized.nvmJvmMetricsBufferSize; |
| if (bufferSize !== undefined) { |
| normalized.runtimeMetricsBufferSize = bufferSize; |
| } |
| } |
| delete normalized.nvmMetricsBufferSize; |
| delete normalized.nvmJvmMetricsBufferSize; |
| |
| return normalized; |
| } |
| |
| function clearDeprecatedRuntimeMetricFields(config: AgentConfig): void { |
| delete config.nvmMetricsReporterActive; |
| delete config.nvmJvmReporterActive; |
| delete config.nvmMetricsCollectPeriod; |
| delete config.nvmJvmMetricsCollectPeriod; |
| delete config.nvmMetricsReportPeriod; |
| delete config.nvmJvmMetricsReportPeriod; |
| delete config.nvmMetricsBufferSize; |
| delete config.nvmJvmMetricsBufferSize; |
| } |
| |
| function applyDeprecatedRuntimeMetricConfig(config: AgentConfig, options: AgentConfig = {}): void { |
| if (options.runtimeMetricsReporterActive === undefined) { |
| if (config.nvmMetricsReporterActive !== undefined) { |
| config.runtimeMetricsReporterActive = config.nvmMetricsReporterActive; |
| } else if (config.nvmJvmReporterActive !== undefined) { |
| config.runtimeMetricsReporterActive = config.nvmJvmReporterActive; |
| } |
| } |
| |
| if (options.runtimeMetricsCollectPeriod === undefined) { |
| if (config.nvmMetricsCollectPeriod !== undefined) { |
| config.runtimeMetricsCollectPeriod = config.nvmMetricsCollectPeriod; |
| } else if (config.nvmJvmMetricsCollectPeriod !== undefined) { |
| config.runtimeMetricsCollectPeriod = config.nvmJvmMetricsCollectPeriod; |
| } |
| } |
| |
| if (options.runtimeMetricsReportPeriod === undefined) { |
| if (config.nvmMetricsReportPeriod !== undefined) { |
| config.runtimeMetricsReportPeriod = config.nvmMetricsReportPeriod; |
| } else if (config.nvmJvmMetricsReportPeriod !== undefined) { |
| config.runtimeMetricsReportPeriod = config.nvmJvmMetricsReportPeriod; |
| } |
| } |
| |
| if (options.runtimeMetricsBufferSize === undefined) { |
| if (config.nvmMetricsBufferSize !== undefined) { |
| config.runtimeMetricsBufferSize = config.nvmMetricsBufferSize; |
| } else if (config.nvmJvmMetricsBufferSize !== undefined) { |
| config.runtimeMetricsBufferSize = config.nvmJvmMetricsBufferSize; |
| } |
| } |
| |
| clearDeprecatedRuntimeMetricFields(config); |
| } |
| |
| export function finalizeConfig(config: AgentConfig, options: AgentConfig = {}): void { |
| applyDeprecatedRuntimeMetricConfig(config, options); |
| |
| const escapeRegExp = (s: string) => s.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1'); |
| |
| config.reDisablePlugins = RegExp( |
| `^(?:${config |
| .disablePlugins!.split(',') |
| .map((s) => escapeRegExp(s.trim())) |
| .join('|')})$`, |
| 'i', |
| ); |
| |
| const convertIgnoreSuffix = (configuredIgnoreSuffix: string | undefined) => { |
| if (!configuredIgnoreSuffix) { |
| // This regexp will never match => no files are ignored. |
| return '\\A(?!x)x'; |
| } else { |
| return `^.+(?:${configuredIgnoreSuffix! |
| .split(',') |
| .map((s) => escapeRegExp(s.trim())) |
| .join('|')})$`; |
| } |
| }; |
| |
| const ignoreSuffix = convertIgnoreSuffix(config.ignoreSuffix); |
| const ignorePath = |
| '^(?:' + |
| config |
| .traceIgnorePath!.split(',') |
| .map( |
| (s0) => |
| s0 |
| .trim() |
| .split('/**/') |
| .map( |
| (s1) => |
| s1 |
| .trim() |
| .split('**') |
| .map( |
| (s2) => |
| s2 |
| .split('*') |
| .map( |
| (s3) => s3.split('?').map(escapeRegExp).join('[^/]'), // replaces "?" |
| ) |
| .join('[^/]*'), // replaces "*" |
| ) |
| .join('(?:(?:[^/]+/)*[^/]+)?'), // replaces "**" |
| ) |
| .join('/(?:[^/]*/)*'), // replaces "/**/" |
| ) |
| .join('|') + |
| ')$'; // replaces "," |
| |
| config.reIgnoreOperation = RegExp(`${ignoreSuffix}|${ignorePath}`); |
| config.reHttpIgnoreMethod = RegExp( |
| `^(?:${config |
| .httpIgnoreMethod!.split(',') |
| .map((s) => escapeRegExp(s.trim())) |
| .join('|')})$`, |
| 'i', |
| ); |
| } |
| |
| const _config = { |
| serviceName: process.env.SW_AGENT_NAME || 'your-nodejs-service', |
| serviceInstance: |
| process.env.SW_AGENT_INSTANCE || |
| ((): string => { |
| return os.hostname(); |
| })(), |
| collectorAddress: process.env.SW_AGENT_COLLECTOR_BACKEND_SERVICES || '127.0.0.1:11800', |
| secure: process.env.SW_AGENT_SECURE?.toLowerCase() === 'true', |
| authorization: process.env.SW_AGENT_AUTHENTICATION, |
| maxBufferSize: ((n) => (Number.isSafeInteger(n) && n > 0 ? n : 1000))( |
| Number.parseInt(process.env.SW_AGENT_MAX_BUFFER_SIZE ?? '', 10), |
| ), |
| coldEndpoint: process.env.SW_COLD_ENDPOINT?.toLowerCase() === 'true', |
| disablePlugins: process.env.SW_AGENT_DISABLE_PLUGINS || '', |
| ignoreSuffix: process.env.SW_IGNORE_SUFFIX ?? '.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg', |
| traceIgnorePath: process.env.SW_TRACE_IGNORE_PATH || '', |
| httpIgnoreMethod: process.env.SW_HTTP_IGNORE_METHOD || '', |
| sqlTraceParameters: (process.env.SW_SQL_TRACE_PARAMETERS || '').toLowerCase() === 'true', |
| sqlParametersMaxLength: Math.trunc(Math.max(0, Number(process.env.SW_SQL_PARAMETERS_MAX_LENGTH))) || 512, |
| mongoTraceParameters: (process.env.SW_MONGO_TRACE_PARAMETERS || '').toLowerCase() === 'true', |
| mongoParametersMaxLength: Math.trunc(Math.max(0, Number(process.env.SW_MONGO_PARAMETERS_MAX_LENGTH))) || 512, |
| awsLambdaFlush: ((n) => (Number.isNaN(n) ? -1 : n))(Number(process.env.SW_AWS_LAMBDA_FLUSH || 2)), |
| awsLambdaChain: (process.env.SW_AWS_LAMBDA_CHAIN || 'false').toLowerCase() === 'true', |
| awsSQSCheckBody: (process.env.SW_AWS_SQS_CHECK_BODY || 'false').toLowerCase() === 'true', |
| reDisablePlugins: RegExp(''), // temporary placeholder so Typescript doesn't throw a fit |
| reIgnoreOperation: RegExp(''), |
| reHttpIgnoreMethod: RegExp(''), |
| traceTimeout: ((n) => (Number.isSafeInteger(n) && n > 0 ? n : 10 * 1000))( |
| Number.parseInt(process.env.SW_AGENT_TRACE_TIMEOUT ?? '', 10), |
| ), |
| runtimeMetricsReporterActive: ((): boolean => { |
| const configured = |
| process.env.SW_AGENT_NODEJS_RUNTIME_METRICS_REPORTER_ACTIVE ?? |
| process.env.SW_AGENT_RUNTIME_METRICS_REPORTER_ACTIVE ?? |
| process.env.SW_AGENT_NVM_METRICS_REPORTER_ACTIVE ?? |
| process.env.SW_AGENT_NVM_JVM_REPORTER_ACTIVE; |
| return configured?.toLowerCase() !== 'false'; |
| })(), |
| runtimeMetricsCollectPeriod: ((n) => (Number.isSafeInteger(n) && n > 0 ? n : 1000))( |
| Number.parseInt( |
| process.env.SW_AGENT_NODEJS_RUNTIME_METRICS_COLLECT_PERIOD ?? |
| process.env.SW_AGENT_RUNTIME_METRICS_COLLECT_PERIOD ?? |
| process.env.SW_AGENT_NVM_METRICS_COLLECT_PERIOD ?? |
| process.env.SW_AGENT_NVM_JVM_METRICS_COLLECT_PERIOD ?? |
| '', |
| 10, |
| ), |
| ), |
| runtimeMetricsReportPeriod: ((n) => (Number.isSafeInteger(n) && n > 0 ? n : 1000))( |
| Number.parseInt( |
| process.env.SW_AGENT_NODEJS_RUNTIME_METRICS_REPORT_PERIOD ?? |
| process.env.SW_AGENT_RUNTIME_METRICS_REPORT_PERIOD ?? |
| process.env.SW_AGENT_NVM_METRICS_REPORT_PERIOD ?? |
| process.env.SW_AGENT_NVM_JVM_METRICS_REPORT_PERIOD ?? |
| '', |
| 10, |
| ), |
| ), |
| runtimeMetricsBufferSize: ((n) => (Number.isSafeInteger(n) && n > 0 ? n : 600))( |
| Number.parseInt( |
| process.env.SW_AGENT_NODEJS_RUNTIME_METRICS_BUFFER_SIZE ?? |
| process.env.SW_AGENT_RUNTIME_METRICS_BUFFER_SIZE ?? |
| process.env.SW_AGENT_NVM_METRICS_BUFFER_SIZE ?? |
| process.env.SW_AGENT_NVM_JVM_METRICS_BUFFER_SIZE ?? |
| '', |
| 10, |
| ), |
| ), |
| }; |
| |
| export default _config; |
| |
| export function ignoreHttpMethodCheck(method: string): boolean { |
| return Boolean(method.match(_config.reHttpIgnoreMethod)); |
| } |