From 4e7eb9a41e3d9b6c736274d1d846805b155b3f6a Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Mon, 15 Jun 2026 14:50:07 +0200 Subject: [PATCH 1/3] test(aws-serverless): Add integration coverage for aws-sdk service instrumentation The vendored `@opentelemetry/instrumentation-aws-sdk` had almost no test coverage - only S3 `PutObject` was exercised, leaving DynamoDB, SQS, SNS, Lambda, Kinesis, SecretsManager and StepFunctions (~97% of the service extension code) completely untested. This adds `nock`-based integration tests (mirroring the existing S3 test) covering the span name, op, origin and service-specific attributes for each service the SDK instruments: * S3 - expanded to PutObject, GetObject and an errored GetObject * DynamoDB - PutItem + Query (db.* attributes, op `db`) * SQS - SendMessage + ReceiveMessage (messaging.* attributes, PRODUCER/CONSUMER) * SNS - Publish (messaging.* attributes, topic ARN) * Lambda - Invoke (faas.* attributes) * Kinesis - PutRecord (stream name) * SecretsManager - GetSecretValue (secret ARN) * StepFunctions - StartExecution (state machine ARN) This is step 1 of streamlining the vendored aws-sdk instrumentation - the tests lock in current behavior so the upcoming cleanup and Sentry-API migration can be done safely. Notes: * The new `@aws-sdk/client-*` packages are pinned to `3.1041.0` (matching the existing S3 dep) because newer clients route through `@smithy/core`, which the current instrumentation does not patch. * The Kinesis client is forced onto the HTTP/1 request handler because it defaults to HTTP/2, which `nock` cannot intercept. Addresses step 1 of #20944 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../node-integration-tests/package.json | 9 +- .../aws-integration/dynamodb/scenario.js | 52 ++ .../aws-integration/dynamodb/test.ts | 51 ++ .../aws-integration/kinesis/scenario.js | 41 ++ .../aws-integration/kinesis/test.ts | 36 ++ .../aws-integration/lambda/scenario.js | 36 ++ .../aws-integration/lambda/test.ts | 37 ++ .../aws-integration/s3/scenario.js | 49 +- .../aws-serverless/aws-integration/s3/test.ts | 74 ++- .../secretsmanager/scenario.js | 36 ++ .../aws-integration/secretsmanager/test.ts | 35 ++ .../aws-integration/sns/scenario.js | 38 ++ .../aws-integration/sns/test.ts | 38 ++ .../aws-integration/sqs/scenario.js | 51 ++ .../aws-integration/sqs/test.ts | 52 ++ .../aws-integration/stepfunctions/scenario.js | 36 ++ .../aws-integration/stepfunctions/test.ts | 36 ++ yarn.lock | 461 +++++++++++++++++- 18 files changed, 1125 insertions(+), 43 deletions(-) create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/scenario.js create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/test.ts create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/scenario.js create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/test.ts create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/scenario.js create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/test.ts create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/scenario.js create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/test.ts create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/scenario.js create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/test.ts create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/scenario.js create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/test.ts create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/scenario.js create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/test.ts diff --git a/dev-packages/node-integration-tests/package.json b/dev-packages/node-integration-tests/package.json index 64d418c674fb..4bc20e276601 100644 --- a/dev-packages/node-integration-tests/package.json +++ b/dev-packages/node-integration-tests/package.json @@ -25,7 +25,14 @@ "dependencies": { "@anthropic-ai/sdk": "0.63.0", "@apollo/server": "^5.5.0", - "@aws-sdk/client-s3": "^3.1041.0", + "@aws-sdk/client-dynamodb": "3.1041.0", + "@aws-sdk/client-kinesis": "3.1041.0", + "@aws-sdk/client-lambda": "3.1041.0", + "@aws-sdk/client-s3": "3.1041.0", + "@aws-sdk/client-secrets-manager": "3.1041.0", + "@aws-sdk/client-sfn": "3.1041.0", + "@aws-sdk/client-sns": "3.1041.0", + "@aws-sdk/client-sqs": "3.1041.0", "@google/genai": "^1.20.0", "@growthbook/growthbook": "^1.6.1", "@hapi/hapi": "^21.3.10", diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/scenario.js new file mode 100644 index 000000000000..c1b1e6d3b4c8 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/scenario.js @@ -0,0 +1,52 @@ +const { loggingTransport } = require('@sentry-internal/node-integration-tests'); +const Sentry = require('@sentry/aws-serverless'); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + tracesSampleRate: 1.0, + transport: loggingTransport, +}); + +const { DynamoDBClient, PutItemCommand, QueryCommand } = require('@aws-sdk/client-dynamodb'); +const nock = require('nock'); + +nock.disableNetConnect(); + +const region = 'us-east-1'; + +async function run() { + await Sentry.startSpan({ name: 'Test Transaction' }, async () => { + const client = new DynamoDBClient({ + region, + credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, + maxAttempts: 1, + }); + + nock(`https://dynamodb.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({}), { 'content-type': 'application/x-amz-json-1.0' }); + + await client.send( + new PutItemCommand({ + TableName: 'my-table', + Item: { id: { S: 'some-id' } }, + }), + ); + + nock(`https://dynamodb.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ Items: [{ id: { S: 'some-id' } }], Count: 1, ScannedCount: 1 }), { + 'content-type': 'application/x-amz-json-1.0', + }); + + await client.send( + new QueryCommand({ + TableName: 'my-table', + KeyConditionExpression: 'id = :id', + ExpressionAttributeValues: { ':id': { S: 'some-id' } }, + }), + ); + }); +} + +run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/test.ts new file mode 100644 index 000000000000..c3c55cb6e854 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/test.ts @@ -0,0 +1,51 @@ +import { afterAll, describe, expect, test } from 'vitest'; +import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; + +describe('awsIntegration - DynamoDB', () => { + afterAll(() => { + cleanupChildProcesses(); + }); + + test('auto-instruments DynamoDB operations', async () => { + await createRunner(__dirname, 'scenario.js') + .ignore('event') + .expect({ + transaction: { + transaction: 'Test Transaction', + spans: expect.arrayContaining([ + expect.objectContaining({ + description: 'DynamoDB.PutItem', + op: 'db', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'sentry.origin': 'auto.otel.aws', + 'sentry.op': 'db', + 'rpc.system': 'aws-api', + 'rpc.method': 'PutItem', + 'rpc.service': 'DynamoDB', + 'db.system': 'dynamodb', + 'db.name': 'my-table', + 'db.operation': 'PutItem', + 'aws.dynamodb.table_names': ['my-table'], + 'otel.kind': 'CLIENT', + }), + }), + expect.objectContaining({ + description: 'DynamoDB.Query', + op: 'db', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'rpc.method': 'Query', + 'db.operation': 'Query', + 'db.name': 'my-table', + 'aws.dynamodb.count': 1, + 'aws.dynamodb.scanned_count': 1, + }), + }), + ]), + }, + }) + .start() + .completed(); + }); +}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/scenario.js new file mode 100644 index 000000000000..ec759aa94dfd --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/scenario.js @@ -0,0 +1,41 @@ +const { loggingTransport } = require('@sentry-internal/node-integration-tests'); +const Sentry = require('@sentry/aws-serverless'); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + tracesSampleRate: 1.0, + transport: loggingTransport, +}); + +const { KinesisClient, PutRecordCommand } = require('@aws-sdk/client-kinesis'); +// The Kinesis client defaults to an HTTP/2 request handler, which `nock` cannot intercept. +// Force the HTTP/1 handler so the request is mocked instead of hitting real AWS. +const { NodeHttpHandler } = require('@smithy/node-http-handler'); +const nock = require('nock'); + +nock.disableNetConnect(); + +const region = 'us-east-1'; + +async function run() { + await Sentry.startSpan({ name: 'Test Transaction' }, async () => { + const client = new KinesisClient({ + region, + credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, + maxAttempts: 1, + requestHandler: new NodeHttpHandler(), + }); + + nock(`https://kinesis.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ SequenceNumber: '1', ShardId: 'shardId-000000000000' }), { + 'content-type': 'application/x-amz-json-1.1', + }); + + await client.send( + new PutRecordCommand({ StreamName: 'my-stream', Data: Buffer.from('data'), PartitionKey: 'partition-key' }), + ); + }); +} + +run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/test.ts new file mode 100644 index 000000000000..d89aabdd07f9 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/test.ts @@ -0,0 +1,36 @@ +import { afterAll, describe, expect, test } from 'vitest'; +import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; + +describe('awsIntegration - Kinesis', () => { + afterAll(() => { + cleanupChildProcesses(); + }); + + test('auto-instruments Kinesis operations, setting the stream name', async () => { + await createRunner(__dirname, 'scenario.js') + .ignore('event') + .expect({ + transaction: { + transaction: 'Test Transaction', + spans: expect.arrayContaining([ + expect.objectContaining({ + description: 'Kinesis.PutRecord', + op: 'rpc', + origin: 'auto.otel.aws', + status: 'ok', + data: expect.objectContaining({ + 'sentry.origin': 'auto.otel.aws', + 'rpc.system': 'aws-api', + 'rpc.method': 'PutRecord', + 'rpc.service': 'Kinesis', + 'aws.kinesis.stream.name': 'my-stream', + 'otel.kind': 'CLIENT', + }), + }), + ]), + }, + }) + .start() + .completed(); + }); +}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/scenario.js new file mode 100644 index 000000000000..c7a9bdff8280 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/scenario.js @@ -0,0 +1,36 @@ +const { loggingTransport } = require('@sentry-internal/node-integration-tests'); +const Sentry = require('@sentry/aws-serverless'); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + tracesSampleRate: 1.0, + transport: loggingTransport, +}); + +const { LambdaClient, InvokeCommand } = require('@aws-sdk/client-lambda'); +const nock = require('nock'); + +nock.disableNetConnect(); + +const region = 'us-east-1'; + +async function run() { + await Sentry.startSpan({ name: 'Test Transaction' }, async () => { + const client = new LambdaClient({ + region, + credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, + maxAttempts: 1, + }); + + nock(`https://lambda.${region}.amazonaws.com`) + .post('/2015-03-31/functions/my-function/invocations') + .reply(200, JSON.stringify({ result: 'ok' }), { + 'content-type': 'application/json', + 'x-amzn-requestid': 'request-id-1', + }); + + await client.send(new InvokeCommand({ FunctionName: 'my-function' })); + }); +} + +run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/test.ts new file mode 100644 index 000000000000..a0784c24dc5f --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/test.ts @@ -0,0 +1,37 @@ +import { afterAll, describe, expect, test } from 'vitest'; +import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; + +describe('awsIntegration - Lambda', () => { + afterAll(() => { + cleanupChildProcesses(); + }); + + test('auto-instruments Lambda invoke, setting faas attributes', async () => { + await createRunner(__dirname, 'scenario.js') + .ignore('event') + .expect({ + transaction: { + transaction: 'Test Transaction', + spans: expect.arrayContaining([ + expect.objectContaining({ + description: 'my-function Invoke', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'sentry.origin': 'auto.otel.aws', + 'rpc.system': 'aws-api', + 'rpc.method': 'Invoke', + 'rpc.service': 'Lambda', + 'faas.invoked_name': 'my-function', + 'faas.invoked_provider': 'aws', + 'faas.execution': 'request-id-1', + 'otel.kind': 'CLIENT', + }), + }), + ]), + }, + }) + .start() + .completed(); + }); +}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/scenario.js index 0dc77ebbeb24..9377a1be2be0 100644 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/scenario.js +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/scenario.js @@ -4,32 +4,47 @@ const Sentry = require('@sentry/aws-serverless'); Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', tracesSampleRate: 1.0, - debug: true, transport: loggingTransport, }); const { S3 } = require('@aws-sdk/client-s3'); const nock = require('nock'); -async function run() { - const bucketName = 'aws-test-bucket'; - const keyName = 'aws-test-object.txt'; - - nock(`https://${bucketName}.s3.amazonaws.com`).get(`/${keyName}`).reply(200, 'contents'); - nock(`https://${bucketName}.s3.amazonaws.com`).put(`/${keyName}`).reply(200, 'contents'); +nock.disableNetConnect(); +async function run() { await Sentry.startSpan({ name: 'Test Transaction' }, async () => { const region = 'us-east-1'; - const s3Client = new S3({ region }); - nock(`https://ot-demo-test.s3.${region}.amazonaws.com/`) - .put('/aws-ot-s3-test-object.txt?x-id=PutObject') - .reply(200, 'test'); - - const params = { - Bucket: 'ot-demo-test', - Key: 'aws-ot-s3-test-object.txt', - }; - await s3Client.putObject(params); + const s3Client = new S3({ + region, + credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, + maxAttempts: 1, + }); + const host = `https://ot-demo-test.s3.${region}.amazonaws.com`; + + // Successful PutObject + nock(host).put('/aws-ot-s3-test-object.txt?x-id=PutObject').reply(200, 'test'); + await s3Client.putObject({ Bucket: 'ot-demo-test', Key: 'aws-ot-s3-test-object.txt' }); + + // Successful GetObject + nock(host).get('/aws-ot-s3-test-object.txt?x-id=GetObject').reply(200, 'contents'); + const getResult = await s3Client.getObject({ Bucket: 'ot-demo-test', Key: 'aws-ot-s3-test-object.txt' }); + // Drain the body so the request fully completes + await getResult.Body?.transformToString(); + + // Failing GetObject (missing key) - should produce a span with error status + nock(host) + .get('/missing-object.txt?x-id=GetObject') + .reply( + 404, + 'NoSuchKeyThe specified key does not exist.', + { 'content-type': 'application/xml' }, + ); + try { + await s3Client.getObject({ Bucket: 'ot-demo-test', Key: 'missing-object.txt' }); + } catch { + // expected + } }); } diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/test.ts index a6fdc2ce88af..7bfbbe6e4163 100644 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/test.ts +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/test.ts @@ -1,36 +1,62 @@ import { afterAll, describe, expect, test } from 'vitest'; import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; -const EXPECTED_TRANSCATION = { - transaction: 'Test Transaction', - spans: expect.arrayContaining([ - expect.objectContaining({ - description: 'S3.PutObject', - op: 'rpc', - origin: 'auto.otel.aws', - data: expect.objectContaining({ - 'sentry.origin': 'auto.otel.aws', - 'sentry.op': 'rpc', - 'rpc.system': 'aws-api', - 'rpc.method': 'PutObject', - 'rpc.service': 'S3', - 'cloud.region': 'us-east-1', - 'aws.s3.bucket': 'ot-demo-test', - 'otel.kind': 'CLIENT', - }), - }), - ]), -}; - -describe('awsIntegration', () => { +describe('awsIntegration - S3', () => { afterAll(() => { cleanupChildProcesses(); }); - test('should auto-instrument aws-sdk v2 package.', async () => { + test('auto-instruments S3 operations and captures errors', async () => { await createRunner(__dirname, 'scenario.js') .ignore('event') - .expect({ transaction: EXPECTED_TRANSCATION }) + .expect({ + transaction: { + transaction: 'Test Transaction', + spans: expect.arrayContaining([ + // Successful PutObject + expect.objectContaining({ + description: 'S3.PutObject', + op: 'rpc', + origin: 'auto.otel.aws', + status: 'ok', + data: expect.objectContaining({ + 'sentry.origin': 'auto.otel.aws', + 'sentry.op': 'rpc', + 'rpc.system': 'aws-api', + 'rpc.method': 'PutObject', + 'rpc.service': 'S3', + 'cloud.region': 'us-east-1', + 'aws.s3.bucket': 'ot-demo-test', + 'otel.kind': 'CLIENT', + }), + }), + // Successful GetObject + expect.objectContaining({ + description: 'S3.GetObject', + op: 'rpc', + origin: 'auto.otel.aws', + status: 'ok', + data: expect.objectContaining({ + 'rpc.method': 'GetObject', + 'rpc.service': 'S3', + 'aws.s3.bucket': 'ot-demo-test', + }), + }), + // Failing GetObject (missing key) - span is marked as errored + expect.objectContaining({ + description: 'S3.GetObject', + op: 'rpc', + origin: 'auto.otel.aws', + status: 'internal_error', + data: expect.objectContaining({ + 'rpc.method': 'GetObject', + 'rpc.service': 'S3', + 'aws.s3.bucket': 'ot-demo-test', + }), + }), + ]), + }, + }) .start() .completed(); }); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/scenario.js new file mode 100644 index 000000000000..2ec2eb411f14 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/scenario.js @@ -0,0 +1,36 @@ +const { loggingTransport } = require('@sentry-internal/node-integration-tests'); +const Sentry = require('@sentry/aws-serverless'); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + tracesSampleRate: 1.0, + transport: loggingTransport, +}); + +const { SecretsManagerClient, GetSecretValueCommand } = require('@aws-sdk/client-secrets-manager'); +const nock = require('nock'); + +nock.disableNetConnect(); + +const region = 'us-east-1'; +const secretArn = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-abc'; + +async function run() { + await Sentry.startSpan({ name: 'Test Transaction' }, async () => { + const client = new SecretsManagerClient({ + region, + credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, + maxAttempts: 1, + }); + + nock(`https://secretsmanager.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ ARN: secretArn, Name: 'my-secret', SecretString: 'secret-value' }), { + 'content-type': 'application/x-amz-json-1.1', + }); + + await client.send(new GetSecretValueCommand({ SecretId: secretArn })); + }); +} + +run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/test.ts new file mode 100644 index 000000000000..c895008c144b --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/test.ts @@ -0,0 +1,35 @@ +import { afterAll, describe, expect, test } from 'vitest'; +import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; + +describe('awsIntegration - SecretsManager', () => { + afterAll(() => { + cleanupChildProcesses(); + }); + + test('auto-instruments SecretsManager operations, setting the secret ARN', async () => { + await createRunner(__dirname, 'scenario.js') + .ignore('event') + .expect({ + transaction: { + transaction: 'Test Transaction', + spans: expect.arrayContaining([ + expect.objectContaining({ + description: 'SecretsManager.GetSecretValue', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'sentry.origin': 'auto.otel.aws', + 'rpc.system': 'aws-api', + 'rpc.method': 'GetSecretValue', + 'rpc.service': 'SecretsManager', + 'aws.secretsmanager.secret.arn': 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-abc', + 'otel.kind': 'CLIENT', + }), + }), + ]), + }, + }) + .start() + .completed(); + }); +}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/scenario.js new file mode 100644 index 000000000000..01e4981ad378 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/scenario.js @@ -0,0 +1,38 @@ +const { loggingTransport } = require('@sentry-internal/node-integration-tests'); +const Sentry = require('@sentry/aws-serverless'); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + tracesSampleRate: 1.0, + transport: loggingTransport, +}); + +const { SNSClient, PublishCommand } = require('@aws-sdk/client-sns'); +const nock = require('nock'); + +nock.disableNetConnect(); + +const region = 'us-east-1'; +const topicArn = 'arn:aws:sns:us-east-1:123456789012:my-topic'; + +async function run() { + await Sentry.startSpan({ name: 'Test Transaction' }, async () => { + const client = new SNSClient({ + region, + credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, + maxAttempts: 1, + }); + + nock(`https://sns.${region}.amazonaws.com`) + .post('/') + .reply( + 200, + 'message-id-1request-id-1', + { 'content-type': 'text/xml' }, + ); + + await client.send(new PublishCommand({ TopicArn: topicArn, Message: 'Hello from Sentry' })); + }); +} + +run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/test.ts new file mode 100644 index 000000000000..0c6a9c4bfb67 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/test.ts @@ -0,0 +1,38 @@ +import { afterAll, describe, expect, test } from 'vitest'; +import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; + +describe('awsIntegration - SNS', () => { + afterAll(() => { + cleanupChildProcesses(); + }); + + test('auto-instruments SNS publish, setting messaging attributes', async () => { + await createRunner(__dirname, 'scenario.js') + .ignore('event') + .expect({ + transaction: { + transaction: 'Test Transaction', + spans: expect.arrayContaining([ + expect.objectContaining({ + description: 'my-topic send', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'sentry.origin': 'auto.otel.aws', + 'rpc.system': 'aws-api', + 'rpc.method': 'Publish', + 'rpc.service': 'SNS', + 'messaging.system': 'aws.sns', + 'messaging.destination': 'my-topic', + 'messaging.destination.name': 'arn:aws:sns:us-east-1:123456789012:my-topic', + 'aws.sns.topic.arn': 'arn:aws:sns:us-east-1:123456789012:my-topic', + 'otel.kind': 'PRODUCER', + }), + }), + ]), + }, + }) + .start() + .completed(); + }); +}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/scenario.js new file mode 100644 index 000000000000..ca4fd689bea4 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/scenario.js @@ -0,0 +1,51 @@ +const crypto = require('crypto'); +const { loggingTransport } = require('@sentry-internal/node-integration-tests'); +const Sentry = require('@sentry/aws-serverless'); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + tracesSampleRate: 1.0, + transport: loggingTransport, +}); + +const { SQSClient, SendMessageCommand, ReceiveMessageCommand } = require('@aws-sdk/client-sqs'); +const nock = require('nock'); + +nock.disableNetConnect(); + +const region = 'us-east-1'; +const queueUrl = `https://sqs.${region}.amazonaws.com/123456789012/my-queue`; +const messageBody = 'Hello from Sentry'; +const md5 = crypto.createHash('md5').update(messageBody).digest('hex'); + +async function run() { + await Sentry.startSpan({ name: 'Test Transaction' }, async () => { + const client = new SQSClient({ + region, + credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, + maxAttempts: 1, + }); + + nock(`https://sqs.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ MessageId: 'message-id-1', MD5OfMessageBody: md5 }), { + 'content-type': 'application/x-amz-json-1.0', + }); + + await client.send(new SendMessageCommand({ QueueUrl: queueUrl, MessageBody: messageBody })); + + nock(`https://sqs.${region}.amazonaws.com`) + .post('/') + .reply( + 200, + JSON.stringify({ + Messages: [{ MessageId: 'message-id-2', Body: messageBody, MD5OfBody: md5, ReceiptHandle: 'handle' }], + }), + { 'content-type': 'application/x-amz-json-1.0' }, + ); + + await client.send(new ReceiveMessageCommand({ QueueUrl: queueUrl })); + }); +} + +run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/test.ts new file mode 100644 index 000000000000..f62e46f68021 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/test.ts @@ -0,0 +1,52 @@ +import { afterAll, describe, expect, test } from 'vitest'; +import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; + +describe('awsIntegration - SQS', () => { + afterAll(() => { + cleanupChildProcesses(); + }); + + test('auto-instruments SQS send and receive, setting messaging attributes', async () => { + await createRunner(__dirname, 'scenario.js') + .ignore('event') + .expect({ + transaction: { + transaction: 'Test Transaction', + spans: expect.arrayContaining([ + expect.objectContaining({ + description: 'my-queue send', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'sentry.origin': 'auto.otel.aws', + 'rpc.system': 'aws-api', + 'rpc.method': 'SendMessage', + 'rpc.service': 'SQS', + 'messaging.system': 'aws_sqs', + 'messaging.destination.name': 'my-queue', + 'url.full': 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue', + 'messaging.message.id': 'message-id-1', + 'otel.kind': 'PRODUCER', + }), + }), + expect.objectContaining({ + description: 'my-queue receive', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'rpc.method': 'ReceiveMessage', + 'rpc.service': 'SQS', + 'messaging.system': 'aws_sqs', + 'messaging.destination.name': 'my-queue', + 'messaging.operation.type': 'receive', + 'messaging.batch.message_count': 1, + 'otel.kind': 'CONSUMER', + }), + }), + ]), + }, + }) + .start() + .completed(); + }); +}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/scenario.js new file mode 100644 index 000000000000..28057990c8c5 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/scenario.js @@ -0,0 +1,36 @@ +const { loggingTransport } = require('@sentry-internal/node-integration-tests'); +const Sentry = require('@sentry/aws-serverless'); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + tracesSampleRate: 1.0, + transport: loggingTransport, +}); + +const { SFNClient, StartExecutionCommand } = require('@aws-sdk/client-sfn'); +const nock = require('nock'); + +nock.disableNetConnect(); + +const region = 'us-east-1'; +const stateMachineArn = 'arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine'; + +async function run() { + await Sentry.startSpan({ name: 'Test Transaction' }, async () => { + const client = new SFNClient({ + region, + credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, + maxAttempts: 1, + }); + + nock(`https://states.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ executionArn: `${stateMachineArn}:execution-1`, startDate: 1 }), { + 'content-type': 'application/x-amz-json-1.0', + }); + + await client.send(new StartExecutionCommand({ stateMachineArn, input: '{}' })); + }); +} + +run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/test.ts new file mode 100644 index 000000000000..430fe5a00420 --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/test.ts @@ -0,0 +1,36 @@ +import { afterAll, describe, expect, test } from 'vitest'; +import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; + +describe('awsIntegration - StepFunctions', () => { + afterAll(() => { + cleanupChildProcesses(); + }); + + test('auto-instruments StepFunctions operations, setting the state machine ARN', async () => { + await createRunner(__dirname, 'scenario.js') + .ignore('event') + .expect({ + transaction: { + transaction: 'Test Transaction', + spans: expect.arrayContaining([ + expect.objectContaining({ + description: 'SFN.StartExecution', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'sentry.origin': 'auto.otel.aws', + 'rpc.system': 'aws-api', + 'rpc.method': 'StartExecution', + 'rpc.service': 'SFN', + 'aws.step_functions.state_machine.arn': + 'arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine', + 'otel.kind': 'CLIENT', + }), + }), + ]), + }, + }) + .start() + .completed(); + }); +}); diff --git a/yarn.lock b/yarn.lock index e6d958af0dd5..d2118591b082 100644 --- a/yarn.lock +++ b/yarn.lock @@ -734,7 +734,154 @@ "@smithy/util-utf8" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/client-s3@^3.1041.0": +"@aws-sdk/client-dynamodb@3.1041.0": + version "3.1041.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.1041.0.tgz#3546d3527c73c3c8ebc8b5b5424f8e1a4a90230e" + integrity sha512-q0dhIfdm3R9EEElaUXvoLD0EBm4KYPcJC4So/skToMPACiznNgVI2Vup4PKM716KTaDsIcF8V1EA7s33H7oWMg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/credential-provider-node" "^3.972.39" + "@aws-sdk/dynamodb-codec" "^3.973.8" + "@aws-sdk/middleware-endpoint-discovery" "^3.972.11" + "@aws-sdk/middleware-host-header" "^3.972.10" + "@aws-sdk/middleware-logger" "^3.972.10" + "@aws-sdk/middleware-recursion-detection" "^3.972.11" + "@aws-sdk/middleware-user-agent" "^3.972.38" + "@aws-sdk/region-config-resolver" "^3.972.13" + "@aws-sdk/types" "^3.973.8" + "@aws-sdk/util-endpoints" "^3.996.8" + "@aws-sdk/util-user-agent-browser" "^3.972.10" + "@aws-sdk/util-user-agent-node" "^3.973.24" + "@smithy/config-resolver" "^4.4.17" + "@smithy/core" "^3.23.17" + "@smithy/fetch-http-handler" "^5.3.17" + "@smithy/hash-node" "^4.2.14" + "@smithy/invalid-dependency" "^4.2.14" + "@smithy/middleware-content-length" "^4.2.14" + "@smithy/middleware-endpoint" "^4.4.32" + "@smithy/middleware-retry" "^4.5.7" + "@smithy/middleware-serde" "^4.2.20" + "@smithy/middleware-stack" "^4.2.14" + "@smithy/node-config-provider" "^4.3.14" + "@smithy/node-http-handler" "^4.6.1" + "@smithy/protocol-http" "^5.3.14" + "@smithy/smithy-client" "^4.12.13" + "@smithy/types" "^4.14.1" + "@smithy/url-parser" "^4.2.14" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.49" + "@smithy/util-defaults-mode-node" "^4.2.54" + "@smithy/util-endpoints" "^3.4.2" + "@smithy/util-middleware" "^4.2.14" + "@smithy/util-retry" "^4.3.6" + "@smithy/util-utf8" "^4.2.2" + "@smithy/util-waiter" "^4.3.0" + tslib "^2.6.2" + +"@aws-sdk/client-kinesis@3.1041.0": + version "3.1041.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-kinesis/-/client-kinesis-3.1041.0.tgz#2cb45017df8d2f0c761ee136ab99b5db92dd689f" + integrity sha512-FxBNTRbsqhltzU5r5k9/Df5xK4be73+3grhy9yFIsNItIL6J4QP8u/YDoYx0S6og6nRjhLNcU2jGK0UVqX/qzw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/credential-provider-node" "^3.972.39" + "@aws-sdk/middleware-host-header" "^3.972.10" + "@aws-sdk/middleware-logger" "^3.972.10" + "@aws-sdk/middleware-recursion-detection" "^3.972.11" + "@aws-sdk/middleware-user-agent" "^3.972.38" + "@aws-sdk/region-config-resolver" "^3.972.13" + "@aws-sdk/types" "^3.973.8" + "@aws-sdk/util-endpoints" "^3.996.8" + "@aws-sdk/util-user-agent-browser" "^3.972.10" + "@aws-sdk/util-user-agent-node" "^3.973.24" + "@smithy/config-resolver" "^4.4.17" + "@smithy/core" "^3.23.17" + "@smithy/eventstream-serde-browser" "^4.2.14" + "@smithy/eventstream-serde-config-resolver" "^4.3.14" + "@smithy/eventstream-serde-node" "^4.2.14" + "@smithy/fetch-http-handler" "^5.3.17" + "@smithy/hash-node" "^4.2.14" + "@smithy/invalid-dependency" "^4.2.14" + "@smithy/middleware-content-length" "^4.2.14" + "@smithy/middleware-endpoint" "^4.4.32" + "@smithy/middleware-retry" "^4.5.7" + "@smithy/middleware-serde" "^4.2.20" + "@smithy/middleware-stack" "^4.2.14" + "@smithy/node-config-provider" "^4.3.14" + "@smithy/node-http-handler" "^4.6.1" + "@smithy/protocol-http" "^5.3.14" + "@smithy/smithy-client" "^4.12.13" + "@smithy/types" "^4.14.1" + "@smithy/url-parser" "^4.2.14" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.49" + "@smithy/util-defaults-mode-node" "^4.2.54" + "@smithy/util-endpoints" "^3.4.2" + "@smithy/util-middleware" "^4.2.14" + "@smithy/util-retry" "^4.3.6" + "@smithy/util-utf8" "^4.2.2" + "@smithy/util-waiter" "^4.3.0" + tslib "^2.6.2" + +"@aws-sdk/client-lambda@3.1041.0": + version "3.1041.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.1041.0.tgz#75396d2d18a7b969d1f388fbd88950a5fcd4bc02" + integrity sha512-J8zz0t+HPLwJblG4PdVlAJ93DxtMkYHHfD+lpTvmzQ6LBBfexbC+d31l8DcmUrbV2dK8dCreldjYlXSe/X6sQA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/credential-provider-node" "^3.972.39" + "@aws-sdk/middleware-host-header" "^3.972.10" + "@aws-sdk/middleware-logger" "^3.972.10" + "@aws-sdk/middleware-recursion-detection" "^3.972.11" + "@aws-sdk/middleware-user-agent" "^3.972.38" + "@aws-sdk/region-config-resolver" "^3.972.13" + "@aws-sdk/types" "^3.973.8" + "@aws-sdk/util-endpoints" "^3.996.8" + "@aws-sdk/util-user-agent-browser" "^3.972.10" + "@aws-sdk/util-user-agent-node" "^3.973.24" + "@smithy/config-resolver" "^4.4.17" + "@smithy/core" "^3.23.17" + "@smithy/eventstream-serde-browser" "^4.2.14" + "@smithy/eventstream-serde-config-resolver" "^4.3.14" + "@smithy/eventstream-serde-node" "^4.2.14" + "@smithy/fetch-http-handler" "^5.3.17" + "@smithy/hash-node" "^4.2.14" + "@smithy/invalid-dependency" "^4.2.14" + "@smithy/middleware-content-length" "^4.2.14" + "@smithy/middleware-endpoint" "^4.4.32" + "@smithy/middleware-retry" "^4.5.7" + "@smithy/middleware-serde" "^4.2.20" + "@smithy/middleware-stack" "^4.2.14" + "@smithy/node-config-provider" "^4.3.14" + "@smithy/node-http-handler" "^4.6.1" + "@smithy/protocol-http" "^5.3.14" + "@smithy/smithy-client" "^4.12.13" + "@smithy/types" "^4.14.1" + "@smithy/url-parser" "^4.2.14" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.49" + "@smithy/util-defaults-mode-node" "^4.2.54" + "@smithy/util-endpoints" "^3.4.2" + "@smithy/util-middleware" "^4.2.14" + "@smithy/util-retry" "^4.3.6" + "@smithy/util-stream" "^4.5.25" + "@smithy/util-utf8" "^4.2.2" + "@smithy/util-waiter" "^4.3.0" + tslib "^2.6.2" + +"@aws-sdk/client-s3@3.1041.0": version "3.1041.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.1041.0.tgz#474b3f99a688554b51d5c65aed713605408adbc8" integrity sha512-sQV14bIqslnBHuSlLMD+fc3pH+ajop6vnrFlJ4wM4JDqcYwVik4O+9srnZUrkesFw5y+CN0GfOQ06CAgtC4mjQ== @@ -795,6 +942,188 @@ "@smithy/util-waiter" "^4.3.0" tslib "^2.6.2" +"@aws-sdk/client-secrets-manager@3.1041.0": + version "3.1041.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1041.0.tgz#ffadb29bfb0c33000fc312632954f92d69999e74" + integrity sha512-dr4AbZ5hIDyecKHWyYy0LhK3h6q/jd6QWem46wyHulJ6IBRPENlpB7iXo7KKFWkgKSweCEqjHVB5W+3WB4JiYw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/credential-provider-node" "^3.972.39" + "@aws-sdk/middleware-host-header" "^3.972.10" + "@aws-sdk/middleware-logger" "^3.972.10" + "@aws-sdk/middleware-recursion-detection" "^3.972.11" + "@aws-sdk/middleware-user-agent" "^3.972.38" + "@aws-sdk/region-config-resolver" "^3.972.13" + "@aws-sdk/types" "^3.973.8" + "@aws-sdk/util-endpoints" "^3.996.8" + "@aws-sdk/util-user-agent-browser" "^3.972.10" + "@aws-sdk/util-user-agent-node" "^3.973.24" + "@smithy/config-resolver" "^4.4.17" + "@smithy/core" "^3.23.17" + "@smithy/fetch-http-handler" "^5.3.17" + "@smithy/hash-node" "^4.2.14" + "@smithy/invalid-dependency" "^4.2.14" + "@smithy/middleware-content-length" "^4.2.14" + "@smithy/middleware-endpoint" "^4.4.32" + "@smithy/middleware-retry" "^4.5.7" + "@smithy/middleware-serde" "^4.2.20" + "@smithy/middleware-stack" "^4.2.14" + "@smithy/node-config-provider" "^4.3.14" + "@smithy/node-http-handler" "^4.6.1" + "@smithy/protocol-http" "^5.3.14" + "@smithy/smithy-client" "^4.12.13" + "@smithy/types" "^4.14.1" + "@smithy/url-parser" "^4.2.14" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.49" + "@smithy/util-defaults-mode-node" "^4.2.54" + "@smithy/util-endpoints" "^3.4.2" + "@smithy/util-middleware" "^4.2.14" + "@smithy/util-retry" "^4.3.6" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@aws-sdk/client-sfn@3.1041.0": + version "3.1041.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sfn/-/client-sfn-3.1041.0.tgz#ce0e66ab24bcd39cff6e410f47ebd700da8c42d3" + integrity sha512-13IXU/aoxY0do8SjIOlpU8FouoPclhrJEqrox3fzynk2jz4ccdPxYLQM+rSQJxpDTUdQ6HfdvOtIvaFRK8DQMA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/credential-provider-node" "^3.972.39" + "@aws-sdk/middleware-host-header" "^3.972.10" + "@aws-sdk/middleware-logger" "^3.972.10" + "@aws-sdk/middleware-recursion-detection" "^3.972.11" + "@aws-sdk/middleware-user-agent" "^3.972.38" + "@aws-sdk/region-config-resolver" "^3.972.13" + "@aws-sdk/types" "^3.973.8" + "@aws-sdk/util-endpoints" "^3.996.8" + "@aws-sdk/util-user-agent-browser" "^3.972.10" + "@aws-sdk/util-user-agent-node" "^3.973.24" + "@smithy/config-resolver" "^4.4.17" + "@smithy/core" "^3.23.17" + "@smithy/fetch-http-handler" "^5.3.17" + "@smithy/hash-node" "^4.2.14" + "@smithy/invalid-dependency" "^4.2.14" + "@smithy/middleware-content-length" "^4.2.14" + "@smithy/middleware-endpoint" "^4.4.32" + "@smithy/middleware-retry" "^4.5.7" + "@smithy/middleware-serde" "^4.2.20" + "@smithy/middleware-stack" "^4.2.14" + "@smithy/node-config-provider" "^4.3.14" + "@smithy/node-http-handler" "^4.6.1" + "@smithy/protocol-http" "^5.3.14" + "@smithy/smithy-client" "^4.12.13" + "@smithy/types" "^4.14.1" + "@smithy/url-parser" "^4.2.14" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.49" + "@smithy/util-defaults-mode-node" "^4.2.54" + "@smithy/util-endpoints" "^3.4.2" + "@smithy/util-middleware" "^4.2.14" + "@smithy/util-retry" "^4.3.6" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@aws-sdk/client-sns@3.1041.0": + version "3.1041.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sns/-/client-sns-3.1041.0.tgz#6043e92c361bbdae5b2f9443c5267a7ca2cfe079" + integrity sha512-Fv5dOKbdCmXswAlPW1rDWQ7Ui5RqXr9iQ3NyeZ91PhHLJiJPCvqeLjQuJHfYiDZbMK7okv7Ne/t3+HcQRmJ3Jw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/credential-provider-node" "^3.972.39" + "@aws-sdk/middleware-host-header" "^3.972.10" + "@aws-sdk/middleware-logger" "^3.972.10" + "@aws-sdk/middleware-recursion-detection" "^3.972.11" + "@aws-sdk/middleware-user-agent" "^3.972.38" + "@aws-sdk/region-config-resolver" "^3.972.13" + "@aws-sdk/types" "^3.973.8" + "@aws-sdk/util-endpoints" "^3.996.8" + "@aws-sdk/util-user-agent-browser" "^3.972.10" + "@aws-sdk/util-user-agent-node" "^3.973.24" + "@smithy/config-resolver" "^4.4.17" + "@smithy/core" "^3.23.17" + "@smithy/fetch-http-handler" "^5.3.17" + "@smithy/hash-node" "^4.2.14" + "@smithy/invalid-dependency" "^4.2.14" + "@smithy/middleware-content-length" "^4.2.14" + "@smithy/middleware-endpoint" "^4.4.32" + "@smithy/middleware-retry" "^4.5.7" + "@smithy/middleware-serde" "^4.2.20" + "@smithy/middleware-stack" "^4.2.14" + "@smithy/node-config-provider" "^4.3.14" + "@smithy/node-http-handler" "^4.6.1" + "@smithy/protocol-http" "^5.3.14" + "@smithy/smithy-client" "^4.12.13" + "@smithy/types" "^4.14.1" + "@smithy/url-parser" "^4.2.14" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.49" + "@smithy/util-defaults-mode-node" "^4.2.54" + "@smithy/util-endpoints" "^3.4.2" + "@smithy/util-middleware" "^4.2.14" + "@smithy/util-retry" "^4.3.6" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + +"@aws-sdk/client-sqs@3.1041.0": + version "3.1041.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sqs/-/client-sqs-3.1041.0.tgz#47bf598f23503b58faa3a1f0df8978b0546fa2dc" + integrity sha512-WXKNzmt9e1mNNzdedR6/X8xJuRsM8L5qCbLFLdBEd8gh3R2JqrLXSEwXmtg07aUeT+KGTOoIn23BdfMjM6KEMw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.8" + "@aws-sdk/credential-provider-node" "^3.972.39" + "@aws-sdk/middleware-host-header" "^3.972.10" + "@aws-sdk/middleware-logger" "^3.972.10" + "@aws-sdk/middleware-recursion-detection" "^3.972.11" + "@aws-sdk/middleware-sdk-sqs" "^3.972.22" + "@aws-sdk/middleware-user-agent" "^3.972.38" + "@aws-sdk/region-config-resolver" "^3.972.13" + "@aws-sdk/types" "^3.973.8" + "@aws-sdk/util-endpoints" "^3.996.8" + "@aws-sdk/util-user-agent-browser" "^3.972.10" + "@aws-sdk/util-user-agent-node" "^3.973.24" + "@smithy/config-resolver" "^4.4.17" + "@smithy/core" "^3.23.17" + "@smithy/fetch-http-handler" "^5.3.17" + "@smithy/hash-node" "^4.2.14" + "@smithy/invalid-dependency" "^4.2.14" + "@smithy/md5-js" "^4.2.14" + "@smithy/middleware-content-length" "^4.2.14" + "@smithy/middleware-endpoint" "^4.4.32" + "@smithy/middleware-retry" "^4.5.7" + "@smithy/middleware-serde" "^4.2.20" + "@smithy/middleware-stack" "^4.2.14" + "@smithy/node-config-provider" "^4.3.14" + "@smithy/node-http-handler" "^4.6.1" + "@smithy/protocol-http" "^5.3.14" + "@smithy/smithy-client" "^4.12.13" + "@smithy/types" "^4.14.1" + "@smithy/url-parser" "^4.2.14" + "@smithy/util-base64" "^4.3.2" + "@smithy/util-body-length-browser" "^4.2.2" + "@smithy/util-body-length-node" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.3.49" + "@smithy/util-defaults-mode-node" "^4.2.54" + "@smithy/util-endpoints" "^3.4.2" + "@smithy/util-middleware" "^4.2.14" + "@smithy/util-retry" "^4.3.6" + "@smithy/util-utf8" "^4.2.2" + tslib "^2.6.2" + "@aws-sdk/core@^3.973.5", "@aws-sdk/core@^3.973.6", "@aws-sdk/core@^3.974.8": version "3.974.8" resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.974.8.tgz#cdd51195a31322f1e429e66919eb18da8944c081" @@ -815,6 +1144,20 @@ "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" +"@aws-sdk/core@^3.974.20": + version "3.974.20" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.974.20.tgz#fc9727897662e148fad2276995298f56b587c3ab" + integrity sha512-7sDi2B2N3mc3nf1nz6FyEx/FCrJ1N1QnBmraHHQNabFaeAh2IaOOLml48/rHOD1bICHgTRkbBgNTvUzEr5Z35g== + dependencies: + "@aws-sdk/types" "^3.973.12" + "@aws-sdk/xml-builder" "^3.972.29" + "@aws/lambda-invoke-store" "^0.2.2" + "@smithy/core" "^3.24.6" + "@smithy/signature-v4" "^5.4.6" + "@smithy/types" "^4.14.3" + bowser "^2.11.0" + tslib "^2.6.2" + "@aws-sdk/crc64-nvme@^3.972.7": version "3.972.7" resolved "https://registry.yarnpkg.com/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.7.tgz#0e56fb3ccc0242ed05ffd0bc993d724ce8b3dde2" @@ -978,6 +1321,24 @@ "@smithy/types" "^4.12.0" tslib "^2.6.2" +"@aws-sdk/dynamodb-codec@^3.973.8": + version "3.973.20" + resolved "https://registry.yarnpkg.com/@aws-sdk/dynamodb-codec/-/dynamodb-codec-3.973.20.tgz#9a98587c741fa72106c5c62622d8ae63a3134cb4" + integrity sha512-SFfxiqVgWeIe+RsJJNAMD//2IfehT4bLpGyNJRB0MgHmOIJtdcfMnR1k7KYyaHokSoQVdncVa9O9DIGa4eqcwg== + dependencies: + "@aws-sdk/core" "^3.974.20" + "@smithy/core" "^3.24.6" + "@smithy/types" "^4.14.3" + tslib "^2.6.2" + +"@aws-sdk/endpoint-cache@^3.972.7": + version "3.972.7" + resolved "https://registry.yarnpkg.com/@aws-sdk/endpoint-cache/-/endpoint-cache-3.972.7.tgz#aa586f465e351fb74eddf340e4f67252a9d5d80b" + integrity sha512-LkwS3ZOUNL5kHzmz3dDx8lE3HOhZmf2VGjbJ/tMUZJYWWl3J0RJTZM7RFz1MLt06WDVvlShcAjY/RzhYlqLL7g== + dependencies: + mnemonist "0.38.3" + tslib "^2.6.2" + "@aws-sdk/middleware-bucket-endpoint@^3.972.10": version "3.972.10" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.10.tgz#d26aa88b441d6d1b6e9275ffdc61e0fbfb55a513" @@ -991,6 +1352,17 @@ "@smithy/util-config-provider" "^4.2.2" tslib "^2.6.2" +"@aws-sdk/middleware-endpoint-discovery@^3.972.11": + version "3.972.18" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.972.18.tgz#226d974c1ad33c18fbc2b34ba689af26cf8a86e5" + integrity sha512-1vKJt/6MBB/MBMRM3qzCMdW70syJY8u2DH+dq7yCnPn7wVJmyeAzAa/sK1lIbbYh8BVLbM5FspsT4zbe885gOw== + dependencies: + "@aws-sdk/endpoint-cache" "^3.972.7" + "@aws-sdk/types" "^3.973.12" + "@smithy/core" "^3.24.6" + "@smithy/types" "^4.14.3" + tslib "^2.6.2" + "@aws-sdk/middleware-expect-continue@^3.972.10": version "3.972.10" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.10.tgz#b685287951156a5d093cfdd37364894c6a8c966c" @@ -1080,6 +1452,16 @@ "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" +"@aws-sdk/middleware-sdk-sqs@^3.972.22": + version "3.972.30" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.30.tgz#641d2931292055f3e3a38215eb446f46ffb89310" + integrity sha512-PVAj7VgWK/ZxCXnkgC4B7cdJyUN99Nsr7IEduHt4A1GieuB+ZnU5bSifHwapbr17wrFkmdxfSh+aA0Lj+Ads6w== + dependencies: + "@aws-sdk/types" "^3.973.12" + "@smithy/core" "^3.24.6" + "@smithy/types" "^4.14.3" + tslib "^2.6.2" + "@aws-sdk/middleware-ssec@^3.972.10": version "3.972.10" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.10.tgz#46b5c030c0116f51110e18042ad3cf863ab5c81c" @@ -1236,6 +1618,14 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" +"@aws-sdk/types@^3.973.12": + version "3.973.12" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.973.12.tgz#a3ae50d325644e4e890030d187febbeef2d238ef" + integrity sha512-43ajd1NF0RMgX5k0hxCNUyEdrtFUsb2aHT2QvpktSC/2Eyb2Jr/JPVqdp0XIoaHWikZJq5tNWSLO6kB5q2eMCA== + dependencies: + "@smithy/types" "^4.14.3" + tslib "^2.6.2" + "@aws-sdk/util-arn-parser@^3.972.3": version "3.972.3" resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz#ed989862bbb172ce16d9e1cd5790e5fe367219c2" @@ -1315,6 +1705,15 @@ fast-xml-parser "5.7.2" tslib "^2.6.2" +"@aws-sdk/xml-builder@^3.972.29": + version "3.972.29" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.29.tgz#1fffe1dd3fbb84c034ff2f8008de8a6926a4a672" + integrity sha512-fk0niuGFxfi8yIJuMVM4mhwObkiQSuwZFj3tAPrLVx64Pk3BkrEIpqjzHKY4hKoEBUD6Jg/S74Zj9jy+5F3DnQ== + dependencies: + "@smithy/types" "^4.14.3" + fast-xml-parser "5.7.3" + tslib "^2.6.2" + "@aws/lambda-invoke-store@^0.2.2": version "0.2.3" resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz#f1137f56209ccc69c15f826242cbf37f828617dd" @@ -7823,6 +8222,15 @@ "@smithy/uuid" "^1.1.2" tslib "^2.6.2" +"@smithy/core@^3.24.6", "@smithy/core@^3.24.7": + version "3.24.7" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.24.7.tgz#040621b1150844abf763fc77691232ea0719a006" + integrity sha512-KoUi4M1f3BG6kzN1FnCwL7oyFptTbyBJKjR6yhSib+JHRdUmM1o+VwsFtJ66NZCkCzVfJMWRHJNo0R0jznp0Pg== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^4.14.4" + tslib "^2.6.2" + "@smithy/credential-provider-imds@^4.2.14", "@smithy/credential-provider-imds@^4.2.8": version "4.2.14" resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.14.tgz#b5dcc198ee240eaf68069e7449bcec29ce279827" @@ -8089,6 +8497,15 @@ "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" +"@smithy/signature-v4@^5.4.6": + version "5.4.7" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.4.7.tgz#a56fc486928bb54d822f1f18f81a1e00328e78ce" + integrity sha512-LwQZazFayImv+IOm0S0enoLeUJwmAlhGC5O6YCcLWezyu08dF46GOxPOq35OpBIHkgd7OvNvBStIFwVNyrvoBw== + dependencies: + "@smithy/core" "^3.24.7" + "@smithy/types" "^4.14.4" + tslib "^2.6.2" + "@smithy/smithy-client@^4.11.1", "@smithy/smithy-client@^4.12.13": version "4.12.13" resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.12.13.tgz#dec184a1d2d5027370ae1582bddbdbc068c97da5" @@ -8109,6 +8526,13 @@ dependencies: tslib "^2.6.2" +"@smithy/types@^4.14.3", "@smithy/types@^4.14.4": + version "4.14.4" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.14.4.tgz#0c83b7e011d30730ec43fa13290e61a7ca234ccc" + integrity sha512-B2S9+UGm1+/pHkcx3ZoLVX1a+pmSk8rqxRR+ZsNqZaJ5q9FWX9AFGQVM4qG5+OBeQUZVy99HY8HqW8gK/wgXzQ== + dependencies: + tslib "^2.6.2" + "@smithy/url-parser@^4.2.14", "@smithy/url-parser@^4.2.8": version "4.2.14" resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.2.14.tgz#349a442a62eb5907533f204b73a010618198b073" @@ -17092,6 +17516,14 @@ fast-xml-builder@^1.1.5: dependencies: path-expression-matcher "^1.1.3" +fast-xml-builder@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz#abd2363145a7625d9789ad96da375fabe3cff28c" + integrity sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q== + dependencies: + path-expression-matcher "^1.5.0" + xml-naming "^0.1.0" + fast-xml-parser@5.7.2, fast-xml-parser@^5.0.7: version "5.7.2" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz#fecd0b054c6c132fc03dab994a413da781e0eb9f" @@ -17102,6 +17534,16 @@ fast-xml-parser@5.7.2, fast-xml-parser@^5.0.7: path-expression-matcher "^1.5.0" strnum "^2.2.3" +fast-xml-parser@5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz#309b04b08d835defc62ab657a0bb340c0e0fbe6a" + integrity sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg== + dependencies: + "@nodable/entities" "^2.1.0" + fast-xml-builder "^1.1.7" + path-expression-matcher "^1.5.0" + strnum "^2.2.3" + fast-xml-parser@^4.4.1: version "4.5.6" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.6.tgz#4ff57d4aca13a2d11aa42ad460495cf00f32b655" @@ -22075,6 +22517,13 @@ mlly@^1.3.0, mlly@^1.4.0, mlly@^1.5.0, mlly@^1.6.1, mlly@^1.7.1, mlly@^1.7.4, ml pkg-types "^1.3.1" ufo "^1.6.3" +mnemonist@0.38.3: + version "0.38.3" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d" + integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw== + dependencies: + obliterator "^1.6.1" + mocked-exports@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/mocked-exports/-/mocked-exports-0.1.1.tgz#6916efea9a9dd0f4abd6a0a72526f56a76c966ea" @@ -23307,6 +23756,11 @@ object.values@^1.1.6, object.values@^1.2.1: define-properties "^1.2.1" es-object-atoms "^1.0.0" +obliterator@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" + integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -31018,6 +31472,11 @@ xml-name-validator@^4.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== +xml-naming@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/xml-naming/-/xml-naming-0.1.0.tgz#8ab7106c5b8d23caa2fabac1cadf17136379fbd8" + integrity sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" From b2ced23be2fbf87f043025aa9d6a3f93a50ecbd3 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Mon, 15 Jun 2026 15:08:31 +0200 Subject: [PATCH 2/3] fix(aws-serverless): Instrument aws-sdk clients using @smithy/core >= 3.24.0 `@smithy/core@3.24.0` moved the `Client` class out of `@smithy/smithy-client` into the `@smithy/core/client` bundle and turned `constructStack` into a closed-over local, so the vendored instrumentation - which created spans by wrapping `constructStack` exported from `@smithy/middleware-stack` - silently produced no spans for any AWS service on `@aws-sdk/*` >= 3.1046.0. This backports the upstream fix (open-telemetry/opentelemetry-js-contrib#3530, released in @opentelemetry/instrumentation-aws-sdk@0.74.0): * Patch `Client.prototype.send` in `@smithy/core/dist-cjs/submodules/client/index.js` for `@smithy/core` >= 3.24.0. * From within the `send` patch, patch the live `middlewareStack` instance directly (its `resolve` is the span-creation point) instead of relying on the no-longer-patchable `constructStack` export. * Guard `clone`/`concat` wrapping with `isWrapped` so repeated patching is safe. The aws-integration tests are consolidated into a single scenario that exercises all instrumented services, and run via `createEsmAndCjsTests` + `describe.each` against two dependency sets: * `latest` - the workspace `@aws-sdk/*` (`@smithy/core` >= 3.24.0, the new path) * `v3.1041.0` - aws-sdk 3.1041.0 pinned together with the pre-`@smithy/core` smithy stack via `additionalDependencies`, exercising the old `@smithy/middleware-stack` path Both run the same assertions in ESM and CJS, proving spans are produced on both architectures. Pinning only the client is not enough - `@smithy/smithy-client` must also be pinned < 4.13, otherwise it pulls `@smithy/core` >= 3.24.0 again. Fixes #21546 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../node-integration-tests/package.json | 16 +- .../aws-integration/dynamodb/scenario.js | 52 - .../aws-integration/dynamodb/test.ts | 51 - .../aws-integration/instrument.mjs | 9 + .../aws-integration/kinesis/scenario.js | 41 - .../aws-integration/kinesis/test.ts | 36 - .../aws-integration/lambda/scenario.js | 36 - .../aws-integration/lambda/test.ts | 37 - .../aws-integration/s3/scenario.js | 51 - .../aws-serverless/aws-integration/s3/test.ts | 63 -- .../aws-integration/scenario.mjs | 168 ++++ .../secretsmanager/scenario.js | 36 - .../aws-integration/secretsmanager/test.ts | 35 - .../aws-integration/sns/scenario.js | 38 - .../aws-integration/sns/test.ts | 38 - .../aws-integration/sqs/scenario.js | 51 - .../aws-integration/sqs/test.ts | 52 - .../aws-integration/stepfunctions/scenario.js | 36 - .../aws-integration/stepfunctions/test.ts | 36 - .../aws-serverless/aws-integration/test.ts | 222 +++++ .../src/integration/aws/vendored/aws-sdk.ts | 40 +- yarn.lock | 921 ++++++------------ 22 files changed, 749 insertions(+), 1316 deletions(-) delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/scenario.js delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/test.ts create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/instrument.mjs delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/scenario.js delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/test.ts delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/scenario.js delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/test.ts delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/scenario.js delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/test.ts create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/scenario.mjs delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/scenario.js delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/test.ts delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/scenario.js delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/test.ts delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/scenario.js delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/test.ts delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/scenario.js delete mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/test.ts create mode 100644 dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/test.ts diff --git a/dev-packages/node-integration-tests/package.json b/dev-packages/node-integration-tests/package.json index 4bc20e276601..5e9585d74336 100644 --- a/dev-packages/node-integration-tests/package.json +++ b/dev-packages/node-integration-tests/package.json @@ -25,14 +25,14 @@ "dependencies": { "@anthropic-ai/sdk": "0.63.0", "@apollo/server": "^5.5.0", - "@aws-sdk/client-dynamodb": "3.1041.0", - "@aws-sdk/client-kinesis": "3.1041.0", - "@aws-sdk/client-lambda": "3.1041.0", - "@aws-sdk/client-s3": "3.1041.0", - "@aws-sdk/client-secrets-manager": "3.1041.0", - "@aws-sdk/client-sfn": "3.1041.0", - "@aws-sdk/client-sns": "3.1041.0", - "@aws-sdk/client-sqs": "3.1041.0", + "@aws-sdk/client-dynamodb": "^3.1046.0", + "@aws-sdk/client-kinesis": "^3.1046.0", + "@aws-sdk/client-lambda": "^3.1046.0", + "@aws-sdk/client-s3": "^3.1046.0", + "@aws-sdk/client-secrets-manager": "^3.1046.0", + "@aws-sdk/client-sfn": "^3.1046.0", + "@aws-sdk/client-sns": "^3.1046.0", + "@aws-sdk/client-sqs": "^3.1046.0", "@google/genai": "^1.20.0", "@growthbook/growthbook": "^1.6.1", "@hapi/hapi": "^21.3.10", diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/scenario.js deleted file mode 100644 index c1b1e6d3b4c8..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/scenario.js +++ /dev/null @@ -1,52 +0,0 @@ -const { loggingTransport } = require('@sentry-internal/node-integration-tests'); -const Sentry = require('@sentry/aws-serverless'); - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracesSampleRate: 1.0, - transport: loggingTransport, -}); - -const { DynamoDBClient, PutItemCommand, QueryCommand } = require('@aws-sdk/client-dynamodb'); -const nock = require('nock'); - -nock.disableNetConnect(); - -const region = 'us-east-1'; - -async function run() { - await Sentry.startSpan({ name: 'Test Transaction' }, async () => { - const client = new DynamoDBClient({ - region, - credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, - maxAttempts: 1, - }); - - nock(`https://dynamodb.${region}.amazonaws.com`) - .post('/') - .reply(200, JSON.stringify({}), { 'content-type': 'application/x-amz-json-1.0' }); - - await client.send( - new PutItemCommand({ - TableName: 'my-table', - Item: { id: { S: 'some-id' } }, - }), - ); - - nock(`https://dynamodb.${region}.amazonaws.com`) - .post('/') - .reply(200, JSON.stringify({ Items: [{ id: { S: 'some-id' } }], Count: 1, ScannedCount: 1 }), { - 'content-type': 'application/x-amz-json-1.0', - }); - - await client.send( - new QueryCommand({ - TableName: 'my-table', - KeyConditionExpression: 'id = :id', - ExpressionAttributeValues: { ':id': { S: 'some-id' } }, - }), - ); - }); -} - -run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/test.ts deleted file mode 100644 index c3c55cb6e854..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/dynamodb/test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { afterAll, describe, expect, test } from 'vitest'; -import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; - -describe('awsIntegration - DynamoDB', () => { - afterAll(() => { - cleanupChildProcesses(); - }); - - test('auto-instruments DynamoDB operations', async () => { - await createRunner(__dirname, 'scenario.js') - .ignore('event') - .expect({ - transaction: { - transaction: 'Test Transaction', - spans: expect.arrayContaining([ - expect.objectContaining({ - description: 'DynamoDB.PutItem', - op: 'db', - origin: 'auto.otel.aws', - data: expect.objectContaining({ - 'sentry.origin': 'auto.otel.aws', - 'sentry.op': 'db', - 'rpc.system': 'aws-api', - 'rpc.method': 'PutItem', - 'rpc.service': 'DynamoDB', - 'db.system': 'dynamodb', - 'db.name': 'my-table', - 'db.operation': 'PutItem', - 'aws.dynamodb.table_names': ['my-table'], - 'otel.kind': 'CLIENT', - }), - }), - expect.objectContaining({ - description: 'DynamoDB.Query', - op: 'db', - origin: 'auto.otel.aws', - data: expect.objectContaining({ - 'rpc.method': 'Query', - 'db.operation': 'Query', - 'db.name': 'my-table', - 'aws.dynamodb.count': 1, - 'aws.dynamodb.scanned_count': 1, - }), - }), - ]), - }, - }) - .start() - .completed(); - }); -}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/instrument.mjs b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/instrument.mjs new file mode 100644 index 000000000000..fe1c5c47983f --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/instrument.mjs @@ -0,0 +1,9 @@ +import * as Sentry from '@sentry/aws-serverless'; +import { loggingTransport } from '@sentry-internal/node-integration-tests'; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '1.0', + tracesSampleRate: 1.0, + transport: loggingTransport, +}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/scenario.js deleted file mode 100644 index ec759aa94dfd..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/scenario.js +++ /dev/null @@ -1,41 +0,0 @@ -const { loggingTransport } = require('@sentry-internal/node-integration-tests'); -const Sentry = require('@sentry/aws-serverless'); - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracesSampleRate: 1.0, - transport: loggingTransport, -}); - -const { KinesisClient, PutRecordCommand } = require('@aws-sdk/client-kinesis'); -// The Kinesis client defaults to an HTTP/2 request handler, which `nock` cannot intercept. -// Force the HTTP/1 handler so the request is mocked instead of hitting real AWS. -const { NodeHttpHandler } = require('@smithy/node-http-handler'); -const nock = require('nock'); - -nock.disableNetConnect(); - -const region = 'us-east-1'; - -async function run() { - await Sentry.startSpan({ name: 'Test Transaction' }, async () => { - const client = new KinesisClient({ - region, - credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, - maxAttempts: 1, - requestHandler: new NodeHttpHandler(), - }); - - nock(`https://kinesis.${region}.amazonaws.com`) - .post('/') - .reply(200, JSON.stringify({ SequenceNumber: '1', ShardId: 'shardId-000000000000' }), { - 'content-type': 'application/x-amz-json-1.1', - }); - - await client.send( - new PutRecordCommand({ StreamName: 'my-stream', Data: Buffer.from('data'), PartitionKey: 'partition-key' }), - ); - }); -} - -run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/test.ts deleted file mode 100644 index d89aabdd07f9..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/kinesis/test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { afterAll, describe, expect, test } from 'vitest'; -import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; - -describe('awsIntegration - Kinesis', () => { - afterAll(() => { - cleanupChildProcesses(); - }); - - test('auto-instruments Kinesis operations, setting the stream name', async () => { - await createRunner(__dirname, 'scenario.js') - .ignore('event') - .expect({ - transaction: { - transaction: 'Test Transaction', - spans: expect.arrayContaining([ - expect.objectContaining({ - description: 'Kinesis.PutRecord', - op: 'rpc', - origin: 'auto.otel.aws', - status: 'ok', - data: expect.objectContaining({ - 'sentry.origin': 'auto.otel.aws', - 'rpc.system': 'aws-api', - 'rpc.method': 'PutRecord', - 'rpc.service': 'Kinesis', - 'aws.kinesis.stream.name': 'my-stream', - 'otel.kind': 'CLIENT', - }), - }), - ]), - }, - }) - .start() - .completed(); - }); -}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/scenario.js deleted file mode 100644 index c7a9bdff8280..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/scenario.js +++ /dev/null @@ -1,36 +0,0 @@ -const { loggingTransport } = require('@sentry-internal/node-integration-tests'); -const Sentry = require('@sentry/aws-serverless'); - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracesSampleRate: 1.0, - transport: loggingTransport, -}); - -const { LambdaClient, InvokeCommand } = require('@aws-sdk/client-lambda'); -const nock = require('nock'); - -nock.disableNetConnect(); - -const region = 'us-east-1'; - -async function run() { - await Sentry.startSpan({ name: 'Test Transaction' }, async () => { - const client = new LambdaClient({ - region, - credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, - maxAttempts: 1, - }); - - nock(`https://lambda.${region}.amazonaws.com`) - .post('/2015-03-31/functions/my-function/invocations') - .reply(200, JSON.stringify({ result: 'ok' }), { - 'content-type': 'application/json', - 'x-amzn-requestid': 'request-id-1', - }); - - await client.send(new InvokeCommand({ FunctionName: 'my-function' })); - }); -} - -run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/test.ts deleted file mode 100644 index a0784c24dc5f..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/lambda/test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { afterAll, describe, expect, test } from 'vitest'; -import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; - -describe('awsIntegration - Lambda', () => { - afterAll(() => { - cleanupChildProcesses(); - }); - - test('auto-instruments Lambda invoke, setting faas attributes', async () => { - await createRunner(__dirname, 'scenario.js') - .ignore('event') - .expect({ - transaction: { - transaction: 'Test Transaction', - spans: expect.arrayContaining([ - expect.objectContaining({ - description: 'my-function Invoke', - op: 'rpc', - origin: 'auto.otel.aws', - data: expect.objectContaining({ - 'sentry.origin': 'auto.otel.aws', - 'rpc.system': 'aws-api', - 'rpc.method': 'Invoke', - 'rpc.service': 'Lambda', - 'faas.invoked_name': 'my-function', - 'faas.invoked_provider': 'aws', - 'faas.execution': 'request-id-1', - 'otel.kind': 'CLIENT', - }), - }), - ]), - }, - }) - .start() - .completed(); - }); -}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/scenario.js deleted file mode 100644 index 9377a1be2be0..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/scenario.js +++ /dev/null @@ -1,51 +0,0 @@ -const { loggingTransport } = require('@sentry-internal/node-integration-tests'); -const Sentry = require('@sentry/aws-serverless'); - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracesSampleRate: 1.0, - transport: loggingTransport, -}); - -const { S3 } = require('@aws-sdk/client-s3'); -const nock = require('nock'); - -nock.disableNetConnect(); - -async function run() { - await Sentry.startSpan({ name: 'Test Transaction' }, async () => { - const region = 'us-east-1'; - const s3Client = new S3({ - region, - credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, - maxAttempts: 1, - }); - const host = `https://ot-demo-test.s3.${region}.amazonaws.com`; - - // Successful PutObject - nock(host).put('/aws-ot-s3-test-object.txt?x-id=PutObject').reply(200, 'test'); - await s3Client.putObject({ Bucket: 'ot-demo-test', Key: 'aws-ot-s3-test-object.txt' }); - - // Successful GetObject - nock(host).get('/aws-ot-s3-test-object.txt?x-id=GetObject').reply(200, 'contents'); - const getResult = await s3Client.getObject({ Bucket: 'ot-demo-test', Key: 'aws-ot-s3-test-object.txt' }); - // Drain the body so the request fully completes - await getResult.Body?.transformToString(); - - // Failing GetObject (missing key) - should produce a span with error status - nock(host) - .get('/missing-object.txt?x-id=GetObject') - .reply( - 404, - 'NoSuchKeyThe specified key does not exist.', - { 'content-type': 'application/xml' }, - ); - try { - await s3Client.getObject({ Bucket: 'ot-demo-test', Key: 'missing-object.txt' }); - } catch { - // expected - } - }); -} - -run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/test.ts deleted file mode 100644 index 7bfbbe6e4163..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/s3/test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { afterAll, describe, expect, test } from 'vitest'; -import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; - -describe('awsIntegration - S3', () => { - afterAll(() => { - cleanupChildProcesses(); - }); - - test('auto-instruments S3 operations and captures errors', async () => { - await createRunner(__dirname, 'scenario.js') - .ignore('event') - .expect({ - transaction: { - transaction: 'Test Transaction', - spans: expect.arrayContaining([ - // Successful PutObject - expect.objectContaining({ - description: 'S3.PutObject', - op: 'rpc', - origin: 'auto.otel.aws', - status: 'ok', - data: expect.objectContaining({ - 'sentry.origin': 'auto.otel.aws', - 'sentry.op': 'rpc', - 'rpc.system': 'aws-api', - 'rpc.method': 'PutObject', - 'rpc.service': 'S3', - 'cloud.region': 'us-east-1', - 'aws.s3.bucket': 'ot-demo-test', - 'otel.kind': 'CLIENT', - }), - }), - // Successful GetObject - expect.objectContaining({ - description: 'S3.GetObject', - op: 'rpc', - origin: 'auto.otel.aws', - status: 'ok', - data: expect.objectContaining({ - 'rpc.method': 'GetObject', - 'rpc.service': 'S3', - 'aws.s3.bucket': 'ot-demo-test', - }), - }), - // Failing GetObject (missing key) - span is marked as errored - expect.objectContaining({ - description: 'S3.GetObject', - op: 'rpc', - origin: 'auto.otel.aws', - status: 'internal_error', - data: expect.objectContaining({ - 'rpc.method': 'GetObject', - 'rpc.service': 'S3', - 'aws.s3.bucket': 'ot-demo-test', - }), - }), - ]), - }, - }) - .start() - .completed(); - }); -}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/scenario.mjs b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/scenario.mjs new file mode 100644 index 000000000000..0e58050adc9c --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/scenario.mjs @@ -0,0 +1,168 @@ +import * as Sentry from '@sentry/aws-serverless'; +import { createHash } from 'crypto'; +import { DynamoDBClient, PutItemCommand, QueryCommand } from '@aws-sdk/client-dynamodb'; +import { KinesisClient, PutRecordCommand } from '@aws-sdk/client-kinesis'; +import { InvokeCommand, LambdaClient } from '@aws-sdk/client-lambda'; +import { S3 } from '@aws-sdk/client-s3'; +import { GetSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager'; +import { SFNClient, StartExecutionCommand } from '@aws-sdk/client-sfn'; +import { PublishCommand, SNSClient } from '@aws-sdk/client-sns'; +import { ReceiveMessageCommand, SendMessageCommand, SQSClient } from '@aws-sdk/client-sqs'; +// The Kinesis client defaults to an HTTP/2 request handler, which `nock` cannot intercept. +// Force the HTTP/1 handler so the request is mocked instead of hitting real AWS. +import { NodeHttpHandler } from '@smithy/node-http-handler'; +import nock from 'nock'; + +nock.disableNetConnect(); + +const region = 'us-east-1'; +const credentials = { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }; + +async function s3() { + const s3Client = new S3({ region, credentials, maxAttempts: 1 }); + const host = `https://ot-demo-test.s3.${region}.amazonaws.com`; + + nock(host).put('/aws-ot-s3-test-object.txt?x-id=PutObject').reply(200, 'test'); + await s3Client.putObject({ Bucket: 'ot-demo-test', Key: 'aws-ot-s3-test-object.txt' }); + + nock(host).get('/aws-ot-s3-test-object.txt?x-id=GetObject').reply(200, 'contents'); + const getResult = await s3Client.getObject({ Bucket: 'ot-demo-test', Key: 'aws-ot-s3-test-object.txt' }); + await getResult.Body?.transformToString(); + + nock(host) + .get('/missing-object.txt?x-id=GetObject') + .reply( + 404, + 'NoSuchKeyThe specified key does not exist.', + { 'content-type': 'application/xml' }, + ); + try { + await s3Client.getObject({ Bucket: 'ot-demo-test', Key: 'missing-object.txt' }); + } catch { + // expected + } +} + +async function dynamodb() { + const client = new DynamoDBClient({ region, credentials, maxAttempts: 1 }); + + nock(`https://dynamodb.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({}), { 'content-type': 'application/x-amz-json-1.0' }); + await client.send(new PutItemCommand({ TableName: 'my-table', Item: { id: { S: 'some-id' } } })); + + nock(`https://dynamodb.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ Items: [{ id: { S: 'some-id' } }], Count: 1, ScannedCount: 1 }), { + 'content-type': 'application/x-amz-json-1.0', + }); + await client.send( + new QueryCommand({ + TableName: 'my-table', + KeyConditionExpression: 'id = :id', + ExpressionAttributeValues: { ':id': { S: 'some-id' } }, + }), + ); +} + +async function sqs() { + const client = new SQSClient({ region, credentials, maxAttempts: 1 }); + const queueUrl = `https://sqs.${region}.amazonaws.com/123456789012/my-queue`; + const messageBody = 'Hello from Sentry'; + const md5 = createHash('md5').update(messageBody).digest('hex'); + + nock(`https://sqs.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ MessageId: 'message-id-1', MD5OfMessageBody: md5 }), { + 'content-type': 'application/x-amz-json-1.0', + }); + await client.send(new SendMessageCommand({ QueueUrl: queueUrl, MessageBody: messageBody })); + + nock(`https://sqs.${region}.amazonaws.com`) + .post('/') + .reply( + 200, + JSON.stringify({ + Messages: [{ MessageId: 'message-id-2', Body: messageBody, MD5OfBody: md5, ReceiptHandle: 'handle' }], + }), + { 'content-type': 'application/x-amz-json-1.0' }, + ); + await client.send(new ReceiveMessageCommand({ QueueUrl: queueUrl })); +} + +async function sns() { + const client = new SNSClient({ region, credentials, maxAttempts: 1 }); + + nock(`https://sns.${region}.amazonaws.com`) + .post('/') + .reply( + 200, + 'message-id-1request-id-1', + { 'content-type': 'text/xml' }, + ); + await client.send(new PublishCommand({ TopicArn: 'arn:aws:sns:us-east-1:123456789012:my-topic', Message: 'Hello' })); +} + +async function lambda() { + const client = new LambdaClient({ region, credentials, maxAttempts: 1 }); + + nock(`https://lambda.${region}.amazonaws.com`) + .post('/2015-03-31/functions/my-function/invocations') + .reply(200, JSON.stringify({ result: 'ok' }), { + 'content-type': 'application/json', + 'x-amzn-requestid': 'request-id-1', + }); + await client.send(new InvokeCommand({ FunctionName: 'my-function' })); +} + +async function kinesis() { + const client = new KinesisClient({ region, credentials, maxAttempts: 1, requestHandler: new NodeHttpHandler() }); + + nock(`https://kinesis.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ SequenceNumber: '1', ShardId: 'shardId-000000000000' }), { + 'content-type': 'application/x-amz-json-1.1', + }); + await client.send( + new PutRecordCommand({ StreamName: 'my-stream', Data: Buffer.from('data'), PartitionKey: 'partition-key' }), + ); +} + +async function secretsmanager() { + const client = new SecretsManagerClient({ region, credentials, maxAttempts: 1 }); + const secretArn = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-abc'; + + nock(`https://secretsmanager.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ ARN: secretArn, Name: 'my-secret', SecretString: 'secret-value' }), { + 'content-type': 'application/x-amz-json-1.1', + }); + await client.send(new GetSecretValueCommand({ SecretId: secretArn })); +} + +async function stepfunctions() { + const client = new SFNClient({ region, credentials, maxAttempts: 1 }); + const stateMachineArn = 'arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine'; + + nock(`https://states.${region}.amazonaws.com`) + .post('/') + .reply(200, JSON.stringify({ executionArn: `${stateMachineArn}:execution-1`, startDate: 1 }), { + 'content-type': 'application/x-amz-json-1.0', + }); + await client.send(new StartExecutionCommand({ stateMachineArn, input: '{}' })); +} + +async function run() { + await Sentry.startSpan({ name: 'Test Transaction' }, async () => { + await s3(); + await dynamodb(); + await sqs(); + await sns(); + await lambda(); + await kinesis(); + await secretsmanager(); + await stepfunctions(); + }); +} + +run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/scenario.js deleted file mode 100644 index 2ec2eb411f14..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/scenario.js +++ /dev/null @@ -1,36 +0,0 @@ -const { loggingTransport } = require('@sentry-internal/node-integration-tests'); -const Sentry = require('@sentry/aws-serverless'); - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracesSampleRate: 1.0, - transport: loggingTransport, -}); - -const { SecretsManagerClient, GetSecretValueCommand } = require('@aws-sdk/client-secrets-manager'); -const nock = require('nock'); - -nock.disableNetConnect(); - -const region = 'us-east-1'; -const secretArn = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-abc'; - -async function run() { - await Sentry.startSpan({ name: 'Test Transaction' }, async () => { - const client = new SecretsManagerClient({ - region, - credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, - maxAttempts: 1, - }); - - nock(`https://secretsmanager.${region}.amazonaws.com`) - .post('/') - .reply(200, JSON.stringify({ ARN: secretArn, Name: 'my-secret', SecretString: 'secret-value' }), { - 'content-type': 'application/x-amz-json-1.1', - }); - - await client.send(new GetSecretValueCommand({ SecretId: secretArn })); - }); -} - -run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/test.ts deleted file mode 100644 index c895008c144b..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/secretsmanager/test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { afterAll, describe, expect, test } from 'vitest'; -import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; - -describe('awsIntegration - SecretsManager', () => { - afterAll(() => { - cleanupChildProcesses(); - }); - - test('auto-instruments SecretsManager operations, setting the secret ARN', async () => { - await createRunner(__dirname, 'scenario.js') - .ignore('event') - .expect({ - transaction: { - transaction: 'Test Transaction', - spans: expect.arrayContaining([ - expect.objectContaining({ - description: 'SecretsManager.GetSecretValue', - op: 'rpc', - origin: 'auto.otel.aws', - data: expect.objectContaining({ - 'sentry.origin': 'auto.otel.aws', - 'rpc.system': 'aws-api', - 'rpc.method': 'GetSecretValue', - 'rpc.service': 'SecretsManager', - 'aws.secretsmanager.secret.arn': 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-abc', - 'otel.kind': 'CLIENT', - }), - }), - ]), - }, - }) - .start() - .completed(); - }); -}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/scenario.js deleted file mode 100644 index 01e4981ad378..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/scenario.js +++ /dev/null @@ -1,38 +0,0 @@ -const { loggingTransport } = require('@sentry-internal/node-integration-tests'); -const Sentry = require('@sentry/aws-serverless'); - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracesSampleRate: 1.0, - transport: loggingTransport, -}); - -const { SNSClient, PublishCommand } = require('@aws-sdk/client-sns'); -const nock = require('nock'); - -nock.disableNetConnect(); - -const region = 'us-east-1'; -const topicArn = 'arn:aws:sns:us-east-1:123456789012:my-topic'; - -async function run() { - await Sentry.startSpan({ name: 'Test Transaction' }, async () => { - const client = new SNSClient({ - region, - credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, - maxAttempts: 1, - }); - - nock(`https://sns.${region}.amazonaws.com`) - .post('/') - .reply( - 200, - 'message-id-1request-id-1', - { 'content-type': 'text/xml' }, - ); - - await client.send(new PublishCommand({ TopicArn: topicArn, Message: 'Hello from Sentry' })); - }); -} - -run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/test.ts deleted file mode 100644 index 0c6a9c4bfb67..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sns/test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { afterAll, describe, expect, test } from 'vitest'; -import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; - -describe('awsIntegration - SNS', () => { - afterAll(() => { - cleanupChildProcesses(); - }); - - test('auto-instruments SNS publish, setting messaging attributes', async () => { - await createRunner(__dirname, 'scenario.js') - .ignore('event') - .expect({ - transaction: { - transaction: 'Test Transaction', - spans: expect.arrayContaining([ - expect.objectContaining({ - description: 'my-topic send', - op: 'rpc', - origin: 'auto.otel.aws', - data: expect.objectContaining({ - 'sentry.origin': 'auto.otel.aws', - 'rpc.system': 'aws-api', - 'rpc.method': 'Publish', - 'rpc.service': 'SNS', - 'messaging.system': 'aws.sns', - 'messaging.destination': 'my-topic', - 'messaging.destination.name': 'arn:aws:sns:us-east-1:123456789012:my-topic', - 'aws.sns.topic.arn': 'arn:aws:sns:us-east-1:123456789012:my-topic', - 'otel.kind': 'PRODUCER', - }), - }), - ]), - }, - }) - .start() - .completed(); - }); -}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/scenario.js deleted file mode 100644 index ca4fd689bea4..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/scenario.js +++ /dev/null @@ -1,51 +0,0 @@ -const crypto = require('crypto'); -const { loggingTransport } = require('@sentry-internal/node-integration-tests'); -const Sentry = require('@sentry/aws-serverless'); - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracesSampleRate: 1.0, - transport: loggingTransport, -}); - -const { SQSClient, SendMessageCommand, ReceiveMessageCommand } = require('@aws-sdk/client-sqs'); -const nock = require('nock'); - -nock.disableNetConnect(); - -const region = 'us-east-1'; -const queueUrl = `https://sqs.${region}.amazonaws.com/123456789012/my-queue`; -const messageBody = 'Hello from Sentry'; -const md5 = crypto.createHash('md5').update(messageBody).digest('hex'); - -async function run() { - await Sentry.startSpan({ name: 'Test Transaction' }, async () => { - const client = new SQSClient({ - region, - credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, - maxAttempts: 1, - }); - - nock(`https://sqs.${region}.amazonaws.com`) - .post('/') - .reply(200, JSON.stringify({ MessageId: 'message-id-1', MD5OfMessageBody: md5 }), { - 'content-type': 'application/x-amz-json-1.0', - }); - - await client.send(new SendMessageCommand({ QueueUrl: queueUrl, MessageBody: messageBody })); - - nock(`https://sqs.${region}.amazonaws.com`) - .post('/') - .reply( - 200, - JSON.stringify({ - Messages: [{ MessageId: 'message-id-2', Body: messageBody, MD5OfBody: md5, ReceiptHandle: 'handle' }], - }), - { 'content-type': 'application/x-amz-json-1.0' }, - ); - - await client.send(new ReceiveMessageCommand({ QueueUrl: queueUrl })); - }); -} - -run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/test.ts deleted file mode 100644 index f62e46f68021..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/sqs/test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { afterAll, describe, expect, test } from 'vitest'; -import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; - -describe('awsIntegration - SQS', () => { - afterAll(() => { - cleanupChildProcesses(); - }); - - test('auto-instruments SQS send and receive, setting messaging attributes', async () => { - await createRunner(__dirname, 'scenario.js') - .ignore('event') - .expect({ - transaction: { - transaction: 'Test Transaction', - spans: expect.arrayContaining([ - expect.objectContaining({ - description: 'my-queue send', - op: 'rpc', - origin: 'auto.otel.aws', - data: expect.objectContaining({ - 'sentry.origin': 'auto.otel.aws', - 'rpc.system': 'aws-api', - 'rpc.method': 'SendMessage', - 'rpc.service': 'SQS', - 'messaging.system': 'aws_sqs', - 'messaging.destination.name': 'my-queue', - 'url.full': 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue', - 'messaging.message.id': 'message-id-1', - 'otel.kind': 'PRODUCER', - }), - }), - expect.objectContaining({ - description: 'my-queue receive', - op: 'rpc', - origin: 'auto.otel.aws', - data: expect.objectContaining({ - 'rpc.method': 'ReceiveMessage', - 'rpc.service': 'SQS', - 'messaging.system': 'aws_sqs', - 'messaging.destination.name': 'my-queue', - 'messaging.operation.type': 'receive', - 'messaging.batch.message_count': 1, - 'otel.kind': 'CONSUMER', - }), - }), - ]), - }, - }) - .start() - .completed(); - }); -}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/scenario.js b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/scenario.js deleted file mode 100644 index 28057990c8c5..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/scenario.js +++ /dev/null @@ -1,36 +0,0 @@ -const { loggingTransport } = require('@sentry-internal/node-integration-tests'); -const Sentry = require('@sentry/aws-serverless'); - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracesSampleRate: 1.0, - transport: loggingTransport, -}); - -const { SFNClient, StartExecutionCommand } = require('@aws-sdk/client-sfn'); -const nock = require('nock'); - -nock.disableNetConnect(); - -const region = 'us-east-1'; -const stateMachineArn = 'arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine'; - -async function run() { - await Sentry.startSpan({ name: 'Test Transaction' }, async () => { - const client = new SFNClient({ - region, - credentials: { accessKeyId: 'aws-test-key', secretAccessKey: 'aws-test-secret' }, - maxAttempts: 1, - }); - - nock(`https://states.${region}.amazonaws.com`) - .post('/') - .reply(200, JSON.stringify({ executionArn: `${stateMachineArn}:execution-1`, startDate: 1 }), { - 'content-type': 'application/x-amz-json-1.0', - }); - - await client.send(new StartExecutionCommand({ stateMachineArn, input: '{}' })); - }); -} - -run(); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/test.ts deleted file mode 100644 index 430fe5a00420..000000000000 --- a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/stepfunctions/test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { afterAll, describe, expect, test } from 'vitest'; -import { cleanupChildProcesses, createRunner } from '../../../../utils/runner'; - -describe('awsIntegration - StepFunctions', () => { - afterAll(() => { - cleanupChildProcesses(); - }); - - test('auto-instruments StepFunctions operations, setting the state machine ARN', async () => { - await createRunner(__dirname, 'scenario.js') - .ignore('event') - .expect({ - transaction: { - transaction: 'Test Transaction', - spans: expect.arrayContaining([ - expect.objectContaining({ - description: 'SFN.StartExecution', - op: 'rpc', - origin: 'auto.otel.aws', - data: expect.objectContaining({ - 'sentry.origin': 'auto.otel.aws', - 'rpc.system': 'aws-api', - 'rpc.method': 'StartExecution', - 'rpc.service': 'SFN', - 'aws.step_functions.state_machine.arn': - 'arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine', - 'otel.kind': 'CLIENT', - }), - }), - ]), - }, - }) - .start() - .completed(); - }); -}); diff --git a/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/test.ts b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/test.ts new file mode 100644 index 000000000000..a27b5c1a88ff --- /dev/null +++ b/dev-packages/node-integration-tests/suites/aws-serverless/aws-integration/test.ts @@ -0,0 +1,222 @@ +import type { TransactionEvent } from '@sentry/core'; +import { afterAll, describe, expect } from 'vitest'; +import { cleanupChildProcesses, createEsmAndCjsTests } from '../../../utils/runner'; + +// The aws-sdk instrumentation creates spans by patching the underlying smithy middleware stack. The +// patch target differs between aws-sdk versions, so we run the exact same assertions against both: +// - the current aws-sdk (default, resolved from the workspace) which routes through `@smithy/core` >= 3.24.0 +// - aws-sdk 3.1041.0 pinned together with the pre-`@smithy/core` stack (`@smithy/middleware-stack`) +const LEGACY_AWS_SDK_DEPENDENCIES = { + '@aws-sdk/client-dynamodb': '3.1041.0', + '@aws-sdk/client-kinesis': '3.1041.0', + '@aws-sdk/client-lambda': '3.1041.0', + '@aws-sdk/client-s3': '3.1041.0', + '@aws-sdk/client-secrets-manager': '3.1041.0', + '@aws-sdk/client-sfn': '3.1041.0', + '@aws-sdk/client-sns': '3.1041.0', + '@aws-sdk/client-sqs': '3.1041.0', + // Pin the smithy layer to the pre-`@smithy/core` versions, otherwise the 3.1041.0 clients still + // resolve `@smithy/smithy-client` >= 4.13 (which routes through `@smithy/core` >= 3.24.0). + '@smithy/smithy-client': '4.12.13', + '@smithy/core': '3.23.17', + '@smithy/middleware-stack': '4.2.14', + '@smithy/node-http-handler': '4.7.8', +}; + +/** + * Asserts the transaction contains one span per instrumented aws-sdk service. Each service is checked + * with its own `expect` so a failure points at the specific service rather than the whole transaction. + */ +function assertAwsServiceSpans(transaction: TransactionEvent): void { + const spans = transaction.spans ?? []; + + const expectSpan = (label: string, expected: Record): void => { + expect(spans, `expected an aws-sdk span for "${label}"`).toContainEqual(expect.objectContaining(expected)); + }; + + expect(transaction.transaction).toBe('Test Transaction'); + + // S3 - PutObject (success) + expectSpan('S3.PutObject', { + description: 'S3.PutObject', + op: 'rpc', + origin: 'auto.otel.aws', + status: 'ok', + data: expect.objectContaining({ + 'sentry.origin': 'auto.otel.aws', + 'sentry.op': 'rpc', + 'rpc.system': 'aws-api', + 'rpc.method': 'PutObject', + 'rpc.service': 'S3', + 'cloud.region': 'us-east-1', + 'aws.s3.bucket': 'ot-demo-test', + 'otel.kind': 'CLIENT', + }), + }); + + // S3 - GetObject (success) + expectSpan('S3.GetObject (success)', { + description: 'S3.GetObject', + op: 'rpc', + origin: 'auto.otel.aws', + status: 'ok', + data: expect.objectContaining({ 'rpc.method': 'GetObject', 'rpc.service': 'S3', 'aws.s3.bucket': 'ot-demo-test' }), + }); + + // S3 - GetObject (errored, missing key) + expectSpan('S3.GetObject (error)', { + description: 'S3.GetObject', + op: 'rpc', + origin: 'auto.otel.aws', + status: 'internal_error', + data: expect.objectContaining({ 'rpc.method': 'GetObject', 'rpc.service': 'S3' }), + }); + + // DynamoDB - PutItem + expectSpan('DynamoDB.PutItem', { + description: 'DynamoDB.PutItem', + op: 'db', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'sentry.op': 'db', + 'rpc.method': 'PutItem', + 'rpc.service': 'DynamoDB', + 'db.system': 'dynamodb', + 'db.name': 'my-table', + 'db.operation': 'PutItem', + 'aws.dynamodb.table_names': ['my-table'], + }), + }); + + // DynamoDB - Query + expectSpan('DynamoDB.Query', { + description: 'DynamoDB.Query', + op: 'db', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'rpc.method': 'Query', + 'db.operation': 'Query', + 'aws.dynamodb.count': 1, + 'aws.dynamodb.scanned_count': 1, + }), + }); + + // SQS - SendMessage (producer) + expectSpan('SQS SendMessage', { + description: 'my-queue send', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'rpc.method': 'SendMessage', + 'rpc.service': 'SQS', + 'messaging.system': 'aws_sqs', + 'messaging.destination.name': 'my-queue', + 'url.full': 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue', + 'messaging.message.id': 'message-id-1', + 'otel.kind': 'PRODUCER', + }), + }); + + // SQS - ReceiveMessage (consumer) + expectSpan('SQS ReceiveMessage', { + description: 'my-queue receive', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'rpc.method': 'ReceiveMessage', + 'messaging.system': 'aws_sqs', + 'messaging.operation.type': 'receive', + 'messaging.batch.message_count': 1, + 'otel.kind': 'CONSUMER', + }), + }); + + // SNS - Publish (producer) + expectSpan('SNS Publish', { + description: 'my-topic send', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'rpc.method': 'Publish', + 'rpc.service': 'SNS', + 'messaging.system': 'aws.sns', + 'messaging.destination': 'my-topic', + 'aws.sns.topic.arn': 'arn:aws:sns:us-east-1:123456789012:my-topic', + 'otel.kind': 'PRODUCER', + }), + }); + + // Lambda - Invoke + expectSpan('Lambda Invoke', { + description: 'my-function Invoke', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'rpc.method': 'Invoke', + 'rpc.service': 'Lambda', + 'faas.invoked_name': 'my-function', + 'faas.invoked_provider': 'aws', + 'faas.execution': 'request-id-1', + }), + }); + + // Kinesis - PutRecord + expectSpan('Kinesis.PutRecord', { + description: 'Kinesis.PutRecord', + op: 'rpc', + origin: 'auto.otel.aws', + status: 'ok', + data: expect.objectContaining({ + 'rpc.method': 'PutRecord', + 'rpc.service': 'Kinesis', + 'aws.kinesis.stream.name': 'my-stream', + }), + }); + + // SecretsManager - GetSecretValue + expectSpan('SecretsManager.GetSecretValue', { + description: 'SecretsManager.GetSecretValue', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'rpc.method': 'GetSecretValue', + 'rpc.service': 'SecretsManager', + 'aws.secretsmanager.secret.arn': 'arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-abc', + }), + }); + + // StepFunctions - StartExecution + expectSpan('StepFunctions.StartExecution', { + description: 'SFN.StartExecution', + op: 'rpc', + origin: 'auto.otel.aws', + data: expect.objectContaining({ + 'rpc.method': 'StartExecution', + 'rpc.service': 'SFN', + 'aws.step_functions.state_machine.arn': 'arn:aws:states:us-east-1:123456789012:stateMachine:my-state-machine', + }), + }); +} + +describe('awsIntegration', () => { + afterAll(() => { + cleanupChildProcesses(); + }); + + describe.each([ + { label: 'latest', additionalDependencies: undefined }, + { label: 'v3.1041.0 (@smithy/middleware-stack)', additionalDependencies: LEGACY_AWS_SDK_DEPENDENCIES }, + ])('aws-sdk $label', ({ additionalDependencies }) => { + createEsmAndCjsTests( + __dirname, + 'scenario.mjs', + 'instrument.mjs', + (createTestRunner, test) => { + test('auto-instruments aws-sdk service operations', { timeout: 90_000 }, async () => { + await createTestRunner().ignore('event').expect({ transaction: assertAwsServiceSpans }).start().completed(); + }); + }, + { additionalDependencies }, + ); + }); +}); diff --git a/packages/aws-serverless/src/integration/aws/vendored/aws-sdk.ts b/packages/aws-serverless/src/integration/aws/vendored/aws-sdk.ts index b20c1387d72a..2864f202c9ac 100644 --- a/packages/aws-serverless/src/integration/aws/vendored/aws-sdk.ts +++ b/packages/aws-serverless/src/integration/aws/vendored/aws-sdk.ts @@ -16,6 +16,8 @@ * NOTICE from the Sentry authors: * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-aws-sdk * - Upstream version: @opentelemetry/instrumentation-aws-sdk@0.73.0 + * - Backported the `@smithy/core` >= 3.24.0 support from upstream 0.74.0 + * (https://github.com/open-telemetry/opentelemetry-js-contrib/pull/3530) */ /* eslint-disable */ @@ -121,6 +123,20 @@ export class AwsInstrumentation extends InstrumentationBase= 3.24.0: the `Client` class moved from @smithy/smithy-client + // into the @smithy/core/client bundle, and `constructStack` became a closed-over local in + // that bundle (so wrapping the @smithy/middleware-stack export no longer applies). We patch + // `Client.prototype.send` there, and patch the live middleware stack from within `send`. + const v3SmithyCoreClientFile = new InstrumentationNodeModuleFile( + '@smithy/core/dist-cjs/submodules/client/index.js', + ['>=3.24.0'], + this.patchV3SmithyClient.bind(this), + this.unpatchV3SmithyClient.bind(this), + ); + const v3SmithyCore = new InstrumentationNodeModuleDefinition('@smithy/core', ['>=3.24.0'], undefined, undefined, [ + v3SmithyCoreClientFile, + ]); + const v3SmithyClient = new InstrumentationNodeModuleDefinition( '@aws-sdk/smithy-client', ['^3.1.0'], @@ -136,7 +152,7 @@ export class AwsInstrumentation extends InstrumentationBase Promise) { + private _getV3SmithyClientSendPatch( + moduleVersion: string | undefined, + original: (...args: unknown[]) => Promise, + ) { + const self = this; return function send(this: any, command: V3PluginCommand, ...args: unknown[]): Promise { command[V3_CLIENT_CONFIG_KEY] = this.config; + // For @smithy/core >= 3.24.0 `constructStack` is no longer patchable via its export, so we + // patch the live middleware stack instance here instead. This is a no-op (guarded by + // `isWrapped`) for older versions where the stack was already patched via `constructStack`. + self.patchV3MiddlewareStack(moduleVersion, this.middlewareStack); return original.apply(this, [command, ...args]); }; } @@ -247,8 +271,12 @@ export class AwsInstrumentation extends InstrumentationBase Date: Mon, 15 Jun 2026 16:11:27 +0200 Subject: [PATCH 3/3] fix dedupe --- yarn.lock | 315 +++++------------------------------------------------- 1 file changed, 26 insertions(+), 289 deletions(-) diff --git a/yarn.lock b/yarn.lock index 991c5d4dad41..1b695c601bd2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -908,18 +908,7 @@ "@smithy/types" "^4.12.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@^3.972.34", "@aws-sdk/credential-provider-env@^3.972.4": - version "3.972.34" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.34.tgz#9d420adf02e7604094a641ae613a353aa86e1b83" - integrity sha512-XT0jtf8Fw9JE6ppsQeoNnZRiG+jqRixMT1v1ZR17G60UvVdsQmTG8nbEyHuEPfMxDXEhfdARaM/XiEhca4lGHQ== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-env@^3.972.46": +"@aws-sdk/credential-provider-env@^3.972.4", "@aws-sdk/credential-provider-env@^3.972.46": version "3.972.46" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.46.tgz#590695585036566535b9d9f28d90658a725a123b" integrity sha512-+GPXVS2srMOlH74S+SmC1gVuP2TvUZ0siuC0onKO93q+udP+M72dmY8wJfVQ5CX9z/9X5A1HHwz5yRIGBtskvQ== @@ -930,23 +919,7 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@^3.972.36", "@aws-sdk/credential-provider-http@^3.972.6": - version "3.972.36" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.36.tgz#842268559da2ffc5855cde1e90e7302d53639c08" - integrity sha512-DPoGWfy7J7RKxvbf5kOKIGQkD2ek3dbKgzKIGrnLuvZBz5myU+Im/H6pmc14QcnFbqHMqxvtWSgRDSJW3qXLQg== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/types" "^3.973.8" - "@smithy/fetch-http-handler" "^5.3.17" - "@smithy/node-http-handler" "^4.6.1" - "@smithy/property-provider" "^4.2.14" - "@smithy/protocol-http" "^5.3.14" - "@smithy/smithy-client" "^4.12.13" - "@smithy/types" "^4.14.1" - "@smithy/util-stream" "^4.5.25" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-http@^3.972.48": +"@aws-sdk/credential-provider-http@^3.972.48", "@aws-sdk/credential-provider-http@^3.972.6": version "3.972.48" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.48.tgz#074fe92aa255f0c42441955da6cfeb2bbc57a263" integrity sha512-fA5loSdlocacRxyUXtpoHSMuk5rsIKRDzQYVMnMxjcmFeZshaJlJ8lymy/hYKji6sne/UmNGj5pxuEs6kq/Qcg== @@ -959,27 +932,7 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@^3.972.38", "@aws-sdk/credential-provider-ini@^3.972.4": - version "3.972.38" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.38.tgz#e20955fdfe4a88149b20dc7e25a517542e1dfd9f" - integrity sha512-oDzUBu2MGJFgoar05sPMCwSrhw44ASyccrHzj66vO69OZqi7I6hZZxXfuPLC8OCzW7C+sU+bI73XHij41yekgQ== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/credential-provider-env" "^3.972.34" - "@aws-sdk/credential-provider-http" "^3.972.36" - "@aws-sdk/credential-provider-login" "^3.972.38" - "@aws-sdk/credential-provider-process" "^3.972.34" - "@aws-sdk/credential-provider-sso" "^3.972.38" - "@aws-sdk/credential-provider-web-identity" "^3.972.38" - "@aws-sdk/nested-clients" "^3.997.6" - "@aws-sdk/types" "^3.973.8" - "@smithy/credential-provider-imds" "^4.2.14" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-ini@^3.972.53": +"@aws-sdk/credential-provider-ini@^3.972.4", "@aws-sdk/credential-provider-ini@^3.972.53": version "3.972.53" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.53.tgz#d17c2ebfab9c3a38c45f857567535bf4dd9290a0" integrity sha512-ZfdhIOR41q8TcWEnUac+gCOb+O2LBWdHLmjedXpXz4IEFW2ppNuFcm6p0sMTavpM+zD5TYfpH5Gp7guRyqSgsQ== @@ -998,21 +951,7 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-login@^3.972.38", "@aws-sdk/credential-provider-login@^3.972.4": - version "3.972.38" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.38.tgz#278437712c02a3ad1785f70c93b4f591cb3f6491" - integrity sha512-g1NosS8qe4OF++G2UFCM5ovSkgipC7YYor5KCWatG0UoMSO5YFj9C8muePlyVmOBV/WTI16Jo3/s1NUo/o1Bww== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/nested-clients" "^3.997.6" - "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/protocol-http" "^5.3.14" - "@smithy/shared-ini-file-loader" "^4.4.9" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-login@^3.972.52": +"@aws-sdk/credential-provider-login@^3.972.4", "@aws-sdk/credential-provider-login@^3.972.52": version "3.972.52" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.52.tgz#43f2db767db000a1c5317ba35ecd2124cb0a883e" integrity sha512-9hu2oR0qH7Fst5Tzdx+UWxm+w5zCXtErTLtOOW5hwwQc170CLwOeniRxyFY6s9mHfGEfC5zFukNBdKBwJR8mhQ== @@ -1024,25 +963,7 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@^3.972.4", "@aws-sdk/credential-provider-node@^3.972.5": - version "3.972.39" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.39.tgz#71f87848b7615dda4f31a57b113be9666e4bbd1a" - integrity sha512-HEswDQyxUtadoZ/bJsPPENHg7R0Lzym5LuMksJeHvqhCOpP+rtkDLKI4/ZChH4w3cf5kG8n6bZuI8PzajoiqMg== - dependencies: - "@aws-sdk/credential-provider-env" "^3.972.34" - "@aws-sdk/credential-provider-http" "^3.972.36" - "@aws-sdk/credential-provider-ini" "^3.972.38" - "@aws-sdk/credential-provider-process" "^3.972.34" - "@aws-sdk/credential-provider-sso" "^3.972.38" - "@aws-sdk/credential-provider-web-identity" "^3.972.38" - "@aws-sdk/types" "^3.973.8" - "@smithy/credential-provider-imds" "^4.2.14" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-node@^3.972.55": +"@aws-sdk/credential-provider-node@^3.972.4", "@aws-sdk/credential-provider-node@^3.972.5", "@aws-sdk/credential-provider-node@^3.972.55": version "3.972.55" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.55.tgz#117eaec668dde8e3366bdb750d4c5c247a59a31f" integrity sha512-zMGLa/dhESVqmCD7mmIFFKSwSFrJGScvCXcjvBZEVOOMauFS5JRQvLTMukFpMEFWiV6dTAlsen2ATDBulLPtbg== @@ -1059,19 +980,7 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@^3.972.34", "@aws-sdk/credential-provider-process@^3.972.4": - version "3.972.34" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.34.tgz#c964275be1a528ac73ade6d98c309fb6b7cdfb68" - integrity sha512-T3IFs4EVmVi1dVN5RciFnklCANSzvrQd/VuHY9ThHSQmYkTogjcGkoJEr+oNUPQZnso52183088NqysMPji1/Q== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-process@^3.972.46": +"@aws-sdk/credential-provider-process@^3.972.4", "@aws-sdk/credential-provider-process@^3.972.46": version "3.972.46" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.46.tgz#b8d967fa7ea65bdb51a0d60609b3947f01ad1390" integrity sha512-VUoNFBIjWrUN8NbFiQiuxQEgFjvziAlBRPK+ddh27aj65gk0BYu6bLZnrdrNZwpW6vAihtSUtEMQ1PUJ32QRPA== @@ -1082,21 +991,7 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@^3.972.38", "@aws-sdk/credential-provider-sso@^3.972.4": - version "3.972.38" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.38.tgz#ec754bfecb2426a3307e19ef7e6c6b6438a327c6" - integrity sha512-5ZxG+t0+3Q3QPh8KEjX6syskhgNf7I0MN7oGioTf6Lm1NTjfP7sIcYGNsthXC2qR8vcD3edNZwCr2ovfSSWuRA== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/nested-clients" "^3.997.6" - "@aws-sdk/token-providers" "3.1041.0" - "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-sso@^3.972.52": +"@aws-sdk/credential-provider-sso@^3.972.4", "@aws-sdk/credential-provider-sso@^3.972.52": version "3.972.52" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.52.tgz#d3f43251c0a02378d9278508385f511dcc105fb8" integrity sha512-nb2/n4o/HQf+FVpVbZe9vCTFngmuDoIsltMgLAtjixaKzvzhB4J8WSDFyWgnErgLHk55ctWH+I4PU+LIHhyffg== @@ -1109,20 +1004,7 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@^3.972.38", "@aws-sdk/credential-provider-web-identity@^3.972.4": - version "3.972.38" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.38.tgz#149951ef6e12db5292118e8ed5d95133c24ad719" - integrity sha512-lYHFF30DGI20jZcYX8cm6Ns0V7f1dDN6g/MBDLTyD/5iw+bXs3yBr2iAiHDkx4RFU5JgsnZvCHYKiRVPRdmOgw== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/nested-clients" "^3.997.6" - "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-web-identity@^3.972.52": +"@aws-sdk/credential-provider-web-identity@^3.972.4", "@aws-sdk/credential-provider-web-identity@^3.972.52": version "3.972.52" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.52.tgz#28201a0e787f83aac75b80922d699cbe489a3d94" integrity sha512-lKj6aRSGbqLmpYmM24bY7a1Xmfcq2vkE3hv8CSPYfc1yCu0BPu/XEJ1L4Fm61MsU6ULLNSG8UGsffNoFUBjESA== @@ -1197,7 +1079,7 @@ "@aws-sdk/checksums" "^3.1000.5" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@^3.972.10", "@aws-sdk/middleware-host-header@^3.972.3": +"@aws-sdk/middleware-host-header@^3.972.3": version "3.972.10" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.10.tgz#e63b91959ce46948d789582351b2a44c4876e924" integrity sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg== @@ -1207,7 +1089,7 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/middleware-logger@^3.972.10", "@aws-sdk/middleware-logger@^3.972.3": +"@aws-sdk/middleware-logger@^3.972.3": version "3.972.10" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.972.10.tgz#d92b3374dcaddd523930bdff441207946343c270" integrity sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ== @@ -1216,7 +1098,7 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@^3.972.11", "@aws-sdk/middleware-recursion-detection@^3.972.3": +"@aws-sdk/middleware-recursion-detection@^3.972.3": version "3.972.11" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.11.tgz#5659982a34fa58c69cbd358c2987c32aefd2bd91" integrity sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ== @@ -1227,26 +1109,6 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@^3.972.37": - version "3.972.37" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.37.tgz#82ef4953cddd3373d2942d07a5d2baf443bbf3ea" - integrity sha512-Km7M+i8DrLArVzrid1gfxeGhYHBd3uxvE77g0s5a52zPSVosxzQBnJ0gwWb6NIp/DOk8gsBMhi7V+cpJG0ndTA== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/types" "^3.973.8" - "@aws-sdk/util-arn-parser" "^3.972.3" - "@smithy/core" "^3.23.17" - "@smithy/node-config-provider" "^4.3.14" - "@smithy/protocol-http" "^5.3.14" - "@smithy/signature-v4" "^5.3.14" - "@smithy/smithy-client" "^4.12.13" - "@smithy/types" "^4.14.1" - "@smithy/util-config-provider" "^4.2.2" - "@smithy/util-middleware" "^4.2.14" - "@smithy/util-stream" "^4.5.25" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - "@aws-sdk/middleware-sdk-s3@^3.972.51": version "3.972.51" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.51.tgz#746c869d5e8a5980946315612d0deefdfd40d54f" @@ -1343,52 +1205,7 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/nested-clients@^3.997.6": - version "3.997.6" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.997.6.tgz#17433cfac2160ec620a14cbff9d2b33675712cae" - integrity sha512-WBDnqatJl+kGObpfmfSxqnXeYTu3Me8wx8WCtvoxX3pfWrrTv8I4WTMSSs7PZqcRcVh8WeUKMgGFjMG+52SR1w== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/middleware-host-header" "^3.972.10" - "@aws-sdk/middleware-logger" "^3.972.10" - "@aws-sdk/middleware-recursion-detection" "^3.972.11" - "@aws-sdk/middleware-user-agent" "^3.972.38" - "@aws-sdk/region-config-resolver" "^3.972.13" - "@aws-sdk/signature-v4-multi-region" "^3.996.25" - "@aws-sdk/types" "^3.973.8" - "@aws-sdk/util-endpoints" "^3.996.8" - "@aws-sdk/util-user-agent-browser" "^3.972.10" - "@aws-sdk/util-user-agent-node" "^3.973.24" - "@smithy/config-resolver" "^4.4.17" - "@smithy/core" "^3.23.17" - "@smithy/fetch-http-handler" "^5.3.17" - "@smithy/hash-node" "^4.2.14" - "@smithy/invalid-dependency" "^4.2.14" - "@smithy/middleware-content-length" "^4.2.14" - "@smithy/middleware-endpoint" "^4.4.32" - "@smithy/middleware-retry" "^4.5.7" - "@smithy/middleware-serde" "^4.2.20" - "@smithy/middleware-stack" "^4.2.14" - "@smithy/node-config-provider" "^4.3.14" - "@smithy/node-http-handler" "^4.6.1" - "@smithy/protocol-http" "^5.3.14" - "@smithy/smithy-client" "^4.12.13" - "@smithy/types" "^4.14.1" - "@smithy/url-parser" "^4.2.14" - "@smithy/util-base64" "^4.3.2" - "@smithy/util-body-length-browser" "^4.2.2" - "@smithy/util-body-length-node" "^4.2.3" - "@smithy/util-defaults-mode-browser" "^4.3.49" - "@smithy/util-defaults-mode-node" "^4.2.54" - "@smithy/util-endpoints" "^3.4.2" - "@smithy/util-middleware" "^4.2.14" - "@smithy/util-retry" "^4.3.6" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - -"@aws-sdk/region-config-resolver@^3.972.13", "@aws-sdk/region-config-resolver@^3.972.3": +"@aws-sdk/region-config-resolver@^3.972.3": version "3.972.13" resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.13.tgz#bd32748c2d41b62be838fec76c4b87d4370939c6" integrity sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A== @@ -1399,18 +1216,6 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@^3.996.25": - version "3.996.25" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.25.tgz#b50651b7e4f9c82482416caa9953ad17645d4a2d" - integrity sha512-+CMIt3e1VzlklAECmG+DtP1sV8iKq25FuA0OKpnJ4KA0kxUtd7CgClY7/RU6VzJBQwbN4EJ9Ue6plvqx1qGadw== - dependencies: - "@aws-sdk/middleware-sdk-s3" "^3.972.37" - "@aws-sdk/types" "^3.973.8" - "@smithy/protocol-http" "^5.3.14" - "@smithy/signature-v4" "^5.3.14" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - "@aws-sdk/signature-v4-multi-region@^3.996.34": version "3.996.34" resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.34.tgz#99749163def9dfc720eef85f7fe2d14bb4b763fb" @@ -1421,19 +1226,6 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/token-providers@3.1041.0": - version "3.1041.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1041.0.tgz#f3f068010780fc85fc4a7faa6a080cfb8afd73a4" - integrity sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/nested-clients" "^3.997.6" - "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - "@aws-sdk/token-providers@3.1066.0": version "3.1066.0" resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1066.0.tgz#1253c27ab45284655ab935411a0fbbf91b2c7c7f" @@ -1454,13 +1246,6 @@ "@smithy/types" "^4.14.3" tslib "^2.6.2" -"@aws-sdk/util-arn-parser@^3.972.3": - version "3.972.3" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz#ed989862bbb172ce16d9e1cd5790e5fe367219c2" - integrity sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA== - dependencies: - tslib "^2.6.2" - "@aws-sdk/util-endpoints@3.980.0": version "3.980.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.980.0.tgz#0d2665ad75f92f3f208541f6fa88451d2a2e96ce" @@ -1501,7 +1286,7 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@^3.972.10", "@aws-sdk/util-user-agent-browser@^3.972.3": +"@aws-sdk/util-user-agent-browser@^3.972.3": version "3.972.10" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.10.tgz#e29be10389db9db12b2d8246ad247a89038f4c60" integrity sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g== @@ -1511,7 +1296,7 @@ bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@^3.972.3", "@aws-sdk/util-user-agent-node@^3.972.4", "@aws-sdk/util-user-agent-node@^3.973.24": +"@aws-sdk/util-user-agent-node@^3.972.3", "@aws-sdk/util-user-agent-node@^3.972.4": version "3.973.24" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.24.tgz#cf44a63b92adfecaeb8cb9f948b390456310566a" integrity sha512-ZWwlkjcIp7cEL8ZfTpTAPNkwx25p7xol0xlKoWVVf22+nsjwmLcHYtTPjIV1cSpmB/b6DaK4cb1fSkvCXHgRdw== @@ -8018,18 +7803,7 @@ "@smithy/types" "^4.14.4" tslib "^2.6.2" -"@smithy/credential-provider-imds@^4.2.14", "@smithy/credential-provider-imds@^4.2.8": - version "4.2.14" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.14.tgz#b5dcc198ee240eaf68069e7449bcec29ce279827" - integrity sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg== - dependencies: - "@smithy/node-config-provider" "^4.3.14" - "@smithy/property-provider" "^4.2.14" - "@smithy/types" "^4.14.1" - "@smithy/url-parser" "^4.2.14" - tslib "^2.6.2" - -"@smithy/credential-provider-imds@^4.3.7": +"@smithy/credential-provider-imds@^4.2.14", "@smithy/credential-provider-imds@^4.2.8", "@smithy/credential-provider-imds@^4.3.7": version "4.3.9" resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.9.tgz#3bb51eea08fb40c519df3c4d3b7c5d24dde0094d" integrity sha512-ZlfJ/4Fa3jYb+3eaohPfG9utX9HmdhFNcFtpoGAhUhdynAOmGXtmigbi7eEiONKM+ykHw8RwKuDEb85Lx7t7fA== @@ -8038,18 +7812,7 @@ "@smithy/types" "^4.14.4" tslib "^2.6.2" -"@smithy/fetch-http-handler@^5.3.17", "@smithy/fetch-http-handler@^5.3.9": - version "5.3.17" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.17.tgz#bf13a4b03eb8afe101775fef59a1758f8fb5cd4b" - integrity sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw== - dependencies: - "@smithy/protocol-http" "^5.3.14" - "@smithy/querystring-builder" "^4.2.14" - "@smithy/types" "^4.14.1" - "@smithy/util-base64" "^4.3.2" - tslib "^2.6.2" - -"@smithy/fetch-http-handler@^5.4.6": +"@smithy/fetch-http-handler@^5.3.17", "@smithy/fetch-http-handler@^5.3.9", "@smithy/fetch-http-handler@^5.4.6": version "5.4.7" resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.7.tgz#fe82b38c6201aa4a413062020cf47c35bd4d44c0" integrity sha512-NslaM2ir0N2hisDmzXLstPaVINZheh8SokyOC++kzFPloZucL2R7Y7bS57mSzx/1Fc/fqmn7twjkeezTTrV0EA== @@ -8058,7 +7821,7 @@ "@smithy/types" "^4.14.4" tslib "^2.6.2" -"@smithy/hash-node@^4.2.14", "@smithy/hash-node@^4.2.8": +"@smithy/hash-node@^4.2.8": version "4.2.14" resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.2.14.tgz#e3ed33dc614e26fff5f043e097750c6931b48592" integrity sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g== @@ -8068,7 +7831,7 @@ "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@smithy/invalid-dependency@^4.2.14", "@smithy/invalid-dependency@^4.2.8": +"@smithy/invalid-dependency@^4.2.8": version "4.2.14" resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.14.tgz#a52766f9d4299abcd9d6cd23b5a76f34fc59c7a0" integrity sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw== @@ -8090,7 +7853,7 @@ dependencies: tslib "^2.6.2" -"@smithy/middleware-content-length@^4.2.14", "@smithy/middleware-content-length@^4.2.8": +"@smithy/middleware-content-length@^4.2.8": version "4.2.14" resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.14.tgz#d8b17f94c4d8f9c3b7992f1db84d3299c83efe78" integrity sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw== @@ -8113,7 +7876,7 @@ "@smithy/util-middleware" "^4.2.14" tslib "^2.6.2" -"@smithy/middleware-retry@^4.4.29", "@smithy/middleware-retry@^4.5.7": +"@smithy/middleware-retry@^4.4.29": version "4.5.7" resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.5.7.tgz#a2da0c472d631ee408ff566186c99571b3efb70b" integrity sha512-bRt6ZImqVSeTk39Nm81K20ObIiAZ3WefY7G6+iz/0tZjs4dgRRjvRX2sgsH+zi6iDCRR/aQvQofLKxxz4rPBZg== @@ -8157,17 +7920,7 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@smithy/node-http-handler@^4.4.8", "@smithy/node-http-handler@^4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.6.1.tgz#cb25b9445e46294a6f0dfb1566dbf2a1a19510af" - integrity sha512-iB+orM4x3xrr57X3YaXazfKnntl0LHlZB1kcXSGzMV1Tt0+YwEjGlbjk/44qEGtBzXAz6yFDzkYTKSV6Pj2HUg== - dependencies: - "@smithy/protocol-http" "^5.3.14" - "@smithy/querystring-builder" "^4.2.14" - "@smithy/types" "^4.14.1" - tslib "^2.6.2" - -"@smithy/node-http-handler@^4.7.6": +"@smithy/node-http-handler@^4.4.8", "@smithy/node-http-handler@^4.6.1", "@smithy/node-http-handler@^4.7.6": version "4.7.8" resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.7.8.tgz#c6a42bc967cc1d9961b1be54d4f3fc5f38f8f4bc" integrity sha512-f+DbsWUwSbtMu1a/j8Y93KiU1SRg9nyzfjereqn1BJ33QOTUXxdlYvVXMhAYl1vuR1Kmna5aIJe09KSIfyFNYw== @@ -8192,15 +7945,6 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@smithy/querystring-builder@^4.2.14": - version "4.2.14" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.14.tgz#102429e0fb004108babf219edfcf6f111e66d782" - integrity sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A== - dependencies: - "@smithy/types" "^4.14.1" - "@smithy/util-uri-escape" "^4.2.2" - tslib "^2.6.2" - "@smithy/querystring-parser@^4.2.14": version "4.2.14" resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.14.tgz#c479ba1f346656b9f8ce46d9a91c229e4e50420f" @@ -8224,7 +7968,7 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@smithy/signature-v4@^5.3.14", "@smithy/signature-v4@^5.4.6": +"@smithy/signature-v4@^5.4.6": version "5.4.7" resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.4.7.tgz#a56fc486928bb54d822f1f18f81a1e00328e78ce" integrity sha512-LwQZazFayImv+IOm0S0enoLeUJwmAlhGC5O6YCcLWezyu08dF46GOxPOq35OpBIHkgd7OvNvBStIFwVNyrvoBw== @@ -8271,14 +8015,14 @@ "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@smithy/util-body-length-browser@^4.2.0", "@smithy/util-body-length-browser@^4.2.2": +"@smithy/util-body-length-browser@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz#c4404277d22039872abdb80e7800f9a63f263862" integrity sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ== dependencies: tslib "^2.6.2" -"@smithy/util-body-length-node@^4.2.1", "@smithy/util-body-length-node@^4.2.3": +"@smithy/util-body-length-node@^4.2.1": version "4.2.3" resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz#f923ca530defb86a9ac3ca2d3066bcca7b304fbc" integrity sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g== @@ -8308,7 +8052,7 @@ dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^4.3.28", "@smithy/util-defaults-mode-browser@^4.3.49": +"@smithy/util-defaults-mode-browser@^4.3.28": version "4.3.49" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.49.tgz#926ce84bf65e56307f25cce7a13b427d33442939" integrity sha512-a5bNrdiONYB/qE2BuKegvUMd/+ZDwdg4vsNuuSzYE8qs2EYAdK9CynL+Rzn29PbPiUqoz/cbpRbcLzD5lEevHw== @@ -8318,7 +8062,7 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^4.2.31", "@smithy/util-defaults-mode-node@^4.2.54": +"@smithy/util-defaults-mode-node@^4.2.31": version "4.2.54" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.54.tgz#32c4ea9f8a8c74ef9fe0ca5e3d6a10df0327f87e" integrity sha512-g1cvrJvOnzeJgEdf7AE4luI7gp6L8weE0y9a9wQUSGtjb8QRHDbCJYuE4Sy0SD9N8RrnNPFsPltAz/OSoBR9Zw== @@ -8378,13 +8122,6 @@ "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@smithy/util-uri-escape@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz#48e40206e7fe9daefc8d44bb43a1ab17e76abf4a" - integrity sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw== - dependencies: - tslib "^2.6.2" - "@smithy/util-utf8@^2.0.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5"