autotel-aws 0.13.23 → 1.0.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 (151) hide show
  1. package/README.md +82 -49
  2. package/dist/attributes.d.cts.map +1 -1
  3. package/dist/attributes.d.ts.map +1 -1
  4. package/dist/cloudwatch.cjs.map +1 -1
  5. package/dist/cloudwatch.d.cts +3 -10
  6. package/dist/cloudwatch.d.cts.map +1 -1
  7. package/dist/cloudwatch.d.ts +3 -10
  8. package/dist/cloudwatch.d.ts.map +1 -1
  9. package/dist/cloudwatch.js.map +1 -1
  10. package/dist/{config-SPkMWWXY.d.cts → config-C8OEKXuM.d.cts} +2 -3
  11. package/dist/config-C8OEKXuM.d.cts.map +1 -0
  12. package/dist/{config-D8QZwF1e.d.ts → config-CgKqoeWF.d.ts} +2 -3
  13. package/dist/config-CgKqoeWF.d.ts.map +1 -0
  14. package/dist/dynamodb.cjs +1 -1
  15. package/dist/dynamodb.cjs.map +1 -1
  16. package/dist/dynamodb.d.cts +0 -1
  17. package/dist/dynamodb.d.cts.map +1 -1
  18. package/dist/dynamodb.d.ts +0 -1
  19. package/dist/dynamodb.d.ts.map +1 -1
  20. package/dist/dynamodb.js +2 -2
  21. package/dist/dynamodb.js.map +1 -1
  22. package/dist/eventbridge.cjs +11 -8
  23. package/dist/eventbridge.cjs.map +1 -1
  24. package/dist/eventbridge.d.cts +0 -1
  25. package/dist/eventbridge.d.cts.map +1 -1
  26. package/dist/eventbridge.d.ts +0 -1
  27. package/dist/eventbridge.d.ts.map +1 -1
  28. package/dist/eventbridge.js +12 -9
  29. package/dist/eventbridge.js.map +1 -1
  30. package/dist/index.cjs +3 -3
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +6 -7
  33. package/dist/index.d.cts.map +1 -1
  34. package/dist/index.d.ts +6 -7
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3 -3
  37. package/dist/index.js.map +1 -1
  38. package/dist/kinesis.cjs +20 -14
  39. package/dist/kinesis.cjs.map +1 -1
  40. package/dist/kinesis.d.cts +0 -1
  41. package/dist/kinesis.d.cts.map +1 -1
  42. package/dist/kinesis.d.ts +0 -1
  43. package/dist/kinesis.d.ts.map +1 -1
  44. package/dist/kinesis.js +21 -15
  45. package/dist/kinesis.js.map +1 -1
  46. package/dist/{lambda-DYyKH-f-.js → lambda-CWmhbRd9.js} +8 -6
  47. package/dist/lambda-CWmhbRd9.js.map +1 -0
  48. package/dist/{lambda-B0LQa5vS.d.ts → lambda-CXNd2ROd.d.ts} +4 -5
  49. package/dist/lambda-CXNd2ROd.d.ts.map +1 -0
  50. package/dist/{lambda-DR33vPpL.cjs → lambda-DK-DzkBl.cjs} +7 -5
  51. package/dist/lambda-DK-DzkBl.cjs.map +1 -0
  52. package/dist/{lambda-DnroO4Od.d.cts → lambda-DPC2DRGt.d.cts} +4 -5
  53. package/dist/lambda-DPC2DRGt.d.cts.map +1 -0
  54. package/dist/lambda-auto.cjs.map +1 -1
  55. package/dist/lambda-auto.d.cts +1 -1
  56. package/dist/lambda-auto.d.ts +1 -1
  57. package/dist/lambda-auto.js.map +1 -1
  58. package/dist/lambda.cjs +1 -1
  59. package/dist/lambda.d.cts +2 -2
  60. package/dist/lambda.d.ts +2 -2
  61. package/dist/lambda.js +1 -1
  62. package/dist/s3.cjs +1 -1
  63. package/dist/s3.cjs.map +1 -1
  64. package/dist/s3.d.cts +0 -1
  65. package/dist/s3.d.cts.map +1 -1
  66. package/dist/s3.d.ts +0 -1
  67. package/dist/s3.d.ts.map +1 -1
  68. package/dist/s3.js +2 -2
  69. package/dist/s3.js.map +1 -1
  70. package/dist/{sdk-C4EzYQRq.js → sdk-D4F7xO0z.js} +2 -2
  71. package/dist/sdk-D4F7xO0z.js.map +1 -0
  72. package/dist/{sdk-C9Nvlh7R.cjs → sdk-DSR-sc_U.cjs} +2 -2
  73. package/dist/sdk-DSR-sc_U.cjs.map +1 -0
  74. package/dist/{sdk-CXqc4o_q.d.ts → sdk-LLi1nfe8.d.ts} +2 -3
  75. package/dist/sdk-LLi1nfe8.d.ts.map +1 -0
  76. package/dist/{sdk-DkAItj4z.d.cts → sdk-gE9gYtr1.d.cts} +2 -3
  77. package/dist/sdk-gE9gYtr1.d.cts.map +1 -0
  78. package/dist/{sdk-wrapper-BVr62EfA.js → sdk-wrapper-DRaXT38d.js} +5 -4
  79. package/dist/sdk-wrapper-DRaXT38d.js.map +1 -0
  80. package/dist/{sdk-wrapper-BDrcyEQ_.cjs → sdk-wrapper-zrvetysi.cjs} +4 -3
  81. package/dist/sdk-wrapper-zrvetysi.cjs.map +1 -0
  82. package/dist/sdk.cjs +1 -1
  83. package/dist/sdk.d.cts +2 -2
  84. package/dist/sdk.d.ts +2 -2
  85. package/dist/sdk.js +1 -1
  86. package/dist/sns.cjs +11 -8
  87. package/dist/sns.cjs.map +1 -1
  88. package/dist/sns.d.cts +0 -1
  89. package/dist/sns.d.cts.map +1 -1
  90. package/dist/sns.d.ts +0 -1
  91. package/dist/sns.d.ts.map +1 -1
  92. package/dist/sns.js +12 -9
  93. package/dist/sns.js.map +1 -1
  94. package/dist/sqs.cjs +14 -10
  95. package/dist/sqs.cjs.map +1 -1
  96. package/dist/sqs.d.cts +0 -1
  97. package/dist/sqs.d.cts.map +1 -1
  98. package/dist/sqs.d.ts +0 -1
  99. package/dist/sqs.d.ts.map +1 -1
  100. package/dist/sqs.js +15 -11
  101. package/dist/sqs.js.map +1 -1
  102. package/dist/step-functions.cjs +23 -16
  103. package/dist/step-functions.cjs.map +1 -1
  104. package/dist/step-functions.d.cts +0 -1
  105. package/dist/step-functions.d.cts.map +1 -1
  106. package/dist/step-functions.d.ts +0 -1
  107. package/dist/step-functions.d.ts.map +1 -1
  108. package/dist/step-functions.js +24 -17
  109. package/dist/step-functions.js.map +1 -1
  110. package/dist/testing.cjs.map +1 -1
  111. package/dist/testing.d.cts +2 -3
  112. package/dist/testing.d.cts.map +1 -1
  113. package/dist/testing.d.ts +2 -3
  114. package/dist/testing.d.ts.map +1 -1
  115. package/dist/testing.js.map +1 -1
  116. package/dist/{types-0uHbJsBN.d.ts → types-C5jWGenE.d.ts} +2 -3
  117. package/dist/types-C5jWGenE.d.ts.map +1 -0
  118. package/dist/{types-DOUDks8I.d.ts → types-CbwDqBuz.d.cts} +1 -2
  119. package/dist/types-CbwDqBuz.d.cts.map +1 -0
  120. package/dist/{types-DOUDks8I.d.cts → types-CbwDqBuz.d.ts} +1 -2
  121. package/dist/types-CbwDqBuz.d.ts.map +1 -0
  122. package/dist/{types-iyHj03Q1.d.cts → types-JruDtTwP.d.cts} +2 -3
  123. package/dist/types-JruDtTwP.d.cts.map +1 -0
  124. package/dist/xray-B46i6z6K.js.map +1 -1
  125. package/dist/{xray-DDcKCKKo.d.cts → xray-Bt9kxkPL.d.cts} +2 -3
  126. package/dist/xray-Bt9kxkPL.d.cts.map +1 -0
  127. package/dist/xray-Cd2UiVRA.cjs.map +1 -1
  128. package/dist/{xray-CG4jciQs.d.ts → xray-DGuAh372.d.ts} +2 -3
  129. package/dist/xray-DGuAh372.d.ts.map +1 -0
  130. package/dist/xray.d.cts +2 -2
  131. package/dist/xray.d.ts +2 -2
  132. package/package.json +30 -30
  133. package/skills/autotel-aws/SKILL.md +28 -21
  134. package/dist/config-D8QZwF1e.d.ts.map +0 -1
  135. package/dist/config-SPkMWWXY.d.cts.map +0 -1
  136. package/dist/lambda-B0LQa5vS.d.ts.map +0 -1
  137. package/dist/lambda-DR33vPpL.cjs.map +0 -1
  138. package/dist/lambda-DYyKH-f-.js.map +0 -1
  139. package/dist/lambda-DnroO4Od.d.cts.map +0 -1
  140. package/dist/sdk-C4EzYQRq.js.map +0 -1
  141. package/dist/sdk-C9Nvlh7R.cjs.map +0 -1
  142. package/dist/sdk-CXqc4o_q.d.ts.map +0 -1
  143. package/dist/sdk-DkAItj4z.d.cts.map +0 -1
  144. package/dist/sdk-wrapper-BDrcyEQ_.cjs.map +0 -1
  145. package/dist/sdk-wrapper-BVr62EfA.js.map +0 -1
  146. package/dist/types-0uHbJsBN.d.ts.map +0 -1
  147. package/dist/types-DOUDks8I.d.cts.map +0 -1
  148. package/dist/types-DOUDks8I.d.ts.map +0 -1
  149. package/dist/types-iyHj03Q1.d.cts.map +0 -1
  150. package/dist/xray-CG4jciQs.d.ts.map +0 -1
  151. package/dist/xray-DDcKCKKo.d.cts.map +0 -1
package/README.md CHANGED
@@ -38,7 +38,10 @@ pnpm add autotel-aws autotel
38
38
  import { init } from 'autotel';
39
39
  import { wrapHandler } from 'autotel-aws/lambda';
40
40
 
41
- init({ service: 'my-lambda', endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT });
41
+ init({
42
+ service: 'my-lambda',
43
+ endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
44
+ });
42
45
 
43
46
  export const handler = wrapHandler(async (event, context) => {
44
47
  // Your handler code - automatically traced
@@ -120,9 +123,12 @@ await consumer.processMessages(async (message, ctx) => {
120
123
  });
121
124
 
122
125
  // Continuous polling
123
- await consumer.poll(async (message, ctx) => {
124
- return await processOrder(message.body);
125
- }, { maxIterations: 100 });
126
+ await consumer.poll(
127
+ async (message, ctx) => {
128
+ return await processOrder(message.body);
129
+ },
130
+ { maxIterations: 100 },
131
+ );
126
132
  ```
127
133
 
128
134
  ## SNS Publisher
@@ -181,7 +187,10 @@ const consumer = new KinesisConsumer(kinesis, {
181
187
  streamName: 'my-stream',
182
188
  });
183
189
 
184
- const shardIterator = await consumer.getShardIterator('shardId-000000000000', 'TRIM_HORIZON');
190
+ const shardIterator = await consumer.getShardIterator(
191
+ 'shardId-000000000000',
192
+ 'TRIM_HORIZON',
193
+ );
185
194
 
186
195
  await consumer.processRecords(shardIterator, async (record, ctx) => {
187
196
  ctx.setAttribute('order.id', record.orderId);
@@ -194,14 +203,18 @@ await consumer.processRecords(shardIterator, async (record, ctx) => {
194
203
  Orchestrate workflows with distributed tracing across state machines:
195
204
 
196
205
  ```typescript
197
- import { StepFunctionsExecutor, StepFunctionsActivityWorker } from 'autotel-aws/step-functions';
206
+ import {
207
+ StepFunctionsExecutor,
208
+ StepFunctionsActivityWorker,
209
+ } from 'autotel-aws/step-functions';
198
210
  import { SFNClient } from '@aws-sdk/client-sfn';
199
211
 
200
212
  const sfn = new SFNClient({ region: 'us-east-1' });
201
213
 
202
214
  // Executor - starts workflows with trace context injection
203
215
  const executor = new StepFunctionsExecutor(sfn, {
204
- stateMachineArn: 'arn:aws:states:us-east-1:123456789:stateMachine:OrderProcessor',
216
+ stateMachineArn:
217
+ 'arn:aws:states:us-east-1:123456789:stateMachine:OrderProcessor',
205
218
  });
206
219
 
207
220
  // Start async execution
@@ -231,7 +244,10 @@ await worker.poll(async (input, taskToken, ctx) => {
231
244
  ### Lambda Invoked by Step Functions
232
245
 
233
246
  ```typescript
234
- import { extractStepFunctionsContext, stripTraceContext } from 'autotel-aws/step-functions';
247
+ import {
248
+ extractStepFunctionsContext,
249
+ stripTraceContext,
250
+ } from 'autotel-aws/step-functions';
235
251
  import { wrapHandler } from 'autotel-aws/lambda';
236
252
 
237
253
  export const handler = wrapHandler(async (event) => {
@@ -277,7 +293,10 @@ await publisher.putEvents([
277
293
  ### Lambda Invoked by EventBridge
278
294
 
279
295
  ```typescript
280
- import { extractEventBridgeContext, stripEventBridgeContext } from 'autotel-aws/eventbridge';
296
+ import {
297
+ extractEventBridgeContext,
298
+ stripEventBridgeContext,
299
+ } from 'autotel-aws/eventbridge';
281
300
  import { wrapHandler } from 'autotel-aws/lambda';
282
301
 
283
302
  export const handler = wrapHandler(async (event) => {
@@ -304,8 +323,9 @@ const baseHandler = async (event, context) => {
304
323
  return { statusCode: 200 };
305
324
  };
306
325
 
307
- export const handler = middy(baseHandler)
308
- .use(tracingMiddleware({ captureResponse: true }));
326
+ export const handler = middy(baseHandler).use(
327
+ tracingMiddleware({ captureResponse: true }),
328
+ );
309
329
  ```
310
330
 
311
331
  ## Service-Specific Semantic Helpers
@@ -349,15 +369,15 @@ export const publishEvent = traceKinesis({
349
369
 
350
370
  ## CloudWatch native OTLP endpoints
351
371
 
352
- As of late 2025 / early 2026, CloudWatch accepts OTLP/HTTP directly no collector required. Three SigV4-authed endpoints:
372
+ As of late 2025 / early 2026, CloudWatch accepts OTLP/HTTP directly. No collector required. Three SigV4-authed endpoints:
353
373
 
354
- | Signal | Endpoint | Lands in |
355
- |---|---|---|
356
- | Traces | `https://xray.<region>.amazonaws.com/v1/traces` | X-Ray + Application Signals + Transaction Search |
357
- | Logs | `https://logs.<region>.amazonaws.com/v1/logs` | CloudWatch Logs (Logs Insights / LiveTail) |
358
- | Metrics | `https://monitoring.<region>.amazonaws.com/v1/metrics` | CloudWatch Metrics (PromQL-queryable) |
374
+ | Signal | Endpoint | Lands in |
375
+ | ------- | ------------------------------------------------------ | ------------------------------------------------ |
376
+ | Traces | `https://xray.<region>.amazonaws.com/v1/traces` | X-Ray + Application Signals + Transaction Search |
377
+ | Logs | `https://logs.<region>.amazonaws.com/v1/logs` | CloudWatch Logs (Logs Insights / LiveTail) |
378
+ | Metrics | `https://monitoring.<region>.amazonaws.com/v1/metrics` | CloudWatch Metrics (PromQL-queryable) |
359
379
 
360
- `autotel-aws/cloudwatch` ships SpanExporter / LogRecordExporter / PushMetricExporter implementations that serialize OTLP/JSON, sign with SigV4, and POST via `globalThis.fetch` usable directly from a Lambda or any Node 18+ runtime, no sidecar.
380
+ `autotel-aws/cloudwatch` ships SpanExporter / LogRecordExporter / PushMetricExporter implementations that serialize OTLP/JSON, sign with SigV4, and POST via `globalThis.fetch`. Usable directly from a Lambda or any Node 18+ runtime, no sidecar.
361
381
 
362
382
  ### Install the optional peers
363
383
 
@@ -390,14 +410,17 @@ init({
390
410
  });
391
411
  ```
392
412
 
393
- In Lambda, call `provider.forceFlush()` before the handler returns, or use `SimpleSpanProcessor` for synchronous export otherwise the runtime freezes the process before the batch ships.
413
+ In Lambda, call `provider.forceFlush()` before the handler returns, or use `SimpleSpanProcessor` for synchronous export. Otherwise the runtime freezes the process before the batch ships.
394
414
 
395
415
  ### Logs
396
416
 
397
417
  The logs exporter needs an existing CloudWatch log group + stream. In Lambda the runtime provisions both and exposes them as `AWS_LAMBDA_LOG_GROUP_NAME` / `AWS_LAMBDA_LOG_STREAM_NAME` (read by default).
398
418
 
399
419
  ```typescript
400
- import { BatchLogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs';
420
+ import {
421
+ BatchLogRecordProcessor,
422
+ LoggerProvider,
423
+ } from '@opentelemetry/sdk-logs';
401
424
  import { CloudWatchLogExporter } from 'autotel-aws/cloudwatch';
402
425
 
403
426
  const provider = new LoggerProvider({
@@ -408,7 +431,10 @@ const provider = new LoggerProvider({
408
431
  ### Metrics
409
432
 
410
433
  ```typescript
411
- import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
434
+ import {
435
+ MeterProvider,
436
+ PeriodicExportingMetricReader,
437
+ } from '@opentelemetry/sdk-metrics';
412
438
  import { CloudWatchMetricExporter } from 'autotel-aws/cloudwatch';
413
439
 
414
440
  const provider = new MeterProvider({
@@ -425,14 +451,14 @@ const provider = new MeterProvider({
425
451
 
426
452
  You have two integration paths:
427
453
 
428
- | | In-process (`autotel-aws/cloudwatch`) | ADOT Lambda extension layer |
429
- |---|---|---|
430
- | Sidecar | None | Yes (extension layer) |
431
- | Export latency | In the billed handler time | Outside billed time |
432
- | Cold start cost | Bundle size + SigV4 init | Layer init |
433
- | Best for | Low-volume functions, custom transports | Higher-throughput functions |
454
+ | | In-process (`autotel-aws/cloudwatch`) | ADOT Lambda extension layer |
455
+ | --------------- | --------------------------------------- | --------------------------- |
456
+ | Sidecar | None | Yes (extension layer) |
457
+ | Export latency | In the billed handler time | Outside billed time |
458
+ | Cold start cost | Bundle size + SigV4 init | Layer init |
459
+ | Best for | Low-volume functions, custom transports | Higher-throughput functions |
434
460
 
435
- Pick one running both ships duplicate spans.
461
+ Pick one. Running both ships duplicate spans.
436
462
 
437
463
  ### ADOT collector config (SigV4)
438
464
 
@@ -465,6 +491,7 @@ service:
465
491
  ```
466
492
 
467
493
  For logs/metrics use the same pattern with:
494
+
468
495
  - logs endpoint `https://logs.<region>.amazonaws.com/v1/logs`, service `logs`
469
496
  - metrics endpoint `https://monitoring.<region>.amazonaws.com/v1/metrics`, service `monitoring`
470
497
 
@@ -587,13 +614,13 @@ export const handler = wrapHandler(async (event, context) => {
587
614
 
588
615
  ### Key Migration Points
589
616
 
590
- | X-Ray SDK | autotel-aws | Notes |
591
- |-----------|-------------|-------|
592
- | `AWSXRay.captureAWSv3Client(client)` | `instrumentSDK(client)` or `autoInstrumentAWS()` | Global auto-instrumentation available |
593
- | `AWSXRay.getSegment().addAnnotation()` | `setXRayAnnotation()` | Same X-Ray filtering capability |
594
- | `AWSXRay.getSegment().addMetadata()` | `setXRayMetadata()` | Same X-Ray metadata storage |
595
- | `new AWSXRay.Segment()` | `trace('name', ...)` or `wrapHandler()` | Automatic span management |
596
- | X-Ray daemon | Any OTLP collector | X-Ray, CloudWatch Agent, or third-party |
617
+ | X-Ray SDK | autotel-aws | Notes |
618
+ | -------------------------------------- | ------------------------------------------------ | --------------------------------------- |
619
+ | `AWSXRay.captureAWSv3Client(client)` | `instrumentSDK(client)` or `autoInstrumentAWS()` | Global auto-instrumentation available |
620
+ | `AWSXRay.getSegment().addAnnotation()` | `setXRayAnnotation()` | Same X-Ray filtering capability |
621
+ | `AWSXRay.getSegment().addMetadata()` | `setXRayMetadata()` | Same X-Ray metadata storage |
622
+ | `new AWSXRay.Segment()` | `trace('name', ...)` or `wrapHandler()` | Automatic span management |
623
+ | X-Ray daemon | Any OTLP collector | X-Ray, CloudWatch Agent, or third-party |
597
624
 
598
625
  ### Environment Variables
599
626
 
@@ -619,50 +646,56 @@ DD_API_KEY=YOUR_API_KEY
619
646
 
620
647
  ### Entry Points
621
648
 
622
- | Import | Description |
623
- |--------|-------------|
624
- | `autotel-aws/lambda` | Lambda handler wrappers + Middy middleware |
625
- | `autotel-aws/lambda/auto` | Zero-config Lambda auto-init |
626
- | `autotel-aws/sdk` | AWS SDK v3 instrumentation |
627
- | `autotel-aws/s3` | S3 semantic helpers |
628
- | `autotel-aws/dynamodb` | DynamoDB semantic helpers |
629
- | `autotel-aws/sqs` | SQS helpers + Producer/Consumer |
630
- | `autotel-aws/sns` | SNS helpers + Publisher |
631
- | `autotel-aws/kinesis` | Kinesis helpers + Producer/Consumer |
649
+ | Import | Description |
650
+ | ---------------------------- | ------------------------------------------------ |
651
+ | `autotel-aws/lambda` | Lambda handler wrappers + Middy middleware |
652
+ | `autotel-aws/lambda/auto` | Zero-config Lambda auto-init |
653
+ | `autotel-aws/sdk` | AWS SDK v3 instrumentation |
654
+ | `autotel-aws/s3` | S3 semantic helpers |
655
+ | `autotel-aws/dynamodb` | DynamoDB semantic helpers |
656
+ | `autotel-aws/sqs` | SQS helpers + Producer/Consumer |
657
+ | `autotel-aws/sns` | SNS helpers + Publisher |
658
+ | `autotel-aws/kinesis` | Kinesis helpers + Producer/Consumer |
632
659
  | `autotel-aws/step-functions` | Step Functions Executor/Worker + context helpers |
633
- | `autotel-aws/eventbridge` | EventBridge Publisher + context helpers |
634
- | `autotel-aws/xray` | X-Ray annotation/metadata helpers |
635
- | `autotel-aws/testing` | Test utilities for Lambda |
636
- | `autotel-aws/attributes` | Semantic attribute builders |
660
+ | `autotel-aws/eventbridge` | EventBridge Publisher + context helpers |
661
+ | `autotel-aws/xray` | X-Ray annotation/metadata helpers |
662
+ | `autotel-aws/testing` | Test utilities for Lambda |
663
+ | `autotel-aws/attributes` | Semantic attribute builders |
637
664
 
638
665
  ### Semantic Attributes
639
666
 
640
667
  All instrumentation follows [OpenTelemetry AWS Semantic Conventions](https://opentelemetry.io/docs/specs/semconv/cloud-providers/aws-sdk/):
641
668
 
642
669
  **Lambda:**
670
+
643
671
  - `faas.name`, `faas.version`, `faas.invocation_id`
644
672
  - `faas.coldstart`, `faas.trigger`
645
673
  - `cloud.provider`, `cloud.region`, `cloud.account.id`
646
674
 
647
675
  **AWS SDK:**
676
+
648
677
  - `rpc.system` (aws-api), `rpc.service`, `rpc.method`
649
678
  - `aws.request_id`, `http.status_code`
650
679
 
651
680
  **Messaging (SQS/SNS/Kinesis):**
681
+
652
682
  - `messaging.system`, `messaging.destination.name`
653
683
  - `messaging.operation`, `messaging.message.id`
654
684
  - `messaging.batch.message_count` (for batch operations)
655
685
 
656
686
  **Database (DynamoDB):**
687
+
657
688
  - `db.system`, `db.operation`, `db.name`
658
689
  - `aws.dynamodb.table_names`
659
690
 
660
691
  **Step Functions:**
692
+
661
693
  - `aws.stepfunctions.state_machine_arn`
662
694
  - `aws.stepfunctions.execution_arn`
663
695
  - `aws.stepfunctions.activity_arn`
664
696
 
665
697
  **EventBridge:**
698
+
666
699
  - `aws.eventbridge.event_bus`
667
700
  - `aws.eventbridge.source`
668
701
  - `aws.eventbridge.detail_type`
@@ -1 +1 @@
1
- {"version":3,"file":"attributes.d.cts","names":[],"sources":["../src/attributes.ts"],"mappings":";;AAQA;;;;;;cAAa,SAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsDG,qBAAA,CAAsB,OAAA;EACpC,YAAA;EACA,YAAA;EACA,eAAA;EACA,SAAA;EACA,OAAA;AAAA,IACE,MAAM;AAAA;AAmBV;;AAnBU,iBAmBM,kBAAA,CAAmB,QAAA;EACjC,OAAA;EACA,SAAA;EACA,SAAA;EACA,cAAA;EACA,iBAAA;EACA,IAAA;AAAA,IACE,MAAM;;;;iBAuBM,uBAAA,CAAwB,SAAA;EACtC,SAAA;EACA,SAAA;EACA,gBAAA;AAAA,IACE,MAAM;;;;iBAeM,iBAAA,CAAkB,SAAA;EAChC,MAAA;EACA,GAAA;EACA,UAAA;AAAA,IACE,MAAM;;;;iBAeM,kBAAA,CAAmB,SAAA;EACjC,SAAA;EACA,QAAA;EACA,SAAA;EACA,SAAA;AAAA,IACE,MAAM;AApBA;AAeV;;AAfU,iBAqCM,kBAAA,CAAmB,SAAA;EACjC,QAAA;EACA,SAAA;AAAA,IACE,MAAM;;;;iBAcM,sBAAA,CAAuB,SAAA;EACrC,UAAA;EACA,OAAA;EACA,SAAA;AAAA,IACE,MAAM;;;;iBAcM,4BAAA,CAA6B,SAAA;EAC3C,eAAA;EACA,YAAA;EACA,WAAA;AAAA,IACE,MAAM;AAtBV;;;AAAA,iBAqCgB,0BAAA,CAA2B,SAAA;EACzC,QAAA;EACA,MAAA;EACA,UAAA;AAAA,IACE,MAAM"}
1
+ {"version":3,"file":"attributes.d.cts","names":[],"sources":["../src/attributes.ts"],"mappings":";;;;;;;;cAQa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsDG,sBAAsB;EACpC;EACA;EACA;EACA;EACA;IACE;;;;iBAmBY,mBAAmB;EACjC;EACA;EACA;EACA;EACA;EACA;IACE;;;;iBAuBY,wBAAwB;EACtC;EACA;EACA;IACE;;;;iBAeY,kBAAkB;EAChC;EACA;EACA;IACE;;;;iBAeY,mBAAmB;EACjC;EACA;EACA;EACA;IACE;;;;iBAiBY,mBAAmB;EACjC;EACA;IACE;;;;iBAcY,uBAAuB;EACrC;EACA;EACA;IACE;;;;iBAcY,6BAA6B;EAC3C;EACA;EACA;IACE;;;;iBAeY,2BAA2B;EACzC;EACA;EACA;IACE"}
@@ -1 +1 @@
1
- {"version":3,"file":"attributes.d.ts","names":[],"sources":["../src/attributes.ts"],"mappings":";;AAQA;;;;;;cAAa,SAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsDG,qBAAA,CAAsB,OAAA;EACpC,YAAA;EACA,YAAA;EACA,eAAA;EACA,SAAA;EACA,OAAA;AAAA,IACE,MAAM;AAAA;AAmBV;;AAnBU,iBAmBM,kBAAA,CAAmB,QAAA;EACjC,OAAA;EACA,SAAA;EACA,SAAA;EACA,cAAA;EACA,iBAAA;EACA,IAAA;AAAA,IACE,MAAM;;;;iBAuBM,uBAAA,CAAwB,SAAA;EACtC,SAAA;EACA,SAAA;EACA,gBAAA;AAAA,IACE,MAAM;;;;iBAeM,iBAAA,CAAkB,SAAA;EAChC,MAAA;EACA,GAAA;EACA,UAAA;AAAA,IACE,MAAM;;;;iBAeM,kBAAA,CAAmB,SAAA;EACjC,SAAA;EACA,QAAA;EACA,SAAA;EACA,SAAA;AAAA,IACE,MAAM;AApBA;AAeV;;AAfU,iBAqCM,kBAAA,CAAmB,SAAA;EACjC,QAAA;EACA,SAAA;AAAA,IACE,MAAM;;;;iBAcM,sBAAA,CAAuB,SAAA;EACrC,UAAA;EACA,OAAA;EACA,SAAA;AAAA,IACE,MAAM;;;;iBAcM,4BAAA,CAA6B,SAAA;EAC3C,eAAA;EACA,YAAA;EACA,WAAA;AAAA,IACE,MAAM;AAtBV;;;AAAA,iBAqCgB,0BAAA,CAA2B,SAAA;EACzC,QAAA;EACA,MAAA;EACA,UAAA;AAAA,IACE,MAAM"}
1
+ {"version":3,"file":"attributes.d.ts","names":[],"sources":["../src/attributes.ts"],"mappings":";;;;;;;;cAQa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsDG,sBAAsB;EACpC;EACA;EACA;EACA;EACA;IACE;;;;iBAmBY,mBAAmB;EACjC;EACA;EACA;EACA;EACA;EACA;IACE;;;;iBAuBY,wBAAwB;EACtC;EACA;EACA;IACE;;;;iBAeY,kBAAkB;EAChC;EACA;EACA;IACE;;;;iBAeY,mBAAmB;EACjC;EACA;EACA;EACA;IACE;;;;iBAiBY,mBAAmB;EACjC;EACA;IACE;;;;iBAcY,uBAAuB;EACrC;EACA;EACA;IACE;;;;iBAcY,6BAA6B;EAC3C;EACA;EACA;IACE;;;;iBAeY,2BAA2B;EACzC;EACA;EACA;IACE"}
@@ -1 +1 @@
1
- {"version":3,"file":"cloudwatch.cjs","names":["ExportResultCode","JsonTraceSerializer","safeReadText","ExportResultCode","JsonLogsSerializer","safeReadText","AggregationTemporality","ExportResultCode","JsonMetricsSerializer"],"sources":["../src/cloudwatch/endpoints.ts","../src/cloudwatch/sigv4.ts","../src/cloudwatch/trace-exporter.ts","../src/cloudwatch/log-exporter.ts","../src/cloudwatch/metric-exporter.ts"],"sourcesContent":["/**\n * CloudWatch native OTLP HTTP endpoints.\n *\n * Reference: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-OTLPEndpoint.html\n *\n * All three endpoints accept OTLP/HTTP (JSON or protobuf, optional gzip)\n * and require AWS Signature V4 authentication. They land data in:\n *\n * - traces → X-Ray + Application Signals + Transaction Search\n * - logs → CloudWatch Logs (needs x-aws-log-group + x-aws-log-stream headers)\n * - metrics → CloudWatch Metrics, queryable via PromQL\n */\n\nexport interface CloudWatchEndpointInput {\n readonly region: string;\n}\n\n/** Traces — signed against the `xray` service. */\nexport function cloudWatchTracesEndpoint({ region }: CloudWatchEndpointInput): string {\n return `https://xray.${region}.amazonaws.com/v1/traces`;\n}\n\n/** Logs — signed against the `logs` service. Requires log group/stream headers. */\nexport function cloudWatchLogsEndpoint({ region }: CloudWatchEndpointInput): string {\n return `https://logs.${region}.amazonaws.com/v1/logs`;\n}\n\n/** Metrics — signed against the `monitoring` service. */\nexport function cloudWatchMetricsEndpoint({ region }: CloudWatchEndpointInput): string {\n return `https://monitoring.${region}.amazonaws.com/v1/metrics`;\n}\n\n/**\n * The SigV4 service name used when signing requests for each endpoint.\n * These do NOT always match the host prefix — they're the canonical\n * AWS service identifiers used by the SigV4 signer.\n */\nexport const SIGV4_SERVICE = {\n traces: 'xray',\n logs: 'logs',\n metrics: 'monitoring',\n} as const;\n\nexport type CloudWatchSignal = keyof typeof SIGV4_SERVICE;\n","/**\n * SigV4 signing helper for CloudWatch OTLP HTTP endpoints.\n *\n * Uses `@smithy/signature-v4` + `@aws-crypto/sha256-js` (optional peer deps).\n * Returns the headers required to POST a signed OTLP request.\n */\n\nimport type { CloudWatchSignal } from './endpoints';\nimport { SIGV4_SERVICE } from './endpoints';\n\nexport interface AwsCredentialsLike {\n readonly accessKeyId: string;\n readonly secretAccessKey: string;\n readonly sessionToken?: string;\n}\n\nexport type AwsCredentialsProvider =\n | AwsCredentialsLike\n | (() => AwsCredentialsLike | Promise<AwsCredentialsLike>);\n\nexport interface SignOtlpRequestInput {\n /** The full endpoint URL (e.g. https://xray.eu-west-1.amazonaws.com/v1/traces). */\n url: string;\n /** OTLP payload — already serialized + (optionally) gzipped. */\n body: Uint8Array;\n /** AWS region (e.g. \"eu-west-1\"). Must match the host. */\n region: string;\n /** Which CloudWatch endpoint we're hitting (selects the SigV4 service name). */\n signal: CloudWatchSignal;\n /** Static credentials or a provider. Falls back to the AWS SDK default chain when omitted. */\n credentials?: AwsCredentialsProvider;\n /** Extra headers to include in the canonical request (signed). */\n additionalHeaders?: Record<string, string>;\n /** Content-Type — defaults to OTLP/JSON. Use `application/x-protobuf` for proto. */\n contentType?: 'application/json' | 'application/x-protobuf';\n /** Content-Encoding (e.g. \"gzip\"). Omit for identity. */\n contentEncoding?: 'gzip';\n}\n\n/**\n * Compute SigV4-signed headers for an OTLP HTTP POST to a CloudWatch endpoint.\n *\n * Throws if the optional `@smithy/signature-v4` / `@aws-crypto/sha256-js`\n * peer dependencies aren't installed — install them alongside autotel-aws\n * when you want to ship telemetry directly from app code (no collector).\n */\nexport async function signCloudWatchOtlpRequest(\n input: SignOtlpRequestInput,\n): Promise<Record<string, string>> {\n const { SignatureV4 } = await loadSigV4();\n const { Sha256 } = await loadSha256();\n\n const credentials = await resolveCredentials(input.credentials);\n const parsed = new URL(input.url);\n const contentType = input.contentType ?? 'application/json';\n\n const headers: Record<string, string> = {\n host: parsed.host,\n 'content-type': contentType,\n ...(input.contentEncoding && { 'content-encoding': input.contentEncoding }),\n ...input.additionalHeaders,\n };\n\n const signer = new SignatureV4({\n service: SIGV4_SERVICE[input.signal],\n region: input.region,\n credentials,\n sha256: Sha256,\n });\n\n const signed = await signer.sign({\n method: 'POST',\n protocol: parsed.protocol,\n hostname: parsed.hostname,\n port: parsed.port ? Number(parsed.port) : undefined,\n path: parsed.pathname + parsed.search,\n headers,\n body: input.body,\n });\n\n return signed.headers as Record<string, string>;\n}\n\nasync function resolveCredentials(\n source: AwsCredentialsProvider | undefined,\n): Promise<AwsCredentialsLike> {\n if (typeof source === 'function') return source();\n if (source) return source;\n return loadDefaultCredentials();\n}\n\nasync function loadDefaultCredentials(): Promise<AwsCredentialsLike> {\n try {\n // Optional peer dep — only required when caller doesn't pass credentials.\n const mod = await import('@aws-sdk/credential-providers');\n return await mod.fromNodeProviderChain()();\n } catch (error) {\n throw new Error(\n 'autotel-aws/cloudwatch: no credentials supplied and `@aws-sdk/credential-providers` is not installed. ' +\n 'Either pass `credentials` explicitly or install the package.',\n { cause: error },\n );\n }\n}\n\nasync function loadSigV4(): Promise<typeof import('@smithy/signature-v4')> {\n try {\n return await import('@smithy/signature-v4');\n } catch (error) {\n throw new Error(\n 'autotel-aws/cloudwatch: `@smithy/signature-v4` is required to sign OTLP requests. ' +\n 'Install it (and `@aws-crypto/sha256-js`) alongside autotel-aws.',\n { cause: error },\n );\n }\n}\n\nasync function loadSha256(): Promise<typeof import('@aws-crypto/sha256-js')> {\n try {\n return await import('@aws-crypto/sha256-js');\n } catch (error) {\n throw new Error(\n 'autotel-aws/cloudwatch: `@aws-crypto/sha256-js` is required to sign OTLP requests. ' +\n 'Install it alongside `@smithy/signature-v4`.',\n { cause: error },\n );\n }\n}\n","/**\n * SpanExporter that ships OTLP/JSON straight to the CloudWatch traces\n * endpoint (https://xray.<region>.amazonaws.com/v1/traces) using SigV4.\n *\n * No collector required. Useful in Lambda when you don't want to attach\n * the ADOT extension layer, or any other env where you'd rather not run\n * a sidecar.\n *\n * Lands in: X-Ray + Application Signals + Transaction Search.\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport { JsonTraceSerializer } from '@opentelemetry/otlp-transformer';\nimport type {\n ReadableSpan,\n SpanExporter,\n} from '@opentelemetry/sdk-trace-base';\n\nimport { cloudWatchTracesEndpoint } from './endpoints';\nimport {\n signCloudWatchOtlpRequest,\n type AwsCredentialsProvider,\n} from './sigv4';\n\nexport interface CloudWatchTraceExporterConfig {\n /** AWS region — defaults to `process.env.AWS_REGION`. */\n region?: string;\n /** Override the endpoint (mainly for tests / VPC endpoints). */\n endpoint?: string;\n /** Static credentials or a provider. Defaults to the AWS SDK default chain. */\n credentials?: AwsCredentialsProvider;\n /** Per-export timeout in ms. Defaults to 10s (CloudWatch's documented soft cap). */\n timeoutMs?: number;\n /** Optional `fetch` override (Node 18+ has it globally; useful in tests). */\n fetchImpl?: typeof fetch;\n}\n\n/**\n * OTLP/JSON exporter for CloudWatch's traces endpoint.\n *\n * Use with `BatchSpanProcessor` or `SimpleSpanProcessor` from\n * `@opentelemetry/sdk-trace-base`. For Lambda, `SimpleSpanProcessor`\n * (synchronous export per span) is fine for small workloads;\n * `BatchSpanProcessor` is better for higher-throughput functions but\n * needs `forceFlush()` before the handler returns.\n */\nexport class CloudWatchTraceExporter implements SpanExporter {\n private readonly region: string;\n private readonly endpoint: string;\n private readonly credentials?: AwsCredentialsProvider;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private shutdownOnce = false;\n\n constructor(config: CloudWatchTraceExporterConfig = {}) {\n const region = config.region ?? process.env.AWS_REGION;\n if (!region) {\n throw new Error(\n 'CloudWatchTraceExporter: `region` is required (pass it explicitly or set AWS_REGION).',\n );\n }\n this.region = region;\n this.endpoint = config.endpoint ?? cloudWatchTracesEndpoint({ region });\n this.credentials = config.credentials;\n this.timeoutMs = config.timeoutMs ?? 10_000;\n this.fetchImpl = config.fetchImpl ?? globalThis.fetch;\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'CloudWatchTraceExporter: global `fetch` is not available — pass `fetchImpl` explicitly (Node 18+ has it natively).',\n );\n }\n }\n\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n if (this.shutdownOnce) {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('CloudWatchTraceExporter: already shut down'),\n });\n return;\n }\n if (spans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n\n this.sendBatch(spans).then(\n () => resultCallback({ code: ExportResultCode.SUCCESS }),\n (error: unknown) =>\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n }\n\n async shutdown(): Promise<void> {\n this.shutdownOnce = true;\n }\n\n async forceFlush(): Promise<void> {\n // Batching is the responsibility of the span processor. Nothing to flush here.\n }\n\n private async sendBatch(spans: ReadableSpan[]): Promise<void> {\n const body = JsonTraceSerializer.serializeRequest(spans);\n if (!body) {\n throw new Error('CloudWatchTraceExporter: serializer produced no body');\n }\n\n const headers = await signCloudWatchOtlpRequest({\n url: this.endpoint,\n body,\n region: this.region,\n signal: 'traces',\n credentials: this.credentials,\n contentType: 'application/json',\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n const text = await safeReadText(response);\n throw new Error(\n `CloudWatchTraceExporter: HTTP ${response.status} ${response.statusText} ${text}`.trim(),\n );\n }\n }\n}\n\nasync function safeReadText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n","/**\n * LogRecordExporter that ships OTLP/JSON logs to the CloudWatch logs\n * endpoint (https://logs.<region>.amazonaws.com/v1/logs) using SigV4.\n *\n * CloudWatch Logs requires `x-aws-log-group` and `x-aws-log-stream`\n * headers — both must already exist (this exporter does NOT create them).\n *\n * In Lambda, the runtime auto-provisions a log group + stream per function;\n * read them from `AWS_LAMBDA_LOG_GROUP_NAME` / `AWS_LAMBDA_LOG_STREAM_NAME`\n * (set automatically when the function runs).\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport { JsonLogsSerializer } from '@opentelemetry/otlp-transformer';\nimport type {\n LogRecordExporter,\n ReadableLogRecord,\n} from '@opentelemetry/sdk-logs';\n\nimport { cloudWatchLogsEndpoint } from './endpoints';\nimport {\n signCloudWatchOtlpRequest,\n type AwsCredentialsProvider,\n} from './sigv4';\n\nexport interface CloudWatchLogExporterConfig {\n region?: string;\n endpoint?: string;\n credentials?: AwsCredentialsProvider;\n /**\n * Existing CloudWatch log group to write into. Defaults to\n * `AWS_LAMBDA_LOG_GROUP_NAME` (set automatically by the Lambda runtime).\n */\n logGroup?: string;\n /**\n * Existing CloudWatch log stream. Defaults to\n * `AWS_LAMBDA_LOG_STREAM_NAME`.\n */\n logStream?: string;\n /**\n * Optional comma-separated list of field paths CloudWatch may truncate\n * if the event exceeds 1 MB (sent as `x-aws-truncatable-fields`).\n */\n truncatableFields?: string;\n timeoutMs?: number;\n fetchImpl?: typeof fetch;\n}\n\nexport class CloudWatchLogExporter implements LogRecordExporter {\n private readonly region: string;\n private readonly endpoint: string;\n private readonly credentials?: AwsCredentialsProvider;\n private readonly logGroup: string;\n private readonly logStream: string;\n private readonly truncatableFields?: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private shutdownOnce = false;\n\n constructor(config: CloudWatchLogExporterConfig = {}) {\n const region = config.region ?? process.env.AWS_REGION;\n if (!region) {\n throw new Error(\n 'CloudWatchLogExporter: `region` is required (pass it explicitly or set AWS_REGION).',\n );\n }\n const logGroup = config.logGroup ?? process.env.AWS_LAMBDA_LOG_GROUP_NAME;\n const logStream = config.logStream ?? process.env.AWS_LAMBDA_LOG_STREAM_NAME;\n if (!logGroup || !logStream) {\n throw new Error(\n 'CloudWatchLogExporter: `logGroup` and `logStream` are required ' +\n '(in Lambda they come from AWS_LAMBDA_LOG_GROUP_NAME / AWS_LAMBDA_LOG_STREAM_NAME).',\n );\n }\n this.region = region;\n this.endpoint = config.endpoint ?? cloudWatchLogsEndpoint({ region });\n this.credentials = config.credentials;\n this.logGroup = logGroup;\n this.logStream = logStream;\n this.truncatableFields = config.truncatableFields;\n this.timeoutMs = config.timeoutMs ?? 10_000;\n this.fetchImpl = config.fetchImpl ?? globalThis.fetch;\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'CloudWatchLogExporter: global `fetch` is not available — pass `fetchImpl` explicitly.',\n );\n }\n }\n\n export(\n logs: ReadableLogRecord[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n if (this.shutdownOnce) {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('CloudWatchLogExporter: already shut down'),\n });\n return;\n }\n if (logs.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n\n this.sendBatch(logs).then(\n () => resultCallback({ code: ExportResultCode.SUCCESS }),\n (error: unknown) =>\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n }\n\n async shutdown(): Promise<void> {\n this.shutdownOnce = true;\n }\n\n async forceFlush(): Promise<void> {}\n\n private async sendBatch(logs: ReadableLogRecord[]): Promise<void> {\n const body = JsonLogsSerializer.serializeRequest(logs);\n if (!body) {\n throw new Error('CloudWatchLogExporter: serializer produced no body');\n }\n\n const additionalHeaders: Record<string, string> = {\n 'x-aws-log-group': this.logGroup,\n 'x-aws-log-stream': this.logStream,\n };\n if (this.truncatableFields) {\n additionalHeaders['x-aws-truncatable-fields'] = this.truncatableFields;\n }\n\n const headers = await signCloudWatchOtlpRequest({\n url: this.endpoint,\n body,\n region: this.region,\n signal: 'logs',\n credentials: this.credentials,\n contentType: 'application/json',\n additionalHeaders,\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n const text = await safeReadText(response);\n throw new Error(\n `CloudWatchLogExporter: HTTP ${response.status} ${response.statusText} ${text}`.trim(),\n );\n }\n }\n}\n\nasync function safeReadText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n","/**\n * PushMetricExporter that ships OTLP/JSON metrics to the CloudWatch\n * metrics endpoint (https://monitoring.<region>.amazonaws.com/v1/metrics)\n * using SigV4.\n *\n * Lands in: CloudWatch Metrics — queryable via PromQL alongside the AWS\n * vended namespaces.\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport { JsonMetricsSerializer } from '@opentelemetry/otlp-transformer';\nimport {\n AggregationTemporality,\n type AggregationTemporalitySelector,\n type InstrumentType,\n type PushMetricExporter,\n type ResourceMetrics,\n} from '@opentelemetry/sdk-metrics';\n\nimport { cloudWatchMetricsEndpoint } from './endpoints';\nimport {\n signCloudWatchOtlpRequest,\n type AwsCredentialsProvider,\n} from './sigv4';\n\nexport interface CloudWatchMetricExporterConfig {\n region?: string;\n endpoint?: string;\n credentials?: AwsCredentialsProvider;\n timeoutMs?: number;\n fetchImpl?: typeof fetch;\n /**\n * Aggregation temporality. CloudWatch's OTLP metrics endpoint accepts\n * delta and cumulative; delta is generally cheaper for counters.\n */\n temporalitySelector?: AggregationTemporalitySelector;\n}\n\nconst DEFAULT_TEMPORALITY: AggregationTemporalitySelector = (\n _instrumentType: InstrumentType,\n) => AggregationTemporality.DELTA;\n\nexport class CloudWatchMetricExporter implements PushMetricExporter {\n private readonly region: string;\n private readonly endpoint: string;\n private readonly credentials?: AwsCredentialsProvider;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly temporalitySelector: AggregationTemporalitySelector;\n private shutdownOnce = false;\n\n constructor(config: CloudWatchMetricExporterConfig = {}) {\n const region = config.region ?? process.env.AWS_REGION;\n if (!region) {\n throw new Error(\n 'CloudWatchMetricExporter: `region` is required (pass it explicitly or set AWS_REGION).',\n );\n }\n this.region = region;\n this.endpoint = config.endpoint ?? cloudWatchMetricsEndpoint({ region });\n this.credentials = config.credentials;\n this.timeoutMs = config.timeoutMs ?? 10_000;\n this.fetchImpl = config.fetchImpl ?? globalThis.fetch;\n this.temporalitySelector =\n config.temporalitySelector ?? DEFAULT_TEMPORALITY;\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'CloudWatchMetricExporter: global `fetch` is not available — pass `fetchImpl` explicitly.',\n );\n }\n }\n\n export(\n metrics: ResourceMetrics,\n resultCallback: (result: ExportResult) => void,\n ): void {\n if (this.shutdownOnce) {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('CloudWatchMetricExporter: already shut down'),\n });\n return;\n }\n\n this.sendBatch(metrics).then(\n () => resultCallback({ code: ExportResultCode.SUCCESS }),\n (error: unknown) =>\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n }\n\n async shutdown(): Promise<void> {\n this.shutdownOnce = true;\n }\n\n async forceFlush(): Promise<void> {}\n\n selectAggregationTemporality(\n instrumentType: InstrumentType,\n ): AggregationTemporality {\n return this.temporalitySelector(instrumentType);\n }\n\n private async sendBatch(metrics: ResourceMetrics): Promise<void> {\n const body = JsonMetricsSerializer.serializeRequest(metrics);\n if (!body) {\n throw new Error('CloudWatchMetricExporter: serializer produced no body');\n }\n\n const headers = await signCloudWatchOtlpRequest({\n url: this.endpoint,\n body,\n region: this.region,\n signal: 'metrics',\n credentials: this.credentials,\n contentType: 'application/json',\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n const text = await safeReadText(response);\n throw new Error(\n `CloudWatchMetricExporter: HTTP ${response.status} ${response.statusText} ${text}`.trim(),\n );\n }\n }\n}\n\nasync function safeReadText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cloudwatch.cjs","names":["ExportResultCode","JsonTraceSerializer","safeReadText","ExportResultCode","JsonLogsSerializer","safeReadText","AggregationTemporality","ExportResultCode","JsonMetricsSerializer"],"sources":["../src/cloudwatch/endpoints.ts","../src/cloudwatch/sigv4.ts","../src/cloudwatch/trace-exporter.ts","../src/cloudwatch/log-exporter.ts","../src/cloudwatch/metric-exporter.ts"],"sourcesContent":["/**\n * CloudWatch native OTLP HTTP endpoints.\n *\n * Reference: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-OTLPEndpoint.html\n *\n * All three endpoints accept OTLP/HTTP (JSON or protobuf, optional gzip)\n * and require AWS Signature V4 authentication. They land data in:\n *\n * - traces → X-Ray + Application Signals + Transaction Search\n * - logs → CloudWatch Logs (needs x-aws-log-group + x-aws-log-stream headers)\n * - metrics → CloudWatch Metrics, queryable via PromQL\n */\n\nexport interface CloudWatchEndpointInput {\n readonly region: string;\n}\n\n/** Traces — signed against the `xray` service. */\nexport function cloudWatchTracesEndpoint({\n region,\n}: CloudWatchEndpointInput): string {\n return `https://xray.${region}.amazonaws.com/v1/traces`;\n}\n\n/** Logs — signed against the `logs` service. Requires log group/stream headers. */\nexport function cloudWatchLogsEndpoint({\n region,\n}: CloudWatchEndpointInput): string {\n return `https://logs.${region}.amazonaws.com/v1/logs`;\n}\n\n/** Metrics — signed against the `monitoring` service. */\nexport function cloudWatchMetricsEndpoint({\n region,\n}: CloudWatchEndpointInput): string {\n return `https://monitoring.${region}.amazonaws.com/v1/metrics`;\n}\n\n/**\n * The SigV4 service name used when signing requests for each endpoint.\n * These do NOT always match the host prefix — they're the canonical\n * AWS service identifiers used by the SigV4 signer.\n */\nexport const SIGV4_SERVICE = {\n traces: 'xray',\n logs: 'logs',\n metrics: 'monitoring',\n} as const;\n\nexport type CloudWatchSignal = keyof typeof SIGV4_SERVICE;\n","/**\n * SigV4 signing helper for CloudWatch OTLP HTTP endpoints.\n *\n * Uses `@smithy/signature-v4` + `@aws-crypto/sha256-js` (optional peer deps).\n * Returns the headers required to POST a signed OTLP request.\n */\n\nimport type { CloudWatchSignal } from './endpoints';\nimport { SIGV4_SERVICE } from './endpoints';\n\nexport interface AwsCredentialsLike {\n readonly accessKeyId: string;\n readonly secretAccessKey: string;\n readonly sessionToken?: string;\n}\n\nexport type AwsCredentialsProvider =\n AwsCredentialsLike | (() => AwsCredentialsLike | Promise<AwsCredentialsLike>);\n\nexport interface SignOtlpRequestInput {\n /** The full endpoint URL (e.g. https://xray.eu-west-1.amazonaws.com/v1/traces). */\n url: string;\n /** OTLP payload — already serialized + (optionally) gzipped. */\n body: Uint8Array;\n /** AWS region (e.g. \"eu-west-1\"). Must match the host. */\n region: string;\n /** Which CloudWatch endpoint we're hitting (selects the SigV4 service name). */\n signal: CloudWatchSignal;\n /** Static credentials or a provider. Falls back to the AWS SDK default chain when omitted. */\n credentials?: AwsCredentialsProvider;\n /** Extra headers to include in the canonical request (signed). */\n additionalHeaders?: Record<string, string>;\n /** Content-Type — defaults to OTLP/JSON. Use `application/x-protobuf` for proto. */\n contentType?: 'application/json' | 'application/x-protobuf';\n /** Content-Encoding (e.g. \"gzip\"). Omit for identity. */\n contentEncoding?: 'gzip';\n}\n\n/**\n * Compute SigV4-signed headers for an OTLP HTTP POST to a CloudWatch endpoint.\n *\n * Throws if the optional `@smithy/signature-v4` / `@aws-crypto/sha256-js`\n * peer dependencies aren't installed — install them alongside autotel-aws\n * when you want to ship telemetry directly from app code (no collector).\n */\nexport async function signCloudWatchOtlpRequest(\n input: SignOtlpRequestInput,\n): Promise<Record<string, string>> {\n const { SignatureV4 } = await loadSigV4();\n const { Sha256 } = await loadSha256();\n\n const credentials = await resolveCredentials(input.credentials);\n const parsed = new URL(input.url);\n const contentType = input.contentType ?? 'application/json';\n\n const headers: Record<string, string> = {\n host: parsed.host,\n 'content-type': contentType,\n ...(input.contentEncoding && { 'content-encoding': input.contentEncoding }),\n ...input.additionalHeaders,\n };\n\n const signer = new SignatureV4({\n service: SIGV4_SERVICE[input.signal],\n region: input.region,\n credentials,\n sha256: Sha256,\n });\n\n const signed = await signer.sign({\n method: 'POST',\n protocol: parsed.protocol,\n hostname: parsed.hostname,\n port: parsed.port ? Number(parsed.port) : undefined,\n path: parsed.pathname + parsed.search,\n headers,\n body: input.body,\n });\n\n return signed.headers as Record<string, string>;\n}\n\nasync function resolveCredentials(\n source: AwsCredentialsProvider | undefined,\n): Promise<AwsCredentialsLike> {\n if (typeof source === 'function') return source();\n if (source) return source;\n return loadDefaultCredentials();\n}\n\nasync function loadDefaultCredentials(): Promise<AwsCredentialsLike> {\n try {\n // Optional peer dep — only required when caller doesn't pass credentials.\n const mod = await import('@aws-sdk/credential-providers');\n return await mod.fromNodeProviderChain()();\n } catch (error) {\n throw new Error(\n 'autotel-aws/cloudwatch: no credentials supplied and `@aws-sdk/credential-providers` is not installed. ' +\n 'Either pass `credentials` explicitly or install the package.',\n { cause: error },\n );\n }\n}\n\nasync function loadSigV4(): Promise<typeof import('@smithy/signature-v4')> {\n try {\n return await import('@smithy/signature-v4');\n } catch (error) {\n throw new Error(\n 'autotel-aws/cloudwatch: `@smithy/signature-v4` is required to sign OTLP requests. ' +\n 'Install it (and `@aws-crypto/sha256-js`) alongside autotel-aws.',\n { cause: error },\n );\n }\n}\n\nasync function loadSha256(): Promise<typeof import('@aws-crypto/sha256-js')> {\n try {\n return await import('@aws-crypto/sha256-js');\n } catch (error) {\n throw new Error(\n 'autotel-aws/cloudwatch: `@aws-crypto/sha256-js` is required to sign OTLP requests. ' +\n 'Install it alongside `@smithy/signature-v4`.',\n { cause: error },\n );\n }\n}\n","/**\n * SpanExporter that ships OTLP/JSON straight to the CloudWatch traces\n * endpoint (https://xray.<region>.amazonaws.com/v1/traces) using SigV4.\n *\n * No collector required. Useful in Lambda when you don't want to attach\n * the ADOT extension layer, or any other env where you'd rather not run\n * a sidecar.\n *\n * Lands in: X-Ray + Application Signals + Transaction Search.\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport { JsonTraceSerializer } from '@opentelemetry/otlp-transformer';\nimport type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';\n\nimport { cloudWatchTracesEndpoint } from './endpoints';\nimport {\n signCloudWatchOtlpRequest,\n type AwsCredentialsProvider,\n} from './sigv4';\n\nexport interface CloudWatchTraceExporterConfig {\n /** AWS region — defaults to `process.env.AWS_REGION`. */\n region?: string;\n /** Override the endpoint (mainly for tests / VPC endpoints). */\n endpoint?: string;\n /** Static credentials or a provider. Defaults to the AWS SDK default chain. */\n credentials?: AwsCredentialsProvider;\n /** Per-export timeout in ms. Defaults to 10s (CloudWatch's documented soft cap). */\n timeoutMs?: number;\n /** Optional `fetch` override (Node 18+ has it globally; useful in tests). */\n fetchImpl?: typeof fetch;\n}\n\n/**\n * OTLP/JSON exporter for CloudWatch's traces endpoint.\n *\n * Use with `BatchSpanProcessor` or `SimpleSpanProcessor` from\n * `@opentelemetry/sdk-trace-base`. For Lambda, `SimpleSpanProcessor`\n * (synchronous export per span) is fine for small workloads;\n * `BatchSpanProcessor` is better for higher-throughput functions but\n * needs `forceFlush()` before the handler returns.\n */\nexport class CloudWatchTraceExporter implements SpanExporter {\n private readonly region: string;\n private readonly endpoint: string;\n private readonly credentials?: AwsCredentialsProvider;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private shutdownOnce = false;\n\n constructor(config: CloudWatchTraceExporterConfig = {}) {\n const region = config.region ?? process.env.AWS_REGION;\n if (!region) {\n throw new Error(\n 'CloudWatchTraceExporter: `region` is required (pass it explicitly or set AWS_REGION).',\n );\n }\n this.region = region;\n this.endpoint = config.endpoint ?? cloudWatchTracesEndpoint({ region });\n this.credentials = config.credentials;\n this.timeoutMs = config.timeoutMs ?? 10_000;\n this.fetchImpl = config.fetchImpl ?? globalThis.fetch;\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'CloudWatchTraceExporter: global `fetch` is not available — pass `fetchImpl` explicitly (Node 18+ has it natively).',\n );\n }\n }\n\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n if (this.shutdownOnce) {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('CloudWatchTraceExporter: already shut down'),\n });\n return;\n }\n if (spans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n\n this.sendBatch(spans).then(\n () => resultCallback({ code: ExportResultCode.SUCCESS }),\n (error: unknown) =>\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n }\n\n async shutdown(): Promise<void> {\n this.shutdownOnce = true;\n }\n\n async forceFlush(): Promise<void> {\n // Batching is the responsibility of the span processor. Nothing to flush here.\n }\n\n private async sendBatch(spans: ReadableSpan[]): Promise<void> {\n const body = JsonTraceSerializer.serializeRequest(spans);\n if (!body) {\n throw new Error('CloudWatchTraceExporter: serializer produced no body');\n }\n\n const headers = await signCloudWatchOtlpRequest({\n url: this.endpoint,\n body,\n region: this.region,\n signal: 'traces',\n credentials: this.credentials,\n contentType: 'application/json',\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n const text = await safeReadText(response);\n throw new Error(\n `CloudWatchTraceExporter: HTTP ${response.status} ${response.statusText} ${text}`.trim(),\n );\n }\n }\n}\n\nasync function safeReadText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n","/**\n * LogRecordExporter that ships OTLP/JSON logs to the CloudWatch logs\n * endpoint (https://logs.<region>.amazonaws.com/v1/logs) using SigV4.\n *\n * CloudWatch Logs requires `x-aws-log-group` and `x-aws-log-stream`\n * headers — both must already exist (this exporter does NOT create them).\n *\n * In Lambda, the runtime auto-provisions a log group + stream per function;\n * read them from `AWS_LAMBDA_LOG_GROUP_NAME` / `AWS_LAMBDA_LOG_STREAM_NAME`\n * (set automatically when the function runs).\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport { JsonLogsSerializer } from '@opentelemetry/otlp-transformer';\nimport type {\n LogRecordExporter,\n ReadableLogRecord,\n} from '@opentelemetry/sdk-logs';\n\nimport { cloudWatchLogsEndpoint } from './endpoints';\nimport {\n signCloudWatchOtlpRequest,\n type AwsCredentialsProvider,\n} from './sigv4';\n\nexport interface CloudWatchLogExporterConfig {\n region?: string;\n endpoint?: string;\n credentials?: AwsCredentialsProvider;\n /**\n * Existing CloudWatch log group to write into. Defaults to\n * `AWS_LAMBDA_LOG_GROUP_NAME` (set automatically by the Lambda runtime).\n */\n logGroup?: string;\n /**\n * Existing CloudWatch log stream. Defaults to\n * `AWS_LAMBDA_LOG_STREAM_NAME`.\n */\n logStream?: string;\n /**\n * Optional comma-separated list of field paths CloudWatch may truncate\n * if the event exceeds 1 MB (sent as `x-aws-truncatable-fields`).\n */\n truncatableFields?: string;\n timeoutMs?: number;\n fetchImpl?: typeof fetch;\n}\n\nexport class CloudWatchLogExporter implements LogRecordExporter {\n private readonly region: string;\n private readonly endpoint: string;\n private readonly credentials?: AwsCredentialsProvider;\n private readonly logGroup: string;\n private readonly logStream: string;\n private readonly truncatableFields?: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private shutdownOnce = false;\n\n constructor(config: CloudWatchLogExporterConfig = {}) {\n const region = config.region ?? process.env.AWS_REGION;\n if (!region) {\n throw new Error(\n 'CloudWatchLogExporter: `region` is required (pass it explicitly or set AWS_REGION).',\n );\n }\n const logGroup = config.logGroup ?? process.env.AWS_LAMBDA_LOG_GROUP_NAME;\n const logStream =\n config.logStream ?? process.env.AWS_LAMBDA_LOG_STREAM_NAME;\n if (!logGroup || !logStream) {\n throw new Error(\n 'CloudWatchLogExporter: `logGroup` and `logStream` are required ' +\n '(in Lambda they come from AWS_LAMBDA_LOG_GROUP_NAME / AWS_LAMBDA_LOG_STREAM_NAME).',\n );\n }\n this.region = region;\n this.endpoint = config.endpoint ?? cloudWatchLogsEndpoint({ region });\n this.credentials = config.credentials;\n this.logGroup = logGroup;\n this.logStream = logStream;\n this.truncatableFields = config.truncatableFields;\n this.timeoutMs = config.timeoutMs ?? 10_000;\n this.fetchImpl = config.fetchImpl ?? globalThis.fetch;\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'CloudWatchLogExporter: global `fetch` is not available — pass `fetchImpl` explicitly.',\n );\n }\n }\n\n export(\n logs: ReadableLogRecord[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n if (this.shutdownOnce) {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('CloudWatchLogExporter: already shut down'),\n });\n return;\n }\n if (logs.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n\n this.sendBatch(logs).then(\n () => resultCallback({ code: ExportResultCode.SUCCESS }),\n (error: unknown) =>\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n }\n\n async shutdown(): Promise<void> {\n this.shutdownOnce = true;\n }\n\n async forceFlush(): Promise<void> {}\n\n private async sendBatch(logs: ReadableLogRecord[]): Promise<void> {\n const body = JsonLogsSerializer.serializeRequest(logs);\n if (!body) {\n throw new Error('CloudWatchLogExporter: serializer produced no body');\n }\n\n const additionalHeaders: Record<string, string> = {\n 'x-aws-log-group': this.logGroup,\n 'x-aws-log-stream': this.logStream,\n };\n if (this.truncatableFields) {\n additionalHeaders['x-aws-truncatable-fields'] = this.truncatableFields;\n }\n\n const headers = await signCloudWatchOtlpRequest({\n url: this.endpoint,\n body,\n region: this.region,\n signal: 'logs',\n credentials: this.credentials,\n contentType: 'application/json',\n additionalHeaders,\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n const text = await safeReadText(response);\n throw new Error(\n `CloudWatchLogExporter: HTTP ${response.status} ${response.statusText} ${text}`.trim(),\n );\n }\n }\n}\n\nasync function safeReadText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n","/**\n * PushMetricExporter that ships OTLP/JSON metrics to the CloudWatch\n * metrics endpoint (https://monitoring.<region>.amazonaws.com/v1/metrics)\n * using SigV4.\n *\n * Lands in: CloudWatch Metrics — queryable via PromQL alongside the AWS\n * vended namespaces.\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport { JsonMetricsSerializer } from '@opentelemetry/otlp-transformer';\nimport {\n AggregationTemporality,\n type AggregationTemporalitySelector,\n type InstrumentType,\n type PushMetricExporter,\n type ResourceMetrics,\n} from '@opentelemetry/sdk-metrics';\n\nimport { cloudWatchMetricsEndpoint } from './endpoints';\nimport {\n signCloudWatchOtlpRequest,\n type AwsCredentialsProvider,\n} from './sigv4';\n\nexport interface CloudWatchMetricExporterConfig {\n region?: string;\n endpoint?: string;\n credentials?: AwsCredentialsProvider;\n timeoutMs?: number;\n fetchImpl?: typeof fetch;\n /**\n * Aggregation temporality. CloudWatch's OTLP metrics endpoint accepts\n * delta and cumulative; delta is generally cheaper for counters.\n */\n temporalitySelector?: AggregationTemporalitySelector;\n}\n\nconst DEFAULT_TEMPORALITY: AggregationTemporalitySelector = (\n _instrumentType: InstrumentType,\n) => AggregationTemporality.DELTA;\n\nexport class CloudWatchMetricExporter implements PushMetricExporter {\n private readonly region: string;\n private readonly endpoint: string;\n private readonly credentials?: AwsCredentialsProvider;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly temporalitySelector: AggregationTemporalitySelector;\n private shutdownOnce = false;\n\n constructor(config: CloudWatchMetricExporterConfig = {}) {\n const region = config.region ?? process.env.AWS_REGION;\n if (!region) {\n throw new Error(\n 'CloudWatchMetricExporter: `region` is required (pass it explicitly or set AWS_REGION).',\n );\n }\n this.region = region;\n this.endpoint = config.endpoint ?? cloudWatchMetricsEndpoint({ region });\n this.credentials = config.credentials;\n this.timeoutMs = config.timeoutMs ?? 10_000;\n this.fetchImpl = config.fetchImpl ?? globalThis.fetch;\n this.temporalitySelector =\n config.temporalitySelector ?? DEFAULT_TEMPORALITY;\n if (typeof this.fetchImpl !== 'function') {\n throw new TypeError(\n 'CloudWatchMetricExporter: global `fetch` is not available — pass `fetchImpl` explicitly.',\n );\n }\n }\n\n export(\n metrics: ResourceMetrics,\n resultCallback: (result: ExportResult) => void,\n ): void {\n if (this.shutdownOnce) {\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('CloudWatchMetricExporter: already shut down'),\n });\n return;\n }\n\n this.sendBatch(metrics).then(\n () => resultCallback({ code: ExportResultCode.SUCCESS }),\n (error: unknown) =>\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n }\n\n async shutdown(): Promise<void> {\n this.shutdownOnce = true;\n }\n\n async forceFlush(): Promise<void> {}\n\n selectAggregationTemporality(\n instrumentType: InstrumentType,\n ): AggregationTemporality {\n return this.temporalitySelector(instrumentType);\n }\n\n private async sendBatch(metrics: ResourceMetrics): Promise<void> {\n const body = JsonMetricsSerializer.serializeRequest(metrics);\n if (!body) {\n throw new Error('CloudWatchMetricExporter: serializer produced no body');\n }\n\n const headers = await signCloudWatchOtlpRequest({\n url: this.endpoint,\n body,\n region: this.region,\n signal: 'metrics',\n credentials: this.credentials,\n contentType: 'application/json',\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.endpoint, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n const text = await safeReadText(response);\n throw new Error(\n `CloudWatchMetricExporter: HTTP ${response.status} ${response.statusText} ${text}`.trim(),\n );\n }\n }\n}\n\nasync function safeReadText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n"],"mappings":"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"}
@@ -2,7 +2,6 @@ import { ExportResult } from "@opentelemetry/core";
2
2
  import { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
3
3
  import { LogRecordExporter, ReadableLogRecord } from "@opentelemetry/sdk-logs";
4
4
  import { AggregationTemporality, AggregationTemporalitySelector, InstrumentType, PushMetricExporter, ResourceMetrics } from "@opentelemetry/sdk-metrics";
5
-
6
5
  //#region src/cloudwatch/endpoints.d.ts
7
6
  /**
8
7
  * CloudWatch native OTLP HTTP endpoints.
@@ -20,17 +19,11 @@ interface CloudWatchEndpointInput {
20
19
  readonly region: string;
21
20
  }
22
21
  /** Traces — signed against the `xray` service. */
23
- declare function cloudWatchTracesEndpoint({
24
- region
25
- }: CloudWatchEndpointInput): string;
22
+ declare function cloudWatchTracesEndpoint({ region }: CloudWatchEndpointInput): string;
26
23
  /** Logs — signed against the `logs` service. Requires log group/stream headers. */
27
- declare function cloudWatchLogsEndpoint({
28
- region
29
- }: CloudWatchEndpointInput): string;
24
+ declare function cloudWatchLogsEndpoint({ region }: CloudWatchEndpointInput): string;
30
25
  /** Metrics — signed against the `monitoring` service. */
31
- declare function cloudWatchMetricsEndpoint({
32
- region
33
- }: CloudWatchEndpointInput): string;
26
+ declare function cloudWatchMetricsEndpoint({ region }: CloudWatchEndpointInput): string;
34
27
  /**
35
28
  * The SigV4 service name used when signing requests for each endpoint.
36
29
  * These do NOT always match the host prefix — they're the canonical
@@ -1 +1 @@
1
- {"version":3,"file":"cloudwatch.d.cts","names":[],"sources":["../src/cloudwatch/endpoints.ts","../src/cloudwatch/sigv4.ts","../src/cloudwatch/trace-exporter.ts","../src/cloudwatch/log-exporter.ts","../src/cloudwatch/metric-exporter.ts"],"mappings":";;;;;;;;;;;;AAaA;;;;AACiB;AAIjB;UALiB,uBAAA;EAAA,SACN,MAAM;AAAA;;iBAID,wBAAA;EAA2B;AAAA,GAAU,uBAAuB;;iBAK5D,sBAAA;EAAyB;AAAA,GAAU,uBAAuB;AALE;AAAA,iBAU5D,yBAAA;EAA4B;AAAA,GAAU,uBAAuB;;;;;;cAShE,aAAA;EAAA;;;;KAMD,gBAAA,gBAAgC,aAAa;;;UCjCxC,kBAAA;EAAA,SACN,WAAA;EAAA,SACA,eAAA;EAAA,SACA,YAAA;AAAA;AAAA,KAGC,sBAAA,GACR,kBAAA,UACO,kBAAA,GAAqB,OAAA,CAAQ,kBAAA;AAAA,UAEvB,oBAAA;EDF2D;ECI1E,GAAA;EDJyC;ECMzC,IAAA,EAAM,UAAA;EDNoE;ECQ1E,MAAA;EDHc;ECKd,MAAA,EAAQ,gBAAA;;EAER,WAAA,GAAc,sBAAA;EDPyB;ECSvC,iBAAA,GAAoB,MAAA;EDT6B;ECWjD,WAAA;EDXwE;ECaxE,eAAA;AAAA;;;;;;;ADR2E;iBCkBvD,yBAAA,CACpB,KAAA,EAAO,oBAAA,GACN,OAAA,CAAQ,MAAA;;;UCvBM,6BAAA;EFP2D;EES1E,MAAA;EFTyC;EEWzC,QAAA;EFX0E;EEa1E,WAAA,GAAc,sBAAA;EFRA;EEUd,SAAA;;EAEA,SAAA,UAAmB,KAAK;AAAA;;;;AFZgD;AAK1E;;;;;cEmBa,uBAAA,YAAmC,YAAA;EAAA,iBAC7B,MAAA;EAAA,iBACA,QAAA;EAAA,iBACA,WAAA;EAAA,iBACA,SAAA;EAAA,iBACA,SAAA;EAAA,QACT,YAAA;cAEI,MAAA,GAAQ,6BAAA;EAmBpB,MAAA,CACE,KAAA,EAAO,YAAA,IACP,cAAA,GAAiB,MAAA,EAAQ,YAAA;EAwBrB,QAAA,IAAY,OAAA;EAIZ,UAAA,IAAc,OAAA;EAAA,QAIN,SAAA;AAAA;;;UClFC,2BAAA;EACf,MAAA;EACA,QAAA;EACA,WAAA,GAAc,sBAAA;EHX4D;AAAA;AAK5E;;EGWE,QAAA;EHXwE;;;;EGgBxE,SAAA;EHhBwE;AAK1E;;;EGgBE,iBAAA;EACA,SAAA;EACA,SAAA,UAAmB,KAAK;AAAA;AAAA,cAGb,qBAAA,YAAiC,iBAAA;EAAA,iBAC3B,MAAA;EAAA,iBACA,QAAA;EAAA,iBACA,WAAA;EAAA,iBACA,QAAA;EAAA,iBACA,SAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,SAAA;EAAA,iBACA,SAAA;EAAA,QACT,YAAA;cAEI,MAAA,GAAQ,2BAAA;EA8BpB,MAAA,CACE,IAAA,EAAM,iBAAA,IACN,cAAA,GAAiB,MAAA,EAAQ,YAAA;EAwBrB,QAAA,IAAY,OAAA;EAIZ,UAAA,IAAc,OAAA;EAAA,QAEN,SAAA;AAAA;;;UChGC,8BAAA;EACf,MAAA;EACA,QAAA;EACA,WAAA,GAAc,sBAAA;EACd,SAAA;EACA,SAAA,UAAmB,KAAA;EJbgC;;AAAuB;AAK5E;EIaE,mBAAA,GAAsB,8BAAA;AAAA;AAAA,cAOX,wBAAA,YAAoC,kBAAA;EAAA,iBAC9B,MAAA;EAAA,iBACA,QAAA;EAAA,iBACA,WAAA;EAAA,iBACA,SAAA;EAAA,iBACA,SAAA;EAAA,iBACA,mBAAA;EAAA,QACT,YAAA;cAEI,MAAA,GAAQ,8BAAA;EAqBpB,MAAA,CACE,OAAA,EAAS,eAAA,EACT,cAAA,GAAiB,MAAA,EAAQ,YAAA;EAoBrB,QAAA,IAAY,OAAA;EAIZ,UAAA,IAAc,OAAA;EAEpB,4BAAA,CACE,cAAA,EAAgB,cAAA,GACf,sBAAA;EAAA,QAIW,SAAA;AAAA"}
1
+ {"version":3,"file":"cloudwatch.d.cts","names":[],"sources":["../src/cloudwatch/endpoints.ts","../src/cloudwatch/sigv4.ts","../src/cloudwatch/trace-exporter.ts","../src/cloudwatch/log-exporter.ts","../src/cloudwatch/metric-exporter.ts"],"mappings":";;;;;;;;;;;;;;;;;UAaiB;WACN;;;iBAIK,2BACd,UACC;;iBAKa,yBACd,UACC;;iBAKa,4BACd,UACC;;;;;;cASU;;;;;KAMD,gCAAgC;;;UCvC3B;WACN;WACA;WACA;;KAGC,yBACV,4BAA4B,qBAAqB,QAAQ;UAE1C;;EAEf;;EAEA,MAAM;;EAEN;;EAEA,QAAQ;;EAER,cAAc;;EAEd,oBAAoB;;EAEpB;;EAEA;;;;;;;;;iBAUoB,0BACpB,OAAO,uBACN,QAAQ;;;UCzBM;;EAEf;;EAEA;;EAEA,cAAc;;EAEd;;EAEA,mBAAmB;;;;;;;;;;;cAYR,mCAAmC;mBAC7B;mBACA;mBACA;mBACA;mBACA;UACT;EAEI,YAAA,SAAQ;EAmBpB,OACE,OAAO,gBACP,iBAAiB,QAAQ;EAwBrB,YAAY;EAIZ,cAAc;UAIN;;;;UC/EC;EACf;EACA;EACA,cAAc;;;;;EAKd;;;;;EAKA;;;;;EAKA;EACA;EACA,mBAAmB;;cAGR,iCAAiC;mBAC3B;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;EAEI,YAAA,SAAQ;EA+BpB,OACE,MAAM,qBACN,iBAAiB,QAAQ;EAwBrB,YAAY;EAIZ,cAAc;UAEN;;;;UCjGC;EACf;EACA;EACA,cAAc;EACd;EACA,mBAAmB;;;;;EAKnB,sBAAsB;;cAOX,oCAAoC;mBAC9B;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;EAEI,YAAA,SAAQ;EAqBpB,OACE,SAAS,iBACT,iBAAiB,QAAQ;EAoBrB,YAAY;EAIZ,cAAc;EAEpB,6BACE,gBAAgB,iBACf;UAIW"}
@@ -2,7 +2,6 @@ import { ExportResult } from "@opentelemetry/core";
2
2
  import { AggregationTemporality, AggregationTemporalitySelector, InstrumentType, PushMetricExporter, ResourceMetrics } from "@opentelemetry/sdk-metrics";
3
3
  import { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
4
4
  import { LogRecordExporter, ReadableLogRecord } from "@opentelemetry/sdk-logs";
5
-
6
5
  //#region src/cloudwatch/endpoints.d.ts
7
6
  /**
8
7
  * CloudWatch native OTLP HTTP endpoints.
@@ -20,17 +19,11 @@ interface CloudWatchEndpointInput {
20
19
  readonly region: string;
21
20
  }
22
21
  /** Traces — signed against the `xray` service. */
23
- declare function cloudWatchTracesEndpoint({
24
- region
25
- }: CloudWatchEndpointInput): string;
22
+ declare function cloudWatchTracesEndpoint({ region }: CloudWatchEndpointInput): string;
26
23
  /** Logs — signed against the `logs` service. Requires log group/stream headers. */
27
- declare function cloudWatchLogsEndpoint({
28
- region
29
- }: CloudWatchEndpointInput): string;
24
+ declare function cloudWatchLogsEndpoint({ region }: CloudWatchEndpointInput): string;
30
25
  /** Metrics — signed against the `monitoring` service. */
31
- declare function cloudWatchMetricsEndpoint({
32
- region
33
- }: CloudWatchEndpointInput): string;
26
+ declare function cloudWatchMetricsEndpoint({ region }: CloudWatchEndpointInput): string;
34
27
  /**
35
28
  * The SigV4 service name used when signing requests for each endpoint.
36
29
  * These do NOT always match the host prefix — they're the canonical
@@ -1 +1 @@
1
- {"version":3,"file":"cloudwatch.d.ts","names":[],"sources":["../src/cloudwatch/endpoints.ts","../src/cloudwatch/sigv4.ts","../src/cloudwatch/trace-exporter.ts","../src/cloudwatch/log-exporter.ts","../src/cloudwatch/metric-exporter.ts"],"mappings":";;;;;;;;;;;;AAaA;;;;AACiB;AAIjB;UALiB,uBAAA;EAAA,SACN,MAAM;AAAA;;iBAID,wBAAA;EAA2B;AAAA,GAAU,uBAAuB;;iBAK5D,sBAAA;EAAyB;AAAA,GAAU,uBAAuB;AALE;AAAA,iBAU5D,yBAAA;EAA4B;AAAA,GAAU,uBAAuB;;;;;;cAShE,aAAA;EAAA;;;;KAMD,gBAAA,gBAAgC,aAAa;;;UCjCxC,kBAAA;EAAA,SACN,WAAA;EAAA,SACA,eAAA;EAAA,SACA,YAAA;AAAA;AAAA,KAGC,sBAAA,GACR,kBAAA,UACO,kBAAA,GAAqB,OAAA,CAAQ,kBAAA;AAAA,UAEvB,oBAAA;EDF2D;ECI1E,GAAA;EDJyC;ECMzC,IAAA,EAAM,UAAA;EDNoE;ECQ1E,MAAA;EDHc;ECKd,MAAA,EAAQ,gBAAA;;EAER,WAAA,GAAc,sBAAA;EDPyB;ECSvC,iBAAA,GAAoB,MAAA;EDT6B;ECWjD,WAAA;EDXwE;ECaxE,eAAA;AAAA;;;;;;;ADR2E;iBCkBvD,yBAAA,CACpB,KAAA,EAAO,oBAAA,GACN,OAAA,CAAQ,MAAA;;;UCvBM,6BAAA;EFP2D;EES1E,MAAA;EFTyC;EEWzC,QAAA;EFX0E;EEa1E,WAAA,GAAc,sBAAA;EFRA;EEUd,SAAA;;EAEA,SAAA,UAAmB,KAAK;AAAA;;;;AFZgD;AAK1E;;;;;cEmBa,uBAAA,YAAmC,YAAA;EAAA,iBAC7B,MAAA;EAAA,iBACA,QAAA;EAAA,iBACA,WAAA;EAAA,iBACA,SAAA;EAAA,iBACA,SAAA;EAAA,QACT,YAAA;cAEI,MAAA,GAAQ,6BAAA;EAmBpB,MAAA,CACE,KAAA,EAAO,YAAA,IACP,cAAA,GAAiB,MAAA,EAAQ,YAAA;EAwBrB,QAAA,IAAY,OAAA;EAIZ,UAAA,IAAc,OAAA;EAAA,QAIN,SAAA;AAAA;;;UClFC,2BAAA;EACf,MAAA;EACA,QAAA;EACA,WAAA,GAAc,sBAAA;EHX4D;AAAA;AAK5E;;EGWE,QAAA;EHXwE;;;;EGgBxE,SAAA;EHhBwE;AAK1E;;;EGgBE,iBAAA;EACA,SAAA;EACA,SAAA,UAAmB,KAAK;AAAA;AAAA,cAGb,qBAAA,YAAiC,iBAAA;EAAA,iBAC3B,MAAA;EAAA,iBACA,QAAA;EAAA,iBACA,WAAA;EAAA,iBACA,QAAA;EAAA,iBACA,SAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,SAAA;EAAA,iBACA,SAAA;EAAA,QACT,YAAA;cAEI,MAAA,GAAQ,2BAAA;EA8BpB,MAAA,CACE,IAAA,EAAM,iBAAA,IACN,cAAA,GAAiB,MAAA,EAAQ,YAAA;EAwBrB,QAAA,IAAY,OAAA;EAIZ,UAAA,IAAc,OAAA;EAAA,QAEN,SAAA;AAAA;;;UChGC,8BAAA;EACf,MAAA;EACA,QAAA;EACA,WAAA,GAAc,sBAAA;EACd,SAAA;EACA,SAAA,UAAmB,KAAA;EJbgC;;AAAuB;AAK5E;EIaE,mBAAA,GAAsB,8BAAA;AAAA;AAAA,cAOX,wBAAA,YAAoC,kBAAA;EAAA,iBAC9B,MAAA;EAAA,iBACA,QAAA;EAAA,iBACA,WAAA;EAAA,iBACA,SAAA;EAAA,iBACA,SAAA;EAAA,iBACA,mBAAA;EAAA,QACT,YAAA;cAEI,MAAA,GAAQ,8BAAA;EAqBpB,MAAA,CACE,OAAA,EAAS,eAAA,EACT,cAAA,GAAiB,MAAA,EAAQ,YAAA;EAoBrB,QAAA,IAAY,OAAA;EAIZ,UAAA,IAAc,OAAA;EAEpB,4BAAA,CACE,cAAA,EAAgB,cAAA,GACf,sBAAA;EAAA,QAIW,SAAA;AAAA"}
1
+ {"version":3,"file":"cloudwatch.d.ts","names":[],"sources":["../src/cloudwatch/endpoints.ts","../src/cloudwatch/sigv4.ts","../src/cloudwatch/trace-exporter.ts","../src/cloudwatch/log-exporter.ts","../src/cloudwatch/metric-exporter.ts"],"mappings":";;;;;;;;;;;;;;;;;UAaiB;WACN;;;iBAIK,2BACd,UACC;;iBAKa,yBACd,UACC;;iBAKa,4BACd,UACC;;;;;;cASU;;;;;KAMD,gCAAgC;;;UCvC3B;WACN;WACA;WACA;;KAGC,yBACV,4BAA4B,qBAAqB,QAAQ;UAE1C;;EAEf;;EAEA,MAAM;;EAEN;;EAEA,QAAQ;;EAER,cAAc;;EAEd,oBAAoB;;EAEpB;;EAEA;;;;;;;;;iBAUoB,0BACpB,OAAO,uBACN,QAAQ;;;UCzBM;;EAEf;;EAEA;;EAEA,cAAc;;EAEd;;EAEA,mBAAmB;;;;;;;;;;;cAYR,mCAAmC;mBAC7B;mBACA;mBACA;mBACA;mBACA;UACT;EAEI,YAAA,SAAQ;EAmBpB,OACE,OAAO,gBACP,iBAAiB,QAAQ;EAwBrB,YAAY;EAIZ,cAAc;UAIN;;;;UC/EC;EACf;EACA;EACA,cAAc;;;;;EAKd;;;;;EAKA;;;;;EAKA;EACA;EACA,mBAAmB;;cAGR,iCAAiC;mBAC3B;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;EAEI,YAAA,SAAQ;EA+BpB,OACE,MAAM,qBACN,iBAAiB,QAAQ;EAwBrB,YAAY;EAIZ,cAAc;UAEN;;;;UCjGC;EACf;EACA;EACA,cAAc;EACd;EACA,mBAAmB;;;;;EAKnB,sBAAsB;;cAOX,oCAAoC;mBAC9B;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;EAEI,YAAA,SAAQ;EAqBpB,OACE,SAAS,iBACT,iBAAiB,QAAQ;EAoBrB,YAAY;EAIZ,cAAc;EAEpB,6BACE,gBAAgB,iBACf;UAIW"}