|
| 1 | +import { Tracer } from '@aws-lambda-powertools/tracer'; |
| 2 | +import { Callback, Context } from 'aws-lambda'; |
| 3 | +import { Metrics, MetricUnits } from '@aws-lambda-powertools/metrics'; |
| 4 | +import { Logger } from '@aws-lambda-powertools/logger'; |
| 5 | + |
| 6 | +const namespace = 'CDKExample'; |
| 7 | +const serviceName = 'MyFunctionWithDecorator'; |
| 8 | + |
| 9 | +const metrics = new Metrics({ namespace: namespace, service: serviceName }); |
| 10 | +const logger = new Logger({ logLevel: 'INFO', serviceName: serviceName }); |
| 11 | +const tracer = new Tracer({ serviceName: serviceName }); |
| 12 | + |
| 13 | +export class MyFunctionWithDecorator { |
| 14 | + @tracer.captureLambdaHanlder() |
| 15 | + @logger.injectLambdaContext() |
| 16 | + @metrics.logMetrics({ |
| 17 | + captureColdStartMetric: true, |
| 18 | + raiseOnEmptyMetrics: true, |
| 19 | + defaultDimensions: { environment: 'example', type: 'withDecorator' }, |
| 20 | + }) |
| 21 | + public handler(_event: unknown, _context: Context, _callback: Callback<unknown>): void | Promise<unknown> { |
| 22 | + // ### Experiment logger |
| 23 | + logger.addPersistentLogAttributes({ |
| 24 | + testKey: 'testValue', |
| 25 | + }); |
| 26 | + logger.debug('This is an DEBUG log'); // Won't show by default |
| 27 | + logger.info('This is an INFO log'); |
| 28 | + logger.warn('This is an WARN log'); |
| 29 | + logger.error('This is an ERROR log'); |
| 30 | + |
| 31 | + // ### Experiment metrics |
| 32 | + metrics.addMetric('test-metric', MetricUnits.Count, 10); |
| 33 | + |
| 34 | + const metricWithItsOwnDimensions = metrics.singleMetric(); |
| 35 | + metricWithItsOwnDimensions.addDimension('InnerDimension', 'true'); |
| 36 | + metricWithItsOwnDimensions.addMetric('single-metric', MetricUnits.Percent, 50); |
| 37 | + |
| 38 | + // ### Experiment tracer |
| 39 | + tracer.putAnnotation('Myannotation', 'My annotation\'s value'); |
| 40 | + |
| 41 | + // Create subsegment & set it as active |
| 42 | + const segment = tracer.getSegment(); // This is the facade segment (the one that is created by Lambda & that can't be manipulated) |
| 43 | + const subsegment = segment.addNewSubsegment('MySubSegment'); |
| 44 | + |
| 45 | + tracer.setSegment(subsegment); |
| 46 | + // TODO: Add the ColdStart annotation !!! NOT POSSIBLE |
| 47 | + // tracer.putAnnotation('ColdStart', tracer); |
| 48 | + |
| 49 | + try { |
| 50 | + throw new Error('test'); |
| 51 | + // Add the response as metadata |
| 52 | + } catch (err) { |
| 53 | + // Add the error as metadata |
| 54 | + subsegment.addError(err as Error, false); |
| 55 | + } |
| 56 | + |
| 57 | + // Close subsegment |
| 58 | + subsegment.close(); |
| 59 | + } |
| 60 | +} |
| 61 | + |
| 62 | +export const handlerClass = new MyFunctionWithDecorator(); |
| 63 | +export const handler = handlerClass.handler; |
0 commit comments