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.
Files changed (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +540 -0
  3. package/dist/attributes.cjs +49 -0
  4. package/dist/attributes.cjs.map +1 -0
  5. package/dist/attributes.d.cts +117 -0
  6. package/dist/attributes.d.ts +117 -0
  7. package/dist/attributes.js +4 -0
  8. package/dist/attributes.js.map +1 -0
  9. package/dist/chunk-35F3UBOO.cjs +48 -0
  10. package/dist/chunk-35F3UBOO.cjs.map +1 -0
  11. package/dist/chunk-4TGVGEUN.cjs +84 -0
  12. package/dist/chunk-4TGVGEUN.cjs.map +1 -0
  13. package/dist/chunk-CIGXV6HA.js +192 -0
  14. package/dist/chunk-CIGXV6HA.js.map +1 -0
  15. package/dist/chunk-D5INYMRP.cjs +350 -0
  16. package/dist/chunk-D5INYMRP.cjs.map +1 -0
  17. package/dist/chunk-DF5PT3JK.js +387 -0
  18. package/dist/chunk-DF5PT3JK.js.map +1 -0
  19. package/dist/chunk-DGUM43GV.js +10 -0
  20. package/dist/chunk-DGUM43GV.js.map +1 -0
  21. package/dist/chunk-DHHLKZHI.cjs +23 -0
  22. package/dist/chunk-DHHLKZHI.cjs.map +1 -0
  23. package/dist/chunk-FKZOELBT.js +78 -0
  24. package/dist/chunk-FKZOELBT.js.map +1 -0
  25. package/dist/chunk-HMTKKKKP.cjs +390 -0
  26. package/dist/chunk-HMTKKKKP.cjs.map +1 -0
  27. package/dist/chunk-I4CKQ4RD.js +153 -0
  28. package/dist/chunk-I4CKQ4RD.js.map +1 -0
  29. package/dist/chunk-JEQ2X3Z6.cjs +12 -0
  30. package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
  31. package/dist/chunk-JMSFE6FJ.js +24 -0
  32. package/dist/chunk-JMSFE6FJ.js.map +1 -0
  33. package/dist/chunk-KUIOI74B.cjs +394 -0
  34. package/dist/chunk-KUIOI74B.cjs.map +1 -0
  35. package/dist/chunk-NQ65Y5AI.cjs +195 -0
  36. package/dist/chunk-NQ65Y5AI.cjs.map +1 -0
  37. package/dist/chunk-OB4XTAVK.cjs +345 -0
  38. package/dist/chunk-OB4XTAVK.cjs.map +1 -0
  39. package/dist/chunk-OHFR7WX5.js +341 -0
  40. package/dist/chunk-OHFR7WX5.js.map +1 -0
  41. package/dist/chunk-PZGYL7XZ.js +40 -0
  42. package/dist/chunk-PZGYL7XZ.js.map +1 -0
  43. package/dist/chunk-Q3DMMQ7K.cjs +164 -0
  44. package/dist/chunk-Q3DMMQ7K.cjs.map +1 -0
  45. package/dist/chunk-UZEJV2YD.cjs +139 -0
  46. package/dist/chunk-UZEJV2YD.cjs.map +1 -0
  47. package/dist/chunk-V4IQWFYN.js +341 -0
  48. package/dist/chunk-V4IQWFYN.js.map +1 -0
  49. package/dist/chunk-VZHQH75L.cjs +26 -0
  50. package/dist/chunk-VZHQH75L.cjs.map +1 -0
  51. package/dist/chunk-X6BY6PCK.js +386 -0
  52. package/dist/chunk-X6BY6PCK.js.map +1 -0
  53. package/dist/chunk-YG56NRIO.js +131 -0
  54. package/dist/chunk-YG56NRIO.js.map +1 -0
  55. package/dist/chunk-ZPDRKCAR.js +21 -0
  56. package/dist/chunk-ZPDRKCAR.js.map +1 -0
  57. package/dist/config-C7zV8Zm6.d.cts +125 -0
  58. package/dist/config-DxjTT8jd.d.ts +125 -0
  59. package/dist/dynamodb.cjs +14 -0
  60. package/dist/dynamodb.cjs.map +1 -0
  61. package/dist/dynamodb.d.cts +93 -0
  62. package/dist/dynamodb.d.ts +93 -0
  63. package/dist/dynamodb.js +5 -0
  64. package/dist/dynamodb.js.map +1 -0
  65. package/dist/eventbridge.cjs +279 -0
  66. package/dist/eventbridge.cjs.map +1 -0
  67. package/dist/eventbridge.d.cts +360 -0
  68. package/dist/eventbridge.d.ts +360 -0
  69. package/dist/eventbridge.js +273 -0
  70. package/dist/eventbridge.js.map +1 -0
  71. package/dist/index.cjs +251 -0
  72. package/dist/index.cjs.map +1 -0
  73. package/dist/index.d.cts +126 -0
  74. package/dist/index.d.ts +126 -0
  75. package/dist/index.js +48 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/kinesis.cjs +23 -0
  78. package/dist/kinesis.cjs.map +1 -0
  79. package/dist/kinesis.d.cts +360 -0
  80. package/dist/kinesis.d.ts +360 -0
  81. package/dist/kinesis.js +6 -0
  82. package/dist/kinesis.js.map +1 -0
  83. package/dist/lambda-auto.cjs +19 -0
  84. package/dist/lambda-auto.cjs.map +1 -0
  85. package/dist/lambda-auto.d.cts +2 -0
  86. package/dist/lambda-auto.d.ts +2 -0
  87. package/dist/lambda-auto.js +17 -0
  88. package/dist/lambda-auto.js.map +1 -0
  89. package/dist/lambda.cjs +42 -0
  90. package/dist/lambda.cjs.map +1 -0
  91. package/dist/lambda.d.cts +231 -0
  92. package/dist/lambda.d.ts +231 -0
  93. package/dist/lambda.js +5 -0
  94. package/dist/lambda.js.map +1 -0
  95. package/dist/s3.cjs +14 -0
  96. package/dist/s3.cjs.map +1 -0
  97. package/dist/s3.d.cts +77 -0
  98. package/dist/s3.d.ts +77 -0
  99. package/dist/s3.js +5 -0
  100. package/dist/s3.js.map +1 -0
  101. package/dist/sdk.cjs +31 -0
  102. package/dist/sdk.cjs.map +1 -0
  103. package/dist/sdk.d.cts +155 -0
  104. package/dist/sdk.d.ts +155 -0
  105. package/dist/sdk.js +6 -0
  106. package/dist/sdk.js.map +1 -0
  107. package/dist/sns.cjs +19 -0
  108. package/dist/sns.cjs.map +1 -0
  109. package/dist/sns.d.cts +256 -0
  110. package/dist/sns.d.ts +256 -0
  111. package/dist/sns.js +6 -0
  112. package/dist/sns.js.map +1 -0
  113. package/dist/sqs.cjs +23 -0
  114. package/dist/sqs.cjs.map +1 -0
  115. package/dist/sqs.d.cts +384 -0
  116. package/dist/sqs.d.ts +384 -0
  117. package/dist/sqs.js +6 -0
  118. package/dist/sqs.js.map +1 -0
  119. package/dist/step-functions.cjs +35 -0
  120. package/dist/step-functions.cjs.map +1 -0
  121. package/dist/step-functions.d.cts +423 -0
  122. package/dist/step-functions.d.ts +423 -0
  123. package/dist/step-functions.js +6 -0
  124. package/dist/step-functions.js.map +1 -0
  125. package/dist/testing.cjs +61 -0
  126. package/dist/testing.cjs.map +1 -0
  127. package/dist/testing.d.cts +39 -0
  128. package/dist/testing.d.ts +39 -0
  129. package/dist/testing.js +58 -0
  130. package/dist/testing.js.map +1 -0
  131. package/dist/types-3_ak5jhy.d.cts +76 -0
  132. package/dist/types-3_ak5jhy.d.ts +76 -0
  133. package/dist/types-UiBv_I_M.d.ts +16 -0
  134. package/dist/types-kTFVdSqO.d.cts +16 -0
  135. package/dist/xray.cjs +26 -0
  136. package/dist/xray.cjs.map +1 -0
  137. package/dist/xray.d.cts +23 -0
  138. package/dist/xray.d.ts +23 -0
  139. package/dist/xray.js +5 -0
  140. package/dist/xray.js.map +1 -0
  141. package/package.json +184 -0
@@ -0,0 +1,390 @@
1
+ 'use strict';
2
+
3
+ var chunkUZEJV2YD_cjs = require('./chunk-UZEJV2YD.cjs');
4
+ var chunkQ3DMMQ7K_cjs = require('./chunk-Q3DMMQ7K.cjs');
5
+ var autotel = require('autotel');
6
+ var api = require('@opentelemetry/api');
7
+
8
+ function traceKinesis(config) {
9
+ return function wrapper(fn) {
10
+ return autotel.trace(
11
+ `kinesis.${config.operation}`,
12
+ (ctx) => async (...args) => {
13
+ ctx.setAttributes(
14
+ chunkQ3DMMQ7K_cjs.buildKinesisAttributes({
15
+ streamName: config.streamName,
16
+ shardId: config.shardId,
17
+ operation: config.operation
18
+ })
19
+ );
20
+ const handler = fn(ctx);
21
+ return handler(...args);
22
+ }
23
+ );
24
+ };
25
+ }
26
+ var KinesisProducer = class {
27
+ client;
28
+ config;
29
+ constructor(client, config) {
30
+ this.client = chunkUZEJV2YD_cjs.wrapSDKClient(client, config.service);
31
+ this.config = {
32
+ injectTraceContext: true,
33
+ ...config
34
+ };
35
+ }
36
+ /**
37
+ * Inject trace context into record data
38
+ */
39
+ injectContext(data) {
40
+ let payload;
41
+ if (typeof data === "string") {
42
+ try {
43
+ payload = JSON.parse(data);
44
+ } catch {
45
+ payload = { _data: data };
46
+ }
47
+ } else {
48
+ payload = data;
49
+ }
50
+ if (this.config.injectTraceContext) {
51
+ const carrier = {};
52
+ api.propagation.inject(api.context.active(), carrier);
53
+ if (carrier.traceparent) {
54
+ payload = {
55
+ ...payload,
56
+ _traceContext: {
57
+ traceparent: carrier.traceparent,
58
+ tracestate: carrier.tracestate,
59
+ baggage: carrier.baggage
60
+ }
61
+ };
62
+ }
63
+ }
64
+ return Buffer.from(JSON.stringify(payload));
65
+ }
66
+ /**
67
+ * Put a single record to the stream
68
+ *
69
+ * @param record - Record to put
70
+ * @returns Promise with shard ID and sequence number
71
+ */
72
+ async putRecord(record) {
73
+ return autotel.trace(`kinesis.put`, async (ctx) => {
74
+ ctx.setAttributes(
75
+ chunkQ3DMMQ7K_cjs.buildKinesisAttributes({
76
+ streamName: this.config.streamName,
77
+ operation: "put"
78
+ })
79
+ );
80
+ const input = {
81
+ StreamName: this.config.streamName,
82
+ Data: this.injectContext(record.data),
83
+ PartitionKey: record.partitionKey,
84
+ ...record.explicitHashKey && { ExplicitHashKey: record.explicitHashKey },
85
+ ...record.sequenceNumberForOrdering && {
86
+ SequenceNumberForOrdering: record.sequenceNumberForOrdering
87
+ }
88
+ };
89
+ try {
90
+ const { PutRecordCommand } = await import('@aws-sdk/client-kinesis');
91
+ const result = await this.client.send(new PutRecordCommand(input));
92
+ if (result.ShardId) {
93
+ ctx.setAttribute("aws.kinesis.shard_id", result.ShardId);
94
+ }
95
+ if (result.SequenceNumber) {
96
+ ctx.setAttribute("aws.kinesis.sequence_number", result.SequenceNumber);
97
+ }
98
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
99
+ return {
100
+ shardId: result.ShardId,
101
+ sequenceNumber: result.SequenceNumber,
102
+ encryptionType: result.EncryptionType
103
+ };
104
+ } catch (error) {
105
+ ctx.setStatus({
106
+ code: api.SpanStatusCode.ERROR,
107
+ message: error instanceof Error ? error.message : "Put failed"
108
+ });
109
+ throw error;
110
+ }
111
+ });
112
+ }
113
+ /**
114
+ * Put multiple records in a batch
115
+ *
116
+ * @param records - Array of records to put (max 500)
117
+ * @returns Promise with successful and failed record results
118
+ */
119
+ async putRecords(records) {
120
+ return autotel.trace(`kinesis.putBatch`, async (ctx) => {
121
+ ctx.setAttributes(
122
+ chunkQ3DMMQ7K_cjs.buildKinesisAttributes({
123
+ streamName: this.config.streamName,
124
+ operation: "put"
125
+ })
126
+ );
127
+ ctx.setAttribute("messaging.batch.message_count", records.length);
128
+ const entries = records.map((record) => ({
129
+ Data: this.injectContext(record.data),
130
+ PartitionKey: record.partitionKey,
131
+ ...record.explicitHashKey && { ExplicitHashKey: record.explicitHashKey }
132
+ }));
133
+ try {
134
+ const { PutRecordsCommand } = await import('@aws-sdk/client-kinesis');
135
+ const result = await this.client.send(
136
+ new PutRecordsCommand({
137
+ StreamName: this.config.streamName,
138
+ Records: entries
139
+ })
140
+ );
141
+ const successful = [];
142
+ const failed = [];
143
+ if (result.Records) {
144
+ for (const r of result.Records) {
145
+ const record = r;
146
+ if (record.ErrorCode) {
147
+ failed.push({ errorCode: record.ErrorCode, errorMessage: record.ErrorMessage });
148
+ } else {
149
+ successful.push({ shardId: record.ShardId, sequenceNumber: record.SequenceNumber });
150
+ }
151
+ }
152
+ }
153
+ ctx.setAttribute("messaging.kinesis.successful_count", successful.length);
154
+ ctx.setAttribute("messaging.kinesis.failed_count", result.FailedRecordCount || 0);
155
+ if (result.FailedRecordCount && result.FailedRecordCount > 0) {
156
+ ctx.setStatus({
157
+ code: api.SpanStatusCode.ERROR,
158
+ message: `${result.FailedRecordCount} records failed`
159
+ });
160
+ } else {
161
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
162
+ }
163
+ return {
164
+ successful,
165
+ failed,
166
+ failedRecordCount: result.FailedRecordCount || 0
167
+ };
168
+ } catch (error) {
169
+ ctx.setStatus({
170
+ code: api.SpanStatusCode.ERROR,
171
+ message: error instanceof Error ? error.message : "Batch put failed"
172
+ });
173
+ throw error;
174
+ }
175
+ });
176
+ }
177
+ };
178
+ var KinesisConsumer = class {
179
+ client;
180
+ config;
181
+ constructor(client, config) {
182
+ this.client = chunkUZEJV2YD_cjs.wrapSDKClient(client, config.service);
183
+ this.config = {
184
+ extractTraceContext: true,
185
+ ...config
186
+ };
187
+ }
188
+ /**
189
+ * Extract trace context from record data
190
+ */
191
+ extractContext(data) {
192
+ if (!this.config.extractTraceContext || !data?._traceContext) {
193
+ return void 0;
194
+ }
195
+ const tc = data._traceContext;
196
+ const carrier = {};
197
+ if (tc.traceparent) carrier.traceparent = tc.traceparent;
198
+ if (tc.tracestate) carrier.tracestate = tc.tracestate;
199
+ if (tc.baggage) carrier.baggage = tc.baggage;
200
+ return Object.keys(carrier).length > 0 ? carrier : void 0;
201
+ }
202
+ /**
203
+ * Parse raw record data
204
+ */
205
+ parseRecord(record) {
206
+ const rawData = record.Data ? Buffer.from(record.Data).toString("utf8") : "";
207
+ let data;
208
+ try {
209
+ data = JSON.parse(rawData);
210
+ } catch {
211
+ data = rawData;
212
+ }
213
+ return {
214
+ sequenceNumber: record.SequenceNumber || "",
215
+ approximateArrivalTimestamp: record.ApproximateArrivalTimestamp,
216
+ data,
217
+ rawData,
218
+ partitionKey: record.PartitionKey || "",
219
+ encryptionType: record.EncryptionType,
220
+ raw: record
221
+ };
222
+ }
223
+ /**
224
+ * Get a shard iterator
225
+ *
226
+ * @param shardId - Shard ID
227
+ * @param type - Iterator type
228
+ * @param startingSequenceNumber - Starting sequence number (for AT_SEQUENCE_NUMBER, AFTER_SEQUENCE_NUMBER)
229
+ * @param timestamp - Starting timestamp (for AT_TIMESTAMP)
230
+ * @returns Shard iterator string
231
+ */
232
+ async getShardIterator(shardId, type, startingSequenceNumber, timestamp) {
233
+ return autotel.trace(`kinesis.getShardIterator`, async (ctx) => {
234
+ ctx.setAttributes(
235
+ chunkQ3DMMQ7K_cjs.buildKinesisAttributes({
236
+ streamName: this.config.streamName,
237
+ shardId,
238
+ operation: "get"
239
+ })
240
+ );
241
+ try {
242
+ const { GetShardIteratorCommand } = await import('@aws-sdk/client-kinesis');
243
+ const result = await this.client.send(
244
+ new GetShardIteratorCommand({
245
+ StreamName: this.config.streamName,
246
+ ShardId: shardId,
247
+ ShardIteratorType: type,
248
+ ...startingSequenceNumber && { StartingSequenceNumber: startingSequenceNumber },
249
+ ...timestamp && { Timestamp: timestamp }
250
+ })
251
+ );
252
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
253
+ return result.ShardIterator || "";
254
+ } catch (error) {
255
+ ctx.setStatus({
256
+ code: api.SpanStatusCode.ERROR,
257
+ message: error instanceof Error ? error.message : "GetShardIterator failed"
258
+ });
259
+ throw error;
260
+ }
261
+ });
262
+ }
263
+ /**
264
+ * Get records from a shard iterator
265
+ *
266
+ * @param shardIterator - Shard iterator
267
+ * @param limit - Maximum records to return (max 10000)
268
+ * @returns Records and next shard iterator
269
+ */
270
+ async getRecords(shardIterator, limit) {
271
+ return autotel.trace(`kinesis.get`, async (ctx) => {
272
+ ctx.setAttributes(
273
+ chunkQ3DMMQ7K_cjs.buildKinesisAttributes({
274
+ streamName: this.config.streamName,
275
+ operation: "get"
276
+ })
277
+ );
278
+ try {
279
+ const { GetRecordsCommand } = await import('@aws-sdk/client-kinesis');
280
+ const result = await this.client.send(
281
+ new GetRecordsCommand({
282
+ ShardIterator: shardIterator,
283
+ ...limit && { Limit: limit }
284
+ })
285
+ );
286
+ const records = (result.Records || []).map((r) => this.parseRecord(r));
287
+ ctx.setAttribute("messaging.batch.message_count", records.length);
288
+ if (result.MillisBehindLatest !== void 0) {
289
+ ctx.setAttribute("aws.kinesis.millis_behind_latest", result.MillisBehindLatest);
290
+ }
291
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
292
+ return {
293
+ records,
294
+ nextIterator: result.NextShardIterator,
295
+ millisBehindLatest: result.MillisBehindLatest
296
+ };
297
+ } catch (error) {
298
+ ctx.setStatus({
299
+ code: api.SpanStatusCode.ERROR,
300
+ message: error instanceof Error ? error.message : "GetRecords failed"
301
+ });
302
+ throw error;
303
+ }
304
+ });
305
+ }
306
+ /**
307
+ * Process records with automatic trace context extraction
308
+ *
309
+ * @param shardIterator - Shard iterator
310
+ * @param processor - Function to process each record
311
+ * @param limit - Maximum records to process
312
+ * @returns Next shard iterator and count of processed records
313
+ */
314
+ async processRecords(shardIterator, processor, limit) {
315
+ const { records, nextIterator } = await this.getRecords(shardIterator, limit);
316
+ let processedCount = 0;
317
+ for (const record of records) {
318
+ const carrier = this.extractContext(record.data);
319
+ const processRecord = async () => {
320
+ return autotel.trace(`kinesis.process`, async (ctx) => {
321
+ ctx.setAttributes(
322
+ chunkQ3DMMQ7K_cjs.buildKinesisAttributes({
323
+ streamName: this.config.streamName,
324
+ operation: "get"
325
+ })
326
+ );
327
+ ctx.setAttribute("aws.kinesis.sequence_number", record.sequenceNumber);
328
+ ctx.setAttribute("aws.kinesis.partition_key", record.partitionKey);
329
+ try {
330
+ await processor(record, ctx);
331
+ processedCount++;
332
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
333
+ } catch (error) {
334
+ ctx.setStatus({
335
+ code: api.SpanStatusCode.ERROR,
336
+ message: error instanceof Error ? error.message : "Processing failed"
337
+ });
338
+ throw error;
339
+ }
340
+ });
341
+ };
342
+ if (carrier) {
343
+ const extractedContext = api.propagation.extract(api.context.active(), carrier);
344
+ await api.context.with(extractedContext, processRecord);
345
+ } else {
346
+ await processRecord();
347
+ }
348
+ }
349
+ return { nextIterator, processedCount };
350
+ }
351
+ /**
352
+ * List shards for the stream
353
+ *
354
+ * @returns Array of shard IDs
355
+ */
356
+ async listShards() {
357
+ return autotel.trace(`kinesis.listShards`, async (ctx) => {
358
+ ctx.setAttributes(
359
+ chunkQ3DMMQ7K_cjs.buildKinesisAttributes({
360
+ streamName: this.config.streamName,
361
+ operation: "get"
362
+ })
363
+ );
364
+ try {
365
+ const { ListShardsCommand } = await import('@aws-sdk/client-kinesis');
366
+ const result = await this.client.send(
367
+ new ListShardsCommand({
368
+ StreamName: this.config.streamName
369
+ })
370
+ );
371
+ const shardIds = result.Shards?.map((s) => s.ShardId || "") || [];
372
+ ctx.setAttribute("aws.kinesis.shard_count", shardIds.length);
373
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
374
+ return shardIds;
375
+ } catch (error) {
376
+ ctx.setStatus({
377
+ code: api.SpanStatusCode.ERROR,
378
+ message: error instanceof Error ? error.message : "ListShards failed"
379
+ });
380
+ throw error;
381
+ }
382
+ });
383
+ }
384
+ };
385
+
386
+ exports.KinesisConsumer = KinesisConsumer;
387
+ exports.KinesisProducer = KinesisProducer;
388
+ exports.traceKinesis = traceKinesis;
389
+ //# sourceMappingURL=chunk-HMTKKKKP.cjs.map
390
+ //# sourceMappingURL=chunk-HMTKKKKP.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/kinesis/index.ts"],"names":["trace","buildKinesisAttributes","wrapSDKClient","propagation","context","SpanStatusCode"],"mappings":"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","file":"chunk-HMTKKKKP.cjs","sourcesContent":["/**\n * Kinesis-specific instrumentation\n *\n * Provides semantic helpers for tracing Kinesis Data Streams operations with proper\n * OpenTelemetry messaging semantic conventions.\n *\n * @example Put record to stream\n * ```typescript\n * import { traceKinesis } from 'autotel-aws/kinesis';\n * import { KinesisClient, PutRecordCommand } from '@aws-sdk/client-kinesis';\n *\n * const kinesis = new KinesisClient({});\n *\n * export const putRecord = traceKinesis({\n * operation: 'put',\n * streamName: 'my-stream'\n * })(ctx => async (data: object, partitionKey: string) => {\n * const result = await kinesis.send(new PutRecordCommand({\n * StreamName: 'my-stream',\n * Data: Buffer.from(JSON.stringify(data)),\n * PartitionKey: partitionKey\n * }));\n *\n * ctx.setAttribute('aws.kinesis.shard_id', result.ShardId ?? '');\n * ctx.setAttribute('aws.kinesis.sequence_number', result.SequenceNumber ?? '');\n *\n * return result;\n * });\n *\n * // Usage: await putRecord({ event: 'click' }, 'user-123');\n * ```\n *\n * @example Get records from shard\n * ```typescript\n * export const getRecords = traceKinesis({\n * operation: 'get',\n * streamName: 'my-stream'\n * })(ctx => async (shardIterator: string, limit: number) => {\n * const result = await kinesis.send(new GetRecordsCommand({\n * ShardIterator: shardIterator,\n * Limit: limit\n * }));\n *\n * ctx.setAttribute('messaging.batch.message_count', result.Records?.length ?? 0);\n * return result;\n * });\n * ```\n */\n\nimport { trace, type TraceContext } from 'autotel';\nimport { context, propagation, SpanStatusCode } from '@opentelemetry/api';\nimport { buildKinesisAttributes } from '../attributes';\nimport { wrapSDKClient } from '../common/sdk-wrapper';\n\n/**\n * Kinesis operation configuration\n */\nexport interface TraceKinesisConfig {\n /**\n * Kinesis operation type\n * - 'put' - PutRecord, PutRecords\n * - 'get' - GetRecords, GetShardIterator\n */\n operation: 'put' | 'get';\n\n /**\n * Kinesis stream name\n * Sets `messaging.destination.name` attribute.\n */\n streamName: string;\n\n /**\n * Shard ID (if known at configuration time)\n * Sets `aws.kinesis.shard_id` attribute.\n */\n shardId?: string;\n}\n\n/**\n * Trace Kinesis operations with semantic attributes\n *\n * Creates a traced function that automatically sets Kinesis messaging semantic attributes\n * following OpenTelemetry conventions.\n *\n * @param config - Kinesis operation configuration\n * @returns A higher-order function that wraps your Kinesis operation with tracing\n *\n * @remarks\n * Semantic attributes set automatically:\n * - `messaging.system` - 'aws_kinesis'\n * - `messaging.destination.name` - Stream name\n * - `messaging.operation` - 'put' or 'get'\n * - `aws.kinesis.shard_id` - Shard ID (if provided)\n *\n * Additional attributes you should set in your handler:\n * - `aws.kinesis.sequence_number` - Record sequence number\n * - `messaging.batch.message_count` - Number of records in batch\n *\n * @see https://opentelemetry.io/docs/specs/semconv/messaging/aws-kinesis/\n */\nexport function traceKinesis(config: TraceKinesisConfig) {\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 `kinesis.${config.operation}`,\n (ctx: TraceContext) =>\n async (...args: TArgs): Promise<TReturn> => {\n // Set Kinesis semantic attributes\n ctx.setAttributes(\n buildKinesisAttributes({\n streamName: config.streamName,\n shardId: config.shardId,\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// Kinesis Producer - Puts records with automatic trace context injection\n// ============================================================================\n\n/**\n * Configuration for Kinesis Producer\n */\nexport interface KinesisProducerConfig {\n /**\n * Kinesis stream name or ARN\n */\n streamName: string;\n\n /**\n * Inject W3C Trace Context into record data\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 * Record to put via Kinesis Producer\n */\nexport interface KinesisRecord {\n /**\n * Record data (will be serialized to JSON if object)\n */\n data: string | object;\n\n /**\n * Partition key for sharding\n */\n partitionKey: string;\n\n /**\n * Optional explicit hash key\n */\n explicitHashKey?: string;\n\n /**\n * Optional sequence number for ordering\n */\n sequenceNumberForOrdering?: string;\n}\n\n/**\n * Kinesis Producer with automatic trace context injection\n *\n * Wraps a Kinesis client to automatically:\n * - Create spans for put operations\n * - Inject W3C Trace Context into record data\n * - Set proper semantic attributes\n *\n * @example Basic usage\n * ```typescript\n * import { KinesisProducer } from 'autotel-aws/kinesis';\n * import { KinesisClient } from '@aws-sdk/client-kinesis';\n *\n * const kinesis = new KinesisClient({ region: 'us-east-1' });\n * const producer = new KinesisProducer(kinesis, {\n * streamName: 'my-stream'\n * });\n *\n * // Put with automatic trace context\n * const result = await producer.putRecord({\n * data: { event: 'click', userId: '123' },\n * partitionKey: 'user-123'\n * });\n * console.log('Sequence:', result.sequenceNumber);\n * ```\n *\n * @example Batch put\n * ```typescript\n * const results = await producer.putRecords([\n * { data: { event: 'click' }, partitionKey: 'user-1' },\n * { data: { event: 'view' }, partitionKey: 'user-2' },\n * { data: { event: 'scroll' }, partitionKey: 'user-3' }\n * ]);\n * console.log(`Put ${results.successful.length} records`);\n * ```\n */\nexport class KinesisProducer<\n \n TClient extends { send: (command: any) => Promise<any> } = any,\n> {\n private client: TClient;\n private config: Required<Pick<KinesisProducerConfig, 'streamName'>> & KinesisProducerConfig;\n\n constructor(client: TClient, config: KinesisProducerConfig) {\n this.client = wrapSDKClient(client as any, config.service) as TClient;\n this.config = {\n injectTraceContext: true,\n ...config,\n };\n }\n\n /**\n * Inject trace context into record data\n */\n private injectContext(data: string | object): Buffer {\n let payload: object;\n\n if (typeof data === 'string') {\n try {\n payload = JSON.parse(data);\n } catch {\n // If not valid JSON, wrap in object\n payload = { _data: data };\n }\n } else {\n payload = data;\n }\n\n if (this.config.injectTraceContext) {\n const carrier: Record<string, string> = {};\n propagation.inject(context.active(), carrier);\n\n if (carrier.traceparent) {\n payload = {\n ...payload,\n _traceContext: {\n traceparent: carrier.traceparent,\n tracestate: carrier.tracestate,\n baggage: carrier.baggage,\n },\n };\n }\n }\n\n return Buffer.from(JSON.stringify(payload));\n }\n\n /**\n * Put a single record to the stream\n *\n * @param record - Record to put\n * @returns Promise with shard ID and sequence number\n */\n async putRecord(record: KinesisRecord): Promise<{\n shardId?: string;\n sequenceNumber?: string;\n encryptionType?: string;\n }> {\n return trace(`kinesis.put`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildKinesisAttributes({\n streamName: this.config.streamName,\n operation: 'put',\n }),\n );\n\n const input = {\n StreamName: this.config.streamName,\n Data: this.injectContext(record.data),\n PartitionKey: record.partitionKey,\n ...(record.explicitHashKey && { ExplicitHashKey: record.explicitHashKey }),\n ...(record.sequenceNumberForOrdering && {\n SequenceNumberForOrdering: record.sequenceNumberForOrdering,\n }),\n };\n\n try {\n const { PutRecordCommand } = await import('@aws-sdk/client-kinesis');\n const result = await this.client.send(new PutRecordCommand(input));\n\n if (result.ShardId) {\n ctx.setAttribute('aws.kinesis.shard_id', result.ShardId);\n }\n if (result.SequenceNumber) {\n ctx.setAttribute('aws.kinesis.sequence_number', result.SequenceNumber);\n }\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return {\n shardId: result.ShardId,\n sequenceNumber: result.SequenceNumber,\n encryptionType: result.EncryptionType,\n };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Put failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Put multiple records in a batch\n *\n * @param records - Array of records to put (max 500)\n * @returns Promise with successful and failed record results\n */\n async putRecords(records: KinesisRecord[]): Promise<{\n successful: Array<{ shardId?: string; sequenceNumber?: string }>;\n failed: Array<{ errorCode?: string; errorMessage?: string }>;\n failedRecordCount: number;\n }> {\n return trace(`kinesis.putBatch`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildKinesisAttributes({\n streamName: this.config.streamName,\n operation: 'put',\n }),\n );\n ctx.setAttribute('messaging.batch.message_count', records.length);\n\n const entries = records.map((record) => ({\n Data: this.injectContext(record.data),\n PartitionKey: record.partitionKey,\n ...(record.explicitHashKey && { ExplicitHashKey: record.explicitHashKey }),\n }));\n\n try {\n const { PutRecordsCommand } = await import('@aws-sdk/client-kinesis');\n const result = await this.client.send(\n new PutRecordsCommand({\n StreamName: this.config.streamName,\n Records: entries,\n }),\n );\n\n const successful: Array<{ shardId?: string; sequenceNumber?: string }> = [];\n const failed: Array<{ errorCode?: string; errorMessage?: string }> = [];\n\n if (result.Records) {\n for (const r of result.Records) {\n const record = r as { ShardId?: string; SequenceNumber?: string; ErrorCode?: string; ErrorMessage?: string };\n if (record.ErrorCode) {\n failed.push({ errorCode: record.ErrorCode, errorMessage: record.ErrorMessage });\n } else {\n successful.push({ shardId: record.ShardId, sequenceNumber: record.SequenceNumber });\n }\n }\n }\n\n ctx.setAttribute('messaging.kinesis.successful_count', successful.length);\n ctx.setAttribute('messaging.kinesis.failed_count', result.FailedRecordCount || 0);\n\n if (result.FailedRecordCount && result.FailedRecordCount > 0) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: `${result.FailedRecordCount} records failed`,\n });\n } else {\n ctx.setStatus({ code: SpanStatusCode.OK });\n }\n\n return {\n successful,\n failed,\n failedRecordCount: result.FailedRecordCount || 0,\n };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Batch put failed',\n });\n throw error;\n }\n });\n }\n}\n\n// ============================================================================\n// Kinesis Consumer - Gets records with trace context extraction\n// ============================================================================\n\n/**\n * Configuration for Kinesis Consumer\n */\nexport interface KinesisConsumerConfig {\n /**\n * Kinesis stream name or ARN\n */\n streamName: string;\n\n /**\n * Extract W3C Trace Context from record data\n * Creates child spans linked to the producer\n * @default true\n */\n extractTraceContext?: boolean;\n\n /**\n * Optional service name for tracing\n */\n service?: string;\n}\n\n/**\n * Received Kinesis record with parsed data\n */\nexport interface ReceivedKinesisRecord {\n /**\n * Sequence number\n */\n sequenceNumber: string;\n\n /**\n * Approximate arrival timestamp\n */\n approximateArrivalTimestamp?: Date;\n\n /**\n * Parsed data (JSON parsed if possible)\n */\n \n data: any;\n\n /**\n * Raw data as string\n */\n rawData: string;\n\n /**\n * Partition key\n */\n partitionKey: string;\n\n /**\n * Encryption type\n */\n encryptionType?: string;\n\n /**\n * Original AWS SDK record object\n */\n \n raw: any;\n}\n\n/**\n * Record processor function type\n */\nexport type KinesisRecordProcessor = (\n record: ReceivedKinesisRecord,\n ctx: TraceContext,\n) => Promise<void>;\n\n/**\n * Kinesis Consumer with automatic trace context extraction\n *\n * Wraps a Kinesis client to automatically:\n * - Create spans for get operations\n * - Extract W3C Trace Context from record data\n * - Link consumer spans to producer spans\n *\n * @example Basic usage\n * ```typescript\n * import { KinesisConsumer } from 'autotel-aws/kinesis';\n * import { KinesisClient } from '@aws-sdk/client-kinesis';\n *\n * const kinesis = new KinesisClient({ region: 'us-east-1' });\n * const consumer = new KinesisConsumer(kinesis, {\n * streamName: 'my-stream'\n * });\n *\n * // Get shard iterator first\n * const iterator = await consumer.getShardIterator('shardId-000000000000', 'LATEST');\n *\n * // Process records with automatic tracing\n * const { nextIterator, records } = await consumer.getRecords(iterator, 100);\n *\n * for (const record of records) {\n * console.log('Record:', record.data);\n * }\n * ```\n *\n * @example With processor function\n * ```typescript\n * await consumer.processRecords(iterator, async (record, ctx) => {\n * ctx.setAttribute('event.type', record.data.event);\n * await handleEvent(record.data);\n * });\n * ```\n */\nexport class KinesisConsumer<\n \n TClient extends { send: (command: any) => Promise<any> } = any,\n> {\n private client: TClient;\n private config: Required<Pick<KinesisConsumerConfig, 'streamName'>> & KinesisConsumerConfig;\n\n constructor(client: TClient, config: KinesisConsumerConfig) {\n this.client = wrapSDKClient(client as any, config.service) as TClient;\n this.config = {\n extractTraceContext: true,\n ...config,\n };\n }\n\n /**\n * Extract trace context from record data\n */\n \n private extractContext(data: any): Record<string, string> | undefined {\n if (!this.config.extractTraceContext || !data?._traceContext) {\n return undefined;\n }\n\n const tc = data._traceContext;\n const carrier: Record<string, string> = {};\n\n if (tc.traceparent) carrier.traceparent = tc.traceparent;\n if (tc.tracestate) carrier.tracestate = tc.tracestate;\n if (tc.baggage) carrier.baggage = tc.baggage;\n\n return Object.keys(carrier).length > 0 ? carrier : undefined;\n }\n\n /**\n * Parse raw record data\n */\n \n private parseRecord(record: any): ReceivedKinesisRecord {\n const rawData = record.Data ? Buffer.from(record.Data).toString('utf8') : '';\n \n let data: any;\n\n try {\n data = JSON.parse(rawData);\n } catch {\n data = rawData;\n }\n\n return {\n sequenceNumber: record.SequenceNumber || '',\n approximateArrivalTimestamp: record.ApproximateArrivalTimestamp,\n data,\n rawData,\n partitionKey: record.PartitionKey || '',\n encryptionType: record.EncryptionType,\n raw: record,\n };\n }\n\n /**\n * Get a shard iterator\n *\n * @param shardId - Shard ID\n * @param type - Iterator type\n * @param startingSequenceNumber - Starting sequence number (for AT_SEQUENCE_NUMBER, AFTER_SEQUENCE_NUMBER)\n * @param timestamp - Starting timestamp (for AT_TIMESTAMP)\n * @returns Shard iterator string\n */\n async getShardIterator(\n shardId: string,\n type: 'AT_SEQUENCE_NUMBER' | 'AFTER_SEQUENCE_NUMBER' | 'TRIM_HORIZON' | 'LATEST' | 'AT_TIMESTAMP',\n startingSequenceNumber?: string,\n timestamp?: Date,\n ): Promise<string> {\n return trace(`kinesis.getShardIterator`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildKinesisAttributes({\n streamName: this.config.streamName,\n shardId,\n operation: 'get',\n }),\n );\n\n try {\n const { GetShardIteratorCommand } = await import('@aws-sdk/client-kinesis');\n const result = await this.client.send(\n new GetShardIteratorCommand({\n StreamName: this.config.streamName,\n ShardId: shardId,\n ShardIteratorType: type,\n ...(startingSequenceNumber && { StartingSequenceNumber: startingSequenceNumber }),\n ...(timestamp && { Timestamp: timestamp }),\n }),\n );\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n return result.ShardIterator || '';\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'GetShardIterator failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Get records from a shard iterator\n *\n * @param shardIterator - Shard iterator\n * @param limit - Maximum records to return (max 10000)\n * @returns Records and next shard iterator\n */\n async getRecords(\n shardIterator: string,\n limit?: number,\n ): Promise<{\n records: ReceivedKinesisRecord[];\n nextIterator?: string;\n millisBehindLatest?: number;\n }> {\n return trace(`kinesis.get`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildKinesisAttributes({\n streamName: this.config.streamName,\n operation: 'get',\n }),\n );\n\n try {\n const { GetRecordsCommand } = await import('@aws-sdk/client-kinesis');\n const result = await this.client.send(\n new GetRecordsCommand({\n ShardIterator: shardIterator,\n ...(limit && { Limit: limit }),\n }),\n );\n\n \n const records = (result.Records || []).map((r: any) => this.parseRecord(r));\n ctx.setAttribute('messaging.batch.message_count', records.length);\n\n if (result.MillisBehindLatest !== undefined) {\n ctx.setAttribute('aws.kinesis.millis_behind_latest', result.MillisBehindLatest);\n }\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return {\n records,\n nextIterator: result.NextShardIterator,\n millisBehindLatest: result.MillisBehindLatest,\n };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'GetRecords failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Process records with automatic trace context extraction\n *\n * @param shardIterator - Shard iterator\n * @param processor - Function to process each record\n * @param limit - Maximum records to process\n * @returns Next shard iterator and count of processed records\n */\n async processRecords(\n shardIterator: string,\n processor: KinesisRecordProcessor,\n limit?: number,\n ): Promise<{ nextIterator?: string; processedCount: number }> {\n const { records, nextIterator } = await this.getRecords(shardIterator, limit);\n let processedCount = 0;\n\n for (const record of records) {\n // Extract trace context from record data\n const carrier = this.extractContext(record.data);\n\n // Create processing span, optionally linked to producer\n const processRecord = async () => {\n return trace(`kinesis.process`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildKinesisAttributes({\n streamName: this.config.streamName,\n operation: 'get',\n }),\n );\n ctx.setAttribute('aws.kinesis.sequence_number', record.sequenceNumber);\n ctx.setAttribute('aws.kinesis.partition_key', record.partitionKey);\n\n try {\n await processor(record, ctx);\n processedCount++;\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, processRecord);\n } else {\n await processRecord();\n }\n }\n\n return { nextIterator, processedCount };\n }\n\n /**\n * List shards for the stream\n *\n * @returns Array of shard IDs\n */\n async listShards(): Promise<string[]> {\n return trace(`kinesis.listShards`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildKinesisAttributes({\n streamName: this.config.streamName,\n operation: 'get',\n }),\n );\n\n try {\n const { ListShardsCommand } = await import('@aws-sdk/client-kinesis');\n const result = await this.client.send(\n new ListShardsCommand({\n StreamName: this.config.streamName,\n }),\n );\n\n const shardIds = result.Shards?.map((s: { ShardId?: string }) => s.ShardId || '') || [];\n ctx.setAttribute('aws.kinesis.shard_count', shardIds.length);\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return shardIds;\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'ListShards failed',\n });\n throw error;\n }\n });\n }\n}\n"]}
@@ -0,0 +1,153 @@
1
+ // src/attributes.ts
2
+ var AWS_ATTRS = {
3
+ // Lambda
4
+ LAMBDA_FUNCTION_NAME: "faas.name",
5
+ LAMBDA_FUNCTION_VERSION: "faas.version",
6
+ LAMBDA_INVOCATION_ID: "faas.invocation_id",
7
+ LAMBDA_COLD_START: "faas.coldstart",
8
+ LAMBDA_TRIGGER: "faas.trigger",
9
+ // AWS SDK
10
+ AWS_SERVICE: "rpc.service",
11
+ AWS_OPERATION: "rpc.method",
12
+ AWS_REQUEST_ID: "aws.request_id",
13
+ AWS_EXTENDED_REQUEST_ID: "aws.extended_request_id",
14
+ AWS_CF_ID: "aws.cf_id",
15
+ // DynamoDB
16
+ DDB_TABLE_NAMES: "aws.dynamodb.table_names",
17
+ DDB_CONSUMED_CAPACITY: "aws.dynamodb.consumed_capacity",
18
+ // S3
19
+ S3_BUCKET: "aws.s3.bucket",
20
+ S3_KEY: "aws.s3.key",
21
+ S3_COPY_SOURCE: "aws.s3.copy_source",
22
+ // SQS
23
+ SQS_QUEUE_NAME: "messaging.destination.name",
24
+ SQS_QUEUE_URL: "aws.sqs.queue_url",
25
+ SQS_MESSAGE_ID: "messaging.message.id",
26
+ // SNS
27
+ SNS_TOPIC_ARN: "messaging.destination.name",
28
+ SNS_MESSAGE_ID: "messaging.message.id",
29
+ // Kinesis
30
+ KINESIS_STREAM_NAME: "messaging.destination.name",
31
+ KINESIS_SHARD_ID: "aws.kinesis.shard_id",
32
+ // Step Functions
33
+ SFN_STATE_MACHINE_ARN: "aws.stepfunctions.state_machine_arn",
34
+ SFN_EXECUTION_ARN: "aws.stepfunctions.execution_arn",
35
+ SFN_ACTIVITY_ARN: "aws.stepfunctions.activity_arn",
36
+ // EventBridge
37
+ EVENTBRIDGE_EVENT_BUS: "aws.eventbridge.event_bus",
38
+ EVENTBRIDGE_SOURCE: "aws.eventbridge.source",
39
+ EVENTBRIDGE_DETAIL_TYPE: "aws.eventbridge.detail_type",
40
+ // X-Ray
41
+ XRAY_ANNOTATIONS: "aws.xray.annotations"
42
+ };
43
+ function buildLambdaAttributes(context) {
44
+ return {
45
+ [AWS_ATTRS.LAMBDA_FUNCTION_NAME]: context.functionName,
46
+ [AWS_ATTRS.LAMBDA_FUNCTION_VERSION]: context.functionVersion,
47
+ [AWS_ATTRS.LAMBDA_INVOCATION_ID]: context.awsRequestId,
48
+ "cloud.provider": "aws",
49
+ "cloud.region": process.env.AWS_REGION || "",
50
+ ...context.coldStart !== void 0 && {
51
+ [AWS_ATTRS.LAMBDA_COLD_START]: context.coldStart
52
+ },
53
+ ...context.trigger && {
54
+ [AWS_ATTRS.LAMBDA_TRIGGER]: context.trigger
55
+ }
56
+ };
57
+ }
58
+ function buildSDKAttributes(metadata) {
59
+ return {
60
+ "rpc.system": "aws-api",
61
+ [AWS_ATTRS.AWS_SERVICE]: metadata.service,
62
+ [AWS_ATTRS.AWS_OPERATION]: metadata.operation,
63
+ ...metadata.requestId && {
64
+ [AWS_ATTRS.AWS_REQUEST_ID]: metadata.requestId
65
+ },
66
+ ...metadata.httpStatusCode && {
67
+ "http.status_code": metadata.httpStatusCode
68
+ },
69
+ ...metadata.extendedRequestId && {
70
+ [AWS_ATTRS.AWS_EXTENDED_REQUEST_ID]: metadata.extendedRequestId
71
+ },
72
+ ...metadata.cfId && {
73
+ [AWS_ATTRS.AWS_CF_ID]: metadata.cfId
74
+ }
75
+ };
76
+ }
77
+ function buildDynamoDBAttributes(operation) {
78
+ return {
79
+ "db.system": "dynamodb",
80
+ "db.operation": operation.operation,
81
+ "db.name": operation.tableName,
82
+ [AWS_ATTRS.DDB_TABLE_NAMES]: [operation.tableName],
83
+ ...operation.consumedCapacity !== void 0 && {
84
+ [AWS_ATTRS.DDB_CONSUMED_CAPACITY]: operation.consumedCapacity
85
+ }
86
+ };
87
+ }
88
+ function buildS3Attributes(operation) {
89
+ return {
90
+ [AWS_ATTRS.S3_BUCKET]: operation.bucket,
91
+ ...operation.key && {
92
+ [AWS_ATTRS.S3_KEY]: operation.key
93
+ },
94
+ ...operation.copySource && {
95
+ [AWS_ATTRS.S3_COPY_SOURCE]: operation.copySource
96
+ }
97
+ };
98
+ }
99
+ function buildSQSAttributes(operation) {
100
+ return {
101
+ "messaging.system": "aws_sqs",
102
+ [AWS_ATTRS.SQS_QUEUE_NAME]: operation.queueName,
103
+ "messaging.operation": operation.operation,
104
+ ...operation.queueUrl && {
105
+ [AWS_ATTRS.SQS_QUEUE_URL]: operation.queueUrl
106
+ },
107
+ ...operation.messageId && {
108
+ [AWS_ATTRS.SQS_MESSAGE_ID]: operation.messageId
109
+ }
110
+ };
111
+ }
112
+ function buildSNSAttributes(operation) {
113
+ return {
114
+ "messaging.system": "aws_sns",
115
+ [AWS_ATTRS.SNS_TOPIC_ARN]: operation.topicArn,
116
+ "messaging.operation": "publish",
117
+ ...operation.messageId && {
118
+ [AWS_ATTRS.SNS_MESSAGE_ID]: operation.messageId
119
+ }
120
+ };
121
+ }
122
+ function buildKinesisAttributes(operation) {
123
+ return {
124
+ "messaging.system": "aws_kinesis",
125
+ [AWS_ATTRS.KINESIS_STREAM_NAME]: operation.streamName,
126
+ "messaging.operation": operation.operation,
127
+ ...operation.shardId && {
128
+ [AWS_ATTRS.KINESIS_SHARD_ID]: operation.shardId
129
+ }
130
+ };
131
+ }
132
+ function buildStepFunctionsAttributes(operation) {
133
+ return {
134
+ [AWS_ATTRS.SFN_STATE_MACHINE_ARN]: operation.stateMachineArn,
135
+ ...operation.executionArn && {
136
+ [AWS_ATTRS.SFN_EXECUTION_ARN]: operation.executionArn
137
+ },
138
+ ...operation.activityArn && {
139
+ [AWS_ATTRS.SFN_ACTIVITY_ARN]: operation.activityArn
140
+ }
141
+ };
142
+ }
143
+ function buildEventBridgeAttributes(operation) {
144
+ return {
145
+ [AWS_ATTRS.EVENTBRIDGE_EVENT_BUS]: operation.eventBus,
146
+ [AWS_ATTRS.EVENTBRIDGE_SOURCE]: operation.source,
147
+ [AWS_ATTRS.EVENTBRIDGE_DETAIL_TYPE]: operation.detailType
148
+ };
149
+ }
150
+
151
+ export { AWS_ATTRS, buildDynamoDBAttributes, buildEventBridgeAttributes, buildKinesisAttributes, buildLambdaAttributes, buildS3Attributes, buildSDKAttributes, buildSNSAttributes, buildSQSAttributes, buildStepFunctionsAttributes };
152
+ //# sourceMappingURL=chunk-I4CKQ4RD.js.map
153
+ //# sourceMappingURL=chunk-I4CKQ4RD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/attributes.ts"],"names":[],"mappings":"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","file":"chunk-I4CKQ4RD.js","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"]}
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
5
+ }) : x)(function(x) {
6
+ if (typeof require !== "undefined") return require.apply(this, arguments);
7
+ throw Error('Dynamic require of "' + x + '" is not supported');
8
+ });
9
+
10
+ exports.__require = __require;
11
+ //# sourceMappingURL=chunk-JEQ2X3Z6.cjs.map
12
+ //# sourceMappingURL=chunk-JEQ2X3Z6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-JEQ2X3Z6.cjs"}