autotel-aws 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +540 -0
- package/dist/attributes.cjs +49 -0
- package/dist/attributes.cjs.map +1 -0
- package/dist/attributes.d.cts +117 -0
- package/dist/attributes.d.ts +117 -0
- package/dist/attributes.js +4 -0
- package/dist/attributes.js.map +1 -0
- package/dist/chunk-35F3UBOO.cjs +48 -0
- package/dist/chunk-35F3UBOO.cjs.map +1 -0
- package/dist/chunk-4TGVGEUN.cjs +84 -0
- package/dist/chunk-4TGVGEUN.cjs.map +1 -0
- package/dist/chunk-CIGXV6HA.js +192 -0
- package/dist/chunk-CIGXV6HA.js.map +1 -0
- package/dist/chunk-D5INYMRP.cjs +350 -0
- package/dist/chunk-D5INYMRP.cjs.map +1 -0
- package/dist/chunk-DF5PT3JK.js +387 -0
- package/dist/chunk-DF5PT3JK.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-DHHLKZHI.cjs +23 -0
- package/dist/chunk-DHHLKZHI.cjs.map +1 -0
- package/dist/chunk-FKZOELBT.js +78 -0
- package/dist/chunk-FKZOELBT.js.map +1 -0
- package/dist/chunk-HMTKKKKP.cjs +390 -0
- package/dist/chunk-HMTKKKKP.cjs.map +1 -0
- package/dist/chunk-I4CKQ4RD.js +153 -0
- package/dist/chunk-I4CKQ4RD.js.map +1 -0
- package/dist/chunk-JEQ2X3Z6.cjs +12 -0
- package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
- package/dist/chunk-JMSFE6FJ.js +24 -0
- package/dist/chunk-JMSFE6FJ.js.map +1 -0
- package/dist/chunk-KUIOI74B.cjs +394 -0
- package/dist/chunk-KUIOI74B.cjs.map +1 -0
- package/dist/chunk-NQ65Y5AI.cjs +195 -0
- package/dist/chunk-NQ65Y5AI.cjs.map +1 -0
- package/dist/chunk-OB4XTAVK.cjs +345 -0
- package/dist/chunk-OB4XTAVK.cjs.map +1 -0
- package/dist/chunk-OHFR7WX5.js +341 -0
- package/dist/chunk-OHFR7WX5.js.map +1 -0
- package/dist/chunk-PZGYL7XZ.js +40 -0
- package/dist/chunk-PZGYL7XZ.js.map +1 -0
- package/dist/chunk-Q3DMMQ7K.cjs +164 -0
- package/dist/chunk-Q3DMMQ7K.cjs.map +1 -0
- package/dist/chunk-UZEJV2YD.cjs +139 -0
- package/dist/chunk-UZEJV2YD.cjs.map +1 -0
- package/dist/chunk-V4IQWFYN.js +341 -0
- package/dist/chunk-V4IQWFYN.js.map +1 -0
- package/dist/chunk-VZHQH75L.cjs +26 -0
- package/dist/chunk-VZHQH75L.cjs.map +1 -0
- package/dist/chunk-X6BY6PCK.js +386 -0
- package/dist/chunk-X6BY6PCK.js.map +1 -0
- package/dist/chunk-YG56NRIO.js +131 -0
- package/dist/chunk-YG56NRIO.js.map +1 -0
- package/dist/chunk-ZPDRKCAR.js +21 -0
- package/dist/chunk-ZPDRKCAR.js.map +1 -0
- package/dist/config-C7zV8Zm6.d.cts +125 -0
- package/dist/config-DxjTT8jd.d.ts +125 -0
- package/dist/dynamodb.cjs +14 -0
- package/dist/dynamodb.cjs.map +1 -0
- package/dist/dynamodb.d.cts +93 -0
- package/dist/dynamodb.d.ts +93 -0
- package/dist/dynamodb.js +5 -0
- package/dist/dynamodb.js.map +1 -0
- package/dist/eventbridge.cjs +279 -0
- package/dist/eventbridge.cjs.map +1 -0
- package/dist/eventbridge.d.cts +360 -0
- package/dist/eventbridge.d.ts +360 -0
- package/dist/eventbridge.js +273 -0
- package/dist/eventbridge.js.map +1 -0
- package/dist/index.cjs +251 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +126 -0
- package/dist/index.d.ts +126 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/kinesis.cjs +23 -0
- package/dist/kinesis.cjs.map +1 -0
- package/dist/kinesis.d.cts +360 -0
- package/dist/kinesis.d.ts +360 -0
- package/dist/kinesis.js +6 -0
- package/dist/kinesis.js.map +1 -0
- package/dist/lambda-auto.cjs +19 -0
- package/dist/lambda-auto.cjs.map +1 -0
- package/dist/lambda-auto.d.cts +2 -0
- package/dist/lambda-auto.d.ts +2 -0
- package/dist/lambda-auto.js +17 -0
- package/dist/lambda-auto.js.map +1 -0
- package/dist/lambda.cjs +42 -0
- package/dist/lambda.cjs.map +1 -0
- package/dist/lambda.d.cts +231 -0
- package/dist/lambda.d.ts +231 -0
- package/dist/lambda.js +5 -0
- package/dist/lambda.js.map +1 -0
- package/dist/s3.cjs +14 -0
- package/dist/s3.cjs.map +1 -0
- package/dist/s3.d.cts +77 -0
- package/dist/s3.d.ts +77 -0
- package/dist/s3.js +5 -0
- package/dist/s3.js.map +1 -0
- package/dist/sdk.cjs +31 -0
- package/dist/sdk.cjs.map +1 -0
- package/dist/sdk.d.cts +155 -0
- package/dist/sdk.d.ts +155 -0
- package/dist/sdk.js +6 -0
- package/dist/sdk.js.map +1 -0
- package/dist/sns.cjs +19 -0
- package/dist/sns.cjs.map +1 -0
- package/dist/sns.d.cts +256 -0
- package/dist/sns.d.ts +256 -0
- package/dist/sns.js +6 -0
- package/dist/sns.js.map +1 -0
- package/dist/sqs.cjs +23 -0
- package/dist/sqs.cjs.map +1 -0
- package/dist/sqs.d.cts +384 -0
- package/dist/sqs.d.ts +384 -0
- package/dist/sqs.js +6 -0
- package/dist/sqs.js.map +1 -0
- package/dist/step-functions.cjs +35 -0
- package/dist/step-functions.cjs.map +1 -0
- package/dist/step-functions.d.cts +423 -0
- package/dist/step-functions.d.ts +423 -0
- package/dist/step-functions.js +6 -0
- package/dist/step-functions.js.map +1 -0
- package/dist/testing.cjs +61 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +39 -0
- package/dist/testing.d.ts +39 -0
- package/dist/testing.js +58 -0
- package/dist/testing.js.map +1 -0
- package/dist/types-3_ak5jhy.d.cts +76 -0
- package/dist/types-3_ak5jhy.d.ts +76 -0
- package/dist/types-UiBv_I_M.d.ts +16 -0
- package/dist/types-kTFVdSqO.d.cts +16 -0
- package/dist/xray.cjs +26 -0
- package/dist/xray.cjs.map +1 -0
- package/dist/xray.d.cts +23 -0
- package/dist/xray.d.ts +23 -0
- package/dist/xray.js +5 -0
- package/dist/xray.js.map +1 -0
- package/package.json +184 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { wrapSDKClient } from './chunk-YG56NRIO.js';
|
|
2
|
+
import { buildSQSAttributes } from './chunk-I4CKQ4RD.js';
|
|
3
|
+
import { trace } from 'autotel';
|
|
4
|
+
import { propagation, context, SpanStatusCode } from '@opentelemetry/api';
|
|
5
|
+
|
|
6
|
+
function traceSQS(config) {
|
|
7
|
+
return function wrapper(fn) {
|
|
8
|
+
return trace(
|
|
9
|
+
`sqs.${config.operation}`,
|
|
10
|
+
(ctx) => async (...args) => {
|
|
11
|
+
ctx.setAttributes(
|
|
12
|
+
buildSQSAttributes({
|
|
13
|
+
queueName: config.queueName,
|
|
14
|
+
queueUrl: config.queueUrl,
|
|
15
|
+
operation: config.operation
|
|
16
|
+
})
|
|
17
|
+
);
|
|
18
|
+
const handler = fn(ctx);
|
|
19
|
+
return handler(...args);
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
var SQSProducer = class {
|
|
25
|
+
client;
|
|
26
|
+
config;
|
|
27
|
+
queueName;
|
|
28
|
+
constructor(client, config) {
|
|
29
|
+
this.client = wrapSDKClient(client, config.service);
|
|
30
|
+
this.config = {
|
|
31
|
+
injectTraceContext: true,
|
|
32
|
+
...config
|
|
33
|
+
};
|
|
34
|
+
this.queueName = config.queueUrl.split("/").pop() || "unknown";
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Inject trace context into message attributes
|
|
38
|
+
*/
|
|
39
|
+
injectContext(attributes) {
|
|
40
|
+
if (!this.config.injectTraceContext) {
|
|
41
|
+
return attributes || {};
|
|
42
|
+
}
|
|
43
|
+
const carrier = {};
|
|
44
|
+
propagation.inject(context.active(), carrier);
|
|
45
|
+
const result = { ...attributes };
|
|
46
|
+
if (carrier.traceparent) {
|
|
47
|
+
result.traceparent = { StringValue: carrier.traceparent, DataType: "String" };
|
|
48
|
+
}
|
|
49
|
+
if (carrier.tracestate) {
|
|
50
|
+
result.tracestate = { StringValue: carrier.tracestate, DataType: "String" };
|
|
51
|
+
}
|
|
52
|
+
if (carrier.baggage) {
|
|
53
|
+
result.baggage = { StringValue: carrier.baggage, DataType: "String" };
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Send a single message to the queue
|
|
59
|
+
*
|
|
60
|
+
* @param message - Message to send
|
|
61
|
+
* @returns Promise with message ID and other metadata
|
|
62
|
+
*/
|
|
63
|
+
async send(message) {
|
|
64
|
+
return trace(`sqs.send`, async (ctx) => {
|
|
65
|
+
ctx.setAttributes(
|
|
66
|
+
buildSQSAttributes({
|
|
67
|
+
queueName: this.queueName,
|
|
68
|
+
queueUrl: this.config.queueUrl,
|
|
69
|
+
operation: "send"
|
|
70
|
+
})
|
|
71
|
+
);
|
|
72
|
+
const input = {
|
|
73
|
+
QueueUrl: this.config.queueUrl,
|
|
74
|
+
MessageBody: message.body,
|
|
75
|
+
MessageAttributes: this.injectContext(message.attributes),
|
|
76
|
+
...message.messageGroupId && { MessageGroupId: message.messageGroupId },
|
|
77
|
+
...message.messageDeduplicationId && {
|
|
78
|
+
MessageDeduplicationId: message.messageDeduplicationId
|
|
79
|
+
},
|
|
80
|
+
...message.delaySeconds !== void 0 && { DelaySeconds: message.delaySeconds }
|
|
81
|
+
};
|
|
82
|
+
try {
|
|
83
|
+
const { SendMessageCommand } = await import('@aws-sdk/client-sqs');
|
|
84
|
+
const result = await this.client.send(new SendMessageCommand(input));
|
|
85
|
+
if (result.MessageId) {
|
|
86
|
+
ctx.setAttribute("messaging.message.id", result.MessageId);
|
|
87
|
+
}
|
|
88
|
+
ctx.setStatus({ code: SpanStatusCode.OK });
|
|
89
|
+
return {
|
|
90
|
+
messageId: result.MessageId,
|
|
91
|
+
sequenceNumber: result.SequenceNumber,
|
|
92
|
+
md5OfMessageBody: result.MD5OfMessageBody
|
|
93
|
+
};
|
|
94
|
+
} catch (error) {
|
|
95
|
+
ctx.setStatus({
|
|
96
|
+
code: SpanStatusCode.ERROR,
|
|
97
|
+
message: error instanceof Error ? error.message : "Send failed"
|
|
98
|
+
});
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Send multiple messages in a batch
|
|
105
|
+
*
|
|
106
|
+
* @param messages - Array of messages to send (max 10)
|
|
107
|
+
* @returns Promise with successful and failed message results
|
|
108
|
+
*/
|
|
109
|
+
async sendBatch(messages) {
|
|
110
|
+
return trace(`sqs.sendBatch`, async (ctx) => {
|
|
111
|
+
ctx.setAttributes(
|
|
112
|
+
buildSQSAttributes({
|
|
113
|
+
queueName: this.queueName,
|
|
114
|
+
queueUrl: this.config.queueUrl,
|
|
115
|
+
operation: "send"
|
|
116
|
+
})
|
|
117
|
+
);
|
|
118
|
+
ctx.setAttribute("messaging.batch.message_count", messages.length);
|
|
119
|
+
const entries = messages.map((message, index) => ({
|
|
120
|
+
Id: String(index),
|
|
121
|
+
MessageBody: message.body,
|
|
122
|
+
MessageAttributes: this.injectContext(message.attributes),
|
|
123
|
+
...message.messageGroupId && { MessageGroupId: message.messageGroupId },
|
|
124
|
+
...message.messageDeduplicationId && {
|
|
125
|
+
MessageDeduplicationId: message.messageDeduplicationId
|
|
126
|
+
},
|
|
127
|
+
...message.delaySeconds !== void 0 && { DelaySeconds: message.delaySeconds }
|
|
128
|
+
}));
|
|
129
|
+
try {
|
|
130
|
+
const { SendMessageBatchCommand } = await import('@aws-sdk/client-sqs');
|
|
131
|
+
const result = await this.client.send(
|
|
132
|
+
new SendMessageBatchCommand({
|
|
133
|
+
QueueUrl: this.config.queueUrl,
|
|
134
|
+
Entries: entries
|
|
135
|
+
})
|
|
136
|
+
);
|
|
137
|
+
const successful = result.Successful?.map((s) => ({
|
|
138
|
+
id: s.Id,
|
|
139
|
+
messageId: s.MessageId,
|
|
140
|
+
sequenceNumber: s.SequenceNumber
|
|
141
|
+
})) || [];
|
|
142
|
+
const failed = result.Failed?.map((f) => ({
|
|
143
|
+
id: f.Id,
|
|
144
|
+
code: f.Code,
|
|
145
|
+
message: f.Message
|
|
146
|
+
})) || [];
|
|
147
|
+
ctx.setAttribute("messaging.sqs.successful_count", successful.length);
|
|
148
|
+
ctx.setAttribute("messaging.sqs.failed_count", failed.length);
|
|
149
|
+
if (failed.length > 0) {
|
|
150
|
+
ctx.setStatus({
|
|
151
|
+
code: SpanStatusCode.ERROR,
|
|
152
|
+
message: `${failed.length} messages failed`
|
|
153
|
+
});
|
|
154
|
+
} else {
|
|
155
|
+
ctx.setStatus({ code: SpanStatusCode.OK });
|
|
156
|
+
}
|
|
157
|
+
return { successful, failed };
|
|
158
|
+
} catch (error) {
|
|
159
|
+
ctx.setStatus({
|
|
160
|
+
code: SpanStatusCode.ERROR,
|
|
161
|
+
message: error instanceof Error ? error.message : "Batch send failed"
|
|
162
|
+
});
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
var SQSConsumer = class {
|
|
169
|
+
client;
|
|
170
|
+
config;
|
|
171
|
+
queueName;
|
|
172
|
+
constructor(client, config) {
|
|
173
|
+
this.client = wrapSDKClient(client, config.service);
|
|
174
|
+
this.config = {
|
|
175
|
+
extractTraceContext: true,
|
|
176
|
+
maxMessages: 10,
|
|
177
|
+
visibilityTimeout: 30,
|
|
178
|
+
waitTimeSeconds: 20,
|
|
179
|
+
...config
|
|
180
|
+
};
|
|
181
|
+
this.queueName = config.queueUrl.split("/").pop() || "unknown";
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Extract trace context from message attributes
|
|
185
|
+
*/
|
|
186
|
+
extractContext(messageAttributes) {
|
|
187
|
+
if (!this.config.extractTraceContext || !messageAttributes) {
|
|
188
|
+
return void 0;
|
|
189
|
+
}
|
|
190
|
+
const carrier = {};
|
|
191
|
+
if (messageAttributes.traceparent?.StringValue) {
|
|
192
|
+
carrier.traceparent = messageAttributes.traceparent.StringValue;
|
|
193
|
+
}
|
|
194
|
+
if (messageAttributes.tracestate?.StringValue) {
|
|
195
|
+
carrier.tracestate = messageAttributes.tracestate.StringValue;
|
|
196
|
+
}
|
|
197
|
+
if (messageAttributes.baggage?.StringValue) {
|
|
198
|
+
carrier.baggage = messageAttributes.baggage.StringValue;
|
|
199
|
+
}
|
|
200
|
+
return Object.keys(carrier).length > 0 ? carrier : void 0;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Parse AWS SDK message into our format
|
|
204
|
+
*/
|
|
205
|
+
parseMessage(message) {
|
|
206
|
+
const attributes = {};
|
|
207
|
+
if (message.MessageAttributes) {
|
|
208
|
+
for (const [key, value] of Object.entries(message.MessageAttributes)) {
|
|
209
|
+
attributes[key] = value.StringValue || "";
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
messageId: message.MessageId || "",
|
|
214
|
+
receiptHandle: message.ReceiptHandle || "",
|
|
215
|
+
body: message.Body || "",
|
|
216
|
+
attributes,
|
|
217
|
+
systemAttributes: message.Attributes || {},
|
|
218
|
+
raw: message
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Receive messages from the queue
|
|
223
|
+
*
|
|
224
|
+
* @returns Array of received messages
|
|
225
|
+
*/
|
|
226
|
+
async receive() {
|
|
227
|
+
return trace(`sqs.receive`, async (ctx) => {
|
|
228
|
+
ctx.setAttributes(
|
|
229
|
+
buildSQSAttributes({
|
|
230
|
+
queueName: this.queueName,
|
|
231
|
+
queueUrl: this.config.queueUrl,
|
|
232
|
+
operation: "receive"
|
|
233
|
+
})
|
|
234
|
+
);
|
|
235
|
+
try {
|
|
236
|
+
const { ReceiveMessageCommand } = await import('@aws-sdk/client-sqs');
|
|
237
|
+
const result = await this.client.send(
|
|
238
|
+
new ReceiveMessageCommand({
|
|
239
|
+
QueueUrl: this.config.queueUrl,
|
|
240
|
+
MaxNumberOfMessages: this.config.maxMessages,
|
|
241
|
+
VisibilityTimeout: this.config.visibilityTimeout,
|
|
242
|
+
WaitTimeSeconds: this.config.waitTimeSeconds,
|
|
243
|
+
MessageAttributeNames: ["All"],
|
|
244
|
+
AttributeNames: ["All"]
|
|
245
|
+
})
|
|
246
|
+
);
|
|
247
|
+
const messages = (result.Messages || []).map((m) => this.parseMessage(m));
|
|
248
|
+
ctx.setAttribute("messaging.batch.message_count", messages.length);
|
|
249
|
+
ctx.setStatus({ code: SpanStatusCode.OK });
|
|
250
|
+
return messages;
|
|
251
|
+
} catch (error) {
|
|
252
|
+
ctx.setStatus({
|
|
253
|
+
code: SpanStatusCode.ERROR,
|
|
254
|
+
message: error instanceof Error ? error.message : "Receive failed"
|
|
255
|
+
});
|
|
256
|
+
throw error;
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Delete a message from the queue
|
|
262
|
+
*
|
|
263
|
+
* @param receiptHandle - Receipt handle of the message to delete
|
|
264
|
+
*/
|
|
265
|
+
async delete(receiptHandle) {
|
|
266
|
+
const { DeleteMessageCommand } = await import('@aws-sdk/client-sqs');
|
|
267
|
+
await this.client.send(
|
|
268
|
+
new DeleteMessageCommand({
|
|
269
|
+
QueueUrl: this.config.queueUrl,
|
|
270
|
+
ReceiptHandle: receiptHandle
|
|
271
|
+
})
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Process messages with automatic trace context extraction
|
|
276
|
+
*
|
|
277
|
+
* Receives messages, processes each with the provided handler,
|
|
278
|
+
* and deletes successfully processed messages.
|
|
279
|
+
*
|
|
280
|
+
* @param processor - Function to process each message
|
|
281
|
+
* @returns Number of messages processed
|
|
282
|
+
*/
|
|
283
|
+
async processMessages(processor) {
|
|
284
|
+
const messages = await this.receive();
|
|
285
|
+
let processed = 0;
|
|
286
|
+
for (const message of messages) {
|
|
287
|
+
const carrier = this.extractContext(message.raw.MessageAttributes);
|
|
288
|
+
const processMessage = async () => {
|
|
289
|
+
return trace(`sqs.process`, async (ctx) => {
|
|
290
|
+
ctx.setAttributes(
|
|
291
|
+
buildSQSAttributes({
|
|
292
|
+
queueName: this.queueName,
|
|
293
|
+
queueUrl: this.config.queueUrl,
|
|
294
|
+
operation: "receive"
|
|
295
|
+
})
|
|
296
|
+
);
|
|
297
|
+
ctx.setAttribute("messaging.message.id", message.messageId);
|
|
298
|
+
try {
|
|
299
|
+
await processor(message, ctx);
|
|
300
|
+
await this.delete(message.receiptHandle);
|
|
301
|
+
processed++;
|
|
302
|
+
ctx.setStatus({ code: SpanStatusCode.OK });
|
|
303
|
+
} catch (error) {
|
|
304
|
+
ctx.setStatus({
|
|
305
|
+
code: SpanStatusCode.ERROR,
|
|
306
|
+
message: error instanceof Error ? error.message : "Processing failed"
|
|
307
|
+
});
|
|
308
|
+
throw error;
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
};
|
|
312
|
+
if (carrier) {
|
|
313
|
+
const extractedContext = propagation.extract(context.active(), carrier);
|
|
314
|
+
await context.with(extractedContext, processMessage);
|
|
315
|
+
} else {
|
|
316
|
+
await processMessage();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return processed;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Start continuous polling loop
|
|
323
|
+
*
|
|
324
|
+
* @param processor - Function to process each message
|
|
325
|
+
* @param options - Polling options including abort signal
|
|
326
|
+
*/
|
|
327
|
+
async poll(processor, options) {
|
|
328
|
+
while (!options?.signal?.aborted) {
|
|
329
|
+
try {
|
|
330
|
+
await this.processMessages(processor);
|
|
331
|
+
} catch (error) {
|
|
332
|
+
console.error("[SQSConsumer] Error processing messages:", error);
|
|
333
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
export { SQSConsumer, SQSProducer, traceSQS };
|
|
340
|
+
//# sourceMappingURL=chunk-OHFR7WX5.js.map
|
|
341
|
+
//# sourceMappingURL=chunk-OHFR7WX5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sqs/index.ts"],"names":[],"mappings":"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","file":"chunk-OHFR7WX5.js","sourcesContent":["/**\n * SQS-specific instrumentation\n *\n * Provides semantic helpers for tracing SQS operations with proper OpenTelemetry\n * messaging semantic conventions. Automatically sets `messaging.*` and `aws.sqs.*` attributes.\n *\n * @example Send message\n * ```typescript\n * import { traceSQS } from 'autotel-aws/sqs';\n * import { SQSClient, SendMessageCommand } from '@aws-sdk/client-sqs';\n *\n * const sqs = new SQSClient({});\n *\n * export const sendMessage = traceSQS({\n * operation: 'send',\n * queueName: 'my-queue',\n * queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue'\n * })(ctx => async (body: string, attributes?: Record<string, string>) => {\n * const result = await sqs.send(new SendMessageCommand({\n * QueueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue',\n * MessageBody: body,\n * MessageAttributes: attributes\n * }));\n *\n * if (result.MessageId) {\n * ctx.setAttribute('messaging.message.id', result.MessageId);\n * }\n *\n * return result;\n * });\n *\n * // Usage: await sendMessage('Hello!', { correlationId: { StringValue: '123', DataType: 'String' } });\n * ```\n *\n * @example Receive and process messages\n * ```typescript\n * export const receiveMessages = traceSQS({\n * operation: 'receive',\n * queueName: 'my-queue'\n * })(ctx => async (maxMessages: number) => {\n * const result = await sqs.send(new ReceiveMessageCommand({\n * QueueUrl: 'https://sqs.../my-queue',\n * MaxNumberOfMessages: maxMessages\n * }));\n *\n * ctx.setAttribute('messaging.batch.message_count', result.Messages?.length ?? 0);\n * return result.Messages;\n * });\n * ```\n */\n\nimport { trace, type TraceContext } from 'autotel';\nimport { context, propagation, SpanStatusCode } from '@opentelemetry/api';\nimport { buildSQSAttributes } from '../attributes';\nimport { wrapSDKClient } from '../common/sdk-wrapper';\n\n/**\n * SQS operation configuration\n */\nexport interface TraceSQSConfig {\n /**\n * SQS operation type\n * - 'send' - SendMessage, SendMessageBatch\n * - 'receive' - ReceiveMessage\n */\n operation: 'send' | 'receive';\n\n /**\n * Queue name (last segment of queue URL)\n * Sets `messaging.destination.name` attribute.\n */\n queueName: string;\n\n /**\n * Full queue URL\n * Sets `aws.sqs.queue_url` attribute.\n */\n queueUrl?: string;\n}\n\n/**\n * Trace SQS operations with semantic attributes\n *\n * Creates a traced function that automatically sets SQS messaging semantic attributes\n * following OpenTelemetry conventions.\n *\n * @param config - SQS operation configuration\n * @returns A higher-order function that wraps your SQS operation with tracing\n *\n * @remarks\n * Semantic attributes set automatically:\n * - `messaging.system` - 'aws_sqs'\n * - `messaging.destination.name` - Queue name\n * - `messaging.operation` - 'send' or 'receive'\n * - `aws.sqs.queue_url` - Full queue URL (if provided)\n *\n * Additional attributes you should set in your handler:\n * - `messaging.message.id` - Message ID from response\n * - `messaging.batch.message_count` - Number of messages in batch\n *\n * @see https://opentelemetry.io/docs/specs/semconv/messaging/aws-sqs/\n */\nexport function traceSQS(config: TraceSQSConfig) {\n return function wrapper<TArgs extends unknown[], TReturn>(\n fn: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n ): (...args: TArgs) => Promise<TReturn> {\n // Use autotel's trace() which properly handles the factory pattern\n return trace(\n `sqs.${config.operation}`,\n (ctx: TraceContext) =>\n async (...args: TArgs): Promise<TReturn> => {\n // Set SQS semantic attributes\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: config.queueName,\n queueUrl: config.queueUrl,\n operation: config.operation,\n }),\n );\n\n // Get the user's handler and execute with forwarded arguments\n const handler = fn(ctx);\n return handler(...args);\n },\n );\n };\n}\n\n// ============================================================================\n// SQS Producer - Sends messages with automatic trace context injection\n// ============================================================================\n\n/**\n * Configuration for SQS Producer\n */\nexport interface SQSProducerConfig {\n /**\n * Full SQS queue URL\n */\n queueUrl: string;\n\n /**\n * Inject W3C Trace Context into message attributes\n * Enables distributed tracing across producer/consumer\n * @default true\n */\n injectTraceContext?: boolean;\n\n /**\n * Optional service name for tracing\n */\n service?: string;\n}\n\n/**\n * Message to send via SQS Producer\n */\nexport interface SQSMessage {\n /**\n * Message body (string)\n */\n body: string;\n\n /**\n * Optional message attributes\n */\n attributes?: Record<string, { StringValue: string; DataType: string }>;\n\n /**\n * Optional message group ID (for FIFO queues)\n */\n messageGroupId?: string;\n\n /**\n * Optional deduplication ID (for FIFO queues)\n */\n messageDeduplicationId?: string;\n\n /**\n * Optional delay in seconds (0-900)\n */\n delaySeconds?: number;\n}\n\n/**\n * SQS Producer with automatic trace context injection\n *\n * Wraps an SQS client to automatically:\n * - Create spans for send operations\n * - Inject W3C Trace Context into message attributes\n * - Set proper semantic attributes\n *\n * @example Basic usage\n * ```typescript\n * import { SQSProducer } from 'autotel-aws/sqs';\n * import { SQSClient } from '@aws-sdk/client-sqs';\n *\n * const sqs = new SQSClient({ region: 'us-east-1' });\n * const producer = new SQSProducer(sqs, {\n * queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue'\n * });\n *\n * // Send with automatic trace context\n * const result = await producer.send({ body: 'Hello!' });\n * console.log('Message ID:', result.messageId);\n * ```\n *\n * @example With custom attributes\n * ```typescript\n * await producer.send({\n * body: JSON.stringify({ orderId: '12345' }),\n * attributes: {\n * 'correlationId': { StringValue: 'abc-123', DataType: 'String' },\n * 'eventType': { StringValue: 'ORDER_CREATED', DataType: 'String' }\n * }\n * });\n * ```\n *\n * @example Batch send\n * ```typescript\n * const results = await producer.sendBatch([\n * { body: 'Message 1' },\n * { body: 'Message 2' },\n * { body: 'Message 3' }\n * ]);\n * console.log(`Sent ${results.successful.length} messages`);\n * ```\n */\nexport class SQSProducer<\n \n TClient extends { send: (command: any) => Promise<any> } = any,\n> {\n private client: TClient;\n private config: Required<Pick<SQSProducerConfig, 'queueUrl'>> & SQSProducerConfig;\n private queueName: string;\n\n constructor(client: TClient, config: SQSProducerConfig) {\n // Wrap the client for basic tracing if not already wrapped\n this.client = wrapSDKClient(client as any, config.service) as TClient;\n this.config = {\n injectTraceContext: true,\n ...config,\n };\n // Extract queue name from URL\n this.queueName = config.queueUrl.split('/').pop() || 'unknown';\n }\n\n /**\n * Inject trace context into message attributes\n */\n private injectContext(\n attributes?: Record<string, { StringValue: string; DataType: string }>,\n ): Record<string, { StringValue: string; DataType: string }> {\n if (!this.config.injectTraceContext) {\n return attributes || {};\n }\n\n const carrier: Record<string, string> = {};\n propagation.inject(context.active(), carrier);\n\n const result = { ...attributes };\n\n if (carrier.traceparent) {\n result.traceparent = { StringValue: carrier.traceparent, DataType: 'String' };\n }\n if (carrier.tracestate) {\n result.tracestate = { StringValue: carrier.tracestate, DataType: 'String' };\n }\n if (carrier.baggage) {\n result.baggage = { StringValue: carrier.baggage, DataType: 'String' };\n }\n\n return result;\n }\n\n /**\n * Send a single message to the queue\n *\n * @param message - Message to send\n * @returns Promise with message ID and other metadata\n */\n async send(message: SQSMessage): Promise<{\n messageId?: string;\n sequenceNumber?: string;\n md5OfMessageBody?: string;\n }> {\n return trace(`sqs.send`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: this.queueName,\n queueUrl: this.config.queueUrl,\n operation: 'send',\n }),\n );\n\n // Build command input\n const input = {\n QueueUrl: this.config.queueUrl,\n MessageBody: message.body,\n MessageAttributes: this.injectContext(message.attributes),\n ...(message.messageGroupId && { MessageGroupId: message.messageGroupId }),\n ...(message.messageDeduplicationId && {\n MessageDeduplicationId: message.messageDeduplicationId,\n }),\n ...(message.delaySeconds !== undefined && { DelaySeconds: message.delaySeconds }),\n };\n\n // Dynamically import the command to avoid requiring @aws-sdk/client-sqs at load time\n try {\n const { SendMessageCommand } = await import('@aws-sdk/client-sqs');\n const result = await this.client.send(new SendMessageCommand(input));\n\n if (result.MessageId) {\n ctx.setAttribute('messaging.message.id', result.MessageId);\n }\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return {\n messageId: result.MessageId,\n sequenceNumber: result.SequenceNumber,\n md5OfMessageBody: result.MD5OfMessageBody,\n };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Send failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Send multiple messages in a batch\n *\n * @param messages - Array of messages to send (max 10)\n * @returns Promise with successful and failed message results\n */\n async sendBatch(messages: SQSMessage[]): Promise<{\n successful: Array<{ id: string; messageId?: string; sequenceNumber?: string }>;\n failed: Array<{ id: string; code?: string; message?: string }>;\n }> {\n return trace(`sqs.sendBatch`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: this.queueName,\n queueUrl: this.config.queueUrl,\n operation: 'send',\n }),\n );\n ctx.setAttribute('messaging.batch.message_count', messages.length);\n\n // Build batch entries\n const entries = messages.map((message, index) => ({\n Id: String(index),\n MessageBody: message.body,\n MessageAttributes: this.injectContext(message.attributes),\n ...(message.messageGroupId && { MessageGroupId: message.messageGroupId }),\n ...(message.messageDeduplicationId && {\n MessageDeduplicationId: message.messageDeduplicationId,\n }),\n ...(message.delaySeconds !== undefined && { DelaySeconds: message.delaySeconds }),\n }));\n\n try {\n const { SendMessageBatchCommand } = await import('@aws-sdk/client-sqs');\n const result = await this.client.send(\n new SendMessageBatchCommand({\n QueueUrl: this.config.queueUrl,\n Entries: entries,\n }),\n );\n\n const successful =\n result.Successful?.map((s: { Id?: string; MessageId?: string; SequenceNumber?: string }) => ({\n id: s.Id!,\n messageId: s.MessageId,\n sequenceNumber: s.SequenceNumber,\n })) || [];\n\n const failed =\n result.Failed?.map((f: { Id?: string; Code?: string; Message?: string }) => ({\n id: f.Id!,\n code: f.Code,\n message: f.Message,\n })) || [];\n\n ctx.setAttribute('messaging.sqs.successful_count', successful.length);\n ctx.setAttribute('messaging.sqs.failed_count', failed.length);\n\n if (failed.length > 0) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: `${failed.length} messages failed`,\n });\n } else {\n ctx.setStatus({ code: SpanStatusCode.OK });\n }\n\n return { successful, failed };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Batch send failed',\n });\n throw error;\n }\n });\n }\n}\n\n// ============================================================================\n// SQS Consumer - Receives and processes messages with trace context extraction\n// ============================================================================\n\n/**\n * Configuration for SQS Consumer\n */\nexport interface SQSConsumerConfig {\n /**\n * Full SQS queue URL\n */\n queueUrl: string;\n\n /**\n * Extract W3C Trace Context from message attributes\n * Creates child spans linked to the producer\n * @default true\n */\n extractTraceContext?: boolean;\n\n /**\n * Maximum number of messages to receive per poll\n * @default 10\n */\n maxMessages?: number;\n\n /**\n * Visibility timeout in seconds\n * @default 30\n */\n visibilityTimeout?: number;\n\n /**\n * Wait time for long polling in seconds (0-20)\n * @default 20\n */\n waitTimeSeconds?: number;\n\n /**\n * Optional service name for tracing\n */\n service?: string;\n}\n\n/**\n * Received SQS message with parsed attributes\n */\nexport interface ReceivedSQSMessage {\n /**\n * Message ID\n */\n messageId: string;\n\n /**\n * Receipt handle for deletion\n */\n receiptHandle: string;\n\n /**\n * Message body (string)\n */\n body: string;\n\n /**\n * Parsed message attributes\n */\n attributes: Record<string, string>;\n\n /**\n * System attributes (ApproximateReceiveCount, etc.)\n */\n systemAttributes: Record<string, string>;\n\n /**\n * Original AWS SDK message object\n */\n \n raw: any;\n}\n\n/**\n * Message processor function type\n */\nexport type MessageProcessor = (\n message: ReceivedSQSMessage,\n ctx: TraceContext,\n) => Promise<void>;\n\n/**\n * SQS Consumer with automatic trace context extraction\n *\n * Wraps an SQS client to automatically:\n * - Create spans for receive/process operations\n * - Extract W3C Trace Context from message attributes\n * - Link consumer spans to producer spans\n * - Delete messages after successful processing\n *\n * @example Basic usage\n * ```typescript\n * import { SQSConsumer } from 'autotel-aws/sqs';\n * import { SQSClient } from '@aws-sdk/client-sqs';\n *\n * const sqs = new SQSClient({ region: 'us-east-1' });\n * const consumer = new SQSConsumer(sqs, {\n * queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue'\n * });\n *\n * // Process messages with automatic tracing\n * await consumer.processMessages(async (message, ctx) => {\n * ctx.setAttribute('order.id', JSON.parse(message.body).orderId);\n * await handleOrder(message.body);\n * });\n * ```\n *\n * @example With polling loop\n * ```typescript\n * // Start continuous polling\n * const controller = new AbortController();\n *\n * consumer.poll(async (message, ctx) => {\n * await processMessage(message);\n * }, { signal: controller.signal });\n *\n * // Stop polling gracefully\n * controller.abort();\n * ```\n */\nexport class SQSConsumer<\n \n TClient extends { send: (command: any) => Promise<any> } = any,\n> {\n private client: TClient;\n private config: Required<\n Pick<SQSConsumerConfig, 'queueUrl' | 'maxMessages' | 'visibilityTimeout' | 'waitTimeSeconds'>\n > &\n SQSConsumerConfig;\n private queueName: string;\n\n constructor(client: TClient, config: SQSConsumerConfig) {\n this.client = wrapSDKClient(client as any, config.service) as TClient;\n this.config = {\n extractTraceContext: true,\n maxMessages: 10,\n visibilityTimeout: 30,\n waitTimeSeconds: 20,\n ...config,\n };\n this.queueName = config.queueUrl.split('/').pop() || 'unknown';\n }\n\n /**\n * Extract trace context from message attributes\n */\n \n private extractContext(messageAttributes: any): Record<string, string> | undefined {\n if (!this.config.extractTraceContext || !messageAttributes) {\n return undefined;\n }\n\n const carrier: Record<string, string> = {};\n\n if (messageAttributes.traceparent?.StringValue) {\n carrier.traceparent = messageAttributes.traceparent.StringValue;\n }\n if (messageAttributes.tracestate?.StringValue) {\n carrier.tracestate = messageAttributes.tracestate.StringValue;\n }\n if (messageAttributes.baggage?.StringValue) {\n carrier.baggage = messageAttributes.baggage.StringValue;\n }\n\n return Object.keys(carrier).length > 0 ? carrier : undefined;\n }\n\n /**\n * Parse AWS SDK message into our format\n */\n \n private parseMessage(message: any): ReceivedSQSMessage {\n const attributes: Record<string, string> = {};\n if (message.MessageAttributes) {\n for (const [key, value] of Object.entries(message.MessageAttributes)) {\n \n attributes[key] = (value as any).StringValue || '';\n }\n }\n\n return {\n messageId: message.MessageId || '',\n receiptHandle: message.ReceiptHandle || '',\n body: message.Body || '',\n attributes,\n systemAttributes: message.Attributes || {},\n raw: message,\n };\n }\n\n /**\n * Receive messages from the queue\n *\n * @returns Array of received messages\n */\n async receive(): Promise<ReceivedSQSMessage[]> {\n return trace(`sqs.receive`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: this.queueName,\n queueUrl: this.config.queueUrl,\n operation: 'receive',\n }),\n );\n\n try {\n const { ReceiveMessageCommand } = await import('@aws-sdk/client-sqs');\n const result = await this.client.send(\n new ReceiveMessageCommand({\n QueueUrl: this.config.queueUrl,\n MaxNumberOfMessages: this.config.maxMessages,\n VisibilityTimeout: this.config.visibilityTimeout,\n WaitTimeSeconds: this.config.waitTimeSeconds,\n MessageAttributeNames: ['All'],\n AttributeNames: ['All'],\n }),\n );\n\n \n const messages = (result.Messages || []).map((m: any) => this.parseMessage(m));\n ctx.setAttribute('messaging.batch.message_count', messages.length);\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return messages;\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Receive failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Delete a message from the queue\n *\n * @param receiptHandle - Receipt handle of the message to delete\n */\n async delete(receiptHandle: string): Promise<void> {\n const { DeleteMessageCommand } = await import('@aws-sdk/client-sqs');\n await this.client.send(\n new DeleteMessageCommand({\n QueueUrl: this.config.queueUrl,\n ReceiptHandle: receiptHandle,\n }),\n );\n }\n\n /**\n * Process messages with automatic trace context extraction\n *\n * Receives messages, processes each with the provided handler,\n * and deletes successfully processed messages.\n *\n * @param processor - Function to process each message\n * @returns Number of messages processed\n */\n async processMessages(processor: MessageProcessor): Promise<number> {\n const messages = await this.receive();\n let processed = 0;\n\n for (const message of messages) {\n // Extract trace context from message attributes\n const carrier = this.extractContext(message.raw.MessageAttributes);\n\n // Create processing span, optionally linked to producer\n const processMessage = async () => {\n return trace(`sqs.process`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: this.queueName,\n queueUrl: this.config.queueUrl,\n operation: 'receive',\n }),\n );\n ctx.setAttribute('messaging.message.id', message.messageId);\n\n try {\n await processor(message, ctx);\n await this.delete(message.receiptHandle);\n processed++;\n ctx.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Processing failed',\n });\n throw error;\n }\n });\n };\n\n // Run with extracted context if available\n if (carrier) {\n const extractedContext = propagation.extract(context.active(), carrier);\n await context.with(extractedContext, processMessage);\n } else {\n await processMessage();\n }\n }\n\n return processed;\n }\n\n /**\n * Start continuous polling loop\n *\n * @param processor - Function to process each message\n * @param options - Polling options including abort signal\n */\n async poll(\n processor: MessageProcessor,\n options?: { signal?: AbortSignal },\n ): Promise<void> {\n while (!options?.signal?.aborted) {\n try {\n await this.processMessages(processor);\n } catch (error) {\n // Log error but continue polling\n console.error('[SQSConsumer] Error processing messages:', error);\n // Small delay before retrying on error\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { AWS_ATTRS } from './chunk-I4CKQ4RD.js';
|
|
2
|
+
import { trace } from '@opentelemetry/api';
|
|
3
|
+
export { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';
|
|
4
|
+
|
|
5
|
+
var xrayConfig = {};
|
|
6
|
+
function configureXRay(config) {
|
|
7
|
+
xrayConfig = { ...xrayConfig, ...config };
|
|
8
|
+
}
|
|
9
|
+
var annotationMap = /* @__PURE__ */ new WeakMap();
|
|
10
|
+
function setXRayAnnotation(key, value) {
|
|
11
|
+
const span = trace.getActiveSpan();
|
|
12
|
+
if (!span) return;
|
|
13
|
+
span.setAttribute(key, value);
|
|
14
|
+
let annotations = annotationMap.get(span);
|
|
15
|
+
if (!annotations) {
|
|
16
|
+
annotations = /* @__PURE__ */ new Set();
|
|
17
|
+
annotationMap.set(span, annotations);
|
|
18
|
+
}
|
|
19
|
+
if (!annotations.has(key)) {
|
|
20
|
+
annotations.add(key);
|
|
21
|
+
span.setAttribute(AWS_ATTRS.XRAY_ANNOTATIONS, [...annotations].join(","));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function setXRayMetadata(key, value) {
|
|
25
|
+
const span = trace.getActiveSpan();
|
|
26
|
+
if (!span) return;
|
|
27
|
+
if (typeof value === "object") {
|
|
28
|
+
try {
|
|
29
|
+
span.setAttribute(key, JSON.stringify(value));
|
|
30
|
+
} catch {
|
|
31
|
+
span.setAttribute(key, "<serialization-failed>");
|
|
32
|
+
}
|
|
33
|
+
} else {
|
|
34
|
+
span.setAttribute(key, value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { configureXRay, setXRayAnnotation, setXRayMetadata };
|
|
39
|
+
//# sourceMappingURL=chunk-PZGYL7XZ.js.map
|
|
40
|
+
//# sourceMappingURL=chunk-PZGYL7XZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/xray/annotations.ts"],"names":[],"mappings":";;;;AAQA,IAAI,aAAyB,EAAC;AAKvB,SAAS,cAAc,MAAA,EAA0B;AACtD,EAAA,UAAA,GAAa,EAAE,GAAG,UAAA,EAAY,GAAG,MAAA,EAAO;AAC1C;AASA,IAAM,aAAA,uBAAoB,OAAA,EAA6B;AAEhD,SAAS,iBAAA,CAAkB,KAAa,KAAA,EAAwC;AACrF,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,EAAc;AACjC,EAAA,IAAI,CAAC,IAAA,EAAM;AAGX,EAAA,IAAA,CAAK,YAAA,CAAa,KAAK,KAAK,CAAA;AAG5B,EAAA,IAAI,WAAA,GAAc,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACxC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,WAAA,uBAAkB,GAAA,EAAY;AAC9B,IAAA,aAAA,CAAc,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,IAAA,WAAA,CAAY,IAAI,GAAG,CAAA;AAEnB,IAAA,IAAA,CAAK,YAAA,CAAa,UAAU,gBAAA,EAAkB,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAC1E;AACF;AAQO,SAAS,eAAA,CAAgB,KAAa,KAAA,EAAiD;AAC5F,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,EAAc;AACjC,EAAA,IAAI,CAAC,IAAA,EAAM;AAEX,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IAC9C,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,YAAA,CAAa,KAAK,wBAAwB,CAAA;AAAA,IACjD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,EAC9B;AACF","file":"chunk-PZGYL7XZ.js","sourcesContent":["/**\n * X-Ray annotation and metadata helpers\n */\n\nimport { trace } from '@opentelemetry/api';\nimport { AWS_ATTRS } from '../attributes';\nimport type { XRayConfig } from '../config';\n\nlet xrayConfig: XRayConfig = {};\n\n/**\n * Configure X-Ray compatibility features\n */\nexport function configureXRay(config: XRayConfig): void {\n xrayConfig = { ...xrayConfig, ...config };\n}\n\n/**\n * Set X-Ray annotation (indexed in X-Ray console)\n *\n * Annotations are indexed and can be used for filtering in X-Ray.\n * They are stored as span attributes with a special annotation list.\n */\n// Track annotations per span (since we can't read attributes back from spans)\nconst annotationMap = new WeakMap<object, Set<string>>();\n\nexport function setXRayAnnotation(key: string, value: string | number | boolean): void {\n const span = trace.getActiveSpan();\n if (!span) return;\n\n // Set the attribute\n span.setAttribute(key, value);\n\n // Track annotation keys for this span\n let annotations = annotationMap.get(span);\n if (!annotations) {\n annotations = new Set<string>();\n annotationMap.set(span, annotations);\n }\n \n if (!annotations.has(key)) {\n annotations.add(key);\n // Store annotation list as comma-separated string (X-Ray format)\n span.setAttribute(AWS_ATTRS.XRAY_ANNOTATIONS, [...annotations].join(','));\n }\n}\n\n/**\n * Set X-Ray metadata (not indexed)\n *\n * Metadata is not indexed but can be viewed in X-Ray console.\n * It's stored as regular span attributes.\n */\nexport function setXRayMetadata(key: string, value: string | number | boolean | object): void {\n const span = trace.getActiveSpan();\n if (!span) return;\n\n if (typeof value === 'object') {\n try {\n span.setAttribute(key, JSON.stringify(value));\n } catch {\n span.setAttribute(key, '<serialization-failed>');\n }\n } else {\n span.setAttribute(key, value);\n }\n}\n"]}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/attributes.ts
|
|
4
|
+
var AWS_ATTRS = {
|
|
5
|
+
// Lambda
|
|
6
|
+
LAMBDA_FUNCTION_NAME: "faas.name",
|
|
7
|
+
LAMBDA_FUNCTION_VERSION: "faas.version",
|
|
8
|
+
LAMBDA_INVOCATION_ID: "faas.invocation_id",
|
|
9
|
+
LAMBDA_COLD_START: "faas.coldstart",
|
|
10
|
+
LAMBDA_TRIGGER: "faas.trigger",
|
|
11
|
+
// AWS SDK
|
|
12
|
+
AWS_SERVICE: "rpc.service",
|
|
13
|
+
AWS_OPERATION: "rpc.method",
|
|
14
|
+
AWS_REQUEST_ID: "aws.request_id",
|
|
15
|
+
AWS_EXTENDED_REQUEST_ID: "aws.extended_request_id",
|
|
16
|
+
AWS_CF_ID: "aws.cf_id",
|
|
17
|
+
// DynamoDB
|
|
18
|
+
DDB_TABLE_NAMES: "aws.dynamodb.table_names",
|
|
19
|
+
DDB_CONSUMED_CAPACITY: "aws.dynamodb.consumed_capacity",
|
|
20
|
+
// S3
|
|
21
|
+
S3_BUCKET: "aws.s3.bucket",
|
|
22
|
+
S3_KEY: "aws.s3.key",
|
|
23
|
+
S3_COPY_SOURCE: "aws.s3.copy_source",
|
|
24
|
+
// SQS
|
|
25
|
+
SQS_QUEUE_NAME: "messaging.destination.name",
|
|
26
|
+
SQS_QUEUE_URL: "aws.sqs.queue_url",
|
|
27
|
+
SQS_MESSAGE_ID: "messaging.message.id",
|
|
28
|
+
// SNS
|
|
29
|
+
SNS_TOPIC_ARN: "messaging.destination.name",
|
|
30
|
+
SNS_MESSAGE_ID: "messaging.message.id",
|
|
31
|
+
// Kinesis
|
|
32
|
+
KINESIS_STREAM_NAME: "messaging.destination.name",
|
|
33
|
+
KINESIS_SHARD_ID: "aws.kinesis.shard_id",
|
|
34
|
+
// Step Functions
|
|
35
|
+
SFN_STATE_MACHINE_ARN: "aws.stepfunctions.state_machine_arn",
|
|
36
|
+
SFN_EXECUTION_ARN: "aws.stepfunctions.execution_arn",
|
|
37
|
+
SFN_ACTIVITY_ARN: "aws.stepfunctions.activity_arn",
|
|
38
|
+
// EventBridge
|
|
39
|
+
EVENTBRIDGE_EVENT_BUS: "aws.eventbridge.event_bus",
|
|
40
|
+
EVENTBRIDGE_SOURCE: "aws.eventbridge.source",
|
|
41
|
+
EVENTBRIDGE_DETAIL_TYPE: "aws.eventbridge.detail_type",
|
|
42
|
+
// X-Ray
|
|
43
|
+
XRAY_ANNOTATIONS: "aws.xray.annotations"
|
|
44
|
+
};
|
|
45
|
+
function buildLambdaAttributes(context) {
|
|
46
|
+
return {
|
|
47
|
+
[AWS_ATTRS.LAMBDA_FUNCTION_NAME]: context.functionName,
|
|
48
|
+
[AWS_ATTRS.LAMBDA_FUNCTION_VERSION]: context.functionVersion,
|
|
49
|
+
[AWS_ATTRS.LAMBDA_INVOCATION_ID]: context.awsRequestId,
|
|
50
|
+
"cloud.provider": "aws",
|
|
51
|
+
"cloud.region": process.env.AWS_REGION || "",
|
|
52
|
+
...context.coldStart !== void 0 && {
|
|
53
|
+
[AWS_ATTRS.LAMBDA_COLD_START]: context.coldStart
|
|
54
|
+
},
|
|
55
|
+
...context.trigger && {
|
|
56
|
+
[AWS_ATTRS.LAMBDA_TRIGGER]: context.trigger
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function buildSDKAttributes(metadata) {
|
|
61
|
+
return {
|
|
62
|
+
"rpc.system": "aws-api",
|
|
63
|
+
[AWS_ATTRS.AWS_SERVICE]: metadata.service,
|
|
64
|
+
[AWS_ATTRS.AWS_OPERATION]: metadata.operation,
|
|
65
|
+
...metadata.requestId && {
|
|
66
|
+
[AWS_ATTRS.AWS_REQUEST_ID]: metadata.requestId
|
|
67
|
+
},
|
|
68
|
+
...metadata.httpStatusCode && {
|
|
69
|
+
"http.status_code": metadata.httpStatusCode
|
|
70
|
+
},
|
|
71
|
+
...metadata.extendedRequestId && {
|
|
72
|
+
[AWS_ATTRS.AWS_EXTENDED_REQUEST_ID]: metadata.extendedRequestId
|
|
73
|
+
},
|
|
74
|
+
...metadata.cfId && {
|
|
75
|
+
[AWS_ATTRS.AWS_CF_ID]: metadata.cfId
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function buildDynamoDBAttributes(operation) {
|
|
80
|
+
return {
|
|
81
|
+
"db.system": "dynamodb",
|
|
82
|
+
"db.operation": operation.operation,
|
|
83
|
+
"db.name": operation.tableName,
|
|
84
|
+
[AWS_ATTRS.DDB_TABLE_NAMES]: [operation.tableName],
|
|
85
|
+
...operation.consumedCapacity !== void 0 && {
|
|
86
|
+
[AWS_ATTRS.DDB_CONSUMED_CAPACITY]: operation.consumedCapacity
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function buildS3Attributes(operation) {
|
|
91
|
+
return {
|
|
92
|
+
[AWS_ATTRS.S3_BUCKET]: operation.bucket,
|
|
93
|
+
...operation.key && {
|
|
94
|
+
[AWS_ATTRS.S3_KEY]: operation.key
|
|
95
|
+
},
|
|
96
|
+
...operation.copySource && {
|
|
97
|
+
[AWS_ATTRS.S3_COPY_SOURCE]: operation.copySource
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function buildSQSAttributes(operation) {
|
|
102
|
+
return {
|
|
103
|
+
"messaging.system": "aws_sqs",
|
|
104
|
+
[AWS_ATTRS.SQS_QUEUE_NAME]: operation.queueName,
|
|
105
|
+
"messaging.operation": operation.operation,
|
|
106
|
+
...operation.queueUrl && {
|
|
107
|
+
[AWS_ATTRS.SQS_QUEUE_URL]: operation.queueUrl
|
|
108
|
+
},
|
|
109
|
+
...operation.messageId && {
|
|
110
|
+
[AWS_ATTRS.SQS_MESSAGE_ID]: operation.messageId
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function buildSNSAttributes(operation) {
|
|
115
|
+
return {
|
|
116
|
+
"messaging.system": "aws_sns",
|
|
117
|
+
[AWS_ATTRS.SNS_TOPIC_ARN]: operation.topicArn,
|
|
118
|
+
"messaging.operation": "publish",
|
|
119
|
+
...operation.messageId && {
|
|
120
|
+
[AWS_ATTRS.SNS_MESSAGE_ID]: operation.messageId
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function buildKinesisAttributes(operation) {
|
|
125
|
+
return {
|
|
126
|
+
"messaging.system": "aws_kinesis",
|
|
127
|
+
[AWS_ATTRS.KINESIS_STREAM_NAME]: operation.streamName,
|
|
128
|
+
"messaging.operation": operation.operation,
|
|
129
|
+
...operation.shardId && {
|
|
130
|
+
[AWS_ATTRS.KINESIS_SHARD_ID]: operation.shardId
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function buildStepFunctionsAttributes(operation) {
|
|
135
|
+
return {
|
|
136
|
+
[AWS_ATTRS.SFN_STATE_MACHINE_ARN]: operation.stateMachineArn,
|
|
137
|
+
...operation.executionArn && {
|
|
138
|
+
[AWS_ATTRS.SFN_EXECUTION_ARN]: operation.executionArn
|
|
139
|
+
},
|
|
140
|
+
...operation.activityArn && {
|
|
141
|
+
[AWS_ATTRS.SFN_ACTIVITY_ARN]: operation.activityArn
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function buildEventBridgeAttributes(operation) {
|
|
146
|
+
return {
|
|
147
|
+
[AWS_ATTRS.EVENTBRIDGE_EVENT_BUS]: operation.eventBus,
|
|
148
|
+
[AWS_ATTRS.EVENTBRIDGE_SOURCE]: operation.source,
|
|
149
|
+
[AWS_ATTRS.EVENTBRIDGE_DETAIL_TYPE]: operation.detailType
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
exports.AWS_ATTRS = AWS_ATTRS;
|
|
154
|
+
exports.buildDynamoDBAttributes = buildDynamoDBAttributes;
|
|
155
|
+
exports.buildEventBridgeAttributes = buildEventBridgeAttributes;
|
|
156
|
+
exports.buildKinesisAttributes = buildKinesisAttributes;
|
|
157
|
+
exports.buildLambdaAttributes = buildLambdaAttributes;
|
|
158
|
+
exports.buildS3Attributes = buildS3Attributes;
|
|
159
|
+
exports.buildSDKAttributes = buildSDKAttributes;
|
|
160
|
+
exports.buildSNSAttributes = buildSNSAttributes;
|
|
161
|
+
exports.buildSQSAttributes = buildSQSAttributes;
|
|
162
|
+
exports.buildStepFunctionsAttributes = buildStepFunctionsAttributes;
|
|
163
|
+
//# sourceMappingURL=chunk-Q3DMMQ7K.cjs.map
|
|
164
|
+
//# sourceMappingURL=chunk-Q3DMMQ7K.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/attributes.ts"],"names":[],"mappings":"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","file":"chunk-Q3DMMQ7K.cjs","sourcesContent":["/**\n * AWS semantic attribute helpers\n * Following OpenTelemetry AWS semantic conventions\n */\n\n/**\n * AWS semantic attribute keys\n */\nexport const AWS_ATTRS = {\n // Lambda\n LAMBDA_FUNCTION_NAME: 'faas.name',\n LAMBDA_FUNCTION_VERSION: 'faas.version',\n LAMBDA_INVOCATION_ID: 'faas.invocation_id',\n LAMBDA_COLD_START: 'faas.coldstart',\n LAMBDA_TRIGGER: 'faas.trigger',\n\n // AWS SDK\n AWS_SERVICE: 'rpc.service',\n AWS_OPERATION: 'rpc.method',\n AWS_REQUEST_ID: 'aws.request_id',\n AWS_EXTENDED_REQUEST_ID: 'aws.extended_request_id',\n AWS_CF_ID: 'aws.cf_id',\n\n // DynamoDB\n DDB_TABLE_NAMES: 'aws.dynamodb.table_names',\n DDB_CONSUMED_CAPACITY: 'aws.dynamodb.consumed_capacity',\n\n // S3\n S3_BUCKET: 'aws.s3.bucket',\n S3_KEY: 'aws.s3.key',\n S3_COPY_SOURCE: 'aws.s3.copy_source',\n\n // SQS\n SQS_QUEUE_NAME: 'messaging.destination.name',\n SQS_QUEUE_URL: 'aws.sqs.queue_url',\n SQS_MESSAGE_ID: 'messaging.message.id',\n\n // SNS\n SNS_TOPIC_ARN: 'messaging.destination.name',\n SNS_MESSAGE_ID: 'messaging.message.id',\n\n // Kinesis\n KINESIS_STREAM_NAME: 'messaging.destination.name',\n KINESIS_SHARD_ID: 'aws.kinesis.shard_id',\n\n // Step Functions\n SFN_STATE_MACHINE_ARN: 'aws.stepfunctions.state_machine_arn',\n SFN_EXECUTION_ARN: 'aws.stepfunctions.execution_arn',\n SFN_ACTIVITY_ARN: 'aws.stepfunctions.activity_arn',\n\n // EventBridge\n EVENTBRIDGE_EVENT_BUS: 'aws.eventbridge.event_bus',\n EVENTBRIDGE_SOURCE: 'aws.eventbridge.source',\n EVENTBRIDGE_DETAIL_TYPE: 'aws.eventbridge.detail_type',\n\n // X-Ray\n XRAY_ANNOTATIONS: 'aws.xray.annotations',\n} as const;\n\n/**\n * Build Lambda span attributes\n */\nexport function buildLambdaAttributes(context: {\n awsRequestId: string;\n functionName: string;\n functionVersion: string;\n coldStart?: boolean;\n trigger?: string;\n}): Record<string, string | boolean> {\n return {\n [AWS_ATTRS.LAMBDA_FUNCTION_NAME]: context.functionName,\n [AWS_ATTRS.LAMBDA_FUNCTION_VERSION]: context.functionVersion,\n [AWS_ATTRS.LAMBDA_INVOCATION_ID]: context.awsRequestId,\n 'cloud.provider': 'aws',\n 'cloud.region': process.env.AWS_REGION || '',\n ...(context.coldStart !== undefined && {\n [AWS_ATTRS.LAMBDA_COLD_START]: context.coldStart,\n }),\n ...(context.trigger && {\n [AWS_ATTRS.LAMBDA_TRIGGER]: context.trigger,\n }),\n };\n}\n\n/**\n * Build AWS SDK span attributes\n */\nexport function buildSDKAttributes(metadata: {\n service: string;\n operation: string;\n requestId?: string;\n httpStatusCode?: number;\n extendedRequestId?: string;\n cfId?: string;\n}): Record<string, string | number> {\n return {\n 'rpc.system': 'aws-api',\n [AWS_ATTRS.AWS_SERVICE]: metadata.service,\n [AWS_ATTRS.AWS_OPERATION]: metadata.operation,\n ...(metadata.requestId && {\n [AWS_ATTRS.AWS_REQUEST_ID]: metadata.requestId,\n }),\n ...(metadata.httpStatusCode && {\n 'http.status_code': metadata.httpStatusCode,\n }),\n ...(metadata.extendedRequestId && {\n [AWS_ATTRS.AWS_EXTENDED_REQUEST_ID]: metadata.extendedRequestId,\n }),\n ...(metadata.cfId && {\n [AWS_ATTRS.AWS_CF_ID]: metadata.cfId,\n }),\n };\n}\n\n/**\n * Build DynamoDB span attributes\n */\nexport function buildDynamoDBAttributes(operation: {\n tableName: string;\n operation: string;\n consumedCapacity?: number;\n}): Record<string, string | number | string[]> {\n return {\n 'db.system': 'dynamodb',\n 'db.operation': operation.operation,\n 'db.name': operation.tableName,\n [AWS_ATTRS.DDB_TABLE_NAMES]: [operation.tableName],\n ...(operation.consumedCapacity !== undefined && {\n [AWS_ATTRS.DDB_CONSUMED_CAPACITY]: operation.consumedCapacity,\n }),\n };\n}\n\n/**\n * Build S3 span attributes\n */\nexport function buildS3Attributes(operation: {\n bucket: string;\n key?: string;\n copySource?: string;\n}): Record<string, string> {\n return {\n [AWS_ATTRS.S3_BUCKET]: operation.bucket,\n ...(operation.key && {\n [AWS_ATTRS.S3_KEY]: operation.key,\n }),\n ...(operation.copySource && {\n [AWS_ATTRS.S3_COPY_SOURCE]: operation.copySource,\n }),\n };\n}\n\n/**\n * Build SQS span attributes\n */\nexport function buildSQSAttributes(operation: {\n queueName: string;\n queueUrl?: string;\n messageId?: string;\n operation: 'send' | 'receive';\n}): Record<string, string> {\n return {\n 'messaging.system': 'aws_sqs',\n [AWS_ATTRS.SQS_QUEUE_NAME]: operation.queueName,\n 'messaging.operation': operation.operation,\n ...(operation.queueUrl && {\n [AWS_ATTRS.SQS_QUEUE_URL]: operation.queueUrl,\n }),\n ...(operation.messageId && {\n [AWS_ATTRS.SQS_MESSAGE_ID]: operation.messageId,\n }),\n };\n}\n\n/**\n * Build SNS span attributes\n */\nexport function buildSNSAttributes(operation: {\n topicArn: string;\n messageId?: string;\n}): Record<string, string> {\n return {\n 'messaging.system': 'aws_sns',\n [AWS_ATTRS.SNS_TOPIC_ARN]: operation.topicArn,\n 'messaging.operation': 'publish',\n ...(operation.messageId && {\n [AWS_ATTRS.SNS_MESSAGE_ID]: operation.messageId,\n }),\n };\n}\n\n/**\n * Build Kinesis span attributes\n */\nexport function buildKinesisAttributes(operation: {\n streamName: string;\n shardId?: string;\n operation: 'put' | 'get';\n}): Record<string, string> {\n return {\n 'messaging.system': 'aws_kinesis',\n [AWS_ATTRS.KINESIS_STREAM_NAME]: operation.streamName,\n 'messaging.operation': operation.operation,\n ...(operation.shardId && {\n [AWS_ATTRS.KINESIS_SHARD_ID]: operation.shardId,\n }),\n };\n}\n\n/**\n * Build Step Functions span attributes\n */\nexport function buildStepFunctionsAttributes(operation: {\n stateMachineArn: string;\n executionArn?: string;\n activityArn?: string;\n}): Record<string, string> {\n return {\n [AWS_ATTRS.SFN_STATE_MACHINE_ARN]: operation.stateMachineArn,\n ...(operation.executionArn && {\n [AWS_ATTRS.SFN_EXECUTION_ARN]: operation.executionArn,\n }),\n ...(operation.activityArn && {\n [AWS_ATTRS.SFN_ACTIVITY_ARN]: operation.activityArn,\n }),\n };\n}\n\n/**\n * Build EventBridge span attributes\n */\nexport function buildEventBridgeAttributes(operation: {\n eventBus: string;\n source: string;\n detailType: string;\n}): Record<string, string> {\n return {\n [AWS_ATTRS.EVENTBRIDGE_EVENT_BUS]: operation.eventBus,\n [AWS_ATTRS.EVENTBRIDGE_SOURCE]: operation.source,\n [AWS_ATTRS.EVENTBRIDGE_DETAIL_TYPE]: operation.detailType,\n };\n}\n"]}
|