diff --git a/docs/core/logger.md b/docs/core/logger.md index ab0bd44986..bcafa63de8 100644 --- a/docs/core/logger.md +++ b/docs/core/logger.md @@ -52,12 +52,12 @@ The library requires two settings. You can set them as environment variables, or These settings will be used across all logs emitted: -| Setting | Description | Environment variable | Constructor parameter | -|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------|-----------------------| -| **Service name** | Sets the name of service of which the Lambda function is part of, that will be present across all log statements | `POWERTOOLS_SERVICE_NAME` | `serviceName` | -| **Logging level** | Sets how verbose Logger should be (INFO, by default). Supported values are: `DEBUG`, `INFO`, `WARN`, `ERROR` | `LOG_LEVEL` | `logLevel` | -| **Log incoming event** | Whether to log or not the incoming event when using the decorator or middleware. Supported values are: `true`, or `false`, disabled by default | `POWERTOOLS_LOGGER_LOG_EVENT` | `logEvent` | -| **Debug log sampling** | Probability that a Lambda invocation will print all the log items regardless of the log level setting. Supported values range from `0.0` to `1` | `POWERTOOLS_LOGGER_SAMPLE_RATE` | `sampleRateValue` | +| Setting | Description | Environment variable | Default Value | Allowed Values | Example Value | Constructor parameter | +|-------------------------|------------------------------------------------------------------------------------------------------------------|---------------------------------|---------------------|--------------------------------|--------------------|-----------------------| +| **Service name** | Sets the name of service of which the Lambda function is part of, that will be present across all log statements | `POWERTOOLS_SERVICE_NAME` | `service_undefined` | Any string | `serverlessAirline`| `serviceName` | +| **Logging level** | Sets how verbose Logger should be | `LOG_LEVEL` | `info` |`DEBUG`, `INFO`, `WARN`, `ERROR`| `ERROR` | `logLevel` | +| **Log incoming event** | Whether to log or not the incoming event when using the decorator or middleware. | `POWERTOOLS_LOGGER_LOG_EVENT` | `false` | `true`, `false` | `false` | `logEvent` | +| **Debug log sampling** | Probability that a Lambda invocation will print all the log items regardless of the log level setting. | `POWERTOOLS_LOGGER_SAMPLE_RATE` | `0` | `0.0` to `1` | `0.5` | `sampleRateValue` | #### Example using AWS Serverless Application Model (SAM) diff --git a/docs/core/metrics.md b/docs/core/metrics.md index 3b2d4baa3f..661cc78de6 100644 --- a/docs/core/metrics.md +++ b/docs/core/metrics.md @@ -66,10 +66,10 @@ The library requires two settings. You can set them as environment variables, or These settings will be used across all metrics emitted: -| Setting | Description | Environment variable | Constructor parameter | -|----------------------|---------------------------------------------------------------------------------|--------------------------------|-----------------------| -| **Service** | Optionally, sets **service** metric dimension across all metrics e.g. `payment` | `POWERTOOLS_SERVICE_NAME` | `serviceName` | -| **Metric namespace** | Logical container where all metrics will be placed e.g. `serverlessAirline` | `POWERTOOLS_METRICS_NAMESPACE` | `namespace` | +| Setting | Description | Environment variable | Default | Allowed Values | Example | Constructor parameter | +|----------------------|-----------------------------------------------------------------|-------------------------------|--------------------|----------------|--------------------|-----------------------| +| **Service** | Optionally, sets **service** metric dimension across all metrics| `POWERTOOLS_SERVICE_NAME` | `service_undefined`| Any string | `serverlessAirline`| `serviceName` | +| **Metric namespace** | Logical container where all metrics will be placed | `POWERTOOLS_METRICS_NAMESPACE`| `default_namespace`| Any string | `serverlessAirline`| `default_namespace` | !!! tip Use your application name or main service as the metric namespace to easily group all metrics diff --git a/docs/core/tracer.md b/docs/core/tracer.md index ec90e4977a..c51e76a21f 100644 --- a/docs/core/tracer.md +++ b/docs/core/tracer.md @@ -50,13 +50,13 @@ The `Tracer` utility must always be instantiated outside of the Lambda handler. The library has three optional settings. You can set them as environment variables, or pass them in the constructor: -| Setting | Description | Environment variable | Constructor parameter | -|----------------------------|-----------------------------------------------------------------------------------------------------------------| -------------------------------------------|------------------------| -| **Service name** | Sets an annotation with the **name of the service** across all traces e.g. `serverlessAirline` | `POWERTOOLS_SERVICE_NAME` | `serviceName` | -| **Tracing enabled** | Enables or disables tracing. By default tracing is enabled when running in AWS Lambda | `POWERTOOLS_TRACE_ENABLED` | `enabled` | -| **Capture HTTPs Requests** | Defines whether HTTPs requests will be traced or not, enabled by default when tracing is also enabled | `POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS` | `captureHTTPsRequests` | -| **Capture Response** | Defines whether functions responses are serialized as metadata, enabled by default when tracing is also enabled | `POWERTOOLS_TRACER_CAPTURE_RESPONSE` | `captureResult` | -| **Capture Errors** | Defines whether functions errors are serialized as metadata, enabled by default when tracing is also enabled | `POWERTOOLS_TRACER_CAPTURE_ERROR` | N/A | +| Setting | Description | Environment variable | Default | Allowed Values | Example | Constructor parameter | +|----------------------------|-----------------------------------------------------------------------| -------------------------------------------|--------------------|------------------|--------------------|------------------------| +| **Service name** | Sets an annotation with the **name of the service** across all traces | `POWERTOOLS_SERVICE_NAME` | `service_undefined`| Any string | `serverlessAirline`| `serviceName` | +| **Tracing enabled** | Enables or disables tracing. | `POWERTOOLS_TRACE_ENABLED` | `true `| `true` or `false`| `false` | `enabled` | +| **Capture HTTPs Requests** | Defines whether HTTPs requests will be traced or not | `POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS` | `true` | `true` or `false`| `false` | `captureHTTPsRequests` | +| **Capture Response** | Defines whether functions responses are serialized as metadata | `POWERTOOLS_TRACER_CAPTURE_RESPONSE` | `true` | `true` or `false`| `false` | `captureResult` | +| **Capture Errors** | Defines whether functions errors are serialized as metadata | `POWERTOOLS_TRACER_CAPTURE_ERROR` | `true` | `true` or `false`| `false` | N/A | !!! note Before your use this utility, your AWS Lambda function must have [Active Tracing enabled](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html) as well as [have permissions](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html#services-xray-permissions) to send traces to AWS X-Ray diff --git a/docs/index.md b/docs/index.md index 88b35688a6..570a3f19ad 100644 --- a/docs/index.md +++ b/docs/index.md @@ -285,8 +285,8 @@ Core utilities such as Tracing, Logging, and Metrics will be available across al | Environment variable | Description | Utility | Default | |----------------------------------------------|----------------------------------------------------------------------------------------|---------------------------|-----------------------| -| **POWERTOOLS_SERVICE_NAME** | Sets service name used for tracing namespace, metrics dimension and structured logging | All | `"service_undefined"` | -| **POWERTOOLS_METRICS_NAMESPACE** | Sets namespace used for metrics | [Metrics](./core/metrics) | `None` | +| **POWERTOOLS_SERVICE_NAME** | Sets service name used for tracing namespace, metrics dimension and structured logging | All | `service_undefined` | +| **POWERTOOLS_METRICS_NAMESPACE** | Sets namespace used for metrics | [Metrics](./core/metrics) | `default_namespace` | | **POWERTOOLS_TRACE_ENABLED** | Explicitly disables tracing | [Tracer](./core/tracer) | `true` | | **POWERTOOLS_TRACER_CAPTURE_RESPONSE** | Captures Lambda or method return as metadata. | [Tracer](./core/tracer) | `true` | | **POWERTOOLS_TRACER_CAPTURE_ERROR** | Captures Lambda or method exception as metadata. | [Tracer](./core/tracer) | `true` | @@ -295,6 +295,8 @@ Core utilities such as Tracing, Logging, and Metrics will be available across al | **POWERTOOLS_LOGGER_SAMPLE_RATE** | Debug log sampling | [Logger](./core/logger) | `0` | | **LOG_LEVEL** | Sets logging level | [Logger](./core/logger) | `INFO` | +Each Utility page provides information on example values and allowed values + ## Tenets These are our core principles to guide our decision making. diff --git a/packages/commons/src/Utility.ts b/packages/commons/src/Utility.ts index 9991f18cef..c1c2a0fc05 100644 --- a/packages/commons/src/Utility.ts +++ b/packages/commons/src/Utility.ts @@ -56,8 +56,8 @@ * ``` */ export class Utility { - private coldStart: boolean = true; + private readonly defaultServiceName: string = 'service_undefined'; public getColdStart(): boolean { if (this.coldStart) { @@ -73,4 +73,17 @@ export class Utility { return this.getColdStart(); } + protected getDefaultServiceName(): string { + return this.defaultServiceName; + } + + /** + * Validate that the service name provided is valid. + * Used internally during initialization. + * + * @param serviceName - Service name to validate + */ + protected isValidServiceName(serviceName?: string): boolean { + return typeof serviceName === 'string' && serviceName.trim().length > 0; + } } \ No newline at end of file diff --git a/packages/commons/tests/unit/Utility.test.ts b/packages/commons/tests/unit/Utility.test.ts index 42db79d7af..b8a89f4af7 100644 --- a/packages/commons/tests/unit/Utility.test.ts +++ b/packages/commons/tests/unit/Utility.test.ts @@ -12,6 +12,24 @@ describe('Class: Utility', () => { jest.resetModules(); }); + describe('Method: getDefaultServiceName', ()=> { + test('it should return the default service name', ()=> { + class PowerTool extends Utility { + public constructor() { + super(); + } + + public dummyMethod(): string { + return this.getDefaultServiceName(); + } + } + + const powertool = new PowerTool(); + const result = powertool.dummyMethod(); + expect(result).toBe('service_undefined'); + }); + }); + describe('Method: getColdStart', () => { test('when called multiple times on the parent class, it returns true the first time, then false afterwards', () => { @@ -142,4 +160,31 @@ describe('Class: Utility', () => { }); + describe('Method: isValidServiceName', () => { + class PowerTool extends Utility { + public constructor() { + super(); + } + + public dummyMethod(name:string): boolean { + return this.isValidServiceName(name); + } + } + test('it should allow valid strings', ()=> { + const powertool = new PowerTool(); + const goodName = 'serverlessAirline'; + + const result = powertool.dummyMethod(goodName); + + expect(result).toBe(true); + }); + + test('it should not allow empty strings', ()=> { + const tooShort = ''; + const powertool = new PowerTool(); + const result = powertool.dummyMethod(tooShort); + + expect(result).toBe(false); + }); + }); }); \ No newline at end of file diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index 92f0d9ee07..61bcb25ea2 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -118,8 +118,6 @@ class Logger extends Utility implements ClassThatLogs { private static readonly defaultLogLevel: LogLevel = 'INFO'; - private static readonly defaultServiceName: string = 'service_undefined'; - // envVarsService is always initialized in the constructor in setOptions() private envVarsService!: EnvironmentVariablesService; @@ -786,7 +784,7 @@ class Logger extends Utility implements ClassThatLogs { this.getEnvVarsService().getCurrentEnvironment(), sampleRateValue: this.getSampleRateValue(), serviceName: - serviceName || this.getCustomConfigService()?.getServiceName() || this.getEnvVarsService().getServiceName() || Logger.defaultServiceName, + serviceName || this.getCustomConfigService()?.getServiceName() || this.getEnvVarsService().getServiceName() || this.getDefaultServiceName(), }, persistentLogAttributes, ); diff --git a/packages/logger/tests/unit/Logger.test.ts b/packages/logger/tests/unit/Logger.test.ts index 17b7969230..f7369c58a4 100644 --- a/packages/logger/tests/unit/Logger.test.ts +++ b/packages/logger/tests/unit/Logger.test.ts @@ -571,6 +571,7 @@ describe('Class: Logger', () => { console: expect.any(Console), coldStart: false, // This is now false because the `coldStart` attribute has been already accessed once by the `addContext` method customConfigService: undefined, + defaultServiceName: 'service_undefined', envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, logFormatter: expect.any(PowertoolLogFormatter), @@ -1269,6 +1270,7 @@ describe('Class: Logger', () => { console: expect.any(Console), coldStart: true, customConfigService: undefined, + defaultServiceName: 'service_undefined', envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, logFormatter: expect.any(PowertoolLogFormatter), @@ -1293,6 +1295,7 @@ describe('Class: Logger', () => { console: expect.any(Console), coldStart: true, customConfigService: undefined, + defaultServiceName: 'service_undefined', envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, logFormatter: expect.any(PowertoolLogFormatter), @@ -1319,6 +1322,7 @@ describe('Class: Logger', () => { console: expect.any(Console), coldStart: true, customConfigService: undefined, + defaultServiceName: 'service_undefined', envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, logFormatter: expect.any(PowertoolLogFormatter), @@ -1343,6 +1347,7 @@ describe('Class: Logger', () => { console: expect.any(Console), coldStart: true, customConfigService: undefined, + defaultServiceName: 'service_undefined', envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, logFormatter: expect.any(PowertoolLogFormatter), diff --git a/packages/logger/tests/unit/helpers.test.ts b/packages/logger/tests/unit/helpers.test.ts index 9309bea207..fc1c941c07 100644 --- a/packages/logger/tests/unit/helpers.test.ts +++ b/packages/logger/tests/unit/helpers.test.ts @@ -46,13 +46,14 @@ describe('Helper: createLogger function', () => { }, envVarsService: expect.any(EnvironmentVariablesService), customConfigService: undefined, + defaultServiceName: 'service_undefined', logLevel: 'DEBUG', logFormatter: expect.any(PowertoolLogFormatter), })); }); - test('when no parameters are set, returns a Logger instance with the correct proprieties', () => { + test('when no parameters are set, returns a Logger instance with the correct properties', () => { // Prepare const loggerOptions = { @@ -74,6 +75,7 @@ describe('Helper: createLogger function', () => { expect(logger).toBeInstanceOf(Logger); expect(logger).toEqual({ coldStart: true, + defaultServiceName: 'service_undefined', customConfigService: expect.any(EnvironmentVariablesService), envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, @@ -100,7 +102,7 @@ describe('Helper: createLogger function', () => { }); - test('when no constructor parameters and no environment variables are set, returns a Logger instance with the default proprieties', () => { + test('when no constructor parameters and no environment variables are set, returns a Logger instance with the default properties', () => { // Prepare const loggerOptions = undefined; @@ -115,6 +117,7 @@ describe('Helper: createLogger function', () => { expect(logger).toEqual({ coldStart: true, customConfigService: undefined, + defaultServiceName: 'service_undefined', envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, logFormatter: expect.any(PowertoolLogFormatter), @@ -138,7 +141,7 @@ describe('Helper: createLogger function', () => { }); - test('when a custom logFormatter is passed, returns a Logger instance with the correct proprieties', () => { + test('when a custom logFormatter is passed, returns a Logger instance with the correct properties', () => { // Prepare const loggerOptions:ConstructorOptions = { @@ -166,7 +169,7 @@ describe('Helper: createLogger function', () => { })); }); - test('when a custom serviceName is passed, returns a Logger instance with the correct proprieties', () => { + test('when a custom serviceName is passed, returns a Logger instance with the correct properties', () => { // Prepare const loggerOptions:ConstructorOptions = { @@ -194,7 +197,7 @@ describe('Helper: createLogger function', () => { })); }); - test('when a custom logLevel is passed, returns a Logger instance with the correct proprieties', () => { + test('when a custom logLevel is passed, returns a Logger instance with the correct properties', () => { // Prepare const loggerOptions:ConstructorOptions = { @@ -236,6 +239,7 @@ describe('Helper: createLogger function', () => { expect(logger).toEqual({ coldStart: true, customConfigService: undefined, + defaultServiceName: 'service_undefined', envVarsService: expect.any(EnvironmentVariablesService), logEvent: false, logFormatter: expect.any(PowertoolLogFormatter), @@ -258,7 +262,7 @@ describe('Helper: createLogger function', () => { }); }); - test('when a custom sampleRateValue is passed, returns a Logger instance with the correct proprieties', () => { + test('when a custom sampleRateValue is passed, returns a Logger instance with the correct properties', () => { // Prepare const loggerOptions:ConstructorOptions = { @@ -286,7 +290,7 @@ describe('Helper: createLogger function', () => { })); }); - test('when a custom customConfigService is passed, returns a Logger instance with the correct proprieties', () => { + test('when a custom customConfigService is passed, returns a Logger instance with the correct properties', () => { const configService: ConfigServiceInterface = { get(name: string): string { @@ -335,7 +339,7 @@ describe('Helper: createLogger function', () => { })); }); - test('when custom persistentLogAttributes is passed, returns a Logger instance with the correct proprieties', () => { + test('when custom persistentLogAttributes is passed, returns a Logger instance with the correct properties', () => { // Prepare const loggerOptions:ConstructorOptions = { @@ -377,7 +381,7 @@ describe('Helper: createLogger function', () => { })); }); - test('when A custom environment is passed, returns a Logger instance with the correct proprieties', () => { + test('when a custom environment is passed, returns a Logger instance with the correct properties', () => { // Prepare const loggerOptions:ConstructorOptions = { diff --git a/packages/metrics/src/Metrics.ts b/packages/metrics/src/Metrics.ts index 10e500b5f7..dbde8e0438 100644 --- a/packages/metrics/src/Metrics.ts +++ b/packages/metrics/src/Metrics.ts @@ -473,7 +473,7 @@ class Metrics extends Utility implements MetricsInterface { private setService(service: string | undefined): void { const targetService = (service || this.getCustomConfigService()?.getServiceName() || - this.getEnvVarsService().getServiceName()) as string; + this.getEnvVarsService().getServiceName()) as string || this.getDefaultServiceName(); if (targetService.length > 0) { this.setDefaultDimensions({ service: targetService }); } diff --git a/packages/metrics/tests/unit/Metrics.test.ts b/packages/metrics/tests/unit/Metrics.test.ts index b3f0086d70..af6a85bf69 100644 --- a/packages/metrics/tests/unit/Metrics.test.ts +++ b/packages/metrics/tests/unit/Metrics.test.ts @@ -76,7 +76,8 @@ describe('Class: Metrics', () => { metrics.addDimension(additionalDimension.name, additionalDimension.value); const loggedData = metrics.serializeMetrics(); - expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(1); + // Expect the additional dimension, and the service dimension + expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(2); expect(loggedData[additionalDimension.name]).toEqual(additionalDimension.value); }); @@ -104,15 +105,18 @@ describe('Class: Metrics', () => { expect(console.log).toBeCalledTimes(2); expect(loggedData[0][dimensionItem.name]).toEqual(dimensionItem.value); - expect(loggedData[0]._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(1); + // Expect the additional dimension, and the service dimension + expect(loggedData[0]._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(2); expect(loggedData[1][dimensionItem.name]).toBeUndefined(); - expect(loggedData[1]._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(0); + // Expect just the service dimension + expect(loggedData[1]._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(1); }); test('Adding more than max dimensions should throw error', () => { expect.assertions(1); const metrics = new Metrics(); - for (let x = 0; x < MAX_DIMENSION_COUNT; x++) { + // The service dimension is already set, so start from 1 + for (let x = 1; x < MAX_DIMENSION_COUNT; x++) { metrics.addDimension(`Dimension-${x}`, `value-${x}`); } try { @@ -130,7 +134,8 @@ describe('Class: Metrics', () => { metrics.addDimensions(additionalDimensions); const loggedData = metrics.serializeMetrics(); - expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(2); + // Expect the additional dimensions, and the service dimension + expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(3); Object.keys(additionalDimensions).forEach((key) => { expect(loggedData[key]).toEqual(additionalDimensions[key]); }); @@ -249,7 +254,8 @@ describe('Class: Metrics', () => { metrics.addMetric('test_name', MetricUnits.Seconds, 10); metrics.addDimension(additionalDimension.name, additionalDimension.value); const loggedData = metrics.serializeMetrics(); - expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(2); + // Expect the additional dimensions, and the service dimension + expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(3); expect(loggedData[additionalDimension.name]).toEqual(additionalDimension.value); metrics.clearDimensions(); } @@ -259,7 +265,8 @@ describe('Class: Metrics', () => { const loggedData = JSON.parse(consoleSpy.mock.calls[0][0]); expect(console.log).toBeCalledTimes(1); - expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(1); + // Expect the additional dimension, and the service dimension + expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(2); expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0]).toContain('default'); expect(loggedData.default).toContain('defaultValue'); }); @@ -661,7 +668,8 @@ describe('Class: Metrics', () => { metrics.addMetric('test_name', MetricUnits.Seconds, 10); metrics.addDimension(additionalDimension.name, additionalDimension.value); const loggedData = metrics.serializeMetrics(); - expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(2); + // Expect the additional dimensions, and the service dimension + expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(3); expect(loggedData[additionalDimension.name]).toEqual(additionalDimension.value); metrics.clearDimensions(); @@ -673,7 +681,8 @@ describe('Class: Metrics', () => { const loggedData = JSON.parse(consoleSpy.mock.calls[0][0]); expect(console.log).toBeCalledTimes(1); - expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(1); + // Expect the additional dimension, and the service dimension + expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual(2); expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0]).toContain('default'); expect(loggedData.default).toContain('defaultValue'); }); diff --git a/packages/tracer/src/Tracer.ts b/packages/tracer/src/Tracer.ts index 072e237e4c..6d846b371f 100644 --- a/packages/tracer/src/Tracer.ts +++ b/packages/tracer/src/Tracer.ts @@ -128,7 +128,8 @@ class Tracer extends Utility implements TracerInterface { // envVarsService is always initialized in the constructor in setOptions() private envVarsService!: EnvironmentVariablesService; - private serviceName?: string; + // serviceName is always initialized in the constructor in setOptions() + private serviceName!: string; private tracingEnabled: boolean = true; @@ -189,7 +190,7 @@ class Tracer extends Utility implements TracerInterface { * */ public addServiceNameAnnotation(): void { - if (!this.isTracingEnabled() || this.serviceName === undefined) { + if (!this.isTracingEnabled()) { return; } this.putAnnotation('Service', this.serviceName); @@ -684,16 +685,6 @@ class Tracer extends Utility implements TracerInterface { return this.getEnvVarsService().getSamLocal() !== ''; } - /** - * Validate that the service name provided is valid. - * Used internally during initialization. - * - * @param serviceName - Service name to validate - */ - private static isValidServiceName(serviceName?: string): boolean { - return typeof serviceName === 'string' && serviceName.trim().length > 0; - } - /** * Setter for `captureError` based on configuration passed and environment variables. * Used internally during initialization. @@ -817,25 +808,26 @@ class Tracer extends Utility implements TracerInterface { * @param serviceName - Name of the service to use */ private setServiceName(serviceName?: string): void { - if (serviceName !== undefined && Tracer.isValidServiceName(serviceName)) { + if (serviceName !== undefined && this.isValidServiceName(serviceName)) { this.serviceName = serviceName; return; } const customConfigValue = this.getCustomConfigService()?.getServiceName(); - if (customConfigValue !== undefined && Tracer.isValidServiceName(customConfigValue)) { + if (customConfigValue !== undefined && this.isValidServiceName(customConfigValue)) { this.serviceName = customConfigValue; return; } const envVarsValue = this.getEnvVarsService().getServiceName(); - if (envVarsValue !== undefined && Tracer.isValidServiceName(envVarsValue)) { + if (envVarsValue !== undefined && this.isValidServiceName(envVarsValue)) { this.serviceName = envVarsValue; return; } + this.serviceName = this.getDefaultServiceName(); } /** diff --git a/packages/tracer/tests/unit/Tracer.test.ts b/packages/tracer/tests/unit/Tracer.test.ts index f541f2e4db..129ecb694b 100644 --- a/packages/tracer/tests/unit/Tracer.test.ts +++ b/packages/tracer/tests/unit/Tracer.test.ts @@ -134,7 +134,7 @@ describe('Class: Tracer', () => { }); - test('when called while a serviceName has not been set, it does nothing', () => { + test('when called when a serviceName has not been set in the constructor or environment variables, it adds the default service name as an annotation', () => { // Prepare delete process.env.POWERTOOLS_SERVICE_NAME; @@ -145,7 +145,8 @@ describe('Class: Tracer', () => { tracer.addServiceNameAnnotation(); // Assess - expect(putAnnotation).toBeCalledTimes(0); + expect(putAnnotation).toBeCalledTimes(1); + expect(putAnnotation).toBeCalledWith('Service', 'service_undefined'); });