@opentelemetry/instrumentation-aws-sdk 0.63.0 → 0.64.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -48,24 +48,25 @@ registerInstrumentations({
48
48
 
49
49
  aws-sdk instrumentation has few options available to choose from. You can set the following:
50
50
 
51
- | Options | Type | Description |
52
- | ----------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
53
- | `preRequestHook` | `AwsSdkRequestCustomAttributeFunction` | Hook called before request send, which allow to add custom attributes to span. |
54
- | `responseHook` | `AwsSdkResponseCustomAttributeFunction` | Hook for adding custom attributes when response is received from aws. |
55
- | `exceptionHook` | `AwsSdkExceptionCustomAttributeFunction` | Hook for adding custom attributes when exception is received from aws. |
56
- | `suppressInternalInstrumentation` | `boolean` | Most aws operation use http requests under the hood. Set this to `true` to hide all underlying http spans. |
57
- | `sqsExtractContextPropagationFromPayload` | `boolean` | Will parse and extract context propagation headers from SQS Payload, false by default. [When should it be used?](./doc/sns.md#integration-with-sqs) |
58
- | `dynamoDBStatementSerializer` | `AwsSdkDynamoDBStatementSerializer` | AWS SDK instrumentation will serialize DynamoDB commands to the `db.statement` attribute using the specified function. Defaults to using a serializer that returns `undefined`. |
51
+ | Options | Type | Description |
52
+ |-------------------------------------------|------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
53
+ | `preRequestHook` | `AwsSdkRequestCustomAttributeFunction` | Hook called before request send, which allow to add custom attributes to span. |
54
+ | `responseHook` | `AwsSdkResponseCustomAttributeFunction` | Hook for adding custom attributes when response is received from aws. |
55
+ | `exceptionHook` | `AwsSdkExceptionCustomAttributeFunction` | Hook for adding custom attributes when exception is received from aws. |
56
+ | `suppressInternalInstrumentation` | `boolean` | Most aws operation use http requests under the hood. Set this to `true` to hide all underlying http spans. |
57
+ | `sqsExtractContextPropagationFromPayload` | `boolean` | Will parse and extract context propagation headers from SQS Payload, false by default. [When should it be used?](./doc/sns.md#integration-with-sqs) |
58
+ | `dynamoDBStatementSerializer` | `AwsSdkDynamoDBStatementSerializer` | AWS SDK instrumentation will serialize DynamoDB commands to the `db.statement` attribute using the specified function. Defaults to using a serializer that returns `undefined`. |
59
59
 
60
60
  ## Span Attributes
61
61
 
62
62
  The instrumentations are collecting the following attributes:
63
- | Attribute Name | Type | Description | Example |
64
- | -------------- | ---- | ----------- | ------- |
65
- | `rpc.system` | string | Always equals "aws-api" | |
66
- | `rpc.method` | string | he name of the operation corresponding to the request, as returned by the AWS SDK. If the SDK does not provide a way to retrieve a name, the name of the command SHOULD be used, removing the suffix `Command` if present, resulting in a PascalCase name with no spaces. | `PutObject` |
67
- | `rpc.service` | string | The name of the service to which a request is made, as returned by the AWS SDK. If the SDK does not provide a away to retrieve a name, the name of the SDK's client interface for a service SHOULD be used, removing the suffix `Client` if present, resulting in a PascalCase name with no spaces. | `S3`, `DynamoDB`, `Route53` |
68
- | `cloud.region` | string | Region name for the request | "eu-west-1" |
63
+
64
+ | Attribute Name | Type | Description | Example |
65
+ |----------------|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
66
+ | `rpc.system` | string | Always equals "aws-api" | |
67
+ | `rpc.method` | string | The name of the operation corresponding to the request, as returned by the AWS SDK. If the SDK does not provide a way to retrieve a name, the name of the command SHOULD be used, removing the suffix `Command` if present, resulting in a PascalCase name with no spaces. | `PutObject` |
68
+ | `rpc.service` | string | The name of the service to which a request is made, as returned by the AWS SDK. If the SDK does not provide a away to retrieve a name, the name of the SDK's client interface for a service SHOULD be used, removing the suffix `Client` if present, resulting in a PascalCase name with no spaces. | `S3`, `DynamoDB`, `Route53` |
69
+ | `cloud.region` | string | Region name for the request | "eu-west-1" |
69
70
 
70
71
  ### Custom User Attributes
71
72
 
@@ -109,48 +110,48 @@ This package emits telemetry using a mix of Semantic Convention versions. While
109
110
 
110
111
  Attributes collected (this list is currently not exhaustive):
111
112
 
112
- | Attribute | Short Description | Service |
113
- | --------------------------------------------- | ---------------------------------------------------------------------------------------------- | -------- |
114
- | `http.status_code` / `http.response.status_code` | (aws-sdk) HTTP response status code. See "HTTP Semantic Convention migration" note below. | |
115
- | `rpc.method` | The name of the (logical) method being called. | |
116
- | `rpc.service` | The full (logical) name of the service being called. | |
117
- | `rpc.system` | A string identifying the remoting system. | |
118
- | `cloud.region` | The AWS Region where the requested service is being accessed. | |
119
- | `aws.dynamodb.attribute_definitions` | The JSON-serialized value of each item in the `AttributeDefinitions` request field. | dynamodb |
120
- | `aws.dynamodb.consistent_read` | The value of the `ConsistentRead` request parameter. | dynamodb |
121
- | `aws.dynamodb.consumed_capacity` | The JSON-serialized value of each item in the `ConsumedCapacity` response field. | dynamodb |
122
- | `aws.dynamodb.count` | The value of the `Count` response parameter. | dynamodb |
123
- | `aws.dynamodb.exclusive_start_table` | The value of the `ExclusiveStartTableName` request parameter. | dynamodb |
124
- | `aws.dynamodb.global_secondary_index_updates` | The JSON-serialized value of each item in the the `GlobalSecondaryIndexUpdates` request field. | dynamodb |
125
- | `aws.dynamodb.global_secondary_indexes` | The JSON-serialized value of each item of the `GlobalSecondaryIndexes` request field. | dynamodb |
126
- | `aws.dynamodb.index_name` | The value of the `IndexName` request parameter. | dynamodb |
127
- | `aws.dynamodb.item_collection_metrics` | The JSON-serialized value of the `ItemCollectionMetrics` response field. | dynamodb |
128
- | `aws.dynamodb.limit` | The value of the `Limit` request parameter. | dynamodb |
129
- | `aws.dynamodb.local_secondary_indexes` | The JSON-serialized value of each item of the `LocalSecondaryIndexes` request field. | dynamodb |
130
- | `aws.dynamodb.projection` | The value of the `ProjectionExpression` request parameter. | dynamodb |
131
- | `aws.dynamodb.provisioned_read_capacity` | The value of the `ProvisionedThroughput.ReadCapacityUnits` request parameter. | dynamodb |
132
- | `aws.dynamodb.provisioned_write_capacity` | The value of the `ProvisionedThroughput.WriteCapacityUnits` request parameter. | dynamodb |
133
- | `aws.dynamodb.scan_forward` | The value of the `ScanIndexForward` request parameter. | dynamodb |
134
- | `aws.dynamodb.scanned_count` | The value of the `ScannedCount` response parameter. | dynamodb |
135
- | `aws.dynamodb.segment` | The value of the `Segment` request parameter. | dynamodb |
136
- | `aws.dynamodb.select` | The value of the `Select` request parameter. | dynamodb |
137
- | `aws.dynamodb.table_count` | The number of items in the `TableNames` response parameter. | dynamodb |
138
- | `aws.dynamodb.table_names` | The keys in the `RequestItems` object field. | dynamodb |
139
- | `aws.dynamodb.total_segments` | The value of the `TotalSegments` request parameter. | dynamodb |
140
- | `db.name` | The name of the database being accessed. | dynamodb |
141
- | `db.operation` | The name of the operation being executed. | dynamodb |
142
- | `db.statement` | The database statement being executed. | dynamodb |
143
- | `db.system` | An identifier for the database management system (DBMS) product being used. | dynamodb |
144
- | `faas.execution` | The execution ID of the current function execution. | lambda |
145
- | `faas.invoked_name` | The name of the invoked function. | lambda |
146
- | `faas.invoked_provider` | The cloud provider of the invoked function. | lambda |
147
- | `faas.invoked_region` | The cloud region of the invoked function. | lambda |
148
- | `messaging.destination` | The message destination name. | sns, sqs |
149
- | `messaging.destination_kind` | The kind of message destination. | sns, sqs |
150
- | `messaging.system` | A string identifying the messaging system. | sns, sqs |
151
- | `messaging.operation` | A string identifying the kind of message consumption. | sqs |
152
- | `messaging.message_id` | A value used by the messaging system as an identifier for the message. | sqs |
153
- | `messaging.url` | The connection string. | sqs |
113
+ | Attribute | Short Description | Service |
114
+ |--------------------------------------------------|------------------------------------------------------------------------------------------------|----------|
115
+ | `http.status_code` / `http.response.status_code` | (aws-sdk) HTTP response status code. See "HTTP Semantic Convention migration" note below. | |
116
+ | `rpc.method` | The name of the (logical) method being called. | |
117
+ | `rpc.service` | The full (logical) name of the service being called. | |
118
+ | `rpc.system` | A string identifying the remoting system. | |
119
+ | `cloud.region` | The AWS Region where the requested service is being accessed. | |
120
+ | `aws.dynamodb.attribute_definitions` | The JSON-serialized value of each item in the `AttributeDefinitions` request field. | dynamodb |
121
+ | `aws.dynamodb.consistent_read` | The value of the `ConsistentRead` request parameter. | dynamodb |
122
+ | `aws.dynamodb.consumed_capacity` | The JSON-serialized value of each item in the `ConsumedCapacity` response field. | dynamodb |
123
+ | `aws.dynamodb.count` | The value of the `Count` response parameter. | dynamodb |
124
+ | `aws.dynamodb.exclusive_start_table` | The value of the `ExclusiveStartTableName` request parameter. | dynamodb |
125
+ | `aws.dynamodb.global_secondary_index_updates` | The JSON-serialized value of each item in the the `GlobalSecondaryIndexUpdates` request field. | dynamodb |
126
+ | `aws.dynamodb.global_secondary_indexes` | The JSON-serialized value of each item of the `GlobalSecondaryIndexes` request field. | dynamodb |
127
+ | `aws.dynamodb.index_name` | The value of the `IndexName` request parameter. | dynamodb |
128
+ | `aws.dynamodb.item_collection_metrics` | The JSON-serialized value of the `ItemCollectionMetrics` response field. | dynamodb |
129
+ | `aws.dynamodb.limit` | The value of the `Limit` request parameter. | dynamodb |
130
+ | `aws.dynamodb.local_secondary_indexes` | The JSON-serialized value of each item of the `LocalSecondaryIndexes` request field. | dynamodb |
131
+ | `aws.dynamodb.projection` | The value of the `ProjectionExpression` request parameter. | dynamodb |
132
+ | `aws.dynamodb.provisioned_read_capacity` | The value of the `ProvisionedThroughput.ReadCapacityUnits` request parameter. | dynamodb |
133
+ | `aws.dynamodb.provisioned_write_capacity` | The value of the `ProvisionedThroughput.WriteCapacityUnits` request parameter. | dynamodb |
134
+ | `aws.dynamodb.scan_forward` | The value of the `ScanIndexForward` request parameter. | dynamodb |
135
+ | `aws.dynamodb.scanned_count` | The value of the `ScannedCount` response parameter. | dynamodb |
136
+ | `aws.dynamodb.segment` | The value of the `Segment` request parameter. | dynamodb |
137
+ | `aws.dynamodb.select` | The value of the `Select` request parameter. | dynamodb |
138
+ | `aws.dynamodb.table_count` | The number of items in the `TableNames` response parameter. | dynamodb |
139
+ | `aws.dynamodb.table_names` | The keys in the `RequestItems` object field. | dynamodb |
140
+ | `aws.dynamodb.total_segments` | The value of the `TotalSegments` request parameter. | dynamodb |
141
+ | `db.name` | The name of the database being accessed. | dynamodb |
142
+ | `db.operation` | The name of the operation being executed. | dynamodb |
143
+ | `db.statement` | The database statement being executed. | dynamodb |
144
+ | `db.system` | An identifier for the database management system (DBMS) product being used. | dynamodb |
145
+ | `faas.execution` | The execution ID of the current function execution. | lambda |
146
+ | `faas.invoked_name` | The name of the invoked function. | lambda |
147
+ | `faas.invoked_provider` | The cloud provider of the invoked function. | lambda |
148
+ | `faas.invoked_region` | The cloud region of the invoked function. | lambda |
149
+ | `messaging.destination` | The message destination name. | sns, sqs |
150
+ | `messaging.destination_kind` | The kind of message destination. | sns, sqs |
151
+ | `messaging.system` | A string identifying the messaging system. | sns, sqs |
152
+ | `messaging.operation` | A string identifying the kind of message consumption. | sqs |
153
+ | `messaging.message_id` | A value used by the messaging system as an identifier for the message. | sqs |
154
+ | `messaging.url` | The connection string. | sqs |
154
155
 
155
156
  ### HTTP Semantic Convention migration
156
157
 
@@ -1 +1 @@
1
- {"version":3,"file":"aws-sdk.js","sourceRoot":"","sources":["../../src/aws-sdk.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Span,\n SpanKind,\n context,\n trace,\n diag,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport { hrTime, suppressTracing } from '@opentelemetry/core';\nimport { AttributeNames } from './enums';\nimport { ServicesExtensions } from './services';\nimport {\n AwsSdkInstrumentationConfig,\n AwsSdkRequestHookInformation,\n AwsSdkResponseHookInformation,\n NormalizedRequest,\n NormalizedResponse,\n} from './types';\n/** @knipignore */\nimport { PACKAGE_NAME, PACKAGE_VERSION } from './version';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport type {\n MiddlewareStack,\n HandlerExecutionContext,\n Command as AwsV3Command,\n Handler as AwsV3MiddlewareHandler,\n InitializeHandlerArguments,\n} from '@aws-sdk/types';\nimport {\n bindPromise,\n extractAttributesFromNormalizedRequest,\n normalizeV3Request,\n removeSuffixFromStringIfExists,\n} from './utils';\nimport { propwrap } from './propwrap';\nimport { RequestMetadata } from './services/ServiceExtension';\nimport { ATTR_HTTP_STATUS_CODE } from './semconv';\nimport { ATTR_HTTP_RESPONSE_STATUS_CODE } from '@opentelemetry/semantic-conventions';\n\nconst V3_CLIENT_CONFIG_KEY = Symbol(\n 'opentelemetry.instrumentation.aws-sdk.client.config'\n);\ntype V3PluginCommand = AwsV3Command<any, any, any, any, any> & {\n [V3_CLIENT_CONFIG_KEY]?: any;\n};\n\nexport class AwsInstrumentation extends InstrumentationBase<AwsSdkInstrumentationConfig> {\n static readonly component = 'aws-sdk';\n // need declare since initialized in callbacks from super constructor\n private declare servicesExtensions: ServicesExtensions;\n\n private _semconvStability: SemconvStability;\n\n constructor(config: AwsSdkInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n process.env.OTEL_SEMCONV_STABILITY_OPT_IN\n );\n }\n\n protected init(): InstrumentationModuleDefinition[] {\n const v3MiddlewareStackFileOldVersions = new InstrumentationNodeModuleFile(\n '@aws-sdk/middleware-stack/dist/cjs/MiddlewareStack.js',\n ['>=3.1.0 <3.35.0'],\n this.patchV3ConstructStack.bind(this),\n this.unpatchV3ConstructStack.bind(this)\n );\n const v3MiddlewareStackFileNewVersions = new InstrumentationNodeModuleFile(\n '@aws-sdk/middleware-stack/dist-cjs/MiddlewareStack.js',\n ['>=3.35.0'],\n this.patchV3ConstructStack.bind(this),\n this.unpatchV3ConstructStack.bind(this)\n );\n\n // as for aws-sdk v3.13.1, constructStack is exported from @aws-sdk/middleware-stack as\n // getter instead of function, which fails shimmer.\n // so we are patching the MiddlewareStack.js file directly to get around it.\n const v3MiddlewareStack = new InstrumentationNodeModuleDefinition(\n '@aws-sdk/middleware-stack',\n ['^3.1.0'],\n undefined,\n undefined,\n [v3MiddlewareStackFileOldVersions, v3MiddlewareStackFileNewVersions]\n );\n\n // Patch for @smithy/middleware-stack for @aws-sdk/* packages v3.363.0+.\n // As of @smithy/middleware-stack@2.1.0 `constructStack` is only available\n // as a getter, so we cannot use `this._wrap()`.\n const self = this;\n const v3SmithyMiddlewareStack = new InstrumentationNodeModuleDefinition(\n '@smithy/middleware-stack',\n ['>=2.0.0'],\n (moduleExports, moduleVersion) => {\n const newExports = propwrap(\n moduleExports,\n 'constructStack',\n (orig: any) => {\n self._diag.debug('propwrapping aws-sdk v3 constructStack');\n return self._getV3ConstructStackPatch(moduleVersion, orig);\n }\n );\n return newExports;\n }\n );\n\n const v3SmithyClient = new InstrumentationNodeModuleDefinition(\n '@aws-sdk/smithy-client',\n ['^3.1.0'],\n this.patchV3SmithyClient.bind(this),\n this.unpatchV3SmithyClient.bind(this)\n );\n\n // patch for new @smithy/smithy-client for aws-sdk packages v3.363.0+\n const v3NewSmithyClient = new InstrumentationNodeModuleDefinition(\n '@smithy/smithy-client',\n ['>=1.0.3'],\n this.patchV3SmithyClient.bind(this),\n this.unpatchV3SmithyClient.bind(this)\n );\n\n return [\n v3MiddlewareStack,\n v3SmithyMiddlewareStack,\n v3SmithyClient,\n v3NewSmithyClient,\n ];\n }\n\n protected patchV3ConstructStack(moduleExports: any, moduleVersion?: string) {\n this._wrap(\n moduleExports,\n 'constructStack',\n this._getV3ConstructStackPatch.bind(this, moduleVersion)\n );\n return moduleExports;\n }\n\n protected unpatchV3ConstructStack(moduleExports: any) {\n this._unwrap(moduleExports, 'constructStack');\n return moduleExports;\n }\n\n protected patchV3SmithyClient(moduleExports: any) {\n this._wrap(\n moduleExports.Client.prototype,\n 'send',\n this._getV3SmithyClientSendPatch.bind(this)\n );\n return moduleExports;\n }\n\n protected unpatchV3SmithyClient(moduleExports: any) {\n this._unwrap(moduleExports.Client.prototype, 'send');\n return moduleExports;\n }\n\n private _startAwsV3Span(\n normalizedRequest: NormalizedRequest,\n metadata: RequestMetadata\n ): Span {\n const name =\n metadata.spanName ??\n `${normalizedRequest.serviceName}.${normalizedRequest.commandName}`;\n const newSpan = this.tracer.startSpan(name, {\n kind: metadata.spanKind ?? SpanKind.CLIENT,\n attributes: {\n ...extractAttributesFromNormalizedRequest(normalizedRequest),\n ...metadata.spanAttributes,\n },\n });\n\n return newSpan;\n }\n\n private _callUserPreRequestHook(\n span: Span,\n request: NormalizedRequest,\n moduleVersion: string | undefined\n ) {\n const { preRequestHook } = this.getConfig();\n if (preRequestHook) {\n const requestInfo: AwsSdkRequestHookInformation = {\n moduleVersion,\n request,\n };\n safeExecuteInTheMiddle(\n () => preRequestHook(span, requestInfo),\n (e: Error | undefined) => {\n if (e)\n diag.error(\n `${AwsInstrumentation.component} instrumentation: preRequestHook error`,\n e\n );\n },\n true\n );\n }\n }\n\n private _callUserResponseHook(span: Span, response: NormalizedResponse) {\n const { responseHook } = this.getConfig();\n if (!responseHook) return;\n\n const responseInfo: AwsSdkResponseHookInformation = {\n response,\n };\n safeExecuteInTheMiddle(\n () => responseHook(span, responseInfo),\n (e: Error | undefined) => {\n if (e)\n diag.error(\n `${AwsInstrumentation.component} instrumentation: responseHook error`,\n e\n );\n },\n true\n );\n }\n\n private _callUserExceptionResponseHook(\n span: Span,\n request: NormalizedRequest,\n err: any\n ) {\n const { exceptionHook } = this.getConfig();\n if (!exceptionHook) return;\n const requestInfo: AwsSdkRequestHookInformation = {\n request,\n };\n\n safeExecuteInTheMiddle(\n () => exceptionHook(span, requestInfo, err),\n (e: Error | undefined) => {\n if (e)\n diag.error(\n `${AwsInstrumentation.component} instrumentation: exceptionHook error`,\n e\n );\n },\n true\n );\n }\n\n private _getV3ConstructStackPatch(\n moduleVersion: string | undefined,\n original: (...args: unknown[]) => MiddlewareStack<any, any>\n ) {\n const self = this;\n return function constructStack(\n this: any,\n ...args: unknown[]\n ): MiddlewareStack<any, any> {\n const stack: MiddlewareStack<any, any> = original.apply(this, args);\n self.patchV3MiddlewareStack(moduleVersion, stack);\n return stack;\n };\n }\n\n private _getV3SmithyClientSendPatch(\n original: (...args: unknown[]) => Promise<any>\n ) {\n return function send(\n this: any,\n command: V3PluginCommand,\n ...args: unknown[]\n ): Promise<any> {\n command[V3_CLIENT_CONFIG_KEY] = this.config;\n return original.apply(this, [command, ...args]);\n };\n }\n\n private patchV3MiddlewareStack(\n moduleVersion: string | undefined,\n middlewareStackToPatch: MiddlewareStack<any, any>\n ) {\n if (!isWrapped(middlewareStackToPatch.resolve)) {\n this._wrap(\n middlewareStackToPatch,\n 'resolve',\n this._getV3MiddlewareStackResolvePatch.bind(this, moduleVersion)\n );\n }\n\n // 'clone' and 'concat' functions are internally calling 'constructStack' which is in same\n // module, thus not patched, and we need to take care of it specifically.\n this._wrap(\n middlewareStackToPatch,\n 'clone',\n this._getV3MiddlewareStackClonePatch.bind(this, moduleVersion)\n );\n this._wrap(\n middlewareStackToPatch,\n 'concat',\n this._getV3MiddlewareStackClonePatch.bind(this, moduleVersion)\n );\n }\n\n private _getV3MiddlewareStackClonePatch(\n moduleVersion: string | undefined,\n original: (...args: any[]) => MiddlewareStack<any, any>\n ) {\n const self = this;\n return function (this: any, ...args: any[]) {\n const newStack = original.apply(this, args);\n self.patchV3MiddlewareStack(moduleVersion, newStack);\n return newStack;\n };\n }\n\n private _getV3MiddlewareStackResolvePatch(\n moduleVersion: string | undefined,\n original: (\n _handler: any,\n context: HandlerExecutionContext\n ) => AwsV3MiddlewareHandler<any, any>\n ) {\n const self = this;\n return function (\n this: any,\n _handler: any,\n awsExecutionContext: HandlerExecutionContext\n ): AwsV3MiddlewareHandler<any, any> {\n const origHandler = original.call(this, _handler, awsExecutionContext);\n const patchedHandler = function (\n this: any,\n command: InitializeHandlerArguments<any> & {\n [V3_CLIENT_CONFIG_KEY]?: any;\n }\n ): Promise<any> {\n const clientConfig = command[V3_CLIENT_CONFIG_KEY];\n const regionPromise = clientConfig?.region?.();\n const serviceName =\n clientConfig?.serviceId ??\n removeSuffixFromStringIfExists(\n // Use 'AWS' as a fallback serviceName to match type definition.\n // In practice, `clientName` should always be set.\n awsExecutionContext.clientName || 'AWS',\n 'Client'\n );\n const commandName =\n awsExecutionContext.commandName ?? command.constructor?.name;\n const normalizedRequest = normalizeV3Request(\n serviceName,\n commandName,\n command.input,\n undefined\n );\n const requestMetadata = self.servicesExtensions.requestPreSpanHook(\n normalizedRequest,\n self.getConfig(),\n self._diag\n );\n const startTime = hrTime();\n const span = self._startAwsV3Span(normalizedRequest, requestMetadata);\n const activeContextWithSpan = trace.setSpan(context.active(), span);\n\n const handlerPromise = new Promise((resolve, reject) => {\n Promise.resolve(regionPromise)\n .then(resolvedRegion => {\n normalizedRequest.region = resolvedRegion;\n span.setAttribute(AttributeNames.CLOUD_REGION, resolvedRegion);\n })\n .catch(e => {\n // there is nothing much we can do in this case.\n // we'll just continue without region\n diag.debug(\n `${AwsInstrumentation.component} instrumentation: failed to extract region from async function`,\n e\n );\n })\n .finally(() => {\n self._callUserPreRequestHook(\n span,\n normalizedRequest,\n moduleVersion\n );\n const resultPromise = context.with(activeContextWithSpan, () => {\n self.servicesExtensions.requestPostSpanHook(normalizedRequest);\n return self._callOriginalFunction(() =>\n origHandler.call(this, command)\n );\n });\n const promiseWithResponseLogic = resultPromise\n .then(response => {\n const requestId = response.output?.$metadata?.requestId;\n if (requestId) {\n span.setAttribute(AttributeNames.AWS_REQUEST_ID, requestId);\n }\n\n const httpStatusCode =\n response.output?.$metadata?.httpStatusCode;\n if (httpStatusCode) {\n if (self._semconvStability & SemconvStability.OLD) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, httpStatusCode);\n }\n if (self._semconvStability & SemconvStability.STABLE) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n httpStatusCode\n );\n }\n }\n\n const extendedRequestId =\n response.output?.$metadata?.extendedRequestId;\n if (extendedRequestId) {\n span.setAttribute(\n AttributeNames.AWS_REQUEST_EXTENDED_ID,\n extendedRequestId\n );\n }\n\n const normalizedResponse: NormalizedResponse = {\n data: response.output,\n request: normalizedRequest,\n requestId: requestId,\n };\n const override = self.servicesExtensions.responseHook(\n normalizedResponse,\n span,\n self.tracer,\n self.getConfig(),\n startTime\n );\n if (override) {\n response.output = override;\n normalizedResponse.data = override;\n }\n self._callUserResponseHook(span, normalizedResponse);\n return response;\n })\n .catch(err => {\n const requestId = err?.RequestId;\n if (requestId) {\n span.setAttribute(AttributeNames.AWS_REQUEST_ID, requestId);\n }\n\n const httpStatusCode = err?.$metadata?.httpStatusCode;\n if (httpStatusCode) {\n if (self._semconvStability & SemconvStability.OLD) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, httpStatusCode);\n }\n if (self._semconvStability & SemconvStability.STABLE) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n httpStatusCode\n );\n }\n }\n\n const extendedRequestId = err?.extendedRequestId;\n if (extendedRequestId) {\n span.setAttribute(\n AttributeNames.AWS_REQUEST_EXTENDED_ID,\n extendedRequestId\n );\n }\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message,\n });\n span.recordException(err);\n self._callUserExceptionResponseHook(\n span,\n normalizedRequest,\n err\n );\n throw err;\n })\n .finally(() => {\n if (!requestMetadata.isStream) {\n span.end();\n }\n });\n promiseWithResponseLogic\n .then(res => {\n resolve(res);\n })\n .catch(err => reject(err));\n });\n });\n\n return requestMetadata.isIncoming\n ? bindPromise(handlerPromise, activeContextWithSpan, 2)\n : handlerPromise;\n };\n return patchedHandler;\n };\n }\n\n private _callOriginalFunction<T>(originalFunction: (...args: any[]) => T): T {\n if (this.getConfig().suppressInternalInstrumentation) {\n return context.with(suppressTracing(context.active()), originalFunction);\n } else {\n return originalFunction();\n }\n }\n\n override _updateMetricInstruments() {\n if (!this.servicesExtensions) {\n this.servicesExtensions = new ServicesExtensions();\n }\n this.servicesExtensions.updateMetricInstruments(this.meter);\n }\n}\n"]}
1
+ {"version":3,"file":"aws-sdk.js","sourceRoot":"","sources":["../../src/aws-sdk.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;GAcG;AACH,4CAO4B;AAC5B,8CAA8D;AAC9D,mCAAyC;AACzC,yCAAgD;AAQhD,kBAAkB;AAClB,uCAA0D;AAC1D,oEASwC;AAQxC,mCAKiB;AACjB,yCAAsC;AAEtC,uCAAkD;AAClD,8EAAqF;AAErF,MAAM,oBAAoB,GAAG,MAAM,CACjC,qDAAqD,CACtD,CAAC;AAKF,MAAa,kBAAmB,SAAQ,qCAAgD;IACtF,MAAM,CAAU,SAAS,GAAG,SAAS,CAAC;IAI9B,iBAAiB,CAAmB;IAE5C,YAAY,SAAsC,EAAE;QAClD,KAAK,CAAC,sBAAY,EAAE,yBAAe,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,iBAAiB,GAAG,IAAA,yCAAuB,EAC9C,MAAM,EACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAC1C,CAAC;IACJ,CAAC;IAES,IAAI;QACZ,MAAM,gCAAgC,GAAG,IAAI,+CAA6B,CACxE,uDAAuD,EACvD,CAAC,iBAAiB,CAAC,EACnB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EACrC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CACxC,CAAC;QACF,MAAM,gCAAgC,GAAG,IAAI,+CAA6B,CACxE,uDAAuD,EACvD,CAAC,UAAU,CAAC,EACZ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EACrC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CACxC,CAAC;QAEF,uFAAuF;QACvF,mDAAmD;QACnD,4EAA4E;QAC5E,MAAM,iBAAiB,GAAG,IAAI,qDAAmC,CAC/D,2BAA2B,EAC3B,CAAC,QAAQ,CAAC,EACV,SAAS,EACT,SAAS,EACT,CAAC,gCAAgC,EAAE,gCAAgC,CAAC,CACrE,CAAC;QAEF,wEAAwE;QACxE,0EAA0E;QAC1E,gDAAgD;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,MAAM,uBAAuB,GAAG,IAAI,qDAAmC,CACrE,0BAA0B,EAC1B,CAAC,SAAS,CAAC,EACX,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE;YAC/B,MAAM,UAAU,GAAG,IAAA,mBAAQ,EACzB,aAAa,EACb,gBAAgB,EAChB,CAAC,IAAS,EAAE,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC3D,OAAO,IAAI,CAAC,yBAAyB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAC7D,CAAC,CACF,CAAC;YACF,OAAO,UAAU,CAAC;QACpB,CAAC,CACF,CAAC;QAEF,MAAM,cAAc,GAAG,IAAI,qDAAmC,CAC5D,wBAAwB,EACxB,CAAC,QAAQ,CAAC,EACV,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EACnC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CACtC,CAAC;QAEF,qEAAqE;QACrE,MAAM,iBAAiB,GAAG,IAAI,qDAAmC,CAC/D,uBAAuB,EACvB,CAAC,SAAS,CAAC,EACX,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EACnC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CACtC,CAAC;QAEF,OAAO;YACL,iBAAiB;YACjB,uBAAuB;YACvB,cAAc;YACd,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAES,qBAAqB,CAAC,aAAkB,EAAE,aAAsB;QACxE,IAAI,CAAC,KAAK,CACR,aAAa,EACb,gBAAgB,EAChB,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CACzD,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;IAES,uBAAuB,CAAC,aAAkB;QAClD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAC9C,OAAO,aAAa,CAAC;IACvB,CAAC;IAES,mBAAmB,CAAC,aAAkB;QAC9C,IAAI,CAAC,KAAK,CACR,aAAa,CAAC,MAAM,CAAC,SAAS,EAC9B,MAAM,EACN,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5C,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;IAES,qBAAqB,CAAC,aAAkB;QAChD,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,eAAe,CACrB,iBAAoC,EACpC,QAAyB;QAEzB,MAAM,IAAI,GACR,QAAQ,CAAC,QAAQ;YACjB,GAAG,iBAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;YAC1C,IAAI,EAAE,QAAQ,CAAC,QAAQ,IAAI,cAAQ,CAAC,MAAM;YAC1C,UAAU,EAAE;gBACV,GAAG,IAAA,8CAAsC,EAAC,iBAAiB,CAAC;gBAC5D,GAAG,QAAQ,CAAC,cAAc;aAC3B;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,uBAAuB,CAC7B,IAAU,EACV,OAA0B,EAC1B,aAAiC;QAEjC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5C,IAAI,cAAc,EAAE;YAClB,MAAM,WAAW,GAAiC;gBAChD,aAAa;gBACb,OAAO;aACR,CAAC;YACF,IAAA,wCAAsB,EACpB,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,EACvC,CAAC,CAAoB,EAAE,EAAE;gBACvB,IAAI,CAAC;oBACH,UAAI,CAAC,KAAK,CACR,GAAG,kBAAkB,CAAC,SAAS,wCAAwC,EACvE,CAAC,CACF,CAAC;YACN,CAAC,EACD,IAAI,CACL,CAAC;SACH;IACH,CAAC;IAEO,qBAAqB,CAAC,IAAU,EAAE,QAA4B;QACpE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,YAAY,GAAkC;YAClD,QAAQ;SACT,CAAC;QACF,IAAA,wCAAsB,EACpB,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,EACtC,CAAC,CAAoB,EAAE,EAAE;YACvB,IAAI,CAAC;gBACH,UAAI,CAAC,KAAK,CACR,GAAG,kBAAkB,CAAC,SAAS,sCAAsC,EACrE,CAAC,CACF,CAAC;QACN,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,8BAA8B,CACpC,IAAU,EACV,OAA0B,EAC1B,GAAQ;QAER,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3C,IAAI,CAAC,aAAa;YAAE,OAAO;QAC3B,MAAM,WAAW,GAAiC;YAChD,OAAO;SACR,CAAC;QAEF,IAAA,wCAAsB,EACpB,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,EAC3C,CAAC,CAAoB,EAAE,EAAE;YACvB,IAAI,CAAC;gBACH,UAAI,CAAC,KAAK,CACR,GAAG,kBAAkB,CAAC,SAAS,uCAAuC,EACtE,CAAC,CACF,CAAC;QACN,CAAC,EACD,IAAI,CACL,CAAC;IACJ,CAAC;IAEO,yBAAyB,CAC/B,aAAiC,EACjC,QAA2D;QAE3D,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,SAAS,cAAc,CAE5B,GAAG,IAAe;YAElB,MAAM,KAAK,GAA8B,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpE,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;IACJ,CAAC;IAEO,2BAA2B,CACjC,QAA8C;QAE9C,OAAO,SAAS,IAAI,CAElB,OAAwB,EACxB,GAAG,IAAe;YAElB,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YAC5C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAC5B,aAAiC,EACjC,sBAAiD;QAEjD,IAAI,CAAC,IAAA,2BAAS,EAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE;YAC9C,IAAI,CAAC,KAAK,CACR,sBAAsB,EACtB,SAAS,EACT,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CACjE,CAAC;SACH;QAED,0FAA0F;QAC1F,yEAAyE;QACzE,IAAI,CAAC,KAAK,CACR,sBAAsB,EACtB,OAAO,EACP,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAC/D,CAAC;QACF,IAAI,CAAC,KAAK,CACR,sBAAsB,EACtB,QAAQ,EACR,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAC/D,CAAC;IACJ,CAAC;IAEO,+BAA+B,CACrC,aAAiC,EACjC,QAAuD;QAEvD,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,UAAqB,GAAG,IAAW;YACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACrD,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC;IAEO,iCAAiC,CACvC,aAAiC,EACjC,QAGqC;QAErC,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,UAEL,QAAa,EACb,mBAA4C;YAE5C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;YACvE,MAAM,cAAc,GAAG,UAErB,OAEC;gBAED,MAAM,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;gBACnD,MAAM,aAAa,GAAG,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC;gBAC/C,MAAM,WAAW,GACf,YAAY,EAAE,SAAS;oBACvB,IAAA,sCAA8B;oBAC5B,gEAAgE;oBAChE,kDAAkD;oBAClD,mBAAmB,CAAC,UAAU,IAAI,KAAK,EACvC,QAAQ,CACT,CAAC;gBACJ,MAAM,WAAW,GACf,mBAAmB,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;gBAC/D,MAAM,iBAAiB,GAAG,IAAA,0BAAkB,EAC1C,WAAW,EACX,WAAW,EACX,OAAO,CAAC,KAAK,EACb,SAAS,CACV,CAAC;gBACF,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAChE,iBAAiB,EACjB,IAAI,CAAC,SAAS,EAAE,EAChB,IAAI,CAAC,KAAK,CACX,CAAC;gBACF,MAAM,SAAS,GAAG,IAAA,aAAM,GAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;gBACtE,MAAM,qBAAqB,GAAG,WAAK,CAAC,OAAO,CAAC,aAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;gBAEpE,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACrD,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;yBAC3B,IAAI,CAAC,cAAc,CAAC,EAAE;wBACrB,iBAAiB,CAAC,MAAM,GAAG,cAAc,CAAC;wBAC1C,IAAI,CAAC,YAAY,CAAC,sBAAc,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;oBACjE,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,CAAC,EAAE;wBACT,gDAAgD;wBAChD,qCAAqC;wBACrC,UAAI,CAAC,KAAK,CACR,GAAG,kBAAkB,CAAC,SAAS,gEAAgE,EAC/F,CAAC,CACF,CAAC;oBACJ,CAAC,CAAC;yBACD,OAAO,CAAC,GAAG,EAAE;wBACZ,IAAI,CAAC,uBAAuB,CAC1B,IAAI,EACJ,iBAAiB,EACjB,aAAa,CACd,CAAC;wBACF,MAAM,aAAa,GAAG,aAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE;4BAC7D,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;4BAC/D,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,CACrC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAChC,CAAC;wBACJ,CAAC,CAAC,CAAC;wBACH,MAAM,wBAAwB,GAAG,aAAa;6BAC3C,IAAI,CAAC,QAAQ,CAAC,EAAE;4BACf,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;4BACxD,IAAI,SAAS,EAAE;gCACb,IAAI,CAAC,YAAY,CAAC,sBAAc,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;6BAC7D;4BAED,MAAM,cAAc,GAClB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,CAAC;4BAC7C,IAAI,cAAc,EAAE;gCAClB,IAAI,IAAI,CAAC,iBAAiB,GAAG,kCAAgB,CAAC,GAAG,EAAE;oCACjD,IAAI,CAAC,YAAY,CAAC,+BAAqB,EAAE,cAAc,CAAC,CAAC;iCAC1D;gCACD,IAAI,IAAI,CAAC,iBAAiB,GAAG,kCAAgB,CAAC,MAAM,EAAE;oCACpD,IAAI,CAAC,YAAY,CACf,qDAA8B,EAC9B,cAAc,CACf,CAAC;iCACH;6BACF;4BAED,MAAM,iBAAiB,GACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC;4BAChD,IAAI,iBAAiB,EAAE;gCACrB,IAAI,CAAC,YAAY,CACf,sBAAc,CAAC,uBAAuB,EACtC,iBAAiB,CAClB,CAAC;6BACH;4BAED,MAAM,kBAAkB,GAAuB;gCAC7C,IAAI,EAAE,QAAQ,CAAC,MAAM;gCACrB,OAAO,EAAE,iBAAiB;gCAC1B,SAAS,EAAE,SAAS;6BACrB,CAAC;4BACF,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CACnD,kBAAkB,EAClB,IAAI,EACJ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,EAAE,EAChB,SAAS,CACV,CAAC;4BACF,IAAI,QAAQ,EAAE;gCACZ,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;gCAC3B,kBAAkB,CAAC,IAAI,GAAG,QAAQ,CAAC;6BACpC;4BACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;4BACrD,OAAO,QAAQ,CAAC;wBAClB,CAAC,CAAC;6BACD,KAAK,CAAC,GAAG,CAAC,EAAE;4BACX,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,CAAC;4BACjC,IAAI,SAAS,EAAE;gCACb,IAAI,CAAC,YAAY,CAAC,sBAAc,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;6BAC7D;4BAED,MAAM,cAAc,GAAG,GAAG,EAAE,SAAS,EAAE,cAAc,CAAC;4BACtD,IAAI,cAAc,EAAE;gCAClB,IAAI,IAAI,CAAC,iBAAiB,GAAG,kCAAgB,CAAC,GAAG,EAAE;oCACjD,IAAI,CAAC,YAAY,CAAC,+BAAqB,EAAE,cAAc,CAAC,CAAC;iCAC1D;gCACD,IAAI,IAAI,CAAC,iBAAiB,GAAG,kCAAgB,CAAC,MAAM,EAAE;oCACpD,IAAI,CAAC,YAAY,CACf,qDAA8B,EAC9B,cAAc,CACf,CAAC;iCACH;6BACF;4BAED,MAAM,iBAAiB,GAAG,GAAG,EAAE,iBAAiB,CAAC;4BACjD,IAAI,iBAAiB,EAAE;gCACrB,IAAI,CAAC,YAAY,CACf,sBAAc,CAAC,uBAAuB,EACtC,iBAAiB,CAClB,CAAC;6BACH;4BAED,IAAI,CAAC,SAAS,CAAC;gCACb,IAAI,EAAE,oBAAc,CAAC,KAAK;gCAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;6BACrB,CAAC,CAAC;4BACH,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;4BAC1B,IAAI,CAAC,8BAA8B,CACjC,IAAI,EACJ,iBAAiB,EACjB,GAAG,CACJ,CAAC;4BACF,MAAM,GAAG,CAAC;wBACZ,CAAC,CAAC;6BACD,OAAO,CAAC,GAAG,EAAE;4BACZ,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;gCAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;6BACZ;wBACH,CAAC,CAAC,CAAC;wBACL,wBAAwB;6BACrB,IAAI,CAAC,GAAG,CAAC,EAAE;4BACV,OAAO,CAAC,GAAG,CAAC,CAAC;wBACf,CAAC,CAAC;6BACD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC/B,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;gBAEH,OAAO,eAAe,CAAC,UAAU;oBAC/B,CAAC,CAAC,IAAA,mBAAW,EAAC,cAAc,EAAE,qBAAqB,EAAE,CAAC,CAAC;oBACvD,CAAC,CAAC,cAAc,CAAC;YACrB,CAAC,CAAC;YACF,OAAO,cAAc,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAI,gBAAuC;QACtE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,+BAA+B,EAAE;YACpD,OAAO,aAAO,CAAC,IAAI,CAAC,IAAA,sBAAe,EAAC,aAAO,CAAC,MAAM,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;SAC1E;aAAM;YACL,OAAO,gBAAgB,EAAE,CAAC;SAC3B;IACH,CAAC;IAEQ,wBAAwB;QAC/B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,6BAAkB,EAAE,CAAC;SACpD;QACD,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;;AA3cU,gDAAkB","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Span,\n SpanKind,\n context,\n trace,\n diag,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport { hrTime, suppressTracing } from '@opentelemetry/core';\nimport { AttributeNames } from './enums';\nimport { ServicesExtensions } from './services';\nimport {\n AwsSdkInstrumentationConfig,\n AwsSdkRequestHookInformation,\n AwsSdkResponseHookInformation,\n NormalizedRequest,\n NormalizedResponse,\n} from './types';\n/** @knipignore */\nimport { PACKAGE_NAME, PACKAGE_VERSION } from './version';\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport type {\n MiddlewareStack,\n HandlerExecutionContext,\n Command as AwsV3Command,\n Handler as AwsV3MiddlewareHandler,\n InitializeHandlerArguments,\n} from '@aws-sdk/types';\nimport {\n bindPromise,\n extractAttributesFromNormalizedRequest,\n normalizeV3Request,\n removeSuffixFromStringIfExists,\n} from './utils';\nimport { propwrap } from './propwrap';\nimport { RequestMetadata } from './services/ServiceExtension';\nimport { ATTR_HTTP_STATUS_CODE } from './semconv';\nimport { ATTR_HTTP_RESPONSE_STATUS_CODE } from '@opentelemetry/semantic-conventions';\n\nconst V3_CLIENT_CONFIG_KEY = Symbol(\n 'opentelemetry.instrumentation.aws-sdk.client.config'\n);\ntype V3PluginCommand = AwsV3Command<any, any, any, any, any> & {\n [V3_CLIENT_CONFIG_KEY]?: any;\n};\n\nexport class AwsInstrumentation extends InstrumentationBase<AwsSdkInstrumentationConfig> {\n static readonly component = 'aws-sdk';\n // need declare since initialized in callbacks from super constructor\n declare private servicesExtensions: ServicesExtensions;\n\n private _semconvStability: SemconvStability;\n\n constructor(config: AwsSdkInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n process.env.OTEL_SEMCONV_STABILITY_OPT_IN\n );\n }\n\n protected init(): InstrumentationModuleDefinition[] {\n const v3MiddlewareStackFileOldVersions = new InstrumentationNodeModuleFile(\n '@aws-sdk/middleware-stack/dist/cjs/MiddlewareStack.js',\n ['>=3.1.0 <3.35.0'],\n this.patchV3ConstructStack.bind(this),\n this.unpatchV3ConstructStack.bind(this)\n );\n const v3MiddlewareStackFileNewVersions = new InstrumentationNodeModuleFile(\n '@aws-sdk/middleware-stack/dist-cjs/MiddlewareStack.js',\n ['>=3.35.0'],\n this.patchV3ConstructStack.bind(this),\n this.unpatchV3ConstructStack.bind(this)\n );\n\n // as for aws-sdk v3.13.1, constructStack is exported from @aws-sdk/middleware-stack as\n // getter instead of function, which fails shimmer.\n // so we are patching the MiddlewareStack.js file directly to get around it.\n const v3MiddlewareStack = new InstrumentationNodeModuleDefinition(\n '@aws-sdk/middleware-stack',\n ['^3.1.0'],\n undefined,\n undefined,\n [v3MiddlewareStackFileOldVersions, v3MiddlewareStackFileNewVersions]\n );\n\n // Patch for @smithy/middleware-stack for @aws-sdk/* packages v3.363.0+.\n // As of @smithy/middleware-stack@2.1.0 `constructStack` is only available\n // as a getter, so we cannot use `this._wrap()`.\n const self = this;\n const v3SmithyMiddlewareStack = new InstrumentationNodeModuleDefinition(\n '@smithy/middleware-stack',\n ['>=2.0.0'],\n (moduleExports, moduleVersion) => {\n const newExports = propwrap(\n moduleExports,\n 'constructStack',\n (orig: any) => {\n self._diag.debug('propwrapping aws-sdk v3 constructStack');\n return self._getV3ConstructStackPatch(moduleVersion, orig);\n }\n );\n return newExports;\n }\n );\n\n const v3SmithyClient = new InstrumentationNodeModuleDefinition(\n '@aws-sdk/smithy-client',\n ['^3.1.0'],\n this.patchV3SmithyClient.bind(this),\n this.unpatchV3SmithyClient.bind(this)\n );\n\n // patch for new @smithy/smithy-client for aws-sdk packages v3.363.0+\n const v3NewSmithyClient = new InstrumentationNodeModuleDefinition(\n '@smithy/smithy-client',\n ['>=1.0.3'],\n this.patchV3SmithyClient.bind(this),\n this.unpatchV3SmithyClient.bind(this)\n );\n\n return [\n v3MiddlewareStack,\n v3SmithyMiddlewareStack,\n v3SmithyClient,\n v3NewSmithyClient,\n ];\n }\n\n protected patchV3ConstructStack(moduleExports: any, moduleVersion?: string) {\n this._wrap(\n moduleExports,\n 'constructStack',\n this._getV3ConstructStackPatch.bind(this, moduleVersion)\n );\n return moduleExports;\n }\n\n protected unpatchV3ConstructStack(moduleExports: any) {\n this._unwrap(moduleExports, 'constructStack');\n return moduleExports;\n }\n\n protected patchV3SmithyClient(moduleExports: any) {\n this._wrap(\n moduleExports.Client.prototype,\n 'send',\n this._getV3SmithyClientSendPatch.bind(this)\n );\n return moduleExports;\n }\n\n protected unpatchV3SmithyClient(moduleExports: any) {\n this._unwrap(moduleExports.Client.prototype, 'send');\n return moduleExports;\n }\n\n private _startAwsV3Span(\n normalizedRequest: NormalizedRequest,\n metadata: RequestMetadata\n ): Span {\n const name =\n metadata.spanName ??\n `${normalizedRequest.serviceName}.${normalizedRequest.commandName}`;\n const newSpan = this.tracer.startSpan(name, {\n kind: metadata.spanKind ?? SpanKind.CLIENT,\n attributes: {\n ...extractAttributesFromNormalizedRequest(normalizedRequest),\n ...metadata.spanAttributes,\n },\n });\n\n return newSpan;\n }\n\n private _callUserPreRequestHook(\n span: Span,\n request: NormalizedRequest,\n moduleVersion: string | undefined\n ) {\n const { preRequestHook } = this.getConfig();\n if (preRequestHook) {\n const requestInfo: AwsSdkRequestHookInformation = {\n moduleVersion,\n request,\n };\n safeExecuteInTheMiddle(\n () => preRequestHook(span, requestInfo),\n (e: Error | undefined) => {\n if (e)\n diag.error(\n `${AwsInstrumentation.component} instrumentation: preRequestHook error`,\n e\n );\n },\n true\n );\n }\n }\n\n private _callUserResponseHook(span: Span, response: NormalizedResponse) {\n const { responseHook } = this.getConfig();\n if (!responseHook) return;\n\n const responseInfo: AwsSdkResponseHookInformation = {\n response,\n };\n safeExecuteInTheMiddle(\n () => responseHook(span, responseInfo),\n (e: Error | undefined) => {\n if (e)\n diag.error(\n `${AwsInstrumentation.component} instrumentation: responseHook error`,\n e\n );\n },\n true\n );\n }\n\n private _callUserExceptionResponseHook(\n span: Span,\n request: NormalizedRequest,\n err: any\n ) {\n const { exceptionHook } = this.getConfig();\n if (!exceptionHook) return;\n const requestInfo: AwsSdkRequestHookInformation = {\n request,\n };\n\n safeExecuteInTheMiddle(\n () => exceptionHook(span, requestInfo, err),\n (e: Error | undefined) => {\n if (e)\n diag.error(\n `${AwsInstrumentation.component} instrumentation: exceptionHook error`,\n e\n );\n },\n true\n );\n }\n\n private _getV3ConstructStackPatch(\n moduleVersion: string | undefined,\n original: (...args: unknown[]) => MiddlewareStack<any, any>\n ) {\n const self = this;\n return function constructStack(\n this: any,\n ...args: unknown[]\n ): MiddlewareStack<any, any> {\n const stack: MiddlewareStack<any, any> = original.apply(this, args);\n self.patchV3MiddlewareStack(moduleVersion, stack);\n return stack;\n };\n }\n\n private _getV3SmithyClientSendPatch(\n original: (...args: unknown[]) => Promise<any>\n ) {\n return function send(\n this: any,\n command: V3PluginCommand,\n ...args: unknown[]\n ): Promise<any> {\n command[V3_CLIENT_CONFIG_KEY] = this.config;\n return original.apply(this, [command, ...args]);\n };\n }\n\n private patchV3MiddlewareStack(\n moduleVersion: string | undefined,\n middlewareStackToPatch: MiddlewareStack<any, any>\n ) {\n if (!isWrapped(middlewareStackToPatch.resolve)) {\n this._wrap(\n middlewareStackToPatch,\n 'resolve',\n this._getV3MiddlewareStackResolvePatch.bind(this, moduleVersion)\n );\n }\n\n // 'clone' and 'concat' functions are internally calling 'constructStack' which is in same\n // module, thus not patched, and we need to take care of it specifically.\n this._wrap(\n middlewareStackToPatch,\n 'clone',\n this._getV3MiddlewareStackClonePatch.bind(this, moduleVersion)\n );\n this._wrap(\n middlewareStackToPatch,\n 'concat',\n this._getV3MiddlewareStackClonePatch.bind(this, moduleVersion)\n );\n }\n\n private _getV3MiddlewareStackClonePatch(\n moduleVersion: string | undefined,\n original: (...args: any[]) => MiddlewareStack<any, any>\n ) {\n const self = this;\n return function (this: any, ...args: any[]) {\n const newStack = original.apply(this, args);\n self.patchV3MiddlewareStack(moduleVersion, newStack);\n return newStack;\n };\n }\n\n private _getV3MiddlewareStackResolvePatch(\n moduleVersion: string | undefined,\n original: (\n _handler: any,\n context: HandlerExecutionContext\n ) => AwsV3MiddlewareHandler<any, any>\n ) {\n const self = this;\n return function (\n this: any,\n _handler: any,\n awsExecutionContext: HandlerExecutionContext\n ): AwsV3MiddlewareHandler<any, any> {\n const origHandler = original.call(this, _handler, awsExecutionContext);\n const patchedHandler = function (\n this: any,\n command: InitializeHandlerArguments<any> & {\n [V3_CLIENT_CONFIG_KEY]?: any;\n }\n ): Promise<any> {\n const clientConfig = command[V3_CLIENT_CONFIG_KEY];\n const regionPromise = clientConfig?.region?.();\n const serviceName =\n clientConfig?.serviceId ??\n removeSuffixFromStringIfExists(\n // Use 'AWS' as a fallback serviceName to match type definition.\n // In practice, `clientName` should always be set.\n awsExecutionContext.clientName || 'AWS',\n 'Client'\n );\n const commandName =\n awsExecutionContext.commandName ?? command.constructor?.name;\n const normalizedRequest = normalizeV3Request(\n serviceName,\n commandName,\n command.input,\n undefined\n );\n const requestMetadata = self.servicesExtensions.requestPreSpanHook(\n normalizedRequest,\n self.getConfig(),\n self._diag\n );\n const startTime = hrTime();\n const span = self._startAwsV3Span(normalizedRequest, requestMetadata);\n const activeContextWithSpan = trace.setSpan(context.active(), span);\n\n const handlerPromise = new Promise((resolve, reject) => {\n Promise.resolve(regionPromise)\n .then(resolvedRegion => {\n normalizedRequest.region = resolvedRegion;\n span.setAttribute(AttributeNames.CLOUD_REGION, resolvedRegion);\n })\n .catch(e => {\n // there is nothing much we can do in this case.\n // we'll just continue without region\n diag.debug(\n `${AwsInstrumentation.component} instrumentation: failed to extract region from async function`,\n e\n );\n })\n .finally(() => {\n self._callUserPreRequestHook(\n span,\n normalizedRequest,\n moduleVersion\n );\n const resultPromise = context.with(activeContextWithSpan, () => {\n self.servicesExtensions.requestPostSpanHook(normalizedRequest);\n return self._callOriginalFunction(() =>\n origHandler.call(this, command)\n );\n });\n const promiseWithResponseLogic = resultPromise\n .then(response => {\n const requestId = response.output?.$metadata?.requestId;\n if (requestId) {\n span.setAttribute(AttributeNames.AWS_REQUEST_ID, requestId);\n }\n\n const httpStatusCode =\n response.output?.$metadata?.httpStatusCode;\n if (httpStatusCode) {\n if (self._semconvStability & SemconvStability.OLD) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, httpStatusCode);\n }\n if (self._semconvStability & SemconvStability.STABLE) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n httpStatusCode\n );\n }\n }\n\n const extendedRequestId =\n response.output?.$metadata?.extendedRequestId;\n if (extendedRequestId) {\n span.setAttribute(\n AttributeNames.AWS_REQUEST_EXTENDED_ID,\n extendedRequestId\n );\n }\n\n const normalizedResponse: NormalizedResponse = {\n data: response.output,\n request: normalizedRequest,\n requestId: requestId,\n };\n const override = self.servicesExtensions.responseHook(\n normalizedResponse,\n span,\n self.tracer,\n self.getConfig(),\n startTime\n );\n if (override) {\n response.output = override;\n normalizedResponse.data = override;\n }\n self._callUserResponseHook(span, normalizedResponse);\n return response;\n })\n .catch(err => {\n const requestId = err?.RequestId;\n if (requestId) {\n span.setAttribute(AttributeNames.AWS_REQUEST_ID, requestId);\n }\n\n const httpStatusCode = err?.$metadata?.httpStatusCode;\n if (httpStatusCode) {\n if (self._semconvStability & SemconvStability.OLD) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, httpStatusCode);\n }\n if (self._semconvStability & SemconvStability.STABLE) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n httpStatusCode\n );\n }\n }\n\n const extendedRequestId = err?.extendedRequestId;\n if (extendedRequestId) {\n span.setAttribute(\n AttributeNames.AWS_REQUEST_EXTENDED_ID,\n extendedRequestId\n );\n }\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message,\n });\n span.recordException(err);\n self._callUserExceptionResponseHook(\n span,\n normalizedRequest,\n err\n );\n throw err;\n })\n .finally(() => {\n if (!requestMetadata.isStream) {\n span.end();\n }\n });\n promiseWithResponseLogic\n .then(res => {\n resolve(res);\n })\n .catch(err => reject(err));\n });\n });\n\n return requestMetadata.isIncoming\n ? bindPromise(handlerPromise, activeContextWithSpan, 2)\n : handlerPromise;\n };\n return patchedHandler;\n };\n }\n\n private _callOriginalFunction<T>(originalFunction: (...args: any[]) => T): T {\n if (this.getConfig().suppressInternalInstrumentation) {\n return context.with(suppressTracing(context.active()), originalFunction);\n } else {\n return originalFunction();\n }\n }\n\n override _updateMetricInstruments() {\n if (!this.servicesExtensions) {\n this.servicesExtensions = new ServicesExtensions();\n }\n this.servicesExtensions.updateMetricInstruments(this.meter);\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  interface Blob {
3
4
  }
4
5
  type Binary = Buffer | Uint8Array | Blob | string;
@@ -1,3 +1,3 @@
1
- export declare const PACKAGE_VERSION = "0.63.0";
1
+ export declare const PACKAGE_VERSION = "0.64.1";
2
2
  export declare const PACKAGE_NAME = "@opentelemetry/instrumentation-aws-sdk";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -17,6 +17,6 @@
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.PACKAGE_NAME = exports.PACKAGE_VERSION = void 0;
19
19
  // this is autogenerated file, see scripts/version-update.js
20
- exports.PACKAGE_VERSION = '0.63.0';
20
+ exports.PACKAGE_VERSION = '0.64.1';
21
21
  exports.PACKAGE_NAME = '@opentelemetry/instrumentation-aws-sdk';
22
22
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,eAAe,GAAG,QAAQ,CAAC;AAC3B,QAAA,YAAY,GAAG,wCAAwC,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const PACKAGE_VERSION = '0.63.0';\nexport const PACKAGE_NAME = '@opentelemetry/instrumentation-aws-sdk';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,eAAe,GAAG,QAAQ,CAAC;AAC3B,QAAA,YAAY,GAAG,wCAAwC,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const PACKAGE_VERSION = '0.64.1';\nexport const PACKAGE_NAME = '@opentelemetry/instrumentation-aws-sdk';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentelemetry/instrumentation-aws-sdk",
3
- "version": "0.63.0",
3
+ "version": "0.64.1",
4
4
  "description": "OpenTelemetry instrumentation for `aws-sdk` and `@aws-sdk/client-*` clients for various AWS services",
5
5
  "keywords": [
6
6
  "aws",
@@ -47,7 +47,7 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "@opentelemetry/core": "^2.0.0",
50
- "@opentelemetry/instrumentation": "^0.207.0",
50
+ "@opentelemetry/instrumentation": "^0.208.0",
51
51
  "@opentelemetry/semantic-conventions": "^1.34.0"
52
52
  },
53
53
  "devDependencies": {
@@ -62,22 +62,12 @@
62
62
  "@aws-sdk/client-sqs": "^3.85.0",
63
63
  "@aws-sdk/types": "^3.370.0",
64
64
  "@opentelemetry/api": "^1.3.0",
65
- "@opentelemetry/contrib-test-utils": "^0.54.0",
65
+ "@opentelemetry/contrib-test-utils": "^0.56.0",
66
66
  "@opentelemetry/sdk-trace-base": "^2.0.0",
67
- "@smithy/node-http-handler": "4.1.1",
68
- "@types/mocha": "10.0.10",
69
- "@types/node": "18.18.14",
70
- "@types/sinon": "17.0.4",
71
- "expect": "29.2.0",
72
- "nock": "13.3.3",
73
- "nyc": "17.1.0",
74
- "rimraf": "5.0.10",
75
- "sinon": "15.2.0",
76
- "test-all-versions": "6.1.0",
77
- "typescript": "5.0.4"
67
+ "@smithy/node-http-handler": "4.4.5"
78
68
  },
79
69
  "engines": {
80
70
  "node": "^18.19.0 || >=20.6.0"
81
71
  },
82
- "gitHead": "2801ab2f0f9243b154a624298dacb7228c4f70cd"
72
+ "gitHead": "66935ac724cc271f70028035e534d47a4dfbcf12"
83
73
  }