diff --git a/docs/core/tracer.md b/docs/core/tracer.md index 12dcc92c83..8f24399847 100644 --- a/docs/core/tracer.md +++ b/docs/core/tracer.md @@ -16,6 +16,7 @@ Tracer is an opinionated thin wrapper for [AWS X-Ray SDK for Node.js](https://gi * Auto capture cold start and service name as annotations, and responses or full exceptions as metadata * Auto-disable when not running in AWS Lambda environment +* Automatically trace HTTP(s) clients and generate segments for each request * Support tracing functions via decorators, middleware, and manual instrumentation * Support tracing AWS SDK v2 and v3 via AWS X-Ray SDK for Node.js @@ -49,13 +50,13 @@ The `Tracer` utility must always be instantiated outside of the Lambda handler. ### Utility settings -The library has one optional setting. You can set it as environment variable, or pass it in the constructor. - -This setting will be used across all traces emitted: +The library has three optional settings. You can set them as environment variables, or pass them in the constructor: Setting | Description | Environment variable | Constructor parameter ------------------------------------------------- |------------------------------------------------------------------------------------------------| ------------------------------------------------- | ------------------------------------------------- +**Tracing enabled** | Enables or disables tracing. By default tracing is enabled when running in AWS Lambda. | `POWERTOOLS_TRACE_ENABLED` | `enabled` **Service name** | Sets an annotation with the **name of the service** across all traces e.g. `serverlessAirline` | `POWERTOOLS_SERVICE_NAME` | `serviceName` +**Capture HTTPs Requests** | Defines whether HTTPs requests will be traced or not, enabled by default when tracing is also enabled. | `POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS` | `captureHTTPsRequests` For a **complete list** of supported environment variables, refer to [this section](./../index.md#environment-variables). @@ -137,13 +138,9 @@ You can quickly start by importing the `Tracer` class, initialize it outside the === "Middy Middleware" - !!! tip "Using Middy for the first time?" - You can install Middy by running `npm i @middy/core`. - Learn more about [its usage and lifecycle in the official Middy documentation](https://github.com/middyjs/middy#usage){target="_blank"}. - ```typescript hl_lines="1-2 11 13" import { Tracer, captureLambdaHandler } from '@aws-lambda-powertools/tracer'; - import middy from '@middy/core'; + import middy from '@middy/core'; // (1) const tracer = new Tracer({ serviceName: 'serverlessAirline' }); @@ -157,6 +154,9 @@ You can quickly start by importing the `Tracer` class, initialize it outside the .use(captureLambdaHandler(tracer)); ``` + 1. Using Middy for the first time? You can install Middy by running `npm i @middy/core`. + Learn more about [its usage and lifecycle in the official Middy documentation](https://github.com/middyjs/middy#usage){target="_blank"}. + === "Decorator" !!! info @@ -326,13 +326,67 @@ If you're looking to shave a few microseconds, or milliseconds depending on your === "index.ts" ```typescript hl_lines="5" - import { S3 } from "aws-sdk"; + import { S3 } from 'aws-sdk'; import { Tracer } from '@aws-lambda-powertools/tracer'; const tracer = new Tracer({ serviceName: 'serverlessAirline' }); const s3 = tracer.captureAWSClient(new S3()); ``` +### Tracing HTTP requests + +When your function makes calls to HTTP APIs, Tracer automatically traces those calls and add the API to the service graph as a downstream service. + +You can opt-out from this feature by setting the **`POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS=false`** environment variable or by passing the `captureHTTPSRequests: false` option to the `Tracer` constructor. + +!!! info + The following snippet shows how to trace [axios](https://www.npmjs.com/package/axios) requests, but you can use any HTTP client library built on top of [http](https://nodejs.org/api/http.html) or [https](https://nodejs.org/api/https.html). + Support to 3rd party HTTP clients is provided on a best effort basis. + +=== "index.ts" + + ```typescript hl_lines="2 7" + import { Tracer } from '@aws-lambda-powertools/tracer'; + import axios from 'axios'; // (1) + + const tracer = new Tracer({ serviceName: 'serverlessAirline' }); + + export const handler = async (event: unknown, context: Context): Promise => { + await axios.get('https://httpbin.org/status/200'); + }; + ``` + + 1. You can install the [axios](https://www.npmjs.com/package/axios) package using `npm i axios` +=== "Example Raw X-Ray Trace excerpt" + + ```json hl_lines="6 9 12-21" + { + "id": "22883fbc730e3a0b", + "name": "## index.handler", + "start_time": 1647956168.22749, + "end_time": 1647956169.0679862, + "subsegments": [ + { + "id": "ab82ab2b7d525d8f", + "name": "httpbin.org", + "start_time": 1647956168.407, + "end_time": 1647956168.945, + "http": { + "request": { + "url": "https://httpbin.org/status/200", + "method": "GET" + }, + "response": { + "status": 200, + "content_length": 0 + } + }, + "namespace": "remote" + } + ] + } + ``` + ## Advanced ### Disabling response auto-capture @@ -361,7 +415,7 @@ This is useful when you need a feature available in X-Ray that is not available === "index.ts" - ```typescript hl_lines="6" + ```typescript hl_lines="7" import { Logger } from '@aws-lambda-powertools/logger'; import { Tracer } from '@aws-lambda-powertools/tracer'; @@ -379,4 +433,4 @@ Tracer is disabled by default when not running in the AWS Lambda environment - T * Use annotations on key operations to slice and dice traces, create unique views, and create metrics from it via Trace Groups * Use a namespace when adding metadata to group data more easily -* Annotations and metadata are added to the current subsegment opened. If you want them in a specific subsegment, [create one](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs-subsegments.html#xray-sdk-nodejs-subsegments-lambda) via the escape hatch mechanism +* Annotations and metadata are added to the currently open subsegment. If you want them in a specific subsegment, [create one](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs-subsegments.html#xray-sdk-nodejs-subsegments-lambda) via the escape hatch mechanism diff --git a/docs/index.md b/docs/index.md index f2937169ab..48b60e850c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -54,6 +54,7 @@ Each TypeScript utility is installed as standalone NPM package. | **POWERTOOLS_TRACE_ENABLED** | Explicitly disables tracing | [Tracer](./core/tracer) | `true` | | **POWERTOOLS_TRACER_CAPTURE_RESPONSE** | Captures Lambda or method return as metadata. | [Tracer](./core/tracer) | `true` | | **POWERTOOLS_TRACER_CAPTURE_ERROR** | Captures Lambda or method exception as metadata. | [Tracer](./core/tracer) | `true` | +| **POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS** | Captures HTTP(s) requests as segments. | [Tracer](./core/tracer) | `true` | | **POWERTOOLS_LOGGER_LOG_EVENT** | Logs incoming event | [Logger](./core/logger) | `false` | | **POWERTOOLS_LOGGER_SAMPLE_RATE** | Debug log sampling | [Logger](./core/logger) | `0` | | **POWERTOOLS_LOG_DEDUPLICATION_DISABLED** | Disables log deduplication filter protection to use Pytest Live Log feature | [Logger](./core/logger) | `false` | diff --git a/package-lock.json b/package-lock.json index bb7e864a2c..e110f829cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -327,42 +327,42 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.55.0.tgz", - "integrity": "sha512-INXDvGzltlO91y/iqNIyPBI6kW1gYwZzHXUTBtDZO1hQCedukj/AXX3kIkksfd5XG96Sj8FTB+1u/bV74dfyVA==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.58.0.tgz", + "integrity": "sha512-54uclCvSVREutcty19NqfzC5V/0ebYSz51lz5jQpHYObP2uUAKOunTAWx1lnWACZ9U9Ka6SHWN/NhKFXeMKwgw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.55.0", - "@aws-sdk/config-resolver": "3.55.0", - "@aws-sdk/credential-provider-node": "3.55.0", - "@aws-sdk/fetch-http-handler": "3.55.0", + "@aws-sdk/client-sts": "3.58.0", + "@aws-sdk/config-resolver": "3.58.0", + "@aws-sdk/credential-provider-node": "3.58.0", + "@aws-sdk/fetch-http-handler": "3.58.0", "@aws-sdk/hash-node": "3.55.0", "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.55.0", - "@aws-sdk/middleware-endpoint-discovery": "3.55.0", - "@aws-sdk/middleware-host-header": "3.55.0", + "@aws-sdk/middleware-content-length": "3.58.0", + "@aws-sdk/middleware-endpoint-discovery": "3.58.0", + "@aws-sdk/middleware-host-header": "3.58.0", "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.55.0", + "@aws-sdk/middleware-retry": "3.58.0", "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-signing": "3.55.0", + "@aws-sdk/middleware-signing": "3.58.0", "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.55.0", - "@aws-sdk/node-config-provider": "3.55.0", - "@aws-sdk/node-http-handler": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/middleware-user-agent": "3.58.0", + "@aws-sdk/node-config-provider": "3.58.0", + "@aws-sdk/node-http-handler": "3.58.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/smithy-client": "3.55.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.55.0", + "@aws-sdk/util-base64-browser": "3.58.0", "@aws-sdk/util-base64-node": "3.55.0", "@aws-sdk/util-body-length-browser": "3.55.0", "@aws-sdk/util-body-length-node": "3.55.0", "@aws-sdk/util-defaults-mode-browser": "3.55.0", - "@aws-sdk/util-defaults-mode-node": "3.55.0", - "@aws-sdk/util-user-agent-browser": "3.55.0", - "@aws-sdk/util-user-agent-node": "3.55.0", + "@aws-sdk/util-defaults-mode-node": "3.58.0", + "@aws-sdk/util-user-agent-browser": "3.58.0", + "@aws-sdk/util-user-agent-node": "3.58.0", "@aws-sdk/util-utf8-browser": "3.55.0", "@aws-sdk/util-utf8-node": "3.55.0", "@aws-sdk/util-waiter": "3.55.0", @@ -383,38 +383,38 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.55.0.tgz", - "integrity": "sha512-bIGy2xkWZ00Vn5ByLIQamHVbzSE6Pbcs67873otNWtpkygfMzvQRFZ8RB6J+C6BuAwT3xTLI0aNi40RxxwM4HQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.58.0.tgz", + "integrity": "sha512-nS5G/OX8Bg4ajBa6+jLcbbr4PpEO+l5eJfGUzoJQwS4Zqa0lF/wC0kyjKm61gLp4JuvhrQskxIC/3IXUqB1XVQ==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.55.0", - "@aws-sdk/fetch-http-handler": "3.55.0", + "@aws-sdk/config-resolver": "3.58.0", + "@aws-sdk/fetch-http-handler": "3.58.0", "@aws-sdk/hash-node": "3.55.0", "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.55.0", - "@aws-sdk/middleware-host-header": "3.55.0", + "@aws-sdk/middleware-content-length": "3.58.0", + "@aws-sdk/middleware-host-header": "3.58.0", "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.55.0", + "@aws-sdk/middleware-retry": "3.58.0", "@aws-sdk/middleware-serde": "3.55.0", "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.55.0", - "@aws-sdk/node-config-provider": "3.55.0", - "@aws-sdk/node-http-handler": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/middleware-user-agent": "3.58.0", + "@aws-sdk/node-config-provider": "3.58.0", + "@aws-sdk/node-http-handler": "3.58.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/smithy-client": "3.55.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.55.0", + "@aws-sdk/util-base64-browser": "3.58.0", "@aws-sdk/util-base64-node": "3.55.0", "@aws-sdk/util-body-length-browser": "3.55.0", "@aws-sdk/util-body-length-node": "3.55.0", "@aws-sdk/util-defaults-mode-browser": "3.55.0", - "@aws-sdk/util-defaults-mode-node": "3.55.0", - "@aws-sdk/util-user-agent-browser": "3.55.0", - "@aws-sdk/util-user-agent-node": "3.55.0", + "@aws-sdk/util-defaults-mode-node": "3.58.0", + "@aws-sdk/util-user-agent-browser": "3.58.0", + "@aws-sdk/util-user-agent-node": "3.58.0", "@aws-sdk/util-utf8-browser": "3.55.0", "@aws-sdk/util-utf8-node": "3.55.0", "tslib": "^2.3.1" @@ -424,41 +424,41 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.55.0.tgz", - "integrity": "sha512-/xmx0bxvhL9ffQ7A263MyTAfC6G0cyy/FwTmTWTt2xoKCNub7sGrPCJOjZB5fvmy9FpUvFUOJw1DnCghANKxzw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.58.0.tgz", + "integrity": "sha512-2cHZsG2eXv/Zl0hvsG9+rdHEuAclMFfkma/3LC3RRwSuZXo1rXoIhFkzHfGfIbivdk738YAo7FT3ZYGlrsK4ow==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.55.0", - "@aws-sdk/credential-provider-node": "3.55.0", - "@aws-sdk/fetch-http-handler": "3.55.0", + "@aws-sdk/config-resolver": "3.58.0", + "@aws-sdk/credential-provider-node": "3.58.0", + "@aws-sdk/fetch-http-handler": "3.58.0", "@aws-sdk/hash-node": "3.55.0", "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.55.0", - "@aws-sdk/middleware-host-header": "3.55.0", + "@aws-sdk/middleware-content-length": "3.58.0", + "@aws-sdk/middleware-host-header": "3.58.0", "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.55.0", - "@aws-sdk/middleware-sdk-sts": "3.55.0", + "@aws-sdk/middleware-retry": "3.58.0", + "@aws-sdk/middleware-sdk-sts": "3.58.0", "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-signing": "3.55.0", + "@aws-sdk/middleware-signing": "3.58.0", "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.55.0", - "@aws-sdk/node-config-provider": "3.55.0", - "@aws-sdk/node-http-handler": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/middleware-user-agent": "3.58.0", + "@aws-sdk/node-config-provider": "3.58.0", + "@aws-sdk/node-http-handler": "3.58.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/smithy-client": "3.55.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.55.0", + "@aws-sdk/util-base64-browser": "3.58.0", "@aws-sdk/util-base64-node": "3.55.0", "@aws-sdk/util-body-length-browser": "3.55.0", "@aws-sdk/util-body-length-node": "3.55.0", "@aws-sdk/util-defaults-mode-browser": "3.55.0", - "@aws-sdk/util-defaults-mode-node": "3.55.0", - "@aws-sdk/util-user-agent-browser": "3.55.0", - "@aws-sdk/util-user-agent-node": "3.55.0", + "@aws-sdk/util-defaults-mode-node": "3.58.0", + "@aws-sdk/util-user-agent-browser": "3.58.0", + "@aws-sdk/util-user-agent-node": "3.58.0", "@aws-sdk/util-utf8-browser": "3.55.0", "@aws-sdk/util-utf8-node": "3.55.0", "entities": "2.2.0", @@ -470,14 +470,15 @@ } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.55.0.tgz", - "integrity": "sha512-dW+UcGu6f+RA1ZsiSpdWUrWwrhevXZeeBtr08X83TP7dK8S6HHv5upX+4es1xou6aMqqin+yHZUVmabvAe/gpg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.58.0.tgz", + "integrity": "sha512-NXEwYw0JrXcvenu42QpNMQXK+6pgZ+6bDGfCgOfCC0FmyI+w/CuF36lApwm7InHvHazOaDlwArXm2pfntErKoA==", "dev": true, "dependencies": { - "@aws-sdk/signature-v4": "3.55.0", + "@aws-sdk/signature-v4": "3.58.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/util-config-provider": "3.55.0", + "@aws-sdk/util-middleware": "3.55.0", "tslib": "^2.3.1" }, "engines": { @@ -499,12 +500,12 @@ } }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.55.0.tgz", - "integrity": "sha512-aBOQomxYwNHQSHuOetrER1r13x3tJWNd9Eho2OcGLRioNS6/on2T5ptQI5/pJvAqOWe7LG65k1g3eTf1T8Nf1Q==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.58.0.tgz", + "integrity": "sha512-CdtnTQ9zqLx1FbXdbgjijLbMcIWOyQM03TFaLSCjI3FNbUwyt3T7StBU9tj/LtbypHhSdXyQBpzUtXTOMWCEhg==", "dev": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.55.0", + "@aws-sdk/node-config-provider": "3.58.0", "@aws-sdk/property-provider": "3.55.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/url-parser": "3.55.0", @@ -515,17 +516,17 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.55.0.tgz", - "integrity": "sha512-f4+8mqJ1xapF9SR90VC+Ho4zlnLPdCgAAm9f7Pauf1/beAk5bkmfLshLwQ5Jo4oEPbWLn1Sdk403kwnxpsnksg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.58.0.tgz", + "integrity": "sha512-uM62hcHUVaHP1YFnbrjf2RlrRj1m/BvMPE+T5jdNRWdE3lvnunhEMawB26HZs9nQqCV6d25I8G9/fGWVL7g3Og==", "dev": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.55.0", - "@aws-sdk/credential-provider-sso": "3.55.0", + "@aws-sdk/credential-provider-imds": "3.58.0", + "@aws-sdk/credential-provider-sso": "3.58.0", "@aws-sdk/credential-provider-web-identity": "3.55.0", "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -534,19 +535,19 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.55.0.tgz", - "integrity": "sha512-cDAk2+29sZyluk3D2vomCJd0adJxjun9yVdyAiuoutxx9LZ1KQgsDEVHDbPQFpmeOBBagtMNpHNVtUunQ3yy1w==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.58.0.tgz", + "integrity": "sha512-f0wzcgMYCQUrii6TLP2ggCxkQP4HH8PW8tbbWEgt4cdIXcjE9KEuxN5yOV6sFHzL3eJh0QM9Yaz8WzhWn6fT2A==", "dev": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.55.0", - "@aws-sdk/credential-provider-ini": "3.55.0", - "@aws-sdk/credential-provider-process": "3.55.0", - "@aws-sdk/credential-provider-sso": "3.55.0", + "@aws-sdk/credential-provider-imds": "3.58.0", + "@aws-sdk/credential-provider-ini": "3.58.0", + "@aws-sdk/credential-provider-process": "3.58.0", + "@aws-sdk/credential-provider-sso": "3.58.0", "@aws-sdk/credential-provider-web-identity": "3.55.0", "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -555,13 +556,13 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.55.0.tgz", - "integrity": "sha512-09AGJ6bdonXpV/dyHzrQqcbo2oy3aDxjcq+/LGo4GuB0ZHD2TJqKpExU7ie0rg/5OdBnTX6c+9JyjeFt03uX7w==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.58.0.tgz", + "integrity": "sha512-npgFqPUjMhUamf1FvJjBYUdpbWx8XWkKCwJsX73I7IYQAvAi2atCOkdtKq+4rds0VWAYu6vzlaI1tXgFxjOPNQ==", "dev": true, "dependencies": { "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -570,14 +571,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.55.0.tgz", - "integrity": "sha512-hKWbZMDY5nZMsOKMVkeUrKCdHaemMhyAH4WfApq976DDJt6bm6U+jvkTspO8qQaIPD8xdRqyi5AMLvVcHjBbTg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.58.0.tgz", + "integrity": "sha512-2qO34s9lJqvCC6zOF4UpopW6xURZpYfVC8xTUDpAUnvTOt4nS5hkx4vNyqPAXILoRHuFJsnlWsBH1UP5ZnBiZg==", "dev": true, "dependencies": { - "@aws-sdk/client-sso": "3.55.0", + "@aws-sdk/client-sso": "3.58.0", "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -613,15 +614,15 @@ } }, "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.55.0.tgz", - "integrity": "sha512-/Sta3MLlszpRZ1pg+ClxfNqGvraX93F587eHrfQMaGXgQ2BqJLiAVRorBRGcmmmrHxfLOqspNqufF7ibrqziRQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.58.0.tgz", + "integrity": "sha512-timF3FjPV5Bd+Kgph83LIKVlPCFObVYzious1a6doeLAT6YFwZpRrWbfP/HzS+DCoYiwUsH69oVJ91BoV66oyA==", "dev": true, "dependencies": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/querystring-builder": "3.55.0", "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-base64-browser": "3.55.0", + "@aws-sdk/util-base64-browser": "3.58.0", "tslib": "^2.3.1" } }, @@ -662,12 +663,12 @@ } }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.55.0.tgz", - "integrity": "sha512-IkFBwa1G5ERfKFh4Kdtcn/aNAGi3Hcp9IO1PVt69LZWaevxjXAi5NS2k65E9mZPEumzuLtcEeC+3qhPs4FUkqQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.58.0.tgz", + "integrity": "sha512-h/BypPkhjv2CpCUbXA8Fa2s7V2GPiz9l11XhYK+sKSuQvQ7Lbq6VhaKaLqfeD3gLVZHgJZSLGl2btdHV1qHNNA==", "dev": true, "dependencies": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -676,14 +677,14 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.55.0.tgz", - "integrity": "sha512-lVQLFQ9I3CCLNlx6lhH6rzodAJgM+rwXEbcn5UB1xSg1cmPd10hD1tvRHndDlHdrRF2ql6zk3LGq4JwB8IjNYw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.58.0.tgz", + "integrity": "sha512-Ll42zMPP8dDTHesv5VdnM0vgT4mW+kR2SgXCWBMuwnZdBn0FDH1A3E0BqJkLuuq2TKIah0/l1sA1qVC68GkAeA==", "dev": true, "dependencies": { - "@aws-sdk/config-resolver": "3.55.0", + "@aws-sdk/config-resolver": "3.58.0", "@aws-sdk/endpoint-cache": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -692,12 +693,12 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.55.0.tgz", - "integrity": "sha512-69mTWJfuPP4aC+h2/cb9B2CUNA9tiRPUBp67dmMrA2dHyy53kNYo8TGgfLKProoBidBz/AVXIfnh+izJj0F20w==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.58.0.tgz", + "integrity": "sha512-q/UKGcanm9e6DBRNN6UKhVqLvpRRdZWbmmPCeDNr4HqhCmgT6i1OvWdhAMOnT++hvCX8DpTsIXzNSlY6zWAxBg==", "dev": true, "dependencies": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -719,14 +720,15 @@ } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.55.0.tgz", - "integrity": "sha512-Z0j4/zyvgp8Y7HYud1MCqheg9koVh7p1ekS8lm6GePZBWILXsFib8PK9eq7B16u2z7yyz2tHrzwQrHRRr0cQKQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.58.0.tgz", + "integrity": "sha512-sfSq+t0Yy47DQwrWGpA8iOx9sd26l4l1JDVTwHNi7+OKD4ClRPVCEdw3bTbbyYz/PV4f9AEfAZ6jwtSff4wkGw==", "dev": true, "dependencies": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/service-error-classification": "3.55.0", "@aws-sdk/types": "3.55.0", + "@aws-sdk/util-middleware": "3.55.0", "tslib": "^2.3.1", "uuid": "^8.3.2" }, @@ -744,15 +746,15 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.55.0.tgz", - "integrity": "sha512-BrK3UXmD08rGbhY6cAHXsQxDfflOrPbKe4gxymlckd9sGIPC42O1KfJQ0CaxWPvG1Gd3R/QFfoPFClpTDhdh0Q==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.58.0.tgz", + "integrity": "sha512-HUz7MhcsSDDTGygOwL61l4voc0pZco06J3z06JjTX19D5XxcQ7hSCtkHHHz0oMb9M1himVSiEon2tjhjsnB99g==", "dev": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.55.0", + "@aws-sdk/middleware-signing": "3.58.0", "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", - "@aws-sdk/signature-v4": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", + "@aws-sdk/signature-v4": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -774,14 +776,14 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.55.0.tgz", - "integrity": "sha512-FUVrFv6zfHkX1gjwOvam4VneGJL9L/1can5HoNKAsxYwGUMVCrMEmyfkGWBy+paMe0dQ3bF4VVZjJHEvzJaQLQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.58.0.tgz", + "integrity": "sha512-4FXubHB66GbhyZUlo6YPQoWpYfED15GNbEmHbJLSONzrVzZR3IkViSPLasDngVm1a050JqKuqNkFYGJBP4No/Q==", "dev": true, "dependencies": { "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", - "@aws-sdk/signature-v4": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", + "@aws-sdk/signature-v4": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -802,12 +804,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.55.0.tgz", - "integrity": "sha512-UOBimkQrj6onXb3Fyuao85IjipnDSowNHfOOl3ADVX9boA/A4db5QAXBSxThV0WHLArC0iiUsnwu95ElSSMVIg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.58.0.tgz", + "integrity": "sha512-1c69bIWM63JwXijXvb9IWwcwQ/gViKMZ1lhxv52NvdG5VSxWXXsFJ2jETEXZoAypwT97Hmf3xo9SYuaHcKoq+g==", "dev": true, "dependencies": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -816,13 +818,13 @@ } }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.55.0.tgz", - "integrity": "sha512-+qpAEWiRXCuY85+VkJWbe+4MfQjlq6Nzi4a+3OejyqTRYMkslK93tR7SejdCiyq1lWpqtbwI9DsjDO45/2P6LA==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.58.0.tgz", + "integrity": "sha512-AMcPqPhKxo/3/yOMS9PsKlI0GWp2/8eD6gSlhzdBpznPCKplyqXOSnSX7wS814Cyh373hFSjCaOrCOA9/EYtDg==", "dev": true, "dependencies": { "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -831,13 +833,13 @@ } }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.55.0.tgz", - "integrity": "sha512-yF4YQr72YgVgWO9IDOhDcncqlKUJmMCtserAYhKNvmkVuaMGHE11p+IByWgcIsMJTvtFaFBhTA3W7zhJB1C1xA==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.58.0.tgz", + "integrity": "sha512-D9xVZG2nfo4GbPsby3JuBiAhpqXTFk1+CfuQU0AZv0gQvE3fFTCnB3za83jo7JV/pyRPU+s+/LHIpxCWUHzStg==", "dev": true, "dependencies": { "@aws-sdk/abort-controller": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/querystring-builder": "3.55.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" @@ -860,9 +862,9 @@ } }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.55.0.tgz", - "integrity": "sha512-vNjjsP5bFuKQMhmuBQZDddH441xanPbm8n42qgfigv0RzgWQhvUFrnmZWLBdyY8geY0RwsQ6x9yfQ0gvs48tpw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.58.0.tgz", + "integrity": "sha512-0yFFRPbR+CCa9eOQBBQ2qtrIDLYqSMN0y7G4iqVM8wQdIw7n3QK1PsTI3RNPGJ3Oi2krFTw5uUKqQQZPZEBuVQ==", "dev": true, "dependencies": { "@aws-sdk/types": "3.55.0", @@ -908,9 +910,9 @@ } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.55.0.tgz", - "integrity": "sha512-utmqVMvif8MjSr27HwPDZGCfJGCI4LoFkm4oyjonyu15aTfULm60mX6RTXftaQ2Syf7dnZ2U4kbp3xgzA5ZIgg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.58.0.tgz", + "integrity": "sha512-ARDKQerIzgNs/MFNdCEuK2lgRJ1lneAaJw0p9O1LkJUvcSibvkSATwny7vwJMueOf+ae1Pf+8+54OMNIt0nTkQ==", "dev": true, "dependencies": { "tslib": "^2.3.1" @@ -920,14 +922,15 @@ } }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.55.0.tgz", - "integrity": "sha512-ryJ43HSIVq7wt+QDBlb5CFH/rrH0+LtgnLDU+FM1XAQkT+oo3V9Hzr7rFmnFSfZqr/8hAn/4xUGTaJKZgO57NQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.58.0.tgz", + "integrity": "sha512-flEo8p3XkzWoBDqnIUQre4jLuT5aLnmfQNI8c2uSjyJ3OBxpJ0iS1cDu3E++d1/pN6Q8o0KOmr2ypHeiyBOujw==", "dev": true, "dependencies": { "@aws-sdk/is-array-buffer": "3.55.0", "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-hex-encoding": "3.55.0", + "@aws-sdk/util-hex-encoding": "3.58.0", + "@aws-sdk/util-middleware": "3.55.0", "@aws-sdk/util-uri-escape": "3.55.0", "tslib": "^2.3.1" }, @@ -969,9 +972,9 @@ } }, "node_modules/@aws-sdk/util-base64-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.55.0.tgz", - "integrity": "sha512-3hrZ2R/ZyD3IM25KhETOGLC5tB/ft8zoyVmNg1l4+takoUm46ompnglFXCVkWBu9Hpxc+M4XtiY7MHE6es4Wtg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.58.0.tgz", + "integrity": "sha512-0ebsXIZNpu/fup9OgsFPnRKfCFbuuI9PPRzvP6twzLxUB0c/aix6Co7LGHFKcRKHZdaykoJMXArf8eHj2Nzv1Q==", "dev": true, "dependencies": { "tslib": "^2.3.1" @@ -1052,14 +1055,14 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.55.0.tgz", - "integrity": "sha512-uIVZ7SVBUrkSH1lqhmvvb0Sc1aecPydGH4ex2qA4Vrp+Xp0h4pzjRELdVEOFbAFMB1uHXzgMV6jLjADGZPrHrQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.58.0.tgz", + "integrity": "sha512-KNUCp0MXI+z3Z3pQCKDkx3Stdy1TXDjcUB+ZJFxRTJGIuBYwX4fV6G8s/zeFJi5Qv1ztR3CJ9fWJGsrx9mQ5EA==", "dev": true, "dependencies": { - "@aws-sdk/config-resolver": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.55.0", - "@aws-sdk/node-config-provider": "3.55.0", + "@aws-sdk/config-resolver": "3.58.0", + "@aws-sdk/credential-provider-imds": "3.58.0", + "@aws-sdk/node-config-provider": "3.58.0", "@aws-sdk/property-provider": "3.55.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" @@ -1069,9 +1072,9 @@ } }, "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.55.0.tgz", - "integrity": "sha512-zbDWNzIyqN2Po7SIo1ZDL4rQMP3R0TzGcCrm01bpQAb+2fWqUPigolvNZXXtMO6eS7EW3ZJJzkfoWHdH8zDz1A==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.58.0.tgz", + "integrity": "sha512-Rl+jXUzk/FJkOLYfUVYPhKa2aUmTpeobRP31l8IatQltSzDgLyRHO35f6UEs7Ztn5s1jbu/POatLAZ2WjbgVyg==", "dev": true, "dependencies": { "tslib": "^2.3.1" @@ -1092,6 +1095,18 @@ "node": ">= 12.0.0" } }, + "node_modules/@aws-sdk/util-middleware": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.55.0.tgz", + "integrity": "sha512-82fW2XV+rUalv8lkd4VlhpPp6xnXO5n9sckMp1N+TrQ+p8eqxqT0+o8n1/6s9Qsnkw64Y3m6+EfCdc8/uFOY2g==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/@aws-sdk/util-uri-escape": { "version": "3.55.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.55.0.tgz", @@ -1105,9 +1120,9 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.55.0.tgz", - "integrity": "sha512-E+8PluqbdOKfdJc9E4k0vy4PPb9wvAMa2Zdm5ycoaY0IXRI9RjQJnRw5JKAAJWLuOy7Lb83LgoowGW3o+4AuKw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.58.0.tgz", + "integrity": "sha512-aJpqCvT09giJRg5xFTBDBRAVF0k0yq3OEf6UTuiOVf5azlL2MGp6PJ/xkJp9Z06PuQQkwBJ/2nIQZemo02a5Sw==", "dev": true, "dependencies": { "@aws-sdk/types": "3.55.0", @@ -1116,12 +1131,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.55.0.tgz", - "integrity": "sha512-7aoolXzpnTcvIGkxY8v8AZR5ooH7c0wttEjQNkOfORQprznNuj5RUZPxq8oStpFSvwASZJPpfd2Y18G2jPthMw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.58.0.tgz", + "integrity": "sha512-VlbY/nzWdN2pfLUHqKvnlGBQ6tEeV4jyK9ggAD2Szjj0bkYvaaKwpBKswQmuJpi5/J2v7Bo4ayBLnqDL7PgzLA==", "dev": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.55.0", + "@aws-sdk/node-config-provider": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" }, @@ -5042,6 +5057,15 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, "node_modules/babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", @@ -8491,6 +8515,26 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -15638,12 +15682,13 @@ "version": "0.7.2", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^0.7.2", - "aws-xray-sdk-core": "^3.3.3" + "@aws-lambda-powertools/commons": "^0.7.1", + "aws-xray-sdk-core": "^3.3.4" }, "devDependencies": { - "@aws-sdk/client-dynamodb": "^3.52.0", + "@aws-sdk/client-dynamodb": "^3.58.0", "@types/promise-retry": "^1.1.3", + "axios": "^0.26.1", "promise-retry": "^2.0.1" } } @@ -15886,9 +15931,9 @@ "version": "file:packages/tracing", "requires": { "@aws-lambda-powertools/commons": "^0.7.2", - "@aws-sdk/client-dynamodb": "^3.52.0", "@types/promise-retry": "^1.1.3", - "aws-xray-sdk-core": "^3.3.3", + "aws-xray-sdk-core": "^3.3.4", + "axios": "^0.26.1", "promise-retry": "^2.0.1" } }, @@ -15903,42 +15948,42 @@ } }, "@aws-sdk/client-dynamodb": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.55.0.tgz", - "integrity": "sha512-INXDvGzltlO91y/iqNIyPBI6kW1gYwZzHXUTBtDZO1hQCedukj/AXX3kIkksfd5XG96Sj8FTB+1u/bV74dfyVA==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.58.0.tgz", + "integrity": "sha512-54uclCvSVREutcty19NqfzC5V/0ebYSz51lz5jQpHYObP2uUAKOunTAWx1lnWACZ9U9Ka6SHWN/NhKFXeMKwgw==", "dev": true, "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.55.0", - "@aws-sdk/config-resolver": "3.55.0", - "@aws-sdk/credential-provider-node": "3.55.0", - "@aws-sdk/fetch-http-handler": "3.55.0", + "@aws-sdk/client-sts": "3.58.0", + "@aws-sdk/config-resolver": "3.58.0", + "@aws-sdk/credential-provider-node": "3.58.0", + "@aws-sdk/fetch-http-handler": "3.58.0", "@aws-sdk/hash-node": "3.55.0", "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.55.0", - "@aws-sdk/middleware-endpoint-discovery": "3.55.0", - "@aws-sdk/middleware-host-header": "3.55.0", + "@aws-sdk/middleware-content-length": "3.58.0", + "@aws-sdk/middleware-endpoint-discovery": "3.58.0", + "@aws-sdk/middleware-host-header": "3.58.0", "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.55.0", + "@aws-sdk/middleware-retry": "3.58.0", "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-signing": "3.55.0", + "@aws-sdk/middleware-signing": "3.58.0", "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.55.0", - "@aws-sdk/node-config-provider": "3.55.0", - "@aws-sdk/node-http-handler": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/middleware-user-agent": "3.58.0", + "@aws-sdk/node-config-provider": "3.58.0", + "@aws-sdk/node-http-handler": "3.58.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/smithy-client": "3.55.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.55.0", + "@aws-sdk/util-base64-browser": "3.58.0", "@aws-sdk/util-base64-node": "3.55.0", "@aws-sdk/util-body-length-browser": "3.55.0", "@aws-sdk/util-body-length-node": "3.55.0", "@aws-sdk/util-defaults-mode-browser": "3.55.0", - "@aws-sdk/util-defaults-mode-node": "3.55.0", - "@aws-sdk/util-user-agent-browser": "3.55.0", - "@aws-sdk/util-user-agent-node": "3.55.0", + "@aws-sdk/util-defaults-mode-node": "3.58.0", + "@aws-sdk/util-user-agent-browser": "3.58.0", + "@aws-sdk/util-user-agent-node": "3.58.0", "@aws-sdk/util-utf8-browser": "3.55.0", "@aws-sdk/util-utf8-node": "3.55.0", "@aws-sdk/util-waiter": "3.55.0", @@ -15955,79 +16000,79 @@ } }, "@aws-sdk/client-sso": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.55.0.tgz", - "integrity": "sha512-bIGy2xkWZ00Vn5ByLIQamHVbzSE6Pbcs67873otNWtpkygfMzvQRFZ8RB6J+C6BuAwT3xTLI0aNi40RxxwM4HQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.58.0.tgz", + "integrity": "sha512-nS5G/OX8Bg4ajBa6+jLcbbr4PpEO+l5eJfGUzoJQwS4Zqa0lF/wC0kyjKm61gLp4JuvhrQskxIC/3IXUqB1XVQ==", "dev": true, "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.55.0", - "@aws-sdk/fetch-http-handler": "3.55.0", + "@aws-sdk/config-resolver": "3.58.0", + "@aws-sdk/fetch-http-handler": "3.58.0", "@aws-sdk/hash-node": "3.55.0", "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.55.0", - "@aws-sdk/middleware-host-header": "3.55.0", + "@aws-sdk/middleware-content-length": "3.58.0", + "@aws-sdk/middleware-host-header": "3.58.0", "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.55.0", + "@aws-sdk/middleware-retry": "3.58.0", "@aws-sdk/middleware-serde": "3.55.0", "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.55.0", - "@aws-sdk/node-config-provider": "3.55.0", - "@aws-sdk/node-http-handler": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/middleware-user-agent": "3.58.0", + "@aws-sdk/node-config-provider": "3.58.0", + "@aws-sdk/node-http-handler": "3.58.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/smithy-client": "3.55.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.55.0", + "@aws-sdk/util-base64-browser": "3.58.0", "@aws-sdk/util-base64-node": "3.55.0", "@aws-sdk/util-body-length-browser": "3.55.0", "@aws-sdk/util-body-length-node": "3.55.0", "@aws-sdk/util-defaults-mode-browser": "3.55.0", - "@aws-sdk/util-defaults-mode-node": "3.55.0", - "@aws-sdk/util-user-agent-browser": "3.55.0", - "@aws-sdk/util-user-agent-node": "3.55.0", + "@aws-sdk/util-defaults-mode-node": "3.58.0", + "@aws-sdk/util-user-agent-browser": "3.58.0", + "@aws-sdk/util-user-agent-node": "3.58.0", "@aws-sdk/util-utf8-browser": "3.55.0", "@aws-sdk/util-utf8-node": "3.55.0", "tslib": "^2.3.1" } }, "@aws-sdk/client-sts": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.55.0.tgz", - "integrity": "sha512-/xmx0bxvhL9ffQ7A263MyTAfC6G0cyy/FwTmTWTt2xoKCNub7sGrPCJOjZB5fvmy9FpUvFUOJw1DnCghANKxzw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.58.0.tgz", + "integrity": "sha512-2cHZsG2eXv/Zl0hvsG9+rdHEuAclMFfkma/3LC3RRwSuZXo1rXoIhFkzHfGfIbivdk738YAo7FT3ZYGlrsK4ow==", "dev": true, "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.55.0", - "@aws-sdk/credential-provider-node": "3.55.0", - "@aws-sdk/fetch-http-handler": "3.55.0", + "@aws-sdk/config-resolver": "3.58.0", + "@aws-sdk/credential-provider-node": "3.58.0", + "@aws-sdk/fetch-http-handler": "3.58.0", "@aws-sdk/hash-node": "3.55.0", "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.55.0", - "@aws-sdk/middleware-host-header": "3.55.0", + "@aws-sdk/middleware-content-length": "3.58.0", + "@aws-sdk/middleware-host-header": "3.58.0", "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.55.0", - "@aws-sdk/middleware-sdk-sts": "3.55.0", + "@aws-sdk/middleware-retry": "3.58.0", + "@aws-sdk/middleware-sdk-sts": "3.58.0", "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-signing": "3.55.0", + "@aws-sdk/middleware-signing": "3.58.0", "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.55.0", - "@aws-sdk/node-config-provider": "3.55.0", - "@aws-sdk/node-http-handler": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/middleware-user-agent": "3.58.0", + "@aws-sdk/node-config-provider": "3.58.0", + "@aws-sdk/node-http-handler": "3.58.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/smithy-client": "3.55.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.55.0", + "@aws-sdk/util-base64-browser": "3.58.0", "@aws-sdk/util-base64-node": "3.55.0", "@aws-sdk/util-body-length-browser": "3.55.0", "@aws-sdk/util-body-length-node": "3.55.0", "@aws-sdk/util-defaults-mode-browser": "3.55.0", - "@aws-sdk/util-defaults-mode-node": "3.55.0", - "@aws-sdk/util-user-agent-browser": "3.55.0", - "@aws-sdk/util-user-agent-node": "3.55.0", + "@aws-sdk/util-defaults-mode-node": "3.58.0", + "@aws-sdk/util-user-agent-browser": "3.58.0", + "@aws-sdk/util-user-agent-node": "3.58.0", "@aws-sdk/util-utf8-browser": "3.55.0", "@aws-sdk/util-utf8-node": "3.55.0", "entities": "2.2.0", @@ -16036,14 +16081,15 @@ } }, "@aws-sdk/config-resolver": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.55.0.tgz", - "integrity": "sha512-dW+UcGu6f+RA1ZsiSpdWUrWwrhevXZeeBtr08X83TP7dK8S6HHv5upX+4es1xou6aMqqin+yHZUVmabvAe/gpg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.58.0.tgz", + "integrity": "sha512-NXEwYw0JrXcvenu42QpNMQXK+6pgZ+6bDGfCgOfCC0FmyI+w/CuF36lApwm7InHvHazOaDlwArXm2pfntErKoA==", "dev": true, "requires": { - "@aws-sdk/signature-v4": "3.55.0", + "@aws-sdk/signature-v4": "3.58.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/util-config-provider": "3.55.0", + "@aws-sdk/util-middleware": "3.55.0", "tslib": "^2.3.1" } }, @@ -16059,12 +16105,12 @@ } }, "@aws-sdk/credential-provider-imds": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.55.0.tgz", - "integrity": "sha512-aBOQomxYwNHQSHuOetrER1r13x3tJWNd9Eho2OcGLRioNS6/on2T5ptQI5/pJvAqOWe7LG65k1g3eTf1T8Nf1Q==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.58.0.tgz", + "integrity": "sha512-CdtnTQ9zqLx1FbXdbgjijLbMcIWOyQM03TFaLSCjI3FNbUwyt3T7StBU9tj/LtbypHhSdXyQBpzUtXTOMWCEhg==", "dev": true, "requires": { - "@aws-sdk/node-config-provider": "3.55.0", + "@aws-sdk/node-config-provider": "3.58.0", "@aws-sdk/property-provider": "3.55.0", "@aws-sdk/types": "3.55.0", "@aws-sdk/url-parser": "3.55.0", @@ -16072,60 +16118,60 @@ } }, "@aws-sdk/credential-provider-ini": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.55.0.tgz", - "integrity": "sha512-f4+8mqJ1xapF9SR90VC+Ho4zlnLPdCgAAm9f7Pauf1/beAk5bkmfLshLwQ5Jo4oEPbWLn1Sdk403kwnxpsnksg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.58.0.tgz", + "integrity": "sha512-uM62hcHUVaHP1YFnbrjf2RlrRj1m/BvMPE+T5jdNRWdE3lvnunhEMawB26HZs9nQqCV6d25I8G9/fGWVL7g3Og==", "dev": true, "requires": { "@aws-sdk/credential-provider-env": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.55.0", - "@aws-sdk/credential-provider-sso": "3.55.0", + "@aws-sdk/credential-provider-imds": "3.58.0", + "@aws-sdk/credential-provider-sso": "3.58.0", "@aws-sdk/credential-provider-web-identity": "3.55.0", "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } }, "@aws-sdk/credential-provider-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.55.0.tgz", - "integrity": "sha512-cDAk2+29sZyluk3D2vomCJd0adJxjun9yVdyAiuoutxx9LZ1KQgsDEVHDbPQFpmeOBBagtMNpHNVtUunQ3yy1w==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.58.0.tgz", + "integrity": "sha512-f0wzcgMYCQUrii6TLP2ggCxkQP4HH8PW8tbbWEgt4cdIXcjE9KEuxN5yOV6sFHzL3eJh0QM9Yaz8WzhWn6fT2A==", "dev": true, "requires": { "@aws-sdk/credential-provider-env": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.55.0", - "@aws-sdk/credential-provider-ini": "3.55.0", - "@aws-sdk/credential-provider-process": "3.55.0", - "@aws-sdk/credential-provider-sso": "3.55.0", + "@aws-sdk/credential-provider-imds": "3.58.0", + "@aws-sdk/credential-provider-ini": "3.58.0", + "@aws-sdk/credential-provider-process": "3.58.0", + "@aws-sdk/credential-provider-sso": "3.58.0", "@aws-sdk/credential-provider-web-identity": "3.55.0", "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } }, "@aws-sdk/credential-provider-process": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.55.0.tgz", - "integrity": "sha512-09AGJ6bdonXpV/dyHzrQqcbo2oy3aDxjcq+/LGo4GuB0ZHD2TJqKpExU7ie0rg/5OdBnTX6c+9JyjeFt03uX7w==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.58.0.tgz", + "integrity": "sha512-npgFqPUjMhUamf1FvJjBYUdpbWx8XWkKCwJsX73I7IYQAvAi2atCOkdtKq+4rds0VWAYu6vzlaI1tXgFxjOPNQ==", "dev": true, "requires": { "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } }, "@aws-sdk/credential-provider-sso": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.55.0.tgz", - "integrity": "sha512-hKWbZMDY5nZMsOKMVkeUrKCdHaemMhyAH4WfApq976DDJt6bm6U+jvkTspO8qQaIPD8xdRqyi5AMLvVcHjBbTg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.58.0.tgz", + "integrity": "sha512-2qO34s9lJqvCC6zOF4UpopW6xURZpYfVC8xTUDpAUnvTOt4nS5hkx4vNyqPAXILoRHuFJsnlWsBH1UP5ZnBiZg==", "dev": true, "requires": { - "@aws-sdk/client-sso": "3.55.0", + "@aws-sdk/client-sso": "3.58.0", "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } @@ -16152,15 +16198,15 @@ } }, "@aws-sdk/fetch-http-handler": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.55.0.tgz", - "integrity": "sha512-/Sta3MLlszpRZ1pg+ClxfNqGvraX93F587eHrfQMaGXgQ2BqJLiAVRorBRGcmmmrHxfLOqspNqufF7ibrqziRQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.58.0.tgz", + "integrity": "sha512-timF3FjPV5Bd+Kgph83LIKVlPCFObVYzious1a6doeLAT6YFwZpRrWbfP/HzS+DCoYiwUsH69oVJ91BoV66oyA==", "dev": true, "requires": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/querystring-builder": "3.55.0", "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-base64-browser": "3.55.0", + "@aws-sdk/util-base64-browser": "3.58.0", "tslib": "^2.3.1" } }, @@ -16195,36 +16241,36 @@ } }, "@aws-sdk/middleware-content-length": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.55.0.tgz", - "integrity": "sha512-IkFBwa1G5ERfKFh4Kdtcn/aNAGi3Hcp9IO1PVt69LZWaevxjXAi5NS2k65E9mZPEumzuLtcEeC+3qhPs4FUkqQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.58.0.tgz", + "integrity": "sha512-h/BypPkhjv2CpCUbXA8Fa2s7V2GPiz9l11XhYK+sKSuQvQ7Lbq6VhaKaLqfeD3gLVZHgJZSLGl2btdHV1qHNNA==", "dev": true, "requires": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } }, "@aws-sdk/middleware-endpoint-discovery": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.55.0.tgz", - "integrity": "sha512-lVQLFQ9I3CCLNlx6lhH6rzodAJgM+rwXEbcn5UB1xSg1cmPd10hD1tvRHndDlHdrRF2ql6zk3LGq4JwB8IjNYw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.58.0.tgz", + "integrity": "sha512-Ll42zMPP8dDTHesv5VdnM0vgT4mW+kR2SgXCWBMuwnZdBn0FDH1A3E0BqJkLuuq2TKIah0/l1sA1qVC68GkAeA==", "dev": true, "requires": { - "@aws-sdk/config-resolver": "3.55.0", + "@aws-sdk/config-resolver": "3.58.0", "@aws-sdk/endpoint-cache": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } }, "@aws-sdk/middleware-host-header": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.55.0.tgz", - "integrity": "sha512-69mTWJfuPP4aC+h2/cb9B2CUNA9tiRPUBp67dmMrA2dHyy53kNYo8TGgfLKProoBidBz/AVXIfnh+izJj0F20w==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.58.0.tgz", + "integrity": "sha512-q/UKGcanm9e6DBRNN6UKhVqLvpRRdZWbmmPCeDNr4HqhCmgT6i1OvWdhAMOnT++hvCX8DpTsIXzNSlY6zWAxBg==", "dev": true, "requires": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } @@ -16240,14 +16286,15 @@ } }, "@aws-sdk/middleware-retry": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.55.0.tgz", - "integrity": "sha512-Z0j4/zyvgp8Y7HYud1MCqheg9koVh7p1ekS8lm6GePZBWILXsFib8PK9eq7B16u2z7yyz2tHrzwQrHRRr0cQKQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.58.0.tgz", + "integrity": "sha512-sfSq+t0Yy47DQwrWGpA8iOx9sd26l4l1JDVTwHNi7+OKD4ClRPVCEdw3bTbbyYz/PV4f9AEfAZ6jwtSff4wkGw==", "dev": true, "requires": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/service-error-classification": "3.55.0", "@aws-sdk/types": "3.55.0", + "@aws-sdk/util-middleware": "3.55.0", "tslib": "^2.3.1", "uuid": "^8.3.2" }, @@ -16261,15 +16308,15 @@ } }, "@aws-sdk/middleware-sdk-sts": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.55.0.tgz", - "integrity": "sha512-BrK3UXmD08rGbhY6cAHXsQxDfflOrPbKe4gxymlckd9sGIPC42O1KfJQ0CaxWPvG1Gd3R/QFfoPFClpTDhdh0Q==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.58.0.tgz", + "integrity": "sha512-HUz7MhcsSDDTGygOwL61l4voc0pZco06J3z06JjTX19D5XxcQ7hSCtkHHHz0oMb9M1himVSiEon2tjhjsnB99g==", "dev": true, "requires": { - "@aws-sdk/middleware-signing": "3.55.0", + "@aws-sdk/middleware-signing": "3.58.0", "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", - "@aws-sdk/signature-v4": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", + "@aws-sdk/signature-v4": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } @@ -16285,14 +16332,14 @@ } }, "@aws-sdk/middleware-signing": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.55.0.tgz", - "integrity": "sha512-FUVrFv6zfHkX1gjwOvam4VneGJL9L/1can5HoNKAsxYwGUMVCrMEmyfkGWBy+paMe0dQ3bF4VVZjJHEvzJaQLQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.58.0.tgz", + "integrity": "sha512-4FXubHB66GbhyZUlo6YPQoWpYfED15GNbEmHbJLSONzrVzZR3IkViSPLasDngVm1a050JqKuqNkFYGJBP4No/Q==", "dev": true, "requires": { "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", - "@aws-sdk/signature-v4": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", + "@aws-sdk/signature-v4": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } @@ -16307,36 +16354,36 @@ } }, "@aws-sdk/middleware-user-agent": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.55.0.tgz", - "integrity": "sha512-UOBimkQrj6onXb3Fyuao85IjipnDSowNHfOOl3ADVX9boA/A4db5QAXBSxThV0WHLArC0iiUsnwu95ElSSMVIg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.58.0.tgz", + "integrity": "sha512-1c69bIWM63JwXijXvb9IWwcwQ/gViKMZ1lhxv52NvdG5VSxWXXsFJ2jETEXZoAypwT97Hmf3xo9SYuaHcKoq+g==", "dev": true, "requires": { - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } }, "@aws-sdk/node-config-provider": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.55.0.tgz", - "integrity": "sha512-+qpAEWiRXCuY85+VkJWbe+4MfQjlq6Nzi4a+3OejyqTRYMkslK93tR7SejdCiyq1lWpqtbwI9DsjDO45/2P6LA==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.58.0.tgz", + "integrity": "sha512-AMcPqPhKxo/3/yOMS9PsKlI0GWp2/8eD6gSlhzdBpznPCKplyqXOSnSX7wS814Cyh373hFSjCaOrCOA9/EYtDg==", "dev": true, "requires": { "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.55.0", + "@aws-sdk/shared-ini-file-loader": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } }, "@aws-sdk/node-http-handler": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.55.0.tgz", - "integrity": "sha512-yF4YQr72YgVgWO9IDOhDcncqlKUJmMCtserAYhKNvmkVuaMGHE11p+IByWgcIsMJTvtFaFBhTA3W7zhJB1C1xA==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.58.0.tgz", + "integrity": "sha512-D9xVZG2nfo4GbPsby3JuBiAhpqXTFk1+CfuQU0AZv0gQvE3fFTCnB3za83jo7JV/pyRPU+s+/LHIpxCWUHzStg==", "dev": true, "requires": { "@aws-sdk/abort-controller": "3.55.0", - "@aws-sdk/protocol-http": "3.55.0", + "@aws-sdk/protocol-http": "3.58.0", "@aws-sdk/querystring-builder": "3.55.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" @@ -16353,9 +16400,9 @@ } }, "@aws-sdk/protocol-http": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.55.0.tgz", - "integrity": "sha512-vNjjsP5bFuKQMhmuBQZDddH441xanPbm8n42qgfigv0RzgWQhvUFrnmZWLBdyY8geY0RwsQ6x9yfQ0gvs48tpw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.58.0.tgz", + "integrity": "sha512-0yFFRPbR+CCa9eOQBBQ2qtrIDLYqSMN0y7G4iqVM8wQdIw7n3QK1PsTI3RNPGJ3Oi2krFTw5uUKqQQZPZEBuVQ==", "dev": true, "requires": { "@aws-sdk/types": "3.55.0", @@ -16389,23 +16436,24 @@ "integrity": "sha512-HdjnDyarsa1Avq1MJurkLyEe9c3eRa76dPmK4TmRGgwJ+tInEzGHL0rBW7V8xBK+PDF+fJQ71hvm8jPYmzvBwQ==" }, "@aws-sdk/shared-ini-file-loader": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.55.0.tgz", - "integrity": "sha512-utmqVMvif8MjSr27HwPDZGCfJGCI4LoFkm4oyjonyu15aTfULm60mX6RTXftaQ2Syf7dnZ2U4kbp3xgzA5ZIgg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.58.0.tgz", + "integrity": "sha512-ARDKQerIzgNs/MFNdCEuK2lgRJ1lneAaJw0p9O1LkJUvcSibvkSATwny7vwJMueOf+ae1Pf+8+54OMNIt0nTkQ==", "dev": true, "requires": { "tslib": "^2.3.1" } }, "@aws-sdk/signature-v4": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.55.0.tgz", - "integrity": "sha512-ryJ43HSIVq7wt+QDBlb5CFH/rrH0+LtgnLDU+FM1XAQkT+oo3V9Hzr7rFmnFSfZqr/8hAn/4xUGTaJKZgO57NQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.58.0.tgz", + "integrity": "sha512-flEo8p3XkzWoBDqnIUQre4jLuT5aLnmfQNI8c2uSjyJ3OBxpJ0iS1cDu3E++d1/pN6Q8o0KOmr2ypHeiyBOujw==", "dev": true, "requires": { "@aws-sdk/is-array-buffer": "3.55.0", "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-hex-encoding": "3.55.0", + "@aws-sdk/util-hex-encoding": "3.58.0", + "@aws-sdk/util-middleware": "3.55.0", "@aws-sdk/util-uri-escape": "3.55.0", "tslib": "^2.3.1" } @@ -16438,9 +16486,9 @@ } }, "@aws-sdk/util-base64-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.55.0.tgz", - "integrity": "sha512-3hrZ2R/ZyD3IM25KhETOGLC5tB/ft8zoyVmNg1l4+takoUm46ompnglFXCVkWBu9Hpxc+M4XtiY7MHE6es4Wtg==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.58.0.tgz", + "integrity": "sha512-0ebsXIZNpu/fup9OgsFPnRKfCFbuuI9PPRzvP6twzLxUB0c/aix6Co7LGHFKcRKHZdaykoJMXArf8eHj2Nzv1Q==", "dev": true, "requires": { "tslib": "^2.3.1" @@ -16506,23 +16554,23 @@ } }, "@aws-sdk/util-defaults-mode-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.55.0.tgz", - "integrity": "sha512-uIVZ7SVBUrkSH1lqhmvvb0Sc1aecPydGH4ex2qA4Vrp+Xp0h4pzjRELdVEOFbAFMB1uHXzgMV6jLjADGZPrHrQ==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.58.0.tgz", + "integrity": "sha512-KNUCp0MXI+z3Z3pQCKDkx3Stdy1TXDjcUB+ZJFxRTJGIuBYwX4fV6G8s/zeFJi5Qv1ztR3CJ9fWJGsrx9mQ5EA==", "dev": true, "requires": { - "@aws-sdk/config-resolver": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.55.0", - "@aws-sdk/node-config-provider": "3.55.0", + "@aws-sdk/config-resolver": "3.58.0", + "@aws-sdk/credential-provider-imds": "3.58.0", + "@aws-sdk/node-config-provider": "3.58.0", "@aws-sdk/property-provider": "3.55.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } }, "@aws-sdk/util-hex-encoding": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.55.0.tgz", - "integrity": "sha512-zbDWNzIyqN2Po7SIo1ZDL4rQMP3R0TzGcCrm01bpQAb+2fWqUPigolvNZXXtMO6eS7EW3ZJJzkfoWHdH8zDz1A==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.58.0.tgz", + "integrity": "sha512-Rl+jXUzk/FJkOLYfUVYPhKa2aUmTpeobRP31l8IatQltSzDgLyRHO35f6UEs7Ztn5s1jbu/POatLAZ2WjbgVyg==", "dev": true, "requires": { "tslib": "^2.3.1" @@ -16537,6 +16585,15 @@ "tslib": "^2.3.1" } }, + "@aws-sdk/util-middleware": { + "version": "3.55.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.55.0.tgz", + "integrity": "sha512-82fW2XV+rUalv8lkd4VlhpPp6xnXO5n9sckMp1N+TrQ+p8eqxqT0+o8n1/6s9Qsnkw64Y3m6+EfCdc8/uFOY2g==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + } + }, "@aws-sdk/util-uri-escape": { "version": "3.55.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.55.0.tgz", @@ -16547,9 +16604,9 @@ } }, "@aws-sdk/util-user-agent-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.55.0.tgz", - "integrity": "sha512-E+8PluqbdOKfdJc9E4k0vy4PPb9wvAMa2Zdm5ycoaY0IXRI9RjQJnRw5JKAAJWLuOy7Lb83LgoowGW3o+4AuKw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.58.0.tgz", + "integrity": "sha512-aJpqCvT09giJRg5xFTBDBRAVF0k0yq3OEf6UTuiOVf5azlL2MGp6PJ/xkJp9Z06PuQQkwBJ/2nIQZemo02a5Sw==", "dev": true, "requires": { "@aws-sdk/types": "3.55.0", @@ -16558,12 +16615,12 @@ } }, "@aws-sdk/util-user-agent-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.55.0.tgz", - "integrity": "sha512-7aoolXzpnTcvIGkxY8v8AZR5ooH7c0wttEjQNkOfORQprznNuj5RUZPxq8oStpFSvwASZJPpfd2Y18G2jPthMw==", + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.58.0.tgz", + "integrity": "sha512-VlbY/nzWdN2pfLUHqKvnlGBQ6tEeV4jyK9ggAD2Szjj0bkYvaaKwpBKswQmuJpi5/J2v7Bo4ayBLnqDL7PgzLA==", "dev": true, "requires": { - "@aws-sdk/node-config-provider": "3.55.0", + "@aws-sdk/node-config-provider": "3.58.0", "@aws-sdk/types": "3.55.0", "tslib": "^2.3.1" } @@ -19655,6 +19712,15 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.8" + } + }, "babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", @@ -22380,6 +22446,12 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -27900,4 +27972,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/tracing/package.json b/packages/tracing/package.json index 197c7a11bd..136eb07b12 100644 --- a/packages/tracing/package.json +++ b/packages/tracing/package.json @@ -30,8 +30,9 @@ "main": "./lib/index.js", "types": "./lib/index.d.ts", "devDependencies": { - "@aws-sdk/client-dynamodb": "^3.52.0", + "@aws-sdk/client-dynamodb": "^3.58.0", "@types/promise-retry": "^1.1.3", + "axios": "^0.26.1", "promise-retry": "^2.0.1" }, "files": [ @@ -45,7 +46,7 @@ "url": "https://github.com/awslabs/aws-lambda-powertools-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^0.7.2", - "aws-xray-sdk-core": "^3.3.3" + "@aws-lambda-powertools/commons": "^0.7.1", + "aws-xray-sdk-core": "^3.3.4" } -} +} \ No newline at end of file diff --git a/packages/tracing/src/Tracer.ts b/packages/tracing/src/Tracer.ts index b2ee7cd938..b25d940777 100644 --- a/packages/tracing/src/Tracer.ts +++ b/packages/tracing/src/Tracer.ts @@ -15,6 +15,7 @@ import { Segment, Subsegment } from 'aws-xray-sdk-core'; * ## Key features * * Auto capture cold start as annotation, and responses or full exceptions as metadata * * Auto-disable when not running in AWS Lambda environment + * * Automatically trace HTTP(s) clients and generate segments for each request * * Support tracing functions via decorators, middleware, and manual instrumentation * * Support tracing AWS SDK v2 and v3 via AWS X-Ray SDK for Node.js * @@ -115,6 +116,8 @@ class Tracer extends Utility implements TracerInterface { public provider: ProviderServiceInterface; private captureError: boolean = true; + + private captureHTTPsRequests: boolean = true; private captureResponse: boolean = true; @@ -131,6 +134,9 @@ class Tracer extends Utility implements TracerInterface { this.setOptions(options); this.provider = new ProviderService(); + if (this.isTracingEnabled() && this.captureHTTPsRequests) { + this.provider.captureHTTPsGlobal(); + } if (!this.isTracingEnabled()) { // Tell x-ray-sdk to not throw an error if context is missing but tracing is disabled this.provider.setContextMissingStrategy(() => ({})); @@ -631,6 +637,39 @@ class Tracer extends Utility implements TracerInterface { } } + /** + * Patch all HTTP(s) clients and create traces when your application makes calls outgoing calls. + * + * Calls using third-party HTTP request libraries, such as Axios, are supported as long as they use the native http + * module under the hood. Support for third-party HTTP request libraries is provided on a best effort basis. + * + * @see https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs-httpclients.html + * + * @param enabled - Whether or not to patch all HTTP clients + * @returns void + */ + private setCaptureHTTPsRequests(enabled?: boolean): void { + if (enabled !== undefined && !enabled) { + this.captureHTTPsRequests = false; + + return; + } + + const customConfigValue = this.getCustomConfigService()?.getCaptureHTTPsRequests(); + if (customConfigValue !== undefined && customConfigValue.toLowerCase() === 'false') { + this.captureHTTPsRequests = false; + + return; + } + + const envVarsValue = this.getEnvVarsService()?.getCaptureHTTPsRequests(); + if (envVarsValue.toLowerCase() === 'false') { + this.captureHTTPsRequests = false; + + return; + } + } + /** * Setter for `captureResponse` based on configuration passed and environment variables. * Used internally during initialization. @@ -679,6 +718,7 @@ class Tracer extends Utility implements TracerInterface { const { enabled, serviceName, + captureHTTPsRequests, customConfigService } = options; @@ -688,6 +728,7 @@ class Tracer extends Utility implements TracerInterface { this.setCaptureResponse(); this.setCaptureError(); this.setServiceName(serviceName); + this.setCaptureHTTPsRequests(captureHTTPsRequests); return this; } diff --git a/packages/tracing/src/TracerInterface.ts b/packages/tracing/src/TracerInterface.ts index 16b06ec639..673d0ed2a3 100644 --- a/packages/tracing/src/TracerInterface.ts +++ b/packages/tracing/src/TracerInterface.ts @@ -2,15 +2,20 @@ import { HandlerMethodDecorator, MethodDecorator } from './types'; import { Segment, Subsegment } from 'aws-xray-sdk-core'; interface TracerInterface { - getSegment(): Segment | Subsegment | undefined - setSegment(segment: Segment | Subsegment): void - putAnnotation: (key: string, value: string | number | boolean) => void - putMetadata: (key: string, value: unknown, namespace?: string | undefined) => void - captureLambdaHandler(): HandlerMethodDecorator - captureMethod(): MethodDecorator + addErrorAsMetadata(error: Error): void + addResponseAsMetadata(data?: unknown, methodName?: string): void + addServiceNameAnnotation(): void + annotateColdStart(): void captureAWS(aws: T): void | T captureAWSv3Client(service: T): void | T captureAWSClient(service: T): void | T + captureLambdaHandler(): HandlerMethodDecorator + captureMethod(): MethodDecorator + getSegment(): Segment | Subsegment + isTracingEnabled(): boolean + putAnnotation: (key: string, value: string | number | boolean) => void + putMetadata: (key: string, value: unknown, namespace?: string | undefined) => void + setSegment(segment: Segment | Subsegment): void } export { diff --git a/packages/tracing/src/config/ConfigService.ts b/packages/tracing/src/config/ConfigService.ts index 067bf53df8..bbaffdb7ed 100644 --- a/packages/tracing/src/config/ConfigService.ts +++ b/packages/tracing/src/config/ConfigService.ts @@ -5,11 +5,14 @@ abstract class ConfigService implements ConfigServiceInterface { // Custom environment variables protected serviceNameVariable = 'POWERTOOLS_SERVICE_NAME'; protected tracerCaptureErrorVariable = 'POWERTOOLS_TRACER_CAPTURE_ERROR'; + protected tracerCaptureHTTPsRequestsVariable = 'POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS'; protected tracerCaptureResponseVariable = 'POWERTOOLS_TRACER_CAPTURE_RESPONSE'; protected tracingEnabledVariable = 'POWERTOOLS_TRACE_ENABLED'; public abstract get(name: string): string; + public abstract getCaptureHTTPsRequests(): string; + public abstract getServiceName(): string; public abstract getTracingCaptureError(): string; diff --git a/packages/tracing/src/config/ConfigServiceInterface.ts b/packages/tracing/src/config/ConfigServiceInterface.ts index 7825c788fa..67db36b5c5 100644 --- a/packages/tracing/src/config/ConfigServiceInterface.ts +++ b/packages/tracing/src/config/ConfigServiceInterface.ts @@ -2,6 +2,8 @@ interface ConfigServiceInterface { get(name: string): string + getCaptureHTTPsRequests(): string + getTracingEnabled(): string getServiceName(): string diff --git a/packages/tracing/src/config/EnvironmentVariablesService.ts b/packages/tracing/src/config/EnvironmentVariablesService.ts index 20c43557df..7fb780e2f8 100644 --- a/packages/tracing/src/config/EnvironmentVariablesService.ts +++ b/packages/tracing/src/config/EnvironmentVariablesService.ts @@ -15,6 +15,10 @@ class EnvironmentVariablesService extends ConfigService { return this.get(this.awsExecutionEnv); } + public getCaptureHTTPsRequests(): string { + return this.get(this.tracerCaptureHTTPsRequestsVariable); + } + public getSamLocal(): string { return this.get(this.samLocalVariable); } diff --git a/packages/tracing/src/provider/ProviderService.ts b/packages/tracing/src/provider/ProviderService.ts index 936f3aec95..626e9b5585 100644 --- a/packages/tracing/src/provider/ProviderService.ts +++ b/packages/tracing/src/provider/ProviderService.ts @@ -1,7 +1,7 @@ import { ContextMissingStrategy } from 'aws-xray-sdk-core/dist/lib/context_utils'; import { Namespace } from 'cls-hooked'; import { ProviderServiceInterface } from '.'; -import { captureAWS, captureAWSClient, captureAWSv3Client, captureAsyncFunc, captureFunc, getNamespace, getSegment, setSegment, Segment, Subsegment, setContextMissingStrategy, setDaemonAddress, setLogger, Logger } from 'aws-xray-sdk-core'; +import { captureAWS, captureAWSClient, captureAWSv3Client, captureAsyncFunc, captureFunc, captureHTTPsGlobal, getNamespace, getSegment, setSegment, Segment, Subsegment, setContextMissingStrategy, setDaemonAddress, setLogger, Logger } from 'aws-xray-sdk-core'; class ProviderService implements ProviderServiceInterface { @@ -27,6 +27,13 @@ class ProviderService implements ProviderServiceInterface { return captureFunc(name, fcn); } + public captureHTTPsGlobal(): void { + // eslint-disable-next-line @typescript-eslint/no-var-requires + captureHTTPsGlobal(require('http')); + // eslint-disable-next-line @typescript-eslint/no-var-requires + captureHTTPsGlobal(require('https')); + } + public getNamespace(): Namespace { return getNamespace(); } diff --git a/packages/tracing/src/provider/ProviderServiceInterface.ts b/packages/tracing/src/provider/ProviderServiceInterface.ts index afbfaf4470..4b4c1bef96 100644 --- a/packages/tracing/src/provider/ProviderServiceInterface.ts +++ b/packages/tracing/src/provider/ProviderServiceInterface.ts @@ -20,9 +20,11 @@ interface ProviderServiceInterface { captureAWSv3Client(awsservice: T): T + captureAsyncFunc(name: string, fcn: (subsegment?: Subsegment) => unknown, parent?: Segment | Subsegment): unknown + captureFunc(name: string, fcn: (subsegment?: Subsegment) => unknown, parent?: Segment | Subsegment): unknown - captureAsyncFunc(name: string, fcn: (subsegment?: Subsegment) => unknown, parent?: Segment | Subsegment): unknown + captureHTTPsGlobal(): void } export { diff --git a/packages/tracing/src/types/Tracer.ts b/packages/tracing/src/types/Tracer.ts index 1fe8a8a30b..288a65c23e 100644 --- a/packages/tracing/src/types/Tracer.ts +++ b/packages/tracing/src/types/Tracer.ts @@ -12,6 +12,7 @@ import { AsyncHandler, LambdaInterface, SyncHandler } from '@aws-lambda-powertoo * const tracerOptions: TracerOptions = { * enabled?: true, * serviceName?: 'serverlessAirline', + * captureHTTPsRequests?: true, * customConfigService?: customConfigService, // Only needed for advanced uses * }; * @@ -21,6 +22,7 @@ import { AsyncHandler, LambdaInterface, SyncHandler } from '@aws-lambda-powertoo type TracerOptions = { enabled?: boolean serviceName?: string + captureHTTPsRequests?: boolean customConfigService?: ConfigServiceInterface }; diff --git a/packages/tracing/tests/e2e/tracer.test.Decorator.ts b/packages/tracing/tests/e2e/tracer.test.Decorator.ts index 53c42c4abe..f86937082f 100644 --- a/packages/tracing/tests/e2e/tracer.test.Decorator.ts +++ b/packages/tracing/tests/e2e/tracer.test.Decorator.ts @@ -1,6 +1,7 @@ import { Tracer } from '../../src'; import { Callback, Context } from 'aws-lambda'; import { DynamoDBClient, PutItemCommand } from '@aws-sdk/client-dynamodb'; +import axios from 'axios'; // eslint-disable-next-line @typescript-eslint/no-var-requires let AWS = require('aws-sdk'); @@ -54,6 +55,7 @@ export class MyFunctionWithDecorator { return Promise.all([ dynamoDBv2.put({ TableName: testTableName, Item: { id: `${serviceName}-${event.invocation}-sdkv2` } }).promise(), dynamoDBv3.send(new PutItemCommand({ TableName: testTableName, Item: { id: { 'S': `${serviceName}-${event.invocation}-sdkv3` } } })), + axios.get('https://httpbin.org/status/200'), new Promise((resolve, reject) => { setTimeout(() => { const res = this.myMethod(); @@ -65,7 +67,7 @@ export class MyFunctionWithDecorator { }, 2000); // We need to wait for to make sure previous calls are finished }) ]) - .then(([ _dynamoDBv2Res, _dynamoDBv3Res, promiseRes ]) => promiseRes) + .then(([ _dynamoDBv2Res, _dynamoDBv3Res, _axiosRes, promiseRes ]) => promiseRes) .catch((err) => { throw err; }); diff --git a/packages/tracing/tests/e2e/tracer.test.DecoratorWithAsyncHandler.ts b/packages/tracing/tests/e2e/tracer.test.DecoratorWithAsyncHandler.ts index 7c44ba27ca..2607968a45 100644 --- a/packages/tracing/tests/e2e/tracer.test.DecoratorWithAsyncHandler.ts +++ b/packages/tracing/tests/e2e/tracer.test.DecoratorWithAsyncHandler.ts @@ -1,6 +1,7 @@ import { Tracer } from '../../src'; import { Context } from 'aws-lambda'; import { DynamoDBClient, PutItemCommand } from '@aws-sdk/client-dynamodb'; +import axios from 'axios'; // eslint-disable-next-line @typescript-eslint/no-var-requires let AWS = require('aws-sdk'); @@ -53,27 +54,18 @@ export class MyFunctionWithDecorator { try { await dynamoDBv2.put({ TableName: testTableName, Item: { id: `${serviceName}-${event.invocation}-sdkv2` } }).promise(); - } catch (err) { - console.error(err); - } - - try { await dynamoDBv3.send(new PutItemCommand({ TableName: testTableName, Item: { id: { 'S': `${serviceName}-${event.invocation}-sdkv3` } } })); - } catch (err) { - console.error(err); - } + await axios.get('https://httpbin.org/status/200'); - let res; - try { - res = this.myMethod(); + const res = this.myMethod(); if (event.throw) { throw new Error(customErrorMessage); } + + return res; } catch (err) { throw err; } - - return res; } @tracer.captureMethod() diff --git a/packages/tracing/tests/e2e/tracer.test.Manual.ts b/packages/tracing/tests/e2e/tracer.test.Manual.ts index f8a11d5cba..0ff9873003 100644 --- a/packages/tracing/tests/e2e/tracer.test.Manual.ts +++ b/packages/tracing/tests/e2e/tracer.test.Manual.ts @@ -1,6 +1,7 @@ import { Tracer } from '../../src'; import { Context } from 'aws-lambda'; import { DynamoDBClient, PutItemCommand } from '@aws-sdk/client-dynamodb'; +import axios from 'axios'; // eslint-disable-next-line @typescript-eslint/no-var-requires let AWS = require('aws-sdk'); @@ -56,23 +57,16 @@ export const handler = async (event: CustomEvent, _context: Context): Promise { TEST_TABLE_NAME: table.tableName, }, timeout: Duration.seconds(30), + bundling: { + externalModules: ['aws-sdk'], + } }); table.grantWriteData(fn); invocationsMap[functionName] = { @@ -134,27 +136,29 @@ describe('Tracer integration tests', () => { // Assess // Retrieve traces from X-Ray using Resource ARN as filter - const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 4); + const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 5); for (let i = 0; i < invocations; i++) { - // Assert that the trace has the expected amount of segments - expect(sortedTraces[i].Segments.length).toBe(4); + expect(sortedTraces[i].Segments.length).toBe(5); const invocationSubsegment = getInvocationSubsegment(sortedTraces[i]); if (invocationSubsegment?.subsegments !== undefined) { expect(invocationSubsegment?.subsegments?.length).toBe(1); + const handlerSubsegment = invocationSubsegment?.subsegments[0]; - // Assert that the subsegment name is the expected one expect(handlerSubsegment.name).toBe('## index.handler'); + if (handlerSubsegment?.subsegments !== undefined) { - // Assert that there're two subsegments - expect(handlerSubsegment?.subsegments?.length).toBe(2); + expect(handlerSubsegment?.subsegments?.length).toBe(3); - const [ AWSSDKSubsegment1, AWSSDKSubsegment2 ] = handlerSubsegment?.subsegments; - // Assert that the subsegment names is the expected ones - expect(AWSSDKSubsegment1.name).toBe('DynamoDB'); - expect(AWSSDKSubsegment2.name).toBe('DynamoDB'); + const subsegments = splitSegmentsByName(handlerSubsegment.subsegments, [ 'DynamoDB', 'httpbin.org' ]); + // Assert that there are exactly two subsegment with the name 'DynamoDB' + expect(subsegments.get('DynamoDB')?.length).toBe(2); + // Assert that there is exactly one subsegment with the name 'httpbin.org' + expect(subsegments.get('httpbin.org')?.length).toBe(1); + // Assert that there are exactly zero other subsegments + expect(subsegments.get('other')?.length).toBe(0); const { annotations, metadata } = handlerSubsegment; @@ -204,27 +208,30 @@ describe('Tracer integration tests', () => { // Assess // Retrieve traces from X-Ray using Resource ARN as filter - const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 4); + const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 5); for (let i = 0; i < invocations; i++) { // Assert that the trace has the expected amount of segments - expect(sortedTraces[i].Segments.length).toBe(4); + expect(sortedTraces[i].Segments.length).toBe(5); const invocationSubsegment = getInvocationSubsegment(sortedTraces[i]); if (invocationSubsegment?.subsegments !== undefined) { expect(invocationSubsegment?.subsegments?.length).toBe(1); + const handlerSubsegment = invocationSubsegment?.subsegments[0]; - // Assert that the subsegment name is the expected one expect(handlerSubsegment.name).toBe('## index.handler'); + if (handlerSubsegment?.subsegments !== undefined) { - // Assert that there're two subsegments - expect(handlerSubsegment?.subsegments?.length).toBe(2); + expect(handlerSubsegment?.subsegments?.length).toBe(3); - const [ AWSSDKSubsegment1, AWSSDKSubsegment2 ] = handlerSubsegment?.subsegments; - // Assert that the subsegment names is the expected ones - expect(AWSSDKSubsegment1.name).toBe('DynamoDB'); - expect(AWSSDKSubsegment2.name).toBe('DynamoDB'); + const subsegments = splitSegmentsByName(handlerSubsegment.subsegments, [ 'DynamoDB', 'httpbin.org' ]); + // Assert that there are exactly two subsegment with the name 'DynamoDB' + expect(subsegments.get('DynamoDB')?.length).toBe(2); + // Assert that there is exactly one subsegment with the name 'httpbin.org' + expect(subsegments.get('httpbin.org')?.length).toBe(1); + // Assert that there are exactly zero other subsegments + expect(subsegments.get('other')?.length).toBe(0); const { annotations, metadata } = handlerSubsegment; @@ -274,27 +281,30 @@ describe('Tracer integration tests', () => { // Assess // Retrieve traces from X-Ray using Resource ARN as filter - const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 4); + const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 5); for (let i = 0; i < invocations; i++) { // Assert that the trace has the expected amount of segments - expect(sortedTraces[i].Segments.length).toBe(4); + expect(sortedTraces[i].Segments.length).toBe(5); const invocationSubsegment = getInvocationSubsegment(sortedTraces[i]); if (invocationSubsegment?.subsegments !== undefined) { expect(invocationSubsegment?.subsegments?.length).toBe(1); + const handlerSubsegment = invocationSubsegment?.subsegments[0]; - // Assert that the subsegment name is the expected one expect(handlerSubsegment.name).toBe('## index.handler'); + if (handlerSubsegment?.subsegments !== undefined) { - // Assert that there're two subsegments - expect(handlerSubsegment?.subsegments?.length).toBe(2); + expect(handlerSubsegment?.subsegments?.length).toBe(3); - const [ AWSSDKSubsegment1, AWSSDKSubsegment2 ] = handlerSubsegment?.subsegments; - // Assert that the subsegment names is the expected ones - expect(AWSSDKSubsegment1.name).toBe('DynamoDB'); - expect(AWSSDKSubsegment2.name).toBe('DynamoDB'); + const subsegments = splitSegmentsByName(handlerSubsegment.subsegments, [ 'DynamoDB', 'httpbin.org' ]); + // Assert that there are exactly two subsegment with the name 'DynamoDB' + expect(subsegments.get('DynamoDB')?.length).toBe(2); + // Assert that there is exactly one subsegment with the name 'httpbin.org' + expect(subsegments.get('httpbin.org')?.length).toBe(1); + // Assert that there are exactly zero other subsegments + expect(subsegments.get('other')?.length).toBe(0); const { annotations, metadata } = handlerSubsegment; @@ -351,7 +361,7 @@ describe('Tracer integration tests', () => { const invocationSubsegment = getInvocationSubsegment(sortedTraces[i]); expect(invocationSubsegment?.subsegments).toBeUndefined(); - + if (i === invocations - 1) { // Assert that the subsegment has the expected fault expect(invocationSubsegment.error).toBe(true); @@ -367,43 +377,34 @@ describe('Tracer integration tests', () => { // Assess // Retrieve traces from X-Ray using Resource ARN as filter - const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 4); + const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 5); for (let i = 0; i < invocations; i++) { // Assert that the trace has the expected amount of segments - expect(sortedTraces[i].Segments.length).toBe(4); + expect(sortedTraces[i].Segments.length).toBe(5); const invocationSubsegment = getInvocationSubsegment(sortedTraces[i]); if (invocationSubsegment?.subsegments !== undefined) { expect(invocationSubsegment?.subsegments?.length).toBe(1); + const handlerSubsegment = invocationSubsegment?.subsegments[0]; - // Assert that the subsegment name is the expected one expect(handlerSubsegment.name).toBe('## index.handler'); + if (handlerSubsegment?.subsegments !== undefined) { - // Assert that there're three subsegments - expect(handlerSubsegment?.subsegments?.length).toBe(3); + expect(handlerSubsegment?.subsegments?.length).toBe(4); - // Sort the subsegments by name - const dynamoDBSubsegments: ParsedDocument[] = []; - const methodSubsegment: ParsedDocument[] = []; - const otherSegments: ParsedDocument[] = []; - handlerSubsegment?.subsegments.forEach(subsegment => { - if (subsegment.name === 'DynamoDB') { - dynamoDBSubsegments.push(subsegment); - } else if (subsegment.name === '### myMethod') { - methodSubsegment.push(subsegment); - } else { - otherSegments.push(subsegment); - } - }); + const subsegments = splitSegmentsByName(handlerSubsegment.subsegments, [ 'DynamoDB', 'httpbin.org', '### myMethod' ]); // Assert that there are exactly two subsegment with the name 'DynamoDB' - expect(dynamoDBSubsegments.length).toBe(2); + expect(subsegments.get('DynamoDB')?.length).toBe(2); + // Assert that there is exactly one subsegment with the name 'httpbin.org' + expect(subsegments.get('httpbin.org')?.length).toBe(1); // Assert that there is exactly one subsegment with the name '### myMethod' - expect(methodSubsegment.length).toBe(1); + expect(subsegments.get('### myMethod')?.length).toBe(1); // Assert that there are exactly zero other subsegments - expect(otherSegments.length).toBe(0); + expect(subsegments.get('other')?.length).toBe(0); + const methodSubsegment = subsegments.get('### myMethod') || []; const { metadata } = methodSubsegment[0]; if (metadata !== undefined) { @@ -464,43 +465,34 @@ describe('Tracer integration tests', () => { // Assess // Retrieve traces from X-Ray using Resource ARN as filter - const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 4); + const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 5); for (let i = 0; i < invocations; i++) { // Assert that the trace has the expected amount of segments - expect(sortedTraces[i].Segments.length).toBe(4); + expect(sortedTraces[i].Segments.length).toBe(5); const invocationSubsegment = getInvocationSubsegment(sortedTraces[i]); if (invocationSubsegment?.subsegments !== undefined) { expect(invocationSubsegment?.subsegments?.length).toBe(1); + const handlerSubsegment = invocationSubsegment?.subsegments[0]; - // Assert that the subsegment name is the expected one expect(handlerSubsegment.name).toBe('## index.handler'); + if (handlerSubsegment?.subsegments !== undefined) { - // Assert that there're three subsegments - expect(handlerSubsegment?.subsegments?.length).toBe(3); + expect(handlerSubsegment?.subsegments?.length).toBe(4); - // Sort the subsegments by name - const dynamoDBSubsegments: ParsedDocument[] = []; - const methodSubsegment: ParsedDocument[] = []; - const otherSegments: ParsedDocument[] = []; - handlerSubsegment?.subsegments.forEach(subsegment => { - if (subsegment.name === 'DynamoDB') { - dynamoDBSubsegments.push(subsegment); - } else if (subsegment.name === '### myMethod') { - methodSubsegment.push(subsegment); - } else { - otherSegments.push(subsegment); - } - }); + const subsegments = splitSegmentsByName(handlerSubsegment.subsegments, [ 'DynamoDB', 'httpbin.org', '### myMethod' ]); // Assert that there are exactly two subsegment with the name 'DynamoDB' - expect(dynamoDBSubsegments.length).toBe(2); + expect(subsegments.get('DynamoDB')?.length).toBe(2); + // Assert that there is exactly one subsegment with the name 'httpbin.org' + expect(subsegments.get('httpbin.org')?.length).toBe(1); // Assert that there is exactly one subsegment with the name '### myMethod' - expect(methodSubsegment.length).toBe(1); + expect(subsegments.get('### myMethod')?.length).toBe(1); // Assert that there are exactly zero other subsegments - expect(otherSegments.length).toBe(0); + expect(subsegments.get('other')?.length).toBe(0); + const methodSubsegment = subsegments.get('### myMethod') || []; const { metadata } = methodSubsegment[0]; if (metadata !== undefined) { @@ -561,43 +553,35 @@ describe('Tracer integration tests', () => { // Assess // Retrieve traces from X-Ray using Resource ARN as filter - const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 4); + const sortedTraces = await getTraces(xray, startTime, resourceArn, invocations, 5); for (let i = 0; i < invocations; i++) { // Assert that the trace has the expected amount of segments - expect(sortedTraces[i].Segments.length).toBe(4); + expect(sortedTraces[i].Segments.length).toBe(5); const invocationSubsegment = getInvocationSubsegment(sortedTraces[i]); if (invocationSubsegment?.subsegments !== undefined) { expect(invocationSubsegment?.subsegments?.length).toBe(1); + const handlerSubsegment = invocationSubsegment?.subsegments[0]; - // Assert that the subsegment name is the expected one expect(handlerSubsegment.name).toBe('## index.handler'); + if (handlerSubsegment?.subsegments !== undefined) { - // Assert that there're three subsegments - expect(handlerSubsegment?.subsegments?.length).toBe(3); + expect(handlerSubsegment?.subsegments?.length).toBe(4); - // Sort the subsegments by name - const dynamoDBSubsegments: ParsedDocument[] = []; - const methodSubsegment: ParsedDocument[] = []; - const otherSegments: ParsedDocument[] = []; - handlerSubsegment?.subsegments.forEach(subsegment => { - if (subsegment.name === 'DynamoDB') { - dynamoDBSubsegments.push(subsegment); - } else if (subsegment.name === '### myMethod') { - methodSubsegment.push(subsegment); - } else { - otherSegments.push(subsegment); - } - }); + const subsegments = splitSegmentsByName(handlerSubsegment.subsegments, [ 'DynamoDB', 'httpbin.org', '### myMethod' ]); // Assert that there are exactly two subsegment with the name 'DynamoDB' - expect(dynamoDBSubsegments.length).toBe(2); + expect(subsegments.get('DynamoDB')?.length).toBe(2); + // Assert that there is exactly one subsegment with the name 'httpbin.org' + expect(subsegments.get('httpbin.org')?.length).toBe(1); // Assert that there is exactly one subsegment with the name '### myMethod' - expect(methodSubsegment.length).toBe(1); + expect(subsegments.get('### myMethod')?.length).toBe(1); // Assert that there are exactly zero other subsegments - expect(otherSegments.length).toBe(0); + expect(subsegments.get('other')?.length).toBe(0); + // Assert that no response was captured on the subsegment + const methodSubsegment = subsegments.get('### myMethod') || []; expect(methodSubsegment[0].hasOwnProperty('metadata')).toBe(false); } else { // Make test fail if the handlerSubsegment subsegment doesn't have any subsebment @@ -655,7 +639,7 @@ describe('Tracer integration tests', () => { const invocationSubsegment = getInvocationSubsegment(sortedTraces[i]); expect(invocationSubsegment?.subsegments).toBeUndefined(); - + if (i === invocations - 1) { // Assert that the subsegment has the expected fault expect(invocationSubsegment.error).toBe(true); @@ -664,4 +648,4 @@ describe('Tracer integration tests', () => { }, ONE_MINUTE * 2); -}); +}); \ No newline at end of file diff --git a/packages/tracing/tests/helpers/tracesUtils.ts b/packages/tracing/tests/helpers/tracesUtils.ts index 31f1b795f9..403217b2ec 100644 --- a/packages/tracing/tests/helpers/tracesUtils.ts +++ b/packages/tracing/tests/helpers/tracesUtils.ts @@ -135,10 +135,23 @@ const getInvocationSubsegment = (trace: ParsedTrace): ParsedDocument => { return invocationSubsegment; }; +const splitSegmentsByName = (subsegments: ParsedDocument[], expectedNames: string[]): Map => { + const splitSegments: Map = new Map([ ...expectedNames, 'other' ].map(name => [ name, [] ])); + subsegments.forEach(subsegment => { + const name = expectedNames.indexOf(subsegment.name) !== -1 ? subsegment.name : 'other'; + const newSegments = splitSegments.get(name) as ParsedDocument[]; + newSegments.push(subsegment); + splitSegments.set(name, newSegments); + }); + + return splitSegments; +}; + export { getTraces, getFunctionSegment, getInvocationSubsegment, + splitSegmentsByName }; export type { diff --git a/packages/tracing/tests/unit/ProviderService.test.ts b/packages/tracing/tests/unit/ProviderService.test.ts index f4be4ed5dd..fdafaf43a3 100644 --- a/packages/tracing/tests/unit/ProviderService.test.ts +++ b/packages/tracing/tests/unit/ProviderService.test.ts @@ -5,13 +5,16 @@ */ import { ProviderService } from '../../src/provider'; -import { captureAWS, captureAWSClient, captureAWSv3Client, captureAsyncFunc, captureFunc, getNamespace, getSegment, setContextMissingStrategy, setDaemonAddress, setLogger, setSegment, Subsegment } from 'aws-xray-sdk-core'; +import { captureAWS, captureAWSClient, captureAWSv3Client, captureAsyncFunc, captureHTTPsGlobal, captureFunc, getNamespace, getSegment, setContextMissingStrategy, setDaemonAddress, setLogger, setSegment, Subsegment } from 'aws-xray-sdk-core'; +import http from 'http'; +import https from 'https'; jest.mock('aws-xray-sdk-core', () => ({ captureAWS: jest.fn(), captureAWSClient: jest.fn(), captureAWSv3Client: jest.fn(), captureAsyncFunc: jest.fn(), + captureHTTPsGlobal: jest.fn(), captureFunc: jest.fn(), getNamespace: jest.fn(), getSegment: jest.fn(), @@ -99,6 +102,25 @@ describe('Class: ProviderService', () => { }); + describe('Method: captureHTTPsGlobal', () => { + + test('when called, it forwards the correct parameter and calls the correct function, twice', () => { + + // Prepare + const provider: ProviderService = new ProviderService(); + + // Act + provider.captureHTTPsGlobal(); + + // Assess + expect(captureHTTPsGlobal).toHaveBeenCalledTimes(2); + expect(captureHTTPsGlobal).toHaveBeenNthCalledWith(1, http); + expect(captureHTTPsGlobal).toHaveBeenNthCalledWith(2, https); + + }); + + }); + describe('Method: captureFunc', () => { test('when called, it forwards the correct parameter, and call the correct function', () => { diff --git a/packages/tracing/tests/unit/Tracer.test.ts b/packages/tracing/tests/unit/Tracer.test.ts index 2a4eaa57f2..377ff13136 100644 --- a/packages/tracing/tests/unit/Tracer.test.ts +++ b/packages/tracing/tests/unit/Tracer.test.ts @@ -1102,4 +1102,5 @@ describe('Class: Tracer', () => { }); }); + }); \ No newline at end of file diff --git a/packages/tracing/tests/unit/config/EnvironmentVariablesService.test.ts b/packages/tracing/tests/unit/config/EnvironmentVariablesService.test.ts index 91e257747b..8ffc9c46b3 100644 --- a/packages/tracing/tests/unit/config/EnvironmentVariablesService.test.ts +++ b/packages/tracing/tests/unit/config/EnvironmentVariablesService.test.ts @@ -102,6 +102,23 @@ describe('Class: EnvironmentVariablesService', () => { }); + describe('Method: getCaptureHTTPsRequests', () => { + + test('It returns the value of the environment variable POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS', () => { + + // Prepare + process.env.POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS = 'false'; + const service = new EnvironmentVariablesService(); + + // Act + const value = service.getCaptureHTTPsRequests(); + + // Assess + expect(value).toEqual('false'); + }); + + }); + describe('Method: getServiceName', () => { test('It returns the value of the environment variable POWERTOOLS_SERVICE_NAME', () => { diff --git a/packages/tracing/tests/unit/helpers.test.ts b/packages/tracing/tests/unit/helpers.test.ts index 5aec936680..7fdf7823d7 100644 --- a/packages/tracing/tests/unit/helpers.test.ts +++ b/packages/tracing/tests/unit/helpers.test.ts @@ -32,7 +32,8 @@ describe('Helper: createTracer function', () => { expect(tracer).toBeInstanceOf(Tracer); expect(tracer).toEqual(expect.objectContaining({ tracingEnabled: true, - serviceName: 'hello-world' + serviceName: 'hello-world', + captureHTTPsRequests: true })); }); @@ -42,7 +43,8 @@ describe('Helper: createTracer function', () => { // Prepare const tracerOptions = { enabled: false, - serviceName: 'my-lambda-service' + serviceName: 'my-lambda-service', + captureHTTPsRequests: false, }; // Act @@ -52,8 +54,10 @@ describe('Helper: createTracer function', () => { expect(tracer).toBeInstanceOf(Tracer); expect(tracer).toEqual(expect.objectContaining({ tracingEnabled: false, - serviceName: 'my-lambda-service' + serviceName: 'my-lambda-service', + captureHTTPsRequests: false, })); + }); test('when a custom serviceName is passed, returns a Tracer instance with the correct properties', () => { @@ -70,8 +74,10 @@ describe('Helper: createTracer function', () => { expect(tracer).toBeInstanceOf(Tracer); expect(tracer).toEqual(expect.objectContaining({ tracingEnabled: true, - serviceName: 'my-lambda-service' + serviceName: 'my-lambda-service', + captureHTTPsRequests: true, })); + }); test('when a custom, but invalid, serviceName is passed, returns a Tracer instance with the correct properties', () => { @@ -88,15 +94,17 @@ describe('Helper: createTracer function', () => { expect(tracer).toBeInstanceOf(Tracer); expect(tracer).toEqual(expect.objectContaining({ tracingEnabled: true, - serviceName: 'hello-world' + serviceName: 'hello-world', + captureHTTPsRequests: true, })); + }); test('when (tracing) disabled is passed, returns a Tracer instance with the correct properties', () => { // Prepare const tracerOptions = { - enabled: true + enabled: false }; // Act @@ -105,9 +113,11 @@ describe('Helper: createTracer function', () => { // Assess expect(tracer).toBeInstanceOf(Tracer); expect(tracer).toEqual(expect.objectContaining({ - tracingEnabled: true, - serviceName: 'hello-world' + tracingEnabled: false, + serviceName: 'hello-world', + captureHTTPsRequests: true, })); + }); test('when a custom customConfigService is passed, returns a Logger instance with the correct proprieties', () => { @@ -116,6 +126,9 @@ describe('Helper: createTracer function', () => { get(name: string): string { return `a-string-from-${name}`; }, + getCaptureHTTPsRequests(): string { + return 'false'; + }, getTracingEnabled(): string { return 'false'; }, @@ -130,7 +143,7 @@ describe('Helper: createTracer function', () => { } }; // Prepare - const tracerOptions:TracerOptions = { + const tracerOptions: TracerOptions = { customConfigService: configService }; @@ -142,9 +155,51 @@ describe('Helper: createTracer function', () => { expect(tracer).toEqual(expect.objectContaining({ customConfigService: configService, tracingEnabled: false, - serviceName: 'my-backend-service' + serviceName: 'my-backend-service', + captureHTTPsRequests: false, + })); + + }); + + test('when tracing is enabled and patching of http requests is opted-out, captureHTTPsRequests is false', () => { + + // Prepare + const tracerOptions = { + enabled: true, + captureHTTPsRequests: false + }; + + // Act + const tracer = createTracer(tracerOptions); + + // Assess + expect(tracer).toBeInstanceOf(Tracer); + expect(tracer).toEqual(expect.objectContaining({ + tracingEnabled: true, + captureHTTPsRequests: false, + })); + + }); + + test('when tracing is enabled captureHTTPsGlobal is true', () => { + + // Prepare + const tracerOptions = { + enabled: true, + }; + + // Act + const tracer = createTracer(tracerOptions); + + // Assess + expect(tracer).toBeInstanceOf(Tracer); + expect(tracer).toEqual(expect.objectContaining({ + tracingEnabled: true, + captureHTTPsRequests: true, })); + }); + }); describe('Environment Variables configs', () => { @@ -274,5 +329,33 @@ describe('Helper: createTracer function', () => { }); + test('when POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS environment variable is set, captureHTTPsGlobal is called', () => { + // Prepare + process.env.POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS = 'false'; + + // Act + const tracer = createTracer(); + + // Assess + expect(tracer).toEqual(expect.objectContaining({ + captureHTTPsRequests: false, + })); + + }); + + test('when POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS environment variable is set to invalid value, captureHTTPsGlobal is called', () => { + // Prepare + process.env.POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS = ''; + + // Act + const tracer = createTracer(); + + // Assess + expect(tracer).toEqual(expect.objectContaining({ + captureHTTPsRequests: true, + })); + + }); + }); }); \ No newline at end of file