@@ -16,6 +16,14 @@ Tracer is an opinionated thin wrapper for [AWS X-Ray SDK for Node.js](https://gi
16
16
17
17
## Getting started
18
18
19
+ Tracer has three global settings that can be used to configure its behavior:
20
+
21
+ Setting | Description | Environment variable | Constructor parameter
22
+ ------------------------------------------------- | ------------------------------------------------- | ------------------------------------------------- | -------------------------------------------------
23
+ ** Trace Enabled** | Explicitly enables/disables tracing | ` POWERTOOLS_TRACE_ENABLED ` | ` enabled `
24
+ ** Capture Responses** | Captures Lambda or method return as metadata | ` POWERTOOLS_TRACER_CAPTURE_RESPONSE ` | N/A
25
+ ** Capture Errors** | Captures Lambda or method exception as metadata | ` POWERTOOLS_TRACER_CAPTURE_ERROR ` | N/A
26
+
19
27
### Permissions
20
28
21
29
Before your use this utility, your AWS Lambda function [ must have permissions] ( https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html#services-xray-permissions ) to send traces to AWS X-Ray.
@@ -63,7 +71,7 @@ You can quickly start by importing the `Tracer` class, initialize it outside the
63
71
// OR tracer = Tracer({ service: 'example' });
64
72
65
73
class Lambda {
66
- @tracer.captureLambdaHanlder ()
74
+ @tracer.captureLambdaHandler ()
67
75
public handler(event: any, context: any) {
68
76
...
69
77
}
@@ -79,27 +87,33 @@ You can quickly start by importing the `Tracer` class, initialize it outside the
79
87
import { Tracer } from '@aws-lambda-powertools/tracer';
80
88
81
89
const tracer = Tracer(); // Sets service via env var
82
- // OR tracer = Tracer({ service: 'example ' });
90
+ // OR tracer = Tracer({ service: 'serverlessAirline ' });
83
91
84
92
export const handler = async (_event: any, context: any) => {
85
93
const segment = tracer.getSegment(); // This is the facade segment (the one that is created by AWS Lambda)
86
- // Create subsegment for the function
87
- const handlerSegment = segment.addNewSubsegment(`## ${context.functionName}`);
94
+ // Create subsegment for the function & set it as active
95
+ const subsegment = segment.addNewSubsegment(`## ${process.env._HANDLER}`);
96
+ tracer.setSegment(subsegment);
97
+
98
+ // Annotate the subsegment with the cold start & serviceName
88
99
tracer.annotateColdStart();
89
100
tracer.addServiceNameAnnotation();
90
101
91
102
let res;
92
103
try {
93
104
res = ...
94
105
// Add the response as metadata
95
- tracer.addResponseAsMetadata(res, context.functionName );
106
+ tracer.addResponseAsMetadata(res, process.env._HANDLER );
96
107
} catch (err) {
97
108
// Add the error as metadata
98
109
tracer.addErrorAsMetadata(err as Error);
110
+ throw err;
99
111
}
100
112
101
113
// Close subsegment (the AWS Lambda one is closed automatically)
102
- handlerSegment.close();
114
+ subsegment.close();
115
+ // Set the facade segment as active again
116
+ tracer.setSegment(segment);
103
117
104
118
return res;
105
119
}
@@ -109,6 +123,7 @@ When using the `captureLambdaHandler` decorator or middleware, Tracer performs t
109
123
110
124
* Handles the lifecycle of the subsegment
111
125
* Creates a ` ColdStart ` annotation to easily filter traces that have had an initialization overhead
126
+ * Creates a ` ServiceName ` annotation to easily filter traces that have a specific service name
112
127
* Captures any response, or full exceptions generated by the handler, and include as tracing metadata
113
128
114
129
### Annotations & Metadata
@@ -123,10 +138,10 @@ When using the `captureLambdaHandler` decorator or middleware, Tracer performs t
123
138
```typescript hl_lines="6"
124
139
import { Tracer } from '@aws-lambda-powertools/tracer';
125
140
126
- const tracer = new Tracer({ serviceName: 'my-service ' });
141
+ const tracer = new Tracer({ serviceName: 'serverlessAirline ' });
127
142
128
143
export const handler = async (_event: any, _context: any) => {
129
- tracer.putAnnotation('PaymentStatus ', "SUCCESS" );
144
+ tracer.putAnnotation('successfulBooking ', true );
130
145
}
131
146
```
132
147
=== "Metadata"
@@ -135,11 +150,11 @@ When using the `captureLambdaHandler` decorator or middleware, Tracer performs t
135
150
```typescript hl_lines="7"
136
151
import { Tracer } from '@aws-lambda-powertools/tracer';
137
152
138
- const tracer = new Tracer({ serviceName: 'my-service ' });
153
+ const tracer = new Tracer({ serviceName: 'serverlessAirline ' });
139
154
140
155
export const handler = async (_event: any, _context: any) => {
141
156
const res = someLogic();
142
- tracer.putMetadata('PaymentResponse ', res);
157
+ tracer.putMetadata('paymentResponse ', res);
143
158
}
144
159
```
145
160
@@ -178,29 +193,32 @@ You can trace other methods using the `captureMethod` decorator or manual instru
178
193
179
194
=== "Manual"
180
195
181
- ```typescript hl_lines="2 8-9 15 18 22 "
196
+ ```typescript hl_lines="6 8-9 15 23 25 "
182
197
import { Tracer } from '@aws-lambda-powertools/tracer';
183
- import { Segment } from 'aws-xray-sdk-core';
184
198
185
- const tracer = new Tracer({ serviceName: 'my-service ' });
199
+ const tracer = new Tracer({ serviceName: 'serverlessAirline ' });
186
200
187
201
const chargeId = async () => {
188
- // Create subsegment & set it as active
189
- const subsegment = new Subsegment(`### chargeId`);
202
+ const parentSubsegment = tracer.getSegment(); // This is the subsegment currently active
203
+ // Create subsegment for the function & set it as active
204
+ const subsegment = parentSubsegment.addNewSubsegment(`### chargeId`);
190
205
tracer.setSegment(subsegment);
191
206
192
207
let res;
193
208
try {
194
209
res = await someLogic(); // Do something
195
210
// Add the response as metadata
196
- tracer.putMetadata(`chargeId response`, data );
211
+ tracer.addResponseAsMetadata(res, 'chargeId' );
197
212
} catch (err) {
198
213
// Add the error as metadata
199
- subsegment.addError(err, false);
214
+ tracer.addErrorAsMetadata(err as Error);
215
+ throw err;
200
216
}
201
217
202
- // Close subsegment
218
+ // Close subsegment (the AWS Lambda one is closed automatically)
203
219
subsegment.close();
220
+ // Set the facade segment as active again
221
+ tracer.setSegment(parentSubsegment);
204
222
205
223
return res;
206
224
}
0 commit comments