Skip to content

Commit

Permalink
feat(metrics): add esmodule support (#1739)
Browse files Browse the repository at this point in the history
  • Loading branch information
dreamorosi committed Oct 12, 2023
1 parent 90a7523 commit e5e42d0
Show file tree
Hide file tree
Showing 28 changed files with 293 additions and 296 deletions.
2 changes: 1 addition & 1 deletion examples/cdk/functions/get-all-items.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { injectLambdaContext } from '@aws-lambda-powertools/logger/middleware';
import { logMetrics } from '@aws-lambda-powertools/metrics';
import { logMetrics } from '@aws-lambda-powertools/metrics/middleware';
import { captureLambdaHandler } from '@aws-lambda-powertools/tracer';
import { ScanCommand } from '@aws-sdk/lib-dynamodb';
import middy from '@middy/core';
Expand Down
2 changes: 1 addition & 1 deletion examples/sam/src/get-all-items.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
import middy from '@middy/core';
import { tableName } from './common/constants';
import { logger, tracer, metrics } from './common/powertools';
import { logMetrics } from '@aws-lambda-powertools/metrics';
import { logMetrics } from '@aws-lambda-powertools/metrics/middleware';
import { injectLambdaContext } from '@aws-lambda-powertools/logger/middleware';
import { captureLambdaHandler } from '@aws-lambda-powertools/tracer';
import { docClient } from './common/dynamodb-client';
Expand Down
2 changes: 1 addition & 1 deletion layers/tests/e2e/layerPublisher.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import { App } from 'aws-cdk-lib';
import { LayerVersion } from 'aws-cdk-lib/aws-lambda';
import { LayerPublisherStack } from '../../src/layer-publisher-stack';
import {
TestNodejsFunction,
TestStack,
TestInvocationLogs,
invokeFunctionOnce,
generateTestUniqueName,
} from '@aws-lambda-powertools/testing-utils';
import { TestNodejsFunction } from '@aws-lambda-powertools/testing-utils/resources/lambda';
import {
RESOURCE_NAME_PREFIX,
SETUP_TIMEOUT,
Expand Down
10 changes: 9 additions & 1 deletion packages/commons/src/types/LambdaInterface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,12 @@ interface LambdaInterface {
handler: SyncHandler<Handler> | AsyncHandler<Handler>;
}

export { LambdaInterface };
type HandlerMethodDecorator = (
target: LambdaInterface,
propertyKey: string | symbol,
descriptor:
| TypedPropertyDescriptor<SyncHandler<Handler>>
| TypedPropertyDescriptor<AsyncHandler<Handler>>
) => void;

export { LambdaInterface, HandlerMethodDecorator };
17 changes: 13 additions & 4 deletions packages/commons/src/types/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
export * from './middy.js';
export * from './awsSdk.js';
export * from './json.js';
export * from './LambdaInterface.js';
export {
MiddlewareLikeObj,
MiddyLikeRequest,
CleanupFunction,
} from './middy.js';
export { SdkClient, MiddlewareArgsLike } from './awsSdk.js';
export { JSONPrimitive, JSONValue, JSONObject, JSONArray } from './json.js';
export {
SyncHandler,
AsyncHandler,
LambdaInterface,
HandlerMethodDecorator,
} from './LambdaInterface.js';
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ module.exports = {
},
runner: 'groups',
preset: 'ts-jest',
moduleNameMapper: {
'^(\\.{1,2}/.*)\\.js$': '$1',
},
transform: {
'^.+\\.ts?$': 'ts-jest',
},
Expand All @@ -14,7 +17,7 @@ module.exports = {
roots: ['<rootDir>/src', '<rootDir>/tests'],
testPathIgnorePatterns: ['/node_modules/'],
testEnvironment: 'node',
coveragePathIgnorePatterns: ['/node_modules/'],
coveragePathIgnorePatterns: ['/node_modules/', '/types/'],
coverageThreshold: {
global: {
statements: 100,
Expand Down
43 changes: 39 additions & 4 deletions packages/metrics/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,54 @@
"test:e2e:nodejs18x": "RUNTIME=nodejs18x jest --group=e2e",
"test:e2e": "jest --group=e2e",
"watch": "jest --group=unit --watch ",
"build": "tsc --build --force",
"build:cjs": "tsc --build --force && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json",
"build:esm": "tsc --project tsconfig.esm.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json",
"build": "npm run build:esm & npm run build:cjs",
"lint": "eslint --ext .ts,.js --no-error-on-unmatched-pattern .",
"lint-fix": "eslint --fix --ext .ts,.js --no-error-on-unmatched-pattern .",
"prebuild": "rimraf ./lib",
"prepack": "node ../../.github/scripts/release_patch_package_json.js ."
"prepack": "rimraf ./lib/*.tsbuildinfo && node ../../.github/scripts/release_patch_package_json.js ."
},
"lint-staged": {
"*.{js,ts}": "npm run lint-fix"
},
"homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/metrics#readme",
"license": "MIT-0",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"type": "module",
"exports": {
".": {
"require": {
"types": "./lib/cjs/index.d.ts",
"default": "./lib/cjs/index.js"
},
"import": {
"types": "./lib/esm/index.d.ts",
"default": "./lib/esm/index.js"
}
},
"./middleware": {
"import": "./lib/esm/middleware/middy.js",
"require": "./lib/cjs/middleware/middy.js"
},
"./types": {
"import": "./lib/esm/types/index.js",
"require": "./lib/cjs/types/index.js"
}
},
"typesVersions": {
"*": {
"middleware": [
"lib/cjs/middleware/middy.d.ts",
"lib/esm/middleware/middy.d.ts"
],
"types": [
"lib/cjs/types/index.d.ts",
"lib/esm/types/index.d.ts"
]
}
},
"types": "./lib/cjs/index.d.ts",
"main": "./lib/cjs/index.js",
"devDependencies": {
"@aws-lambda-powertools/testing-utils": "file:../testing",
"@aws-sdk/client-cloudwatch": "^3.413.0",
Expand Down
61 changes: 30 additions & 31 deletions packages/metrics/src/Metrics.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,28 @@
import type { Callback, Context, Handler } from 'aws-lambda';
import { Utility } from '@aws-lambda-powertools/commons';
import type { MetricsInterface } from './MetricsInterface';
import {
type ConfigServiceInterface,
EnvironmentVariablesService,
} from './config';
import type { HandlerMethodDecorator } from '@aws-lambda-powertools/commons/types';
import { EnvironmentVariablesService } from './config/EnvironmentVariablesService.js';
import {
MAX_DIMENSION_COUNT,
MAX_METRICS_SIZE,
DEFAULT_NAMESPACE,
COLD_START_METRIC,
MAX_METRIC_VALUES_SIZE,
} from './constants';
MetricUnit as MetricUnits,
MetricResolution as MetricResolutions,
} from './constants.js';
import {
MetricsOptions,
Dimensions,
EmfOutput,
HandlerMethodDecorator,
StoredMetrics,
ExtraOptions,
MetricUnit,
MetricUnits,
MetricResolution,
MetricDefinition,
} from './types';
type MetricsOptions,
type Dimensions,
type EmfOutput,
type StoredMetrics,
type ExtraOptions,
type MetricDefinition,
type ConfigServiceInterface,
type MetricsInterface,
type MetricUnit,
type MetricResolution,
} from './types/index.js';

/**
* ## Intro
Expand Down Expand Up @@ -83,7 +82,7 @@ import {
* @metrics.logMetrics({ captureColdStartMetric: true, throwOnEmptyMetrics: true })
* public handler(_event: any, _context: any): Promise<void> {
* // ...
* metrics.addMetric('test-metric', MetricUnits.Count, 10);
* metrics.addMetric('test-metric', MetricUnit.Count, 10);
* // ...
* }
* }
Expand All @@ -99,13 +98,13 @@ import {
* @example
*
* ```typescript
* import { Metrics, MetricUnits } from '@aws-lambda-powertools/metrics';
* import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics';
*
* const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' });
*
* export const handler = async (_event: any, _context: any): Promise<void> => {
* metrics.captureColdStartMetric();
* metrics.addMetric('test-metric', MetricUnits.Count, 10);
* metrics.addMetric('test-metric', MetricUnit.Count, 10);
* metrics.publishStoredMetrics();
* };
* ```
Expand Down Expand Up @@ -188,15 +187,15 @@ class Metrics extends Utility implements MetricsInterface {
* or when calling {@link Metrics.publishStoredMetrics}.
*
* You can add a metric by specifying the metric name, unit, and value. For convenience,
* we provide a set of constants for the most common units in {@link MetricUnits}.
* we provide a set of constants for the most common units in {@link MetricUnit}.
*
* @example
* ```typescript
* import { Metrics, MetricUnits } from '@aws-lambda-powertools/metrics';
* import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics';
*
* const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' });
*
* metrics.addMetric('successfulBooking', MetricUnits.Count, 1);
* metrics.addMetric('successfulBooking', MetricUnit.Count, 1);
* ```
*
* Optionally, you can specify the metric resolution, which can be either `High` or `Standard`.
Expand All @@ -205,11 +204,11 @@ class Metrics extends Utility implements MetricsInterface {
*
* @example
* ```typescript
* import { Metrics, MetricUnits, MetricResolution } from '@aws-lambda-powertools/metrics';
* import { Metrics, MetricUnit, MetricResolution } from '@aws-lambda-powertools/metrics';
*
* const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' });
*
* metrics.addMetric('successfulBooking', MetricUnits.Count, 1, MetricResolution.High);
* metrics.addMetric('successfulBooking', MetricUnit.Count, 1, MetricResolution.High);
* ```
*
* @param name - The metric name
Expand All @@ -221,7 +220,7 @@ class Metrics extends Utility implements MetricsInterface {
name: string,
unit: MetricUnit,
value: number,
resolution: MetricResolution = MetricResolution.Standard
resolution: MetricResolution = MetricResolutions.Standard
): void {
this.storeMetric(name, unit, value, resolution);
if (this.isSingleMetric) this.publishStoredMetrics();
Expand Down Expand Up @@ -369,12 +368,12 @@ class Metrics extends Utility implements MetricsInterface {
* @example
*
* ```typescript
* import { Metrics, MetricUnits } from '@aws-lambda-powertools/metrics';
* import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics';
*
* const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); // Sets metric namespace, and service as a metric dimension
*
* export const handler = async (_event: any, _context: any): Promise<void> => {
* metrics.addMetric('test-metric', MetricUnits.Count, 10);
* metrics.addMetric('test-metric', MetricUnit.Count, 10);
* metrics.publishStoredMetrics();
* };
* ```
Expand Down Expand Up @@ -413,7 +412,7 @@ class Metrics extends Utility implements MetricsInterface {
).map((metricDefinition) => ({
Name: metricDefinition.name,
Unit: metricDefinition.unit,
...(metricDefinition.resolution === MetricResolution.High
...(metricDefinition.resolution === MetricResolutions.High
? { StorageResolution: metricDefinition.resolution }
: {}),
}));
Expand Down Expand Up @@ -499,7 +498,7 @@ class Metrics extends Utility implements MetricsInterface {
* ```typescript
* const singleMetric = metrics.singleMetric();
* singleMetric.addDimension('InnerDimension', 'true');
* singleMetric.addMetric('single-metric', MetricUnits.Percent, 50);
* singleMetric.addMetric('single-metric', MetricUnit.Percent, 50);
* ```
*
* @returns the Metrics
Expand Down Expand Up @@ -706,4 +705,4 @@ class Metrics extends Utility implements MetricsInterface {
}
}

export { Metrics, MetricUnits, MetricResolution };
export { Metrics };
2 changes: 1 addition & 1 deletion packages/metrics/src/config/EnvironmentVariablesService.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { ConfigServiceInterface } from './ConfigServiceInterface';
import type { ConfigServiceInterface } from '../types/ConfigServiceInterface.js';
import { EnvironmentVariablesService as CommonEnvironmentVariablesService } from '@aws-lambda-powertools/commons';

class EnvironmentVariablesService
Expand Down
2 changes: 0 additions & 2 deletions packages/metrics/src/config/index.ts

This file was deleted.

36 changes: 36 additions & 0 deletions packages/metrics/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,46 @@ const MAX_METRICS_SIZE = 100;
const MAX_METRIC_VALUES_SIZE = 100;
const MAX_DIMENSION_COUNT = 29;

const MetricUnit = {
Seconds: 'Seconds',
Microseconds: 'Microseconds',
Milliseconds: 'Milliseconds',
Bytes: 'Bytes',
Kilobytes: 'Kilobytes',
Megabytes: 'Megabytes',
Gigabytes: 'Gigabytes',
Terabytes: 'Terabytes',
Bits: 'Bits',
Kilobits: 'Kilobits',
Megabits: 'Megabits',
Gigabits: 'Gigabits',
Terabits: 'Terabits',
Percent: 'Percent',
Count: 'Count',
BytesPerSecond: 'Bytes/Second',
KilobytesPerSecond: 'Kilobytes/Second',
MegabytesPerSecond: 'Megabytes/Second',
GigabytesPerSecond: 'Gigabytes/Second',
TerabytesPerSecond: 'Terabytes/Second',
BitsPerSecond: 'Bits/Second',
KilobitsPerSecond: 'Kilobits/Second',
MegabitsPerSecond: 'Megabits/Second',
GigabitsPerSecond: 'Gigabits/Second',
TerabitsPerSecond: 'Terabits/Second',
CountPerSecond: 'Count/Second',
} as const;

const MetricResolution = {
Standard: 60,
High: 1,
} as const;

export {
COLD_START_METRIC,
DEFAULT_NAMESPACE,
MAX_METRICS_SIZE,
MAX_METRIC_VALUES_SIZE,
MAX_DIMENSION_COUNT,
MetricUnit,
MetricResolution,
};
5 changes: 2 additions & 3 deletions packages/metrics/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export * from './Metrics';
export * from './MetricsInterface';
export * from './middleware';
export { Metrics } from './Metrics.js';
export { MetricUnit, MetricResolution } from './constants.js';
1 change: 0 additions & 1 deletion packages/metrics/src/middleware/index.ts

This file was deleted.

4 changes: 2 additions & 2 deletions packages/metrics/src/middleware/middy.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { METRICS_KEY } from '@aws-lambda-powertools/commons';
import type { Metrics } from '../Metrics';
import type { ExtraOptions } from '../types';
import type { Metrics } from '../Metrics.js';
import type { ExtraOptions } from '../types/Metrics.js';
import type {
MiddlewareLikeObj,
MiddyLikeRequest,
Expand Down
9 changes: 0 additions & 9 deletions packages/metrics/src/types/MetricResolution.ts

This file was deleted.

Loading

0 comments on commit e5e42d0

Please sign in to comment.