From 04052bb349ba7dde1edef8cd00e9e3a9bc4c9dec Mon Sep 17 00:00:00 2001 From: Luke Belton <58511679+luke-belton@users.noreply.github.com> Date: Thu, 19 Aug 2021 14:05:43 +0100 Subject: [PATCH 1/6] adds aws lambda examples --- examples/aws-lambda/simple-app/.gitignore | 1 + examples/aws-lambda/simple-app/README.md | 52 +++++++ .../simple-app/async/handled-exception.js | 25 ++++ .../aws-lambda/simple-app/async/package.json | 9 ++ .../simple-app/async/promise-rejection.js | 20 +++ .../aws-lambda/simple-app/async/timeout.js | 23 +++ .../simple-app/async/unhandled-exception.js | 15 ++ .../simple-app/callback/handled-exception.js | 25 ++++ .../simple-app/callback/package.json | 9 ++ .../simple-app/callback/promise-rejection.js | 20 +++ .../callback/thrown-unhandled-exception.js | 15 ++ .../aws-lambda/simple-app/callback/timeout.js | 23 +++ .../callback/unhandled-exception.js | 15 ++ .../events/async/handled-exception.json | 46 ++++++ .../events/async/promise-rejection.json | 46 ++++++ .../simple-app/events/async/timeout.json | 47 +++++++ .../events/async/unhandled-exception.json | 46 ++++++ .../events/callback/handled-exception.json | 46 ++++++ .../events/callback/promise-rejection.json | 46 ++++++ .../callback/thrown-unhandled-exception.json | 46 ++++++ .../simple-app/events/callback/timeout.json | 47 +++++++ .../events/callback/unhandled-exception.json | 46 ++++++ examples/aws-lambda/simple-app/template.yaml | 131 ++++++++++++++++++ 23 files changed, 799 insertions(+) create mode 100644 examples/aws-lambda/simple-app/.gitignore create mode 100644 examples/aws-lambda/simple-app/README.md create mode 100644 examples/aws-lambda/simple-app/async/handled-exception.js create mode 100644 examples/aws-lambda/simple-app/async/package.json create mode 100644 examples/aws-lambda/simple-app/async/promise-rejection.js create mode 100644 examples/aws-lambda/simple-app/async/timeout.js create mode 100644 examples/aws-lambda/simple-app/async/unhandled-exception.js create mode 100644 examples/aws-lambda/simple-app/callback/handled-exception.js create mode 100644 examples/aws-lambda/simple-app/callback/package.json create mode 100644 examples/aws-lambda/simple-app/callback/promise-rejection.js create mode 100644 examples/aws-lambda/simple-app/callback/thrown-unhandled-exception.js create mode 100644 examples/aws-lambda/simple-app/callback/timeout.js create mode 100644 examples/aws-lambda/simple-app/callback/unhandled-exception.js create mode 100644 examples/aws-lambda/simple-app/events/async/handled-exception.json create mode 100644 examples/aws-lambda/simple-app/events/async/promise-rejection.json create mode 100644 examples/aws-lambda/simple-app/events/async/timeout.json create mode 100644 examples/aws-lambda/simple-app/events/async/unhandled-exception.json create mode 100644 examples/aws-lambda/simple-app/events/callback/handled-exception.json create mode 100644 examples/aws-lambda/simple-app/events/callback/promise-rejection.json create mode 100644 examples/aws-lambda/simple-app/events/callback/thrown-unhandled-exception.json create mode 100644 examples/aws-lambda/simple-app/events/callback/timeout.json create mode 100644 examples/aws-lambda/simple-app/events/callback/unhandled-exception.json create mode 100644 examples/aws-lambda/simple-app/template.yaml diff --git a/examples/aws-lambda/simple-app/.gitignore b/examples/aws-lambda/simple-app/.gitignore new file mode 100644 index 0000000000..592fb594cb --- /dev/null +++ b/examples/aws-lambda/simple-app/.gitignore @@ -0,0 +1 @@ +.aws-sam \ No newline at end of file diff --git a/examples/aws-lambda/simple-app/README.md b/examples/aws-lambda/simple-app/README.md new file mode 100644 index 0000000000..7e5d584dcb --- /dev/null +++ b/examples/aws-lambda/simple-app/README.md @@ -0,0 +1,52 @@ +# AWS Lambda + +This is an example project showing how to use `@bugsnag/js` with AWS Lambda. + +This project was initialized with [`sam init`](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-init.html). + +## Prerequsities +- [SAM CLI tools](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) +- [Docker](https://docs.docker.com/get-docker/) is installed and running on your machine (only if testing locally) + +## Usage + +Clone the repo and `cd` into the directory of this example: + +``` +git clone git@github.com:bugsnag/bugsnag-js.git +cd bugsnag-js/examples/aws-lambda/simple-app +``` +- Bugsnag is started for each Lambda function with `Bugsnag.start` and the `@bugsnag/plugin-aws-lambda` plugin +- Errors in your Lambda are handled by wrapping your Lambda handler inside Bugsnag's handler +- Both async and callback handlers are supported, with examples given for both inside this app + +Replace `` in `template.yaml` with your own. + +### Build +``` +sam build +``` + +### Run all functions locally +To run all the functions on a local server: +``` +sam local start-api --host '127.0.0.1' -p '3000' +``` +Hit a function endpoint: +``` +curl -X GET 'http://127.0.0.1:3000/async/handled-exception' +``` +### Testing a single function +To test a single function using a sample [Event](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-event): +``` +sam local invoke "" -e +``` +e.g. to run the `CallbackHandledExceptionFunctionNode14` function: +``` +sam local invoke "CallbackHandledExceptionFunctionNode14" -e events/callback/handled-exception.json +``` + +## Known issues + +- There is a bug with the SAM CLI that prevents Bugsnag from notifying you of timeouts when running the functions with the SAM CLI, see https://github.com/aws/aws-sam-cli/issues/2519. Timeout examples have been included and should work when deployed to AWS. + diff --git a/examples/aws-lambda/simple-app/async/handled-exception.js b/examples/aws-lambda/simple-app/async/handled-exception.js new file mode 100644 index 0000000000..784e63b09c --- /dev/null +++ b/examples/aws-lambda/simple-app/async/handled-exception.js @@ -0,0 +1,25 @@ +const Bugsnag = require('@bugsnag/js') +const BugsnagPluginAwsLambda = require('@bugsnag/plugin-aws-lambda') + +Bugsnag.start({ + apiKey: process.env.BUGSNAG_API_KEY, + plugins: [BugsnagPluginAwsLambda] +}) + +const bugsnagHandler = Bugsnag.getPlugin('awsLambda').createHandler() + +const handler = async (event, _context) => { + Bugsnag.notify(new Error('Bad thing!'), (e) => { + e.context = "Don't worry - I handled it" + }) + console.log('a handled error was sent to our dashboard!') + return { + statusCode: 200, + body: JSON.stringify({ + route: event.path, + message: 'Did not crash!' + }) + } +} + +module.exports.lambdaHandler = bugsnagHandler(handler) diff --git a/examples/aws-lambda/simple-app/async/package.json b/examples/aws-lambda/simple-app/async/package.json new file mode 100644 index 0000000000..fcbc79e714 --- /dev/null +++ b/examples/aws-lambda/simple-app/async/package.json @@ -0,0 +1,9 @@ +{ + "name": "simple-app", + "version": "1.0.0", + "description": "simple lambda app for testing", + "dependencies": { + "@bugsnag/js": "^7.11.0", + "@bugsnag/plugin-aws-lambda": "^7.11.0" + } +} diff --git a/examples/aws-lambda/simple-app/async/promise-rejection.js b/examples/aws-lambda/simple-app/async/promise-rejection.js new file mode 100644 index 0000000000..e671b81e59 --- /dev/null +++ b/examples/aws-lambda/simple-app/async/promise-rejection.js @@ -0,0 +1,20 @@ +const Bugsnag = require('@bugsnag/js') +const BugsnagPluginAwsLambda = require('@bugsnag/plugin-aws-lambda') + +Bugsnag.start({ + apiKey: process.env.BUGSNAG_API_KEY, + plugins: [BugsnagPluginAwsLambda] +}) + +const bugsnagHandler = Bugsnag.getPlugin('awsLambda').createHandler() + +const handler = async (_event, _context) => { + Promise.reject(new Error('yikes - a rejected promise!')) + + return { + statusCode: 200, + body: JSON.stringify({ message: 'Did not crash!' }) + } +} + +module.exports.lambdaHandler = bugsnagHandler(handler) diff --git a/examples/aws-lambda/simple-app/async/timeout.js b/examples/aws-lambda/simple-app/async/timeout.js new file mode 100644 index 0000000000..ea706e47c9 --- /dev/null +++ b/examples/aws-lambda/simple-app/async/timeout.js @@ -0,0 +1,23 @@ +const Bugsnag = require('@bugsnag/js') +const BugsnagPluginAwsLambda = require('@bugsnag/plugin-aws-lambda') + +Bugsnag.start({ + apiKey: process.env.BUGSNAG_API_KEY, + plugins: [BugsnagPluginAwsLambda] +}) + +const bugsnagHandler = Bugsnag.getPlugin('awsLambda').createHandler({ + lambdaTimeoutNotifyMs: 2000 // set to notify 2000ms before timeout (default) +}) + +// due to a bug in AWS lambda this will not notify when running with SAM CLI: https://github.com/aws/aws-sam-cli/issues/2519 +const handler = async (_event, _context) => { + await new Promise((resolve) => setTimeout(resolve, 4000)) // function timeout is 3000ms as per template.yaml + + return { + statusCode: 200, + body: JSON.stringify({ message: 'Did not crash!' }) + } +} + +module.exports.lambdaHandler = bugsnagHandler(handler) diff --git a/examples/aws-lambda/simple-app/async/unhandled-exception.js b/examples/aws-lambda/simple-app/async/unhandled-exception.js new file mode 100644 index 0000000000..8929ed3149 --- /dev/null +++ b/examples/aws-lambda/simple-app/async/unhandled-exception.js @@ -0,0 +1,15 @@ +const Bugsnag = require('@bugsnag/js') +const BugsnagPluginAwsLambda = require('@bugsnag/plugin-aws-lambda') + +Bugsnag.start({ + apiKey: process.env.BUGSNAG_API_KEY, + plugins: [BugsnagPluginAwsLambda] +}) + +const bugsnagHandler = Bugsnag.getPlugin('awsLambda').createHandler() + +const handler = async (_event, _context) => { + throw new Error('Bad thing!') +} + +module.exports.lambdaHandler = bugsnagHandler(handler) diff --git a/examples/aws-lambda/simple-app/callback/handled-exception.js b/examples/aws-lambda/simple-app/callback/handled-exception.js new file mode 100644 index 0000000000..76bef4a5e4 --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/handled-exception.js @@ -0,0 +1,25 @@ +const Bugsnag = require('@bugsnag/js') +const BugsnagPluginAwsLambda = require('@bugsnag/plugin-aws-lambda') + +Bugsnag.start({ + apiKey: process.env.BUGSNAG_API_KEY, + plugins: [BugsnagPluginAwsLambda] +}) + +const bugsnagHandler = Bugsnag.getPlugin('awsLambda').createHandler() + +const handler = (event, _context, callback) => { + Bugsnag.notify(new Error('Bad thing!'), (e) => { + e.context = "Don't worry - I handled it" + }) + console.log('a handled error was sent to our dashboard!') + callback(null, { + statusCode: 200, + body: JSON.stringify({ + route: event.path, + message: 'Did not crash!' + }) + }) +} + +module.exports.lambdaHandler = bugsnagHandler(handler) diff --git a/examples/aws-lambda/simple-app/callback/package.json b/examples/aws-lambda/simple-app/callback/package.json new file mode 100644 index 0000000000..fcbc79e714 --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/package.json @@ -0,0 +1,9 @@ +{ + "name": "simple-app", + "version": "1.0.0", + "description": "simple lambda app for testing", + "dependencies": { + "@bugsnag/js": "^7.11.0", + "@bugsnag/plugin-aws-lambda": "^7.11.0" + } +} diff --git a/examples/aws-lambda/simple-app/callback/promise-rejection.js b/examples/aws-lambda/simple-app/callback/promise-rejection.js new file mode 100644 index 0000000000..0f7b3c6e5e --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/promise-rejection.js @@ -0,0 +1,20 @@ +const Bugsnag = require('@bugsnag/js') +const BugsnagPluginAwsLambda = require('@bugsnag/plugin-aws-lambda') + +Bugsnag.start({ + apiKey: process.env.BUGSNAG_API_KEY, + plugins: [BugsnagPluginAwsLambda] +}) + +const bugsnagHandler = Bugsnag.getPlugin('awsLambda').createHandler() + +const handler = (_event, _context, callback) => { + Promise.reject(new Error('yikes - a rejected promise!')) + + callback(null, { + statusCode: 200, + body: JSON.stringify({ message: 'Did not crash!' }) + }) +} + +module.exports.lambdaHandler = bugsnagHandler(handler) diff --git a/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception.js b/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception.js new file mode 100644 index 0000000000..ec588a8406 --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception.js @@ -0,0 +1,15 @@ +const Bugsnag = require('@bugsnag/js') +const BugsnagPluginAwsLambda = require('@bugsnag/plugin-aws-lambda') + +Bugsnag.start({ + apiKey: process.env.BUGSNAG_API_KEY, + plugins: [BugsnagPluginAwsLambda] +}) + +const bugsnagHandler = Bugsnag.getPlugin('awsLambda').createHandler() + +const handler = (_event, _context, _callback) => { + throw new Error('Oh no!') +} + +module.exports.lambdaHandler = bugsnagHandler(handler) diff --git a/examples/aws-lambda/simple-app/callback/timeout.js b/examples/aws-lambda/simple-app/callback/timeout.js new file mode 100644 index 0000000000..4d3a472596 --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/timeout.js @@ -0,0 +1,23 @@ +const Bugsnag = require('@bugsnag/js') +const BugsnagPluginAwsLambda = require('@bugsnag/plugin-aws-lambda') + +Bugsnag.start({ + apiKey: process.env.BUGSNAG_API_KEY, + plugins: [BugsnagPluginAwsLambda] +}) + +const bugsnagHandler = Bugsnag.getPlugin('awsLambda').createHandler({ + lambdaTimeoutNotifyMs: 2000 // set to notify 2000ms before timeout +}) + +// due to a bug in AWS lambda this will not notify when running with SAM CLI: https://github.com/aws/aws-sam-cli/issues/2519 +const handler = async (_event, _context, callback) => { + await new Promise((resolve) => setTimeout(resolve, 4000)) // function timeout is 3000ms as per template.yaml + + callback(null, { + statusCode: 200, + body: JSON.stringify({ message: 'Did not crash!' }) + }) +} + +module.exports.lambdaHandler = bugsnagHandler(handler) diff --git a/examples/aws-lambda/simple-app/callback/unhandled-exception.js b/examples/aws-lambda/simple-app/callback/unhandled-exception.js new file mode 100644 index 0000000000..4b36f41aae --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/unhandled-exception.js @@ -0,0 +1,15 @@ +const Bugsnag = require('@bugsnag/js') +const BugsnagPluginAwsLambda = require('@bugsnag/plugin-aws-lambda') + +Bugsnag.start({ + apiKey: process.env.BUGSNAG_API_KEY, + plugins: [BugsnagPluginAwsLambda] +}) + +const bugsnagHandler = Bugsnag.getPlugin('awsLambda').createHandler() + +const handler = (event, context, callback) => { + callback(new Error('Oh no!')) +} + +module.exports.lambdaHandler = bugsnagHandler(handler) diff --git a/examples/aws-lambda/simple-app/events/async/handled-exception.json b/examples/aws-lambda/simple-app/events/async/handled-exception.json new file mode 100644 index 0000000000..d2dd52c1cd --- /dev/null +++ b/examples/aws-lambda/simple-app/events/async/handled-exception.json @@ -0,0 +1,46 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/async/handled-exception", + "httpMethod": "GET", + "isBase64Encoded": false, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/async/handled-exception", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/examples/aws-lambda/simple-app/events/async/promise-rejection.json b/examples/aws-lambda/simple-app/events/async/promise-rejection.json new file mode 100644 index 0000000000..94dad812fc --- /dev/null +++ b/examples/aws-lambda/simple-app/events/async/promise-rejection.json @@ -0,0 +1,46 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/async/promise-rejection", + "httpMethod": "GET", + "isBase64Encoded": false, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/async/promise-rejection", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/examples/aws-lambda/simple-app/events/async/timeout.json b/examples/aws-lambda/simple-app/events/async/timeout.json new file mode 100644 index 0000000000..8d56242a6e --- /dev/null +++ b/examples/aws-lambda/simple-app/events/async/timeout.json @@ -0,0 +1,47 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/async/timeout", + "httpMethod": "GET", + "isBase64Encoded": false, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/async/timeout", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } + } + \ No newline at end of file diff --git a/examples/aws-lambda/simple-app/events/async/unhandled-exception.json b/examples/aws-lambda/simple-app/events/async/unhandled-exception.json new file mode 100644 index 0000000000..5faa1236be --- /dev/null +++ b/examples/aws-lambda/simple-app/events/async/unhandled-exception.json @@ -0,0 +1,46 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/async/unhandled-exception", + "httpMethod": "GET", + "isBase64Encoded": false, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/async/unhandled-exception", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/examples/aws-lambda/simple-app/events/callback/handled-exception.json b/examples/aws-lambda/simple-app/events/callback/handled-exception.json new file mode 100644 index 0000000000..d691f4d67e --- /dev/null +++ b/examples/aws-lambda/simple-app/events/callback/handled-exception.json @@ -0,0 +1,46 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/callback/handled-exception", + "httpMethod": "GET", + "isBase64Encoded": false, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/callback/handled-exception", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/examples/aws-lambda/simple-app/events/callback/promise-rejection.json b/examples/aws-lambda/simple-app/events/callback/promise-rejection.json new file mode 100644 index 0000000000..62a5997190 --- /dev/null +++ b/examples/aws-lambda/simple-app/events/callback/promise-rejection.json @@ -0,0 +1,46 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/callback/promise-rejection", + "httpMethod": "GET", + "isBase64Encoded": false, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/callback/promise-rejection", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/examples/aws-lambda/simple-app/events/callback/thrown-unhandled-exception.json b/examples/aws-lambda/simple-app/events/callback/thrown-unhandled-exception.json new file mode 100644 index 0000000000..0fff07fca3 --- /dev/null +++ b/examples/aws-lambda/simple-app/events/callback/thrown-unhandled-exception.json @@ -0,0 +1,46 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/callback/thrown-unhandled-exception", + "httpMethod": "GET", + "isBase64Encoded": false, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/callback/thrown-unhandled-exception", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/examples/aws-lambda/simple-app/events/callback/timeout.json b/examples/aws-lambda/simple-app/events/callback/timeout.json new file mode 100644 index 0000000000..f5911aabc4 --- /dev/null +++ b/examples/aws-lambda/simple-app/events/callback/timeout.json @@ -0,0 +1,47 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/callback/timeout", + "httpMethod": "GET", + "isBase64Encoded": false, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/callback/timeout", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } + } + \ No newline at end of file diff --git a/examples/aws-lambda/simple-app/events/callback/unhandled-exception.json b/examples/aws-lambda/simple-app/events/callback/unhandled-exception.json new file mode 100644 index 0000000000..12ae1a8f49 --- /dev/null +++ b/examples/aws-lambda/simple-app/events/callback/unhandled-exception.json @@ -0,0 +1,46 @@ +{ + "body": "", + "resource": "/{proxy+}", + "path": "/callback/unhandled-exception", + "httpMethod": "GET", + "isBase64Encoded": false, + "queryStringParameters": {}, + "multiValueQueryStringParameters": {}, + "pathParameters": {}, + "stageVariables": {}, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/callback/unhandled-exception", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/examples/aws-lambda/simple-app/template.yaml b/examples/aws-lambda/simple-app/template.yaml new file mode 100644 index 0000000000..81d06c39bc --- /dev/null +++ b/examples/aws-lambda/simple-app/template.yaml @@ -0,0 +1,131 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: > + simple-app + +# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst +Globals: + Function: + Timeout: 3 + Environment: + Variables: + BUGSNAG_API_KEY: + +Resources: + + AsyncUnhandledExceptionFunctionNode14: + Type: AWS::Serverless::Function + Properties: + CodeUri: async/ + Handler: unhandled-exception.lambdaHandler + Runtime: nodejs14.x + Events: + AsyncUnhandledException: + Type: Api + Properties: + Path: /async/unhandled-exception + Method: get + + AsyncHandledExceptionFunctionNode14: + Type: AWS::Serverless::Function + Properties: + CodeUri: async/ + Handler: handled-exception.lambdaHandler + Runtime: nodejs14.x + Events: + AsyncHandledException: + Type: Api + Properties: + Path: /async/handled-exception + Method: get + + AsyncPromiseRejectionFunctionNode14: + Type: AWS::Serverless::Function + Properties: + CodeUri: async/ + Handler: promise-rejection.lambdaHandler + Runtime: nodejs14.x + Events: + AsyncPromiseRejection: + Type: Api + Properties: + Path: /async/promise-rejection + Method: get + + AsyncTimeoutFunctionNode14: + Type: AWS::Serverless::Function + Properties: + CodeUri: async/ + Handler: timeout.lambdaHandler + Runtime: nodejs14.x + Events: + AsyncTimeout: + Type: Api + Properties: + Path: /async/timeout + Method: get + + CallbackUnhandledExceptionFunctionNode14: + Type: AWS::Serverless::Function + Properties: + CodeUri: callback/ + Handler: unhandled-exception.lambdaHandler + Runtime: nodejs14.x + Events: + CallbackUnhandledException: + Type: Api + Properties: + Path: /callback/unhandled-exception + Method: get + + CallbackThrownUnhandledExceptionFunctionNode14: + Type: AWS::Serverless::Function + Properties: + CodeUri: callback/ + Handler: thrown-unhandled-exception.lambdaHandler + Runtime: nodejs14.x + Events: + CallbackThrownUnhandledException: + Type: Api + Properties: + Path: /callback/thrown-unhandled-exception + Method: get + + CallbackHandledExceptionFunctionNode14: + Type: AWS::Serverless::Function + Properties: + CodeUri: callback/ + Handler: handled-exception.lambdaHandler + Runtime: nodejs14.x + Events: + CallbackHandledException: + Type: Api + Properties: + Path: /callback/handled-exception + Method: get + + CallbackPromiseRejectionFunctionNode14: + Type: AWS::Serverless::Function + Properties: + CodeUri: callback/ + Handler: promise-rejection.lambdaHandler + Runtime: nodejs14.x + Events: + CallbackPromiseRejection: + Type: Api + Properties: + Path: /callback/promise-rejection + Method: get + + CallbackTimeoutFunctionNode14: + Type: AWS::Serverless::Function + Properties: + CodeUri: callback/ + Handler: timeout.lambdaHandler + Runtime: nodejs14.x + Events: + CallbackPromiseRejection: + Type: Api + Properties: + Path: /callback/timeout + Method: get \ No newline at end of file From cc94fc4cd0c879d52999d32ac775993e52062da9 Mon Sep 17 00:00:00 2001 From: Luke Belton <58511679+luke-belton@users.noreply.github.com> Date: Fri, 11 Mar 2022 14:36:25 +0000 Subject: [PATCH 2/6] PR comments/refactor to share dependencies in Layer --- examples/aws-lambda/simple-app/README.md | 26 +- .../handled-exception.js | 0 .../async/handled-exception/package.json | 4 + .../aws-lambda/simple-app/async/package.json | 9 - .../async/promise-rejection/package.json | 4 + .../promise-rejection.js | 0 .../simple-app/async/timeout/package.json | 4 + .../simple-app/async/{ => timeout}/timeout.js | 0 .../async/unhandled-exception/package.json | 4 + .../unhandled-exception.js | 0 .../handled-exception.js | 0 .../callback/handled-exception/package.json | 4 + .../simple-app/callback/package.json | 9 - .../callback/promise-rejection/package.json | 4 + .../promise-rejection.js | 0 .../thrown-unhandled-exception/package.json | 4 + .../thrown-unhandled-exception.js | 0 .../simple-app/callback/timeout/package.json | 4 + .../callback/{ => timeout}/timeout.js | 0 .../callback/unhandled-exception/package.json | 4 + .../unhandled-exception.js | 0 .../nodejs/package-lock.json | 301 ++++++++++++++++++ .../dependencies-layer/nodejs/package.json | 9 + examples/aws-lambda/simple-app/template.yaml | 67 ++-- 24 files changed, 417 insertions(+), 40 deletions(-) rename examples/aws-lambda/simple-app/async/{ => handled-exception}/handled-exception.js (100%) create mode 100644 examples/aws-lambda/simple-app/async/handled-exception/package.json delete mode 100644 examples/aws-lambda/simple-app/async/package.json create mode 100644 examples/aws-lambda/simple-app/async/promise-rejection/package.json rename examples/aws-lambda/simple-app/async/{ => promise-rejection}/promise-rejection.js (100%) create mode 100644 examples/aws-lambda/simple-app/async/timeout/package.json rename examples/aws-lambda/simple-app/async/{ => timeout}/timeout.js (100%) create mode 100644 examples/aws-lambda/simple-app/async/unhandled-exception/package.json rename examples/aws-lambda/simple-app/async/{ => unhandled-exception}/unhandled-exception.js (100%) rename examples/aws-lambda/simple-app/callback/{ => handled-exception}/handled-exception.js (100%) create mode 100644 examples/aws-lambda/simple-app/callback/handled-exception/package.json delete mode 100644 examples/aws-lambda/simple-app/callback/package.json create mode 100644 examples/aws-lambda/simple-app/callback/promise-rejection/package.json rename examples/aws-lambda/simple-app/callback/{ => promise-rejection}/promise-rejection.js (100%) create mode 100644 examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/package.json rename examples/aws-lambda/simple-app/callback/{ => thrown-unhandled-exception}/thrown-unhandled-exception.js (100%) create mode 100644 examples/aws-lambda/simple-app/callback/timeout/package.json rename examples/aws-lambda/simple-app/callback/{ => timeout}/timeout.js (100%) create mode 100644 examples/aws-lambda/simple-app/callback/unhandled-exception/package.json rename examples/aws-lambda/simple-app/callback/{ => unhandled-exception}/unhandled-exception.js (100%) create mode 100644 examples/aws-lambda/simple-app/dependencies-layer/nodejs/package-lock.json create mode 100644 examples/aws-lambda/simple-app/dependencies-layer/nodejs/package.json diff --git a/examples/aws-lambda/simple-app/README.md b/examples/aws-lambda/simple-app/README.md index 7e5d584dcb..0f56515dde 100644 --- a/examples/aws-lambda/simple-app/README.md +++ b/examples/aws-lambda/simple-app/README.md @@ -22,6 +22,12 @@ cd bugsnag-js/examples/aws-lambda/simple-app Replace `` in `template.yaml` with your own. +### Install dependencies +A Lambda layer is used to share dependencies (Bugsnag) across the functions. From the project root, install the dependecies before invoking the functions: +``` +cd dependecies-layer +npm install +``` ### Build ``` sam build @@ -32,6 +38,9 @@ To run all the functions on a local server: ``` sam local start-api --host '127.0.0.1' -p '3000' ``` +To avoid building the dependency layer image on each invocation, you can use the `--warm-containers [EAGER | LAZY]` option. `EAGER` loads the layer containers for all functions at startup + persists them between invocations. `LAZY` only loads the layer containers when each function is first invoked, and then persists them for further invocations. + + Hit a function endpoint: ``` curl -X GET 'http://127.0.0.1:3000/async/handled-exception' @@ -41,11 +50,24 @@ To test a single function using a sample [Event](https://docs.aws.amazon.com/lam ``` sam local invoke "" -e ``` -e.g. to run the `CallbackHandledExceptionFunctionNode14` function: +e.g. to run the `CallbackHandledException` function: ``` -sam local invoke "CallbackHandledExceptionFunctionNode14" -e events/callback/handled-exception.json +sam local invoke "CallbackHandledException" -e events/callback/handled-exception.json ``` +### Available functions +Function Name | Expected Response Code-Message +--- | --- + `AsyncUnhandledException`| 502 - Internal server error + `AsyncHandledException` | 200 - Did not crash! + `AsyncPromiseRejection` | 502 - Internal server error + `AsyncTimeout` | 502 - Internal server error + `CallbackUnhandledException` | 502 - Internal server error + `CallbackThrownUnhandledException` | 502 - Internal server error + `CallbackHandledException` | 200 - Did not crash! + `CallbackPromiseRejection` | 502 - Internal server error + `CallbackTimeout` | 502 - Internal server error + ## Known issues - There is a bug with the SAM CLI that prevents Bugsnag from notifying you of timeouts when running the functions with the SAM CLI, see https://github.com/aws/aws-sam-cli/issues/2519. Timeout examples have been included and should work when deployed to AWS. diff --git a/examples/aws-lambda/simple-app/async/handled-exception.js b/examples/aws-lambda/simple-app/async/handled-exception/handled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/async/handled-exception.js rename to examples/aws-lambda/simple-app/async/handled-exception/handled-exception.js diff --git a/examples/aws-lambda/simple-app/async/handled-exception/package.json b/examples/aws-lambda/simple-app/async/handled-exception/package.json new file mode 100644 index 0000000000..b84301badc --- /dev/null +++ b/examples/aws-lambda/simple-app/async/handled-exception/package.json @@ -0,0 +1,4 @@ +{ + "name": "async-handled-exception", + "version": "1.0.0" +} diff --git a/examples/aws-lambda/simple-app/async/package.json b/examples/aws-lambda/simple-app/async/package.json deleted file mode 100644 index fcbc79e714..0000000000 --- a/examples/aws-lambda/simple-app/async/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "simple-app", - "version": "1.0.0", - "description": "simple lambda app for testing", - "dependencies": { - "@bugsnag/js": "^7.11.0", - "@bugsnag/plugin-aws-lambda": "^7.11.0" - } -} diff --git a/examples/aws-lambda/simple-app/async/promise-rejection/package.json b/examples/aws-lambda/simple-app/async/promise-rejection/package.json new file mode 100644 index 0000000000..fc1d84227b --- /dev/null +++ b/examples/aws-lambda/simple-app/async/promise-rejection/package.json @@ -0,0 +1,4 @@ +{ + "name": "async-promise-rejection", + "version": "1.0.0" +} diff --git a/examples/aws-lambda/simple-app/async/promise-rejection.js b/examples/aws-lambda/simple-app/async/promise-rejection/promise-rejection.js similarity index 100% rename from examples/aws-lambda/simple-app/async/promise-rejection.js rename to examples/aws-lambda/simple-app/async/promise-rejection/promise-rejection.js diff --git a/examples/aws-lambda/simple-app/async/timeout/package.json b/examples/aws-lambda/simple-app/async/timeout/package.json new file mode 100644 index 0000000000..2edaf6ff91 --- /dev/null +++ b/examples/aws-lambda/simple-app/async/timeout/package.json @@ -0,0 +1,4 @@ +{ + "name": "async-timeout", + "version": "1.0.0" +} diff --git a/examples/aws-lambda/simple-app/async/timeout.js b/examples/aws-lambda/simple-app/async/timeout/timeout.js similarity index 100% rename from examples/aws-lambda/simple-app/async/timeout.js rename to examples/aws-lambda/simple-app/async/timeout/timeout.js diff --git a/examples/aws-lambda/simple-app/async/unhandled-exception/package.json b/examples/aws-lambda/simple-app/async/unhandled-exception/package.json new file mode 100644 index 0000000000..70a7eaaace --- /dev/null +++ b/examples/aws-lambda/simple-app/async/unhandled-exception/package.json @@ -0,0 +1,4 @@ +{ + "name": "async-unhandled-exception", + "version": "1.0.0" +} diff --git a/examples/aws-lambda/simple-app/async/unhandled-exception.js b/examples/aws-lambda/simple-app/async/unhandled-exception/unhandled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/async/unhandled-exception.js rename to examples/aws-lambda/simple-app/async/unhandled-exception/unhandled-exception.js diff --git a/examples/aws-lambda/simple-app/callback/handled-exception.js b/examples/aws-lambda/simple-app/callback/handled-exception/handled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/handled-exception.js rename to examples/aws-lambda/simple-app/callback/handled-exception/handled-exception.js diff --git a/examples/aws-lambda/simple-app/callback/handled-exception/package.json b/examples/aws-lambda/simple-app/callback/handled-exception/package.json new file mode 100644 index 0000000000..61be1f7a3a --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/handled-exception/package.json @@ -0,0 +1,4 @@ +{ + "name": "callback-handled-exception", + "version": "1.0.0" +} diff --git a/examples/aws-lambda/simple-app/callback/package.json b/examples/aws-lambda/simple-app/callback/package.json deleted file mode 100644 index fcbc79e714..0000000000 --- a/examples/aws-lambda/simple-app/callback/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "simple-app", - "version": "1.0.0", - "description": "simple lambda app for testing", - "dependencies": { - "@bugsnag/js": "^7.11.0", - "@bugsnag/plugin-aws-lambda": "^7.11.0" - } -} diff --git a/examples/aws-lambda/simple-app/callback/promise-rejection/package.json b/examples/aws-lambda/simple-app/callback/promise-rejection/package.json new file mode 100644 index 0000000000..84cc527469 --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/promise-rejection/package.json @@ -0,0 +1,4 @@ +{ + "name": "callback-promise-rejection", + "version": "1.0.0" +} diff --git a/examples/aws-lambda/simple-app/callback/promise-rejection.js b/examples/aws-lambda/simple-app/callback/promise-rejection/promise-rejection.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/promise-rejection.js rename to examples/aws-lambda/simple-app/callback/promise-rejection/promise-rejection.js diff --git a/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/package.json b/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/package.json new file mode 100644 index 0000000000..4d689bc16b --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/package.json @@ -0,0 +1,4 @@ +{ + "name": "callback-thrown-unhandled-exception", + "version": "1.0.0" +} diff --git a/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception.js b/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/thrown-unhandled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/thrown-unhandled-exception.js rename to examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/thrown-unhandled-exception.js diff --git a/examples/aws-lambda/simple-app/callback/timeout/package.json b/examples/aws-lambda/simple-app/callback/timeout/package.json new file mode 100644 index 0000000000..877a2363db --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/timeout/package.json @@ -0,0 +1,4 @@ +{ + "name": "callback-timeout", + "version": "1.0.0" +} diff --git a/examples/aws-lambda/simple-app/callback/timeout.js b/examples/aws-lambda/simple-app/callback/timeout/timeout.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/timeout.js rename to examples/aws-lambda/simple-app/callback/timeout/timeout.js diff --git a/examples/aws-lambda/simple-app/callback/unhandled-exception/package.json b/examples/aws-lambda/simple-app/callback/unhandled-exception/package.json new file mode 100644 index 0000000000..fbea3f7f62 --- /dev/null +++ b/examples/aws-lambda/simple-app/callback/unhandled-exception/package.json @@ -0,0 +1,4 @@ +{ + "name": "callback-unhandled-exception", + "version": "1.0.0" +} diff --git a/examples/aws-lambda/simple-app/callback/unhandled-exception.js b/examples/aws-lambda/simple-app/callback/unhandled-exception/unhandled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/unhandled-exception.js rename to examples/aws-lambda/simple-app/callback/unhandled-exception/unhandled-exception.js diff --git a/examples/aws-lambda/simple-app/dependencies-layer/nodejs/package-lock.json b/examples/aws-lambda/simple-app/dependencies-layer/nodejs/package-lock.json new file mode 100644 index 0000000000..9c9352c422 --- /dev/null +++ b/examples/aws-lambda/simple-app/dependencies-layer/nodejs/package-lock.json @@ -0,0 +1,301 @@ +{ + "name": "simple-app", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "simple-app", + "version": "1.0.0", + "dependencies": { + "@bugsnag/js": "^7.16.1", + "@bugsnag/plugin-aws-lambda": "^7.16.1" + } + }, + "node_modules/@bugsnag/browser": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.16.2.tgz", + "integrity": "sha512-iBbAmjTDe0I6WPTHi3wIcmKu3ykydtT6fc8atJA65rzgDLMlTM1Wnwz4Ny1cn0bVouLGa48BRiOJ27Rwy7QRYA==", + "dependencies": { + "@bugsnag/core": "^7.16.1" + } + }, + "node_modules/@bugsnag/core": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.16.1.tgz", + "integrity": "sha512-zuBnL7B329VldItRqhXYrp1hjmjZnltJwNXMysi9WtY4t29WKk5LVwgWb1mPM9clJ0FoObZ7kvvQMUTKh3ezFQ==", + "dependencies": { + "@bugsnag/cuid": "^3.0.0", + "@bugsnag/safe-json-stringify": "^6.0.0", + "error-stack-parser": "^2.0.3", + "iserror": "0.0.2", + "stack-generator": "^2.0.3" + } + }, + "node_modules/@bugsnag/cuid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@bugsnag/cuid/-/cuid-3.0.0.tgz", + "integrity": "sha512-LOt8aaBI+KvOQGneBtpuCz3YqzyEAehd1f3nC5yr9TIYW1+IzYKa2xWS4EiMz5pPOnRPHkyyS5t/wmSmN51Gjg==" + }, + "node_modules/@bugsnag/in-flight": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@bugsnag/in-flight/-/in-flight-7.16.1.tgz", + "integrity": "sha512-mzEWXU1fuy7uBwEH1TpX0aEdCpk67y5pXQTCPnKaNevTNmFZw7KQAX2vxmwZjDlW9wXJ/UQIBRV//RLxn8nEVg==", + "dependencies": { + "@bugsnag/cuid": "^3.0.0" + }, + "peerDependencies": { + "@bugsnag/core": "^7.0.0" + } + }, + "node_modules/@bugsnag/js": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.16.2.tgz", + "integrity": "sha512-AzV0PtG3SZt+HnA2JmRJeI60aDNZsIJbEEAZIWZeATvWBt5RdVdsWKllM1SkTvURfxfdAVd4Xry3BgVrh8nEbg==", + "dependencies": { + "@bugsnag/browser": "^7.16.2", + "@bugsnag/node": "^7.16.2" + } + }, + "node_modules/@bugsnag/node": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.16.2.tgz", + "integrity": "sha512-V5pND701cIYGzjjTwt0tuvAU1YyPB9h7vo5F/DzrDHRPmCINA/oVbc0Twco87knc2VPe8ntGFqTicTY65iOWzg==", + "dependencies": { + "@bugsnag/core": "^7.16.1", + "byline": "^5.0.0", + "error-stack-parser": "^2.0.2", + "iserror": "^0.0.2", + "pump": "^3.0.0", + "stack-generator": "^2.0.3" + } + }, + "node_modules/@bugsnag/plugin-aws-lambda": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@bugsnag/plugin-aws-lambda/-/plugin-aws-lambda-7.16.2.tgz", + "integrity": "sha512-De2zMZkGx33ErxMJMD17urgSidhegsDxEk6SXKYUvLOdQTG3iSGFxdu0m/dMWHE110WJIK+NAz4r9c+RknLsng==", + "dependencies": { + "@bugsnag/in-flight": "^7.16.1", + "@bugsnag/plugin-browser-session": "^7.16.1" + }, + "peerDependencies": { + "@bugsnag/core": "^7.0.0" + } + }, + "node_modules/@bugsnag/plugin-browser-session": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@bugsnag/plugin-browser-session/-/plugin-browser-session-7.16.1.tgz", + "integrity": "sha512-SnOJTAED2tQY9AS7riOXlR19wn7tFENKjDtTd5ZlLO5PwATPMLIU+jsWcgl9Y2EsBn1jZGnm002ehlGvuOcQjw==", + "peerDependencies": { + "@bugsnag/core": "^7.0.0" + } + }, + "node_modules/@bugsnag/safe-json-stringify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz", + "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==" + }, + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", + "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/iserror": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/iserror/-/iserror-0.0.2.tgz", + "integrity": "sha1-vVNFH+L2aLnyQCwZZnh6qix8C/U=" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/stack-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz", + "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==", + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/stackframe": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", + "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + }, + "dependencies": { + "@bugsnag/browser": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.16.2.tgz", + "integrity": "sha512-iBbAmjTDe0I6WPTHi3wIcmKu3ykydtT6fc8atJA65rzgDLMlTM1Wnwz4Ny1cn0bVouLGa48BRiOJ27Rwy7QRYA==", + "requires": { + "@bugsnag/core": "^7.16.1" + } + }, + "@bugsnag/core": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.16.1.tgz", + "integrity": "sha512-zuBnL7B329VldItRqhXYrp1hjmjZnltJwNXMysi9WtY4t29WKk5LVwgWb1mPM9clJ0FoObZ7kvvQMUTKh3ezFQ==", + "requires": { + "@bugsnag/cuid": "^3.0.0", + "@bugsnag/safe-json-stringify": "^6.0.0", + "error-stack-parser": "^2.0.3", + "iserror": "0.0.2", + "stack-generator": "^2.0.3" + } + }, + "@bugsnag/cuid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@bugsnag/cuid/-/cuid-3.0.0.tgz", + "integrity": "sha512-LOt8aaBI+KvOQGneBtpuCz3YqzyEAehd1f3nC5yr9TIYW1+IzYKa2xWS4EiMz5pPOnRPHkyyS5t/wmSmN51Gjg==" + }, + "@bugsnag/in-flight": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@bugsnag/in-flight/-/in-flight-7.16.1.tgz", + "integrity": "sha512-mzEWXU1fuy7uBwEH1TpX0aEdCpk67y5pXQTCPnKaNevTNmFZw7KQAX2vxmwZjDlW9wXJ/UQIBRV//RLxn8nEVg==", + "requires": { + "@bugsnag/cuid": "^3.0.0" + } + }, + "@bugsnag/js": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.16.2.tgz", + "integrity": "sha512-AzV0PtG3SZt+HnA2JmRJeI60aDNZsIJbEEAZIWZeATvWBt5RdVdsWKllM1SkTvURfxfdAVd4Xry3BgVrh8nEbg==", + "requires": { + "@bugsnag/browser": "^7.16.2", + "@bugsnag/node": "^7.16.2" + } + }, + "@bugsnag/node": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.16.2.tgz", + "integrity": "sha512-V5pND701cIYGzjjTwt0tuvAU1YyPB9h7vo5F/DzrDHRPmCINA/oVbc0Twco87knc2VPe8ntGFqTicTY65iOWzg==", + "requires": { + "@bugsnag/core": "^7.16.1", + "byline": "^5.0.0", + "error-stack-parser": "^2.0.2", + "iserror": "^0.0.2", + "pump": "^3.0.0", + "stack-generator": "^2.0.3" + } + }, + "@bugsnag/plugin-aws-lambda": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@bugsnag/plugin-aws-lambda/-/plugin-aws-lambda-7.16.2.tgz", + "integrity": "sha512-De2zMZkGx33ErxMJMD17urgSidhegsDxEk6SXKYUvLOdQTG3iSGFxdu0m/dMWHE110WJIK+NAz4r9c+RknLsng==", + "requires": { + "@bugsnag/in-flight": "^7.16.1", + "@bugsnag/plugin-browser-session": "^7.16.1" + } + }, + "@bugsnag/plugin-browser-session": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@bugsnag/plugin-browser-session/-/plugin-browser-session-7.16.1.tgz", + "integrity": "sha512-SnOJTAED2tQY9AS7riOXlR19wn7tFENKjDtTd5ZlLO5PwATPMLIU+jsWcgl9Y2EsBn1jZGnm002ehlGvuOcQjw==", + "requires": {} + }, + "@bugsnag/safe-json-stringify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz", + "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==" + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-stack-parser": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", + "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", + "requires": { + "stackframe": "^1.1.1" + } + }, + "iserror": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/iserror/-/iserror-0.0.2.tgz", + "integrity": "sha1-vVNFH+L2aLnyQCwZZnh6qix8C/U=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "stack-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz", + "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==", + "requires": { + "stackframe": "^1.1.1" + } + }, + "stackframe": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", + "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/examples/aws-lambda/simple-app/dependencies-layer/nodejs/package.json b/examples/aws-lambda/simple-app/dependencies-layer/nodejs/package.json new file mode 100644 index 0000000000..b661192e79 --- /dev/null +++ b/examples/aws-lambda/simple-app/dependencies-layer/nodejs/package.json @@ -0,0 +1,9 @@ +{ + "name": "simple-app-dependencies", + "version": "1.0.0", + "dependencies": { + "@bugsnag/js": "^7.16.1", + "@bugsnag/plugin-aws-lambda": "^7.16.1" + } + } + \ No newline at end of file diff --git a/examples/aws-lambda/simple-app/template.yaml b/examples/aws-lambda/simple-app/template.yaml index 81d06c39bc..d3af8160c8 100644 --- a/examples/aws-lambda/simple-app/template.yaml +++ b/examples/aws-lambda/simple-app/template.yaml @@ -9,16 +9,18 @@ Globals: Timeout: 3 Environment: Variables: - BUGSNAG_API_KEY: + BUGSNAG_API_KEY: Resources: - AsyncUnhandledExceptionFunctionNode14: + AsyncUnhandledException: Type: AWS::Serverless::Function Properties: - CodeUri: async/ + CodeUri: async/unhandled-exception Handler: unhandled-exception.lambdaHandler Runtime: nodejs14.x + Layers: + - !Ref NodeDependenciesLayer Events: AsyncUnhandledException: Type: Api @@ -26,12 +28,14 @@ Resources: Path: /async/unhandled-exception Method: get - AsyncHandledExceptionFunctionNode14: + AsyncHandledException: Type: AWS::Serverless::Function Properties: - CodeUri: async/ + CodeUri: async/handled-exception Handler: handled-exception.lambdaHandler Runtime: nodejs14.x + Layers: + - !Ref NodeDependenciesLayer Events: AsyncHandledException: Type: Api @@ -39,12 +43,14 @@ Resources: Path: /async/handled-exception Method: get - AsyncPromiseRejectionFunctionNode14: + AsyncPromiseRejection: Type: AWS::Serverless::Function Properties: - CodeUri: async/ + CodeUri: async/promise-rejection Handler: promise-rejection.lambdaHandler Runtime: nodejs14.x + Layers: + - !Ref NodeDependenciesLayer Events: AsyncPromiseRejection: Type: Api @@ -52,12 +58,14 @@ Resources: Path: /async/promise-rejection Method: get - AsyncTimeoutFunctionNode14: + AsyncTimeout: Type: AWS::Serverless::Function Properties: - CodeUri: async/ + CodeUri: async/timeout Handler: timeout.lambdaHandler Runtime: nodejs14.x + Layers: + - !Ref NodeDependenciesLayer Events: AsyncTimeout: Type: Api @@ -65,12 +73,14 @@ Resources: Path: /async/timeout Method: get - CallbackUnhandledExceptionFunctionNode14: + CallbackUnhandledException: Type: AWS::Serverless::Function Properties: - CodeUri: callback/ + CodeUri: callback/unhandled-exception Handler: unhandled-exception.lambdaHandler Runtime: nodejs14.x + Layers: + - !Ref NodeDependenciesLayer Events: CallbackUnhandledException: Type: Api @@ -78,12 +88,14 @@ Resources: Path: /callback/unhandled-exception Method: get - CallbackThrownUnhandledExceptionFunctionNode14: + CallbackThrownUnhandledException: Type: AWS::Serverless::Function Properties: - CodeUri: callback/ + CodeUri: callback/thrown-unhandled-exception Handler: thrown-unhandled-exception.lambdaHandler Runtime: nodejs14.x + Layers: + - !Ref NodeDependenciesLayer Events: CallbackThrownUnhandledException: Type: Api @@ -91,12 +103,14 @@ Resources: Path: /callback/thrown-unhandled-exception Method: get - CallbackHandledExceptionFunctionNode14: + CallbackHandledException: Type: AWS::Serverless::Function Properties: - CodeUri: callback/ + CodeUri: callback/handled-exception Handler: handled-exception.lambdaHandler Runtime: nodejs14.x + Layers: + - !Ref NodeDependenciesLayer Events: CallbackHandledException: Type: Api @@ -104,12 +118,14 @@ Resources: Path: /callback/handled-exception Method: get - CallbackPromiseRejectionFunctionNode14: + CallbackPromiseRejection: Type: AWS::Serverless::Function Properties: - CodeUri: callback/ + CodeUri: callback/promise-rejection Handler: promise-rejection.lambdaHandler Runtime: nodejs14.x + Layers: + - !Ref NodeDependenciesLayer Events: CallbackPromiseRejection: Type: Api @@ -117,15 +133,26 @@ Resources: Path: /callback/promise-rejection Method: get - CallbackTimeoutFunctionNode14: + CallbackTimeout: Type: AWS::Serverless::Function Properties: - CodeUri: callback/ + CodeUri: callback/timeout Handler: timeout.lambdaHandler Runtime: nodejs14.x + Layers: + - !Ref NodeDependenciesLayer Events: CallbackPromiseRejection: Type: Api Properties: Path: /callback/timeout - Method: get \ No newline at end of file + Method: get + + NodeDependenciesLayer: + Type: AWS::Serverless::LayerVersion + Properties: + LayerName: node-dependencies-layer + Description: Dependencies for the Lambda Functions + ContentUri: dependencies-layer/ + CompatibleRuntimes: + - nodejs14.x \ No newline at end of file From ca61862fb5165f39d8cf12d4a4d53ddb7af6b8c5 Mon Sep 17 00:00:00 2001 From: Luke Belton <58511679+luke-belton@users.noreply.github.com> Date: Fri, 11 Mar 2022 15:13:34 +0000 Subject: [PATCH 3/6] rename lambda files to improve error grouping --- ...xception.js => async-handled-exception.js} | 0 ...ejection.js => async-promise-rejection.js} | 0 .../timeout/{timeout.js => async-timeout.js} | 0 ...eption.js => async-unhandled-exception.js} | 0 ...ption.js => callback-handled-exception.js} | 0 ...ction.js => callback-promise-rejection.js} | 0 ...=> callback-thrown-unhandled-exception.js} | 0 .../{timeout.js => callback-timeout.js} | 0 ...ion.js => callback-unhandled-exception.js} | 0 examples/aws-lambda/simple-app/template.yaml | 20 +++++++++---------- 10 files changed, 10 insertions(+), 10 deletions(-) rename examples/aws-lambda/simple-app/async/handled-exception/{handled-exception.js => async-handled-exception.js} (100%) rename examples/aws-lambda/simple-app/async/promise-rejection/{promise-rejection.js => async-promise-rejection.js} (100%) rename examples/aws-lambda/simple-app/async/timeout/{timeout.js => async-timeout.js} (100%) rename examples/aws-lambda/simple-app/async/unhandled-exception/{unhandled-exception.js => async-unhandled-exception.js} (100%) rename examples/aws-lambda/simple-app/callback/handled-exception/{handled-exception.js => callback-handled-exception.js} (100%) rename examples/aws-lambda/simple-app/callback/promise-rejection/{promise-rejection.js => callback-promise-rejection.js} (100%) rename examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/{thrown-unhandled-exception.js => callback-thrown-unhandled-exception.js} (100%) rename examples/aws-lambda/simple-app/callback/timeout/{timeout.js => callback-timeout.js} (100%) rename examples/aws-lambda/simple-app/callback/unhandled-exception/{unhandled-exception.js => callback-unhandled-exception.js} (100%) diff --git a/examples/aws-lambda/simple-app/async/handled-exception/handled-exception.js b/examples/aws-lambda/simple-app/async/handled-exception/async-handled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/async/handled-exception/handled-exception.js rename to examples/aws-lambda/simple-app/async/handled-exception/async-handled-exception.js diff --git a/examples/aws-lambda/simple-app/async/promise-rejection/promise-rejection.js b/examples/aws-lambda/simple-app/async/promise-rejection/async-promise-rejection.js similarity index 100% rename from examples/aws-lambda/simple-app/async/promise-rejection/promise-rejection.js rename to examples/aws-lambda/simple-app/async/promise-rejection/async-promise-rejection.js diff --git a/examples/aws-lambda/simple-app/async/timeout/timeout.js b/examples/aws-lambda/simple-app/async/timeout/async-timeout.js similarity index 100% rename from examples/aws-lambda/simple-app/async/timeout/timeout.js rename to examples/aws-lambda/simple-app/async/timeout/async-timeout.js diff --git a/examples/aws-lambda/simple-app/async/unhandled-exception/unhandled-exception.js b/examples/aws-lambda/simple-app/async/unhandled-exception/async-unhandled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/async/unhandled-exception/unhandled-exception.js rename to examples/aws-lambda/simple-app/async/unhandled-exception/async-unhandled-exception.js diff --git a/examples/aws-lambda/simple-app/callback/handled-exception/handled-exception.js b/examples/aws-lambda/simple-app/callback/handled-exception/callback-handled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/handled-exception/handled-exception.js rename to examples/aws-lambda/simple-app/callback/handled-exception/callback-handled-exception.js diff --git a/examples/aws-lambda/simple-app/callback/promise-rejection/promise-rejection.js b/examples/aws-lambda/simple-app/callback/promise-rejection/callback-promise-rejection.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/promise-rejection/promise-rejection.js rename to examples/aws-lambda/simple-app/callback/promise-rejection/callback-promise-rejection.js diff --git a/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/thrown-unhandled-exception.js b/examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/callback-thrown-unhandled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/thrown-unhandled-exception.js rename to examples/aws-lambda/simple-app/callback/thrown-unhandled-exception/callback-thrown-unhandled-exception.js diff --git a/examples/aws-lambda/simple-app/callback/timeout/timeout.js b/examples/aws-lambda/simple-app/callback/timeout/callback-timeout.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/timeout/timeout.js rename to examples/aws-lambda/simple-app/callback/timeout/callback-timeout.js diff --git a/examples/aws-lambda/simple-app/callback/unhandled-exception/unhandled-exception.js b/examples/aws-lambda/simple-app/callback/unhandled-exception/callback-unhandled-exception.js similarity index 100% rename from examples/aws-lambda/simple-app/callback/unhandled-exception/unhandled-exception.js rename to examples/aws-lambda/simple-app/callback/unhandled-exception/callback-unhandled-exception.js diff --git a/examples/aws-lambda/simple-app/template.yaml b/examples/aws-lambda/simple-app/template.yaml index d3af8160c8..55afdcd9ef 100644 --- a/examples/aws-lambda/simple-app/template.yaml +++ b/examples/aws-lambda/simple-app/template.yaml @@ -17,7 +17,7 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: async/unhandled-exception - Handler: unhandled-exception.lambdaHandler + Handler: async-unhandled-exception.lambdaHandler Runtime: nodejs14.x Layers: - !Ref NodeDependenciesLayer @@ -32,7 +32,7 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: async/handled-exception - Handler: handled-exception.lambdaHandler + Handler: async-handled-exception.lambdaHandler Runtime: nodejs14.x Layers: - !Ref NodeDependenciesLayer @@ -47,7 +47,7 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: async/promise-rejection - Handler: promise-rejection.lambdaHandler + Handler: async-promise-rejection.lambdaHandler Runtime: nodejs14.x Layers: - !Ref NodeDependenciesLayer @@ -62,7 +62,7 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: async/timeout - Handler: timeout.lambdaHandler + Handler: async-timeout.lambdaHandler Runtime: nodejs14.x Layers: - !Ref NodeDependenciesLayer @@ -77,7 +77,7 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: callback/unhandled-exception - Handler: unhandled-exception.lambdaHandler + Handler: callback-unhandled-exception.lambdaHandler Runtime: nodejs14.x Layers: - !Ref NodeDependenciesLayer @@ -92,7 +92,7 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: callback/thrown-unhandled-exception - Handler: thrown-unhandled-exception.lambdaHandler + Handler: callback-thrown-unhandled-exception.lambdaHandler Runtime: nodejs14.x Layers: - !Ref NodeDependenciesLayer @@ -107,7 +107,7 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: callback/handled-exception - Handler: handled-exception.lambdaHandler + Handler: callback-handled-exception.lambdaHandler Runtime: nodejs14.x Layers: - !Ref NodeDependenciesLayer @@ -122,7 +122,7 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: callback/promise-rejection - Handler: promise-rejection.lambdaHandler + Handler: callback-promise-rejection.lambdaHandler Runtime: nodejs14.x Layers: - !Ref NodeDependenciesLayer @@ -137,7 +137,7 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: callback/timeout - Handler: timeout.lambdaHandler + Handler: callback-timeout.lambdaHandler Runtime: nodejs14.x Layers: - !Ref NodeDependenciesLayer @@ -153,6 +153,6 @@ Resources: Properties: LayerName: node-dependencies-layer Description: Dependencies for the Lambda Functions - ContentUri: dependencies-layer/ + ContentUri: callback-dependencies-layer/ CompatibleRuntimes: - nodejs14.x \ No newline at end of file From 41ca60eb196bebb5283f7d36a5e8332b46e70090 Mon Sep 17 00:00:00 2001 From: Luke Belton <58511679+luke-belton@users.noreply.github.com> Date: Fri, 11 Mar 2022 15:17:26 +0000 Subject: [PATCH 4/6] add timeout to template for timeout functions --- examples/aws-lambda/simple-app/template.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/aws-lambda/simple-app/template.yaml b/examples/aws-lambda/simple-app/template.yaml index 55afdcd9ef..6d985a6f4c 100644 --- a/examples/aws-lambda/simple-app/template.yaml +++ b/examples/aws-lambda/simple-app/template.yaml @@ -64,6 +64,7 @@ Resources: CodeUri: async/timeout Handler: async-timeout.lambdaHandler Runtime: nodejs14.x + Timeout: 3 Layers: - !Ref NodeDependenciesLayer Events: @@ -124,6 +125,7 @@ Resources: CodeUri: callback/promise-rejection Handler: callback-promise-rejection.lambdaHandler Runtime: nodejs14.x + Timeout: 3 Layers: - !Ref NodeDependenciesLayer Events: From c4d02f3268079f39f823b5318604f7f5f3acdc24 Mon Sep 17 00:00:00 2001 From: Luke Belton <58511679+luke-belton@users.noreply.github.com> Date: Fri, 11 Mar 2022 15:24:56 +0000 Subject: [PATCH 5/6] improve description of each lambda --- examples/aws-lambda/simple-app/README.md | 26 +++++++++++------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/examples/aws-lambda/simple-app/README.md b/examples/aws-lambda/simple-app/README.md index 0f56515dde..bf3a9a8338 100644 --- a/examples/aws-lambda/simple-app/README.md +++ b/examples/aws-lambda/simple-app/README.md @@ -56,19 +56,17 @@ sam local invoke "CallbackHandledException" -e events/callback/handled-exception ``` ### Available functions -Function Name | Expected Response Code-Message ---- | --- - `AsyncUnhandledException`| 502 - Internal server error - `AsyncHandledException` | 200 - Did not crash! - `AsyncPromiseRejection` | 502 - Internal server error - `AsyncTimeout` | 502 - Internal server error - `CallbackUnhandledException` | 502 - Internal server error - `CallbackThrownUnhandledException` | 502 - Internal server error - `CallbackHandledException` | 200 - Did not crash! - `CallbackPromiseRejection` | 502 - Internal server error - `CallbackTimeout` | 502 - Internal server error -## Known issues - -- There is a bug with the SAM CLI that prevents Bugsnag from notifying you of timeouts when running the functions with the SAM CLI, see https://github.com/aws/aws-sam-cli/issues/2519. Timeout examples have been included and should work when deployed to AWS. +Bugsnag's `createHandler` supports both [`async`](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html#nodejs-handler-async) and [`callback`](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html#nodejs-handler-sync) handlers. Examples are given for both types of handler. +Function Name | Expected Response Code & Message | Purpose +--- | --- | --- + `AsyncUnhandledException`| 502 - Internal server error | Error returned from the handler + `AsyncHandledException` | 200 - Did not crash! | Call to `Bugsnag.notify` inside the handler, successful response + `AsyncPromiseRejection` | 502 - Internal server error | Promise rejected inside handler + `AsyncTimeout` | 502 - Internal server error | Function times out - Bugsnag notifies [`lambdaTimeoutNotifyMs`](https://docs.bugsnag.com/platforms/javascript/aws-lambda/#lambdatimeoutnotifyms) before timeout + `CallbackUnhandledException` | 502 - Internal server error | Error returned using handler's callback function + `CallbackThrownUnhandledException` | 502 - Internal server error | Error thrown inside the handler + `CallbackHandledException` | 200 - Did not crash! | Call to `Bugsnag.notify` inside the handler, successful response + `CallbackPromiseRejection` | 502 - Internal server error | Promise rejected inside handler + `CallbackTimeout` | 502 - Internal server error | Function times out - Bugsnag notifies [`lambdaTimeoutNotifyMs`](https://docs.bugsnag.com/platforms/javascript/aws-lambda/#lambdatimeoutnotifyms) before timeout From dd3c0f16ae47f6f97f2a629b0681fcae9bd7ff31 Mon Sep 17 00:00:00 2001 From: Luke Belton <58511679+luke-belton@users.noreply.github.com> Date: Thu, 8 Sep 2022 17:33:36 +0100 Subject: [PATCH 6/6] update for PR comments --- examples/aws-lambda/simple-app/README.md | 44 ++- .../nodejs/package-lock.json | 301 ------------------ examples/aws-lambda/simple-app/template.yaml | 13 +- 3 files changed, 35 insertions(+), 323 deletions(-) delete mode 100644 examples/aws-lambda/simple-app/dependencies-layer/nodejs/package-lock.json diff --git a/examples/aws-lambda/simple-app/README.md b/examples/aws-lambda/simple-app/README.md index bf3a9a8338..cd73f01bcd 100644 --- a/examples/aws-lambda/simple-app/README.md +++ b/examples/aws-lambda/simple-app/README.md @@ -4,7 +4,8 @@ This is an example project showing how to use `@bugsnag/js` with AWS Lambda. This project was initialized with [`sam init`](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-init.html). -## Prerequsities +## Prerequisites + - [SAM CLI tools](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) - [Docker](https://docs.docker.com/get-docker/) is installed and running on your machine (only if testing locally) @@ -16,6 +17,7 @@ Clone the repo and `cd` into the directory of this example: git clone git@github.com:bugsnag/bugsnag-js.git cd bugsnag-js/examples/aws-lambda/simple-app ``` + - Bugsnag is started for each Lambda function with `Bugsnag.start` and the `@bugsnag/plugin-aws-lambda` plugin - Errors in your Lambda are handled by wrapping your Lambda handler inside Bugsnag's handler - Both async and callback handlers are supported, with examples given for both inside this app @@ -23,34 +25,47 @@ cd bugsnag-js/examples/aws-lambda/simple-app Replace `` in `template.yaml` with your own. ### Install dependencies -A Lambda layer is used to share dependencies (Bugsnag) across the functions. From the project root, install the dependecies before invoking the functions: + +A Lambda layer is used to share dependencies (Bugsnag) across the functions. From the project root, install the dependencies before invoking the functions: + ``` -cd dependecies-layer -npm install +cd dependencies-layer && npm install && cd .. ``` + ### Build + +From the root directory: + ``` sam build ``` ### Run all functions locally + To run all the functions on a local server: + ``` sam local start-api --host '127.0.0.1' -p '3000' ``` -To avoid building the dependency layer image on each invocation, you can use the `--warm-containers [EAGER | LAZY]` option. `EAGER` loads the layer containers for all functions at startup + persists them between invocations. `LAZY` only loads the layer containers when each function is first invoked, and then persists them for further invocations. +To avoid building the dependency layer image on each invocation, you can use the `--warm-containers [EAGER | LAZY]` option. `EAGER` loads the layer containers for all functions at startup + persists them between invocations. `LAZY` only loads the layer containers when each function is first invoked, and then persists them for further invocations. Hit a function endpoint: + ``` curl -X GET 'http://127.0.0.1:3000/async/handled-exception' ``` + ### Testing a single function + To test a single function using a sample [Event](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-event): + ``` sam local invoke "" -e ``` + e.g. to run the `CallbackHandledException` function: + ``` sam local invoke "CallbackHandledException" -e events/callback/handled-exception.json ``` @@ -60,13 +75,12 @@ sam local invoke "CallbackHandledException" -e events/callback/handled-exception Bugsnag's `createHandler` supports both [`async`](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html#nodejs-handler-async) and [`callback`](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html#nodejs-handler-sync) handlers. Examples are given for both types of handler. Function Name | Expected Response Code & Message | Purpose --- | --- | --- - `AsyncUnhandledException`| 502 - Internal server error | Error returned from the handler - `AsyncHandledException` | 200 - Did not crash! | Call to `Bugsnag.notify` inside the handler, successful response - `AsyncPromiseRejection` | 502 - Internal server error | Promise rejected inside handler - `AsyncTimeout` | 502 - Internal server error | Function times out - Bugsnag notifies [`lambdaTimeoutNotifyMs`](https://docs.bugsnag.com/platforms/javascript/aws-lambda/#lambdatimeoutnotifyms) before timeout - `CallbackUnhandledException` | 502 - Internal server error | Error returned using handler's callback function - `CallbackThrownUnhandledException` | 502 - Internal server error | Error thrown inside the handler - `CallbackHandledException` | 200 - Did not crash! | Call to `Bugsnag.notify` inside the handler, successful response - `CallbackPromiseRejection` | 502 - Internal server error | Promise rejected inside handler - `CallbackTimeout` | 502 - Internal server error | Function times out - Bugsnag notifies [`lambdaTimeoutNotifyMs`](https://docs.bugsnag.com/platforms/javascript/aws-lambda/#lambdatimeoutnotifyms) before timeout - +`AsyncUnhandledException`| 502 - Internal server error | Error returned from the handler +`AsyncHandledException` | 200 - Did not crash! | Call to `Bugsnag.notify` inside the handler, successful response +`AsyncPromiseRejection` | 502 - Internal server error | Promise rejected inside handler +`AsyncTimeout` | 502 - Internal server error | Function times out - Bugsnag notifies [`lambdaTimeoutNotifyMs`](https://docs.bugsnag.com/platforms/javascript/aws-lambda/#lambdatimeoutnotifyms) before timeout +`CallbackUnhandledException` | 502 - Internal server error | Error returned using handler's callback function +`CallbackThrownUnhandledException` | 502 - Internal server error | Error thrown inside the handler +`CallbackHandledException` | 200 - Did not crash! | Call to `Bugsnag.notify` inside the handler, successful response +`CallbackPromiseRejection` | 502 - Internal server error | Promise rejected inside handler +`CallbackTimeout` | 502 - Internal server error | Function times out - Bugsnag notifies [`lambdaTimeoutNotifyMs`](https://docs.bugsnag.com/platforms/javascript/aws-lambda/#lambdatimeoutnotifyms) before timeout diff --git a/examples/aws-lambda/simple-app/dependencies-layer/nodejs/package-lock.json b/examples/aws-lambda/simple-app/dependencies-layer/nodejs/package-lock.json deleted file mode 100644 index 9c9352c422..0000000000 --- a/examples/aws-lambda/simple-app/dependencies-layer/nodejs/package-lock.json +++ /dev/null @@ -1,301 +0,0 @@ -{ - "name": "simple-app", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "simple-app", - "version": "1.0.0", - "dependencies": { - "@bugsnag/js": "^7.16.1", - "@bugsnag/plugin-aws-lambda": "^7.16.1" - } - }, - "node_modules/@bugsnag/browser": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.16.2.tgz", - "integrity": "sha512-iBbAmjTDe0I6WPTHi3wIcmKu3ykydtT6fc8atJA65rzgDLMlTM1Wnwz4Ny1cn0bVouLGa48BRiOJ27Rwy7QRYA==", - "dependencies": { - "@bugsnag/core": "^7.16.1" - } - }, - "node_modules/@bugsnag/core": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.16.1.tgz", - "integrity": "sha512-zuBnL7B329VldItRqhXYrp1hjmjZnltJwNXMysi9WtY4t29WKk5LVwgWb1mPM9clJ0FoObZ7kvvQMUTKh3ezFQ==", - "dependencies": { - "@bugsnag/cuid": "^3.0.0", - "@bugsnag/safe-json-stringify": "^6.0.0", - "error-stack-parser": "^2.0.3", - "iserror": "0.0.2", - "stack-generator": "^2.0.3" - } - }, - "node_modules/@bugsnag/cuid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@bugsnag/cuid/-/cuid-3.0.0.tgz", - "integrity": "sha512-LOt8aaBI+KvOQGneBtpuCz3YqzyEAehd1f3nC5yr9TIYW1+IzYKa2xWS4EiMz5pPOnRPHkyyS5t/wmSmN51Gjg==" - }, - "node_modules/@bugsnag/in-flight": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@bugsnag/in-flight/-/in-flight-7.16.1.tgz", - "integrity": "sha512-mzEWXU1fuy7uBwEH1TpX0aEdCpk67y5pXQTCPnKaNevTNmFZw7KQAX2vxmwZjDlW9wXJ/UQIBRV//RLxn8nEVg==", - "dependencies": { - "@bugsnag/cuid": "^3.0.0" - }, - "peerDependencies": { - "@bugsnag/core": "^7.0.0" - } - }, - "node_modules/@bugsnag/js": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.16.2.tgz", - "integrity": "sha512-AzV0PtG3SZt+HnA2JmRJeI60aDNZsIJbEEAZIWZeATvWBt5RdVdsWKllM1SkTvURfxfdAVd4Xry3BgVrh8nEbg==", - "dependencies": { - "@bugsnag/browser": "^7.16.2", - "@bugsnag/node": "^7.16.2" - } - }, - "node_modules/@bugsnag/node": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.16.2.tgz", - "integrity": "sha512-V5pND701cIYGzjjTwt0tuvAU1YyPB9h7vo5F/DzrDHRPmCINA/oVbc0Twco87knc2VPe8ntGFqTicTY65iOWzg==", - "dependencies": { - "@bugsnag/core": "^7.16.1", - "byline": "^5.0.0", - "error-stack-parser": "^2.0.2", - "iserror": "^0.0.2", - "pump": "^3.0.0", - "stack-generator": "^2.0.3" - } - }, - "node_modules/@bugsnag/plugin-aws-lambda": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@bugsnag/plugin-aws-lambda/-/plugin-aws-lambda-7.16.2.tgz", - "integrity": "sha512-De2zMZkGx33ErxMJMD17urgSidhegsDxEk6SXKYUvLOdQTG3iSGFxdu0m/dMWHE110WJIK+NAz4r9c+RknLsng==", - "dependencies": { - "@bugsnag/in-flight": "^7.16.1", - "@bugsnag/plugin-browser-session": "^7.16.1" - }, - "peerDependencies": { - "@bugsnag/core": "^7.0.0" - } - }, - "node_modules/@bugsnag/plugin-browser-session": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@bugsnag/plugin-browser-session/-/plugin-browser-session-7.16.1.tgz", - "integrity": "sha512-SnOJTAED2tQY9AS7riOXlR19wn7tFENKjDtTd5ZlLO5PwATPMLIU+jsWcgl9Y2EsBn1jZGnm002ehlGvuOcQjw==", - "peerDependencies": { - "@bugsnag/core": "^7.0.0" - } - }, - "node_modules/@bugsnag/safe-json-stringify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz", - "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==" - }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-stack-parser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", - "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/iserror": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/iserror/-/iserror-0.0.2.tgz", - "integrity": "sha1-vVNFH+L2aLnyQCwZZnh6qix8C/U=" - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/stack-generator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz", - "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==", - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/stackframe": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", - "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - }, - "dependencies": { - "@bugsnag/browser": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.16.2.tgz", - "integrity": "sha512-iBbAmjTDe0I6WPTHi3wIcmKu3ykydtT6fc8atJA65rzgDLMlTM1Wnwz4Ny1cn0bVouLGa48BRiOJ27Rwy7QRYA==", - "requires": { - "@bugsnag/core": "^7.16.1" - } - }, - "@bugsnag/core": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.16.1.tgz", - "integrity": "sha512-zuBnL7B329VldItRqhXYrp1hjmjZnltJwNXMysi9WtY4t29WKk5LVwgWb1mPM9clJ0FoObZ7kvvQMUTKh3ezFQ==", - "requires": { - "@bugsnag/cuid": "^3.0.0", - "@bugsnag/safe-json-stringify": "^6.0.0", - "error-stack-parser": "^2.0.3", - "iserror": "0.0.2", - "stack-generator": "^2.0.3" - } - }, - "@bugsnag/cuid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@bugsnag/cuid/-/cuid-3.0.0.tgz", - "integrity": "sha512-LOt8aaBI+KvOQGneBtpuCz3YqzyEAehd1f3nC5yr9TIYW1+IzYKa2xWS4EiMz5pPOnRPHkyyS5t/wmSmN51Gjg==" - }, - "@bugsnag/in-flight": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@bugsnag/in-flight/-/in-flight-7.16.1.tgz", - "integrity": "sha512-mzEWXU1fuy7uBwEH1TpX0aEdCpk67y5pXQTCPnKaNevTNmFZw7KQAX2vxmwZjDlW9wXJ/UQIBRV//RLxn8nEVg==", - "requires": { - "@bugsnag/cuid": "^3.0.0" - } - }, - "@bugsnag/js": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.16.2.tgz", - "integrity": "sha512-AzV0PtG3SZt+HnA2JmRJeI60aDNZsIJbEEAZIWZeATvWBt5RdVdsWKllM1SkTvURfxfdAVd4Xry3BgVrh8nEbg==", - "requires": { - "@bugsnag/browser": "^7.16.2", - "@bugsnag/node": "^7.16.2" - } - }, - "@bugsnag/node": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.16.2.tgz", - "integrity": "sha512-V5pND701cIYGzjjTwt0tuvAU1YyPB9h7vo5F/DzrDHRPmCINA/oVbc0Twco87knc2VPe8ntGFqTicTY65iOWzg==", - "requires": { - "@bugsnag/core": "^7.16.1", - "byline": "^5.0.0", - "error-stack-parser": "^2.0.2", - "iserror": "^0.0.2", - "pump": "^3.0.0", - "stack-generator": "^2.0.3" - } - }, - "@bugsnag/plugin-aws-lambda": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@bugsnag/plugin-aws-lambda/-/plugin-aws-lambda-7.16.2.tgz", - "integrity": "sha512-De2zMZkGx33ErxMJMD17urgSidhegsDxEk6SXKYUvLOdQTG3iSGFxdu0m/dMWHE110WJIK+NAz4r9c+RknLsng==", - "requires": { - "@bugsnag/in-flight": "^7.16.1", - "@bugsnag/plugin-browser-session": "^7.16.1" - } - }, - "@bugsnag/plugin-browser-session": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@bugsnag/plugin-browser-session/-/plugin-browser-session-7.16.1.tgz", - "integrity": "sha512-SnOJTAED2tQY9AS7riOXlR19wn7tFENKjDtTd5ZlLO5PwATPMLIU+jsWcgl9Y2EsBn1jZGnm002ehlGvuOcQjw==", - "requires": {} - }, - "@bugsnag/safe-json-stringify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz", - "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==" - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "error-stack-parser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz", - "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==", - "requires": { - "stackframe": "^1.1.1" - } - }, - "iserror": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/iserror/-/iserror-0.0.2.tgz", - "integrity": "sha1-vVNFH+L2aLnyQCwZZnh6qix8C/U=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "stack-generator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz", - "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==", - "requires": { - "stackframe": "^1.1.1" - } - }, - "stackframe": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz", - "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - } -} diff --git a/examples/aws-lambda/simple-app/template.yaml b/examples/aws-lambda/simple-app/template.yaml index 6d985a6f4c..c43650f6b4 100644 --- a/examples/aws-lambda/simple-app/template.yaml +++ b/examples/aws-lambda/simple-app/template.yaml @@ -1,18 +1,17 @@ -AWSTemplateFormatVersion: '2010-09-09' +AWSTemplateFormatVersion: "2010-09-09" Transform: AWS::Serverless-2016-10-31 Description: > simple-app - + # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Environment: Variables: - BUGSNAG_API_KEY: + BUGSNAG_API_KEY: a12a0c59ed3137195c967a33e3091690 Resources: - AsyncUnhandledException: Type: AWS::Serverless::Function Properties: @@ -149,12 +148,12 @@ Resources: Properties: Path: /callback/timeout Method: get - + NodeDependenciesLayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: node-dependencies-layer Description: Dependencies for the Lambda Functions - ContentUri: callback-dependencies-layer/ + ContentUri: dependencies-layer/ CompatibleRuntimes: - - nodejs14.x \ No newline at end of file + - nodejs14.x