CloudWatch metrics utility for AWS Lambda functions using Embedded Metric Format with asynchronous metric emission
npx @tessl/cli install tessl/npm-aws-lambda-powertools--metrics@2.29.0CloudWatch metrics utility for AWS Lambda using Embedded Metric Format (EMF). Emits custom metrics asynchronously without impacting function latency.
npm install @aws-lambda-powertools/metricsimport { Metrics, MetricUnit, MetricResolution } from '@aws-lambda-powertools/metrics';
import { logMetrics } from '@aws-lambda-powertools/metrics/middleware';
import type { MetricsOptions, Dimensions, ExtraOptions } from '@aws-lambda-powertools/metrics/types';import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics';
const metrics = new Metrics({
namespace: 'serverlessAirline',
serviceName: 'orders',
defaultDimensions: { environment: 'prod' }
});
export const handler = async (event: { requestId: string }) => {
metrics.addMetadata('request_id', event.requestId);
metrics.addDimension('region', 'us-west-2');
metrics.addMetric('successfulBooking', MetricUnit.Count, 1);
metrics.publishStoredMetrics();
};Metrics Class: Main interface for metric operations. Buffers up to 100 metrics per EMF blob, supports dimensions (max 29), metadata, and automatic/manual flushing.
Metric Buffering: Automatically buffers metrics and flushes when buffer reaches 100 metrics or 100 values per metric.
Dimensions: Low-cardinality key-value pairs for filtering/grouping metrics in CloudWatch (max 29). Cleared after publishing except default dimensions.
Metadata: High-cardinality contextual data searchable in CloudWatch Logs but not in Metrics UI. No limit on entries.
EMF Serialization: Converts metrics to CloudWatch Embedded Metric Format for asynchronous processing via stdout.
const MetricUnit = {
// Time
Seconds: 'Seconds', Microseconds: 'Microseconds', Milliseconds: 'Milliseconds',
// Size
Bytes: 'Bytes', Kilobytes: 'Kilobytes', Megabytes: 'Megabytes', Gigabytes: 'Gigabytes', Terabytes: 'Terabytes',
// Bits
Bits: 'Bits', Kilobits: 'Kilobits', Megabits: 'Megabits', Gigabits: 'Gigabits', Terabits: 'Terabits',
// Other
Percent: 'Percent', Count: 'Count',
// Rate (per second)
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',
// None
NoUnit: 'None'
} as const;const MetricResolution = {
Standard: 60, // 60 seconds - lower cost
High: 1 // 1 second - higher cost, better granularity
} as const;