From 0fa261bd3adccdbff6a70ed1b3d8f1d79f824032 Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Thu, 1 Dec 2016 12:02:57 -0800 Subject: [PATCH 1/7] Updated for use with AWS X-Ray --- .ebextensions/options.config | 9 - .ebextensions/xray.config | 35 ++++ app.js | 45 +++-- iam_policy.json | 16 +- npm-shrinkwrap.json | 379 ----------------------------------- package.json | 5 +- views/index.ejs | 149 ++++++++++---- 7 files changed, 196 insertions(+), 442 deletions(-) create mode 100644 .ebextensions/xray.config delete mode 100644 npm-shrinkwrap.json diff --git a/.ebextensions/options.config b/.ebextensions/options.config index ba195a9..576c436 100644 --- a/.ebextensions/options.config +++ b/.ebextensions/options.config @@ -10,12 +10,3 @@ option_settings: ProxyServer: nginx aws:elasticbeanstalk:container:nodejs:staticfiles: /static: /static - aws:autoscaling:asg: - Cooldown: "120" - aws:autoscaling:trigger: - Unit: "Percent" - Period: "1" - BreachDuration: "2" - UpperThreshold: "75" - LowerThreshold: "30" - MeasureName: "CPUUtilization" diff --git a/.ebextensions/xray.config b/.ebextensions/xray.config new file mode 100644 index 0000000..741b574 --- /dev/null +++ b/.ebextensions/xray.config @@ -0,0 +1,35 @@ +packages: + yum: + jq: [] + +commands: + 01-install-xrayd: + command: /tmp/install-xrayd.sh + ignoreErrors: true + +files: + "/tmp/install-xrayd.sh" : + mode: "000744" + owner: root + group: root + content: | + #!/bin/bash -x + AWS_REGION=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.AWS_REGION') + curl https://s3.dualstack.${AWS_REGION}.amazonaws.com/aws-xray-assets.${AWS_REGION}/xray-daemon/aws-xray-daemon-1.x.rpm -o /home/ec2-user/aws-xray-daemon-1.x.rpm + yum remove -y xray + yum install -y /home/ec2-user/aws-xray-daemon-1.x.rpm + + "/opt/elasticbeanstalk/tasks/taillogs.d/xray-daemon.conf" : + mode: "000644" + owner: root + group: root + content: | + /var/log/xray/xray.log + + "/etc/amazon/xray/cfg.yaml" : + mode: "000644" + owner: root + group: root + content: | + Logging: + LogLevel: "info" \ No newline at end of file diff --git a/app.js b/app.js index 38018fa..a550f98 100644 --- a/app.js +++ b/app.js @@ -24,28 +24,40 @@ if (cluster.isMaster) { // Code to run if we're in a worker process } else { var AWS = require('aws-sdk'); + var http = require('http'); + var XRay = require('aws-xray-sdk'); var express = require('express'); var bodyParser = require('body-parser'); + var queryString = require('querystring'); AWS.config.region = process.env.REGION - var sns = new AWS.SNS(); - var ddb = new AWS.DynamoDB(); + XRay.config([XRay.plugins.EC2]); + XRay.captureHTTPs(http); + XRay.setDefaultName('myfrontend-dev'); + var app = express(); + var sns = XRay.captureAWSClient(new AWS.SNS()); + var ddb = XRay.captureAWSClient(new AWS.DynamoDB()); var ddbTable = process.env.STARTUP_SIGNUP_TABLE; var snsTopic = process.env.NEW_SIGNUP_TOPIC; - var app = express(); app.set('view engine', 'ejs'); app.set('views', __dirname + '/views'); app.use(bodyParser.urlencoded({extended:false})); + app.use(XRay.express.openSegment()); app.get('/', function(req, res) { - res.render('index', { - static_path: 'static', - theme: process.env.THEME || 'flatly', - flask_debug: process.env.FLASK_DEBUG || 'false' + XRay.captureAsync('Page Render', function(seg) { + res.render('index', { + static_path: 'static', + theme: process.env.THEME || 'flatly', + flask_debug: process.env.FLASK_DEBUG || 'false' + }); + seg.close(); }); + + res.status(200).end(); }); app.post('/signup', function(req, res) { @@ -56,20 +68,20 @@ if (cluster.isMaster) { 'theme': {'S': req.body.theme} }; + var seg = XRay.getSegment(); + seg.addAnnotation('theme', req.body.theme); + ddb.putItem({ 'TableName': ddbTable, 'Item': item, 'Expected': { email: { Exists: false } } }, function(err, data) { if (err) { - var returnStatus = 500; - if (err.code === 'ConditionalCheckFailedException') { - returnStatus = 409; + res.status(409).end("User already exists"); + } else { + res.status(500).end("DDB Error"); } - - res.status(returnStatus).end(); - console.log('DDB Error: ' + err); } else { sns.publish({ 'Message': 'Name: ' + req.body.name + "\r\nEmail: " + req.body.email @@ -79,16 +91,17 @@ if (cluster.isMaster) { 'TopicArn': snsTopic }, function(err, data) { if (err) { - res.status(500).end(); - console.log('SNS Error: ' + err); + res.status(500).end("SNS Error"); } else { - res.status(201).end(); + res.status(201).end("Success"); } }); } }); }); + app.use(XRay.express.closeSegment()); + var port = process.env.PORT || 3000; var server = app.listen(port, function () { diff --git a/iam_policy.json b/iam_policy.json index d6d9322..bb4472e 100644 --- a/iam_policy.json +++ b/iam_policy.json @@ -3,13 +3,25 @@ "Statement": [ { "Effect": "Allow", - "Action": [ "dynamodb:PutItem" ], + "Action": [ + "dynamodb:PutItem" + ], "Resource": [ "*" ] }, { "Effect": "Allow", - "Action": [ "sns:Publish" ], + "Action": [ + "sns:Publish" + ], "Resource": [ "*" ] + }, + { + "Effect":"Allow", + "Action": [ + "xray: PutTraceSegments", + "xray: PutTelemetryRecords" + ], + "Resource":[ "*" ] } ] } \ No newline at end of file diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json deleted file mode 100644 index e648c9c..0000000 --- a/npm-shrinkwrap.json +++ /dev/null @@ -1,379 +0,0 @@ -{ - "name": "Elastic-Beanstalk-Sample-App", - "version": "0.0.1", - "dependencies": { - "aws-sdk": { - "version": "2.1.39", - "from": "aws-sdk@latest", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1.39.tgz", - "dependencies": { - "sax": { - "version": "0.5.3", - "from": "sax@0.5.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.3.tgz" - }, - "xml2js": { - "version": "0.2.8", - "from": "xml2js@0.2.8", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz" - }, - "xmlbuilder": { - "version": "0.4.2", - "from": "xmlbuilder@0.4.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.2.tgz" - } - } - }, - "body-parser": { - "version": "1.13.2", - "from": "body-parser@latest", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.2.tgz", - "dependencies": { - "bytes": { - "version": "2.1.0", - "from": "bytes@2.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz" - }, - "content-type": { - "version": "1.0.1", - "from": "content-type@~1.0.1", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" - }, - "debug": { - "version": "2.2.0", - "from": "debug@~2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "dependencies": { - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - } - } - }, - "depd": { - "version": "1.0.1", - "from": "depd@~1.0.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz" - }, - "http-errors": { - "version": "1.3.1", - "from": "http-errors@~1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "dependencies": { - "inherits": { - "version": "2.0.1", - "from": "inherits@~2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "statuses": { - "version": "1.2.1", - "from": "statuses@1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" - } - } - }, - "iconv-lite": { - "version": "0.4.11", - "from": "iconv-lite@0.4.11", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz" - }, - "on-finished": { - "version": "2.3.0", - "from": "on-finished@~2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "dependencies": { - "ee-first": { - "version": "1.1.1", - "from": "ee-first@1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - } - } - }, - "qs": { - "version": "4.0.0", - "from": "qs@4.0.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" - }, - "raw-body": { - "version": "2.1.2", - "from": "raw-body@~2.1.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.2.tgz", - "dependencies": { - "unpipe": { - "version": "1.0.0", - "from": "unpipe@1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - } - } - }, - "type-is": { - "version": "1.6.5", - "from": "type-is@~1.6.4", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.5.tgz", - "dependencies": { - "media-typer": { - "version": "0.3.0", - "from": "media-typer@0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - }, - "mime-types": { - "version": "2.1.3", - "from": "mime-types@~2.1.3", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.3.tgz", - "dependencies": { - "mime-db": { - "version": "1.15.0", - "from": "mime-db@~1.15.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.15.0.tgz" - } - } - } - } - } - } - }, - "ejs": { - "version": "2.3.3", - "from": "ejs@latest", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.3.3.tgz" - }, - "express": { - "version": "4.13.1", - "from": "express@latest", - "resolved": "https://registry.npmjs.org/express/-/express-4.13.1.tgz", - "dependencies": { - "accepts": { - "version": "1.2.11", - "from": "accepts@~1.2.10", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.11.tgz", - "dependencies": { - "mime-types": { - "version": "2.1.3", - "from": "mime-types@~2.1.3", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.3.tgz", - "dependencies": { - "mime-db": { - "version": "1.15.0", - "from": "mime-db@~1.15.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.15.0.tgz" - } - } - }, - "negotiator": { - "version": "0.5.3", - "from": "negotiator@0.5.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" - } - } - }, - "array-flatten": { - "version": "1.1.0", - "from": "array-flatten@1.1.0", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.0.tgz" - }, - "content-disposition": { - "version": "0.5.0", - "from": "content-disposition@0.5.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz" - }, - "content-type": { - "version": "1.0.1", - "from": "content-type@~1.0.1", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" - }, - "cookie": { - "version": "0.1.3", - "from": "cookie@0.1.3", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz" - }, - "cookie-signature": { - "version": "1.0.6", - "from": "cookie-signature@1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - }, - "debug": { - "version": "2.2.0", - "from": "debug@~2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "dependencies": { - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - } - } - }, - "depd": { - "version": "1.0.1", - "from": "depd@~1.0.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz" - }, - "escape-html": { - "version": "1.0.2", - "from": "escape-html@1.0.2", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" - }, - "etag": { - "version": "1.7.0", - "from": "etag@~1.7.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" - }, - "finalhandler": { - "version": "0.4.0", - "from": "finalhandler@0.4.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", - "dependencies": { - "unpipe": { - "version": "1.0.0", - "from": "unpipe@~1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - } - } - }, - "fresh": { - "version": "0.3.0", - "from": "fresh@0.3.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" - }, - "merge-descriptors": { - "version": "1.0.0", - "from": "merge-descriptors@1.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.0.tgz" - }, - "methods": { - "version": "1.1.1", - "from": "methods@~1.1.1", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.1.tgz" - }, - "on-finished": { - "version": "2.3.0", - "from": "on-finished@~2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "dependencies": { - "ee-first": { - "version": "1.1.1", - "from": "ee-first@1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - } - } - }, - "parseurl": { - "version": "1.3.0", - "from": "parseurl@~1.3.0", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz" - }, - "path-to-regexp": { - "version": "0.1.6", - "from": "path-to-regexp@0.1.6", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.6.tgz" - }, - "proxy-addr": { - "version": "1.0.8", - "from": "proxy-addr@~1.0.8", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.8.tgz", - "dependencies": { - "forwarded": { - "version": "0.1.0", - "from": "forwarded@~0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" - }, - "ipaddr.js": { - "version": "1.0.1", - "from": "ipaddr.js@1.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.1.tgz" - } - } - }, - "qs": { - "version": "4.0.0", - "from": "qs@4.0.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" - }, - "range-parser": { - "version": "1.0.2", - "from": "range-parser@~1.0.2", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.2.tgz" - }, - "send": { - "version": "0.13.0", - "from": "send@0.13.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.13.0.tgz", - "dependencies": { - "destroy": { - "version": "1.0.3", - "from": "destroy@1.0.3", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz" - }, - "http-errors": { - "version": "1.3.1", - "from": "http-errors@~1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "dependencies": { - "inherits": { - "version": "2.0.1", - "from": "inherits@~2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - } - } - }, - "mime": { - "version": "1.3.4", - "from": "mime@1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - }, - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "statuses": { - "version": "1.2.1", - "from": "statuses@~1.2.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" - } - } - }, - "serve-static": { - "version": "1.10.0", - "from": "serve-static@~1.10.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz" - }, - "type-is": { - "version": "1.6.5", - "from": "type-is@~1.6.4", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.5.tgz", - "dependencies": { - "media-typer": { - "version": "0.3.0", - "from": "media-typer@0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - }, - "mime-types": { - "version": "2.1.3", - "from": "mime-types@~2.1.3", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.3.tgz", - "dependencies": { - "mime-db": { - "version": "1.15.0", - "from": "mime-db@~1.15.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.15.0.tgz" - } - } - } - } - }, - "vary": { - "version": "1.0.1", - "from": "vary@~1.0.0", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" - }, - "utils-merge": { - "version": "1.0.0", - "from": "utils-merge@1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - } - } - } - } -} diff --git a/package.json b/package.json index 57d32fd..8875d61 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,12 @@ "private": true, "dependencies": { "ejs": "latest", + "http": "latest", "aws-sdk": "latest", "express": "latest", - "body-parser": "latest" + "body-parser": "latest", + "querystring": "latest", + "aws-xray-sdk": "latest" }, "scripts": { "start": "node app.js" diff --git a/views/index.ejs b/views/index.ejs index e871601..1cd08bd 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -6,18 +6,16 @@ - A New Startup: Sign Up Today! + AWS X-Ray Sample Application " rel="stylesheet"> " rel="stylesheet"> - -

A New Startup

- <% if (flask_debug === 'true') { %> -
- Flask is in debug mode. This is not safe for production. -
+ + <% if (flask_debug === 'true') { %> +
+ Flask is in debug mode. This is not safe for production. +
<% } %> + + + +

The next big thing is coming...

-

We're pretty thrilled to unveil our latest creation. Sign up below to be notified when we officially launch!

-

Sign up today

+

+ We're pretty thrilled to unveil our latest creation. Sign up below to be notified when we officially launch! +

+

+ Sign up today +

- @@ -86,33 +111,87 @@
- From 0ff6e7b331f3b9b3bdccd0e9e83e958ba1740e5f Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Thu, 1 Dec 2016 12:04:51 -0800 Subject: [PATCH 2/7] Updated Readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6dde926..823ef44 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AWS Elastic Beanstalk Express Sample App +# AWS Elastic Beanstalk Express Sample App Instrumented for use with AWS X-Ray This sample application uses the [Express](https://expressjs.com/) framework and [Bootstrap](http://getbootstrap.com/) to build a simple, scalable customer signup form that is deployed to [AWS Elastic Beanstalk](http://aws.amazon.com/elasticbeanstalk/). The application stores data in [Amazon DynamoDB](http://aws.amazon.com/dynamodb/) and publishes notifications to the [Amazon Simple Notification Service (SNS)](http://aws.amazon.com/sns/) when a customer fills out the form. ## Features From 7b2e201d261b568eaf3dd9315a2a6950300252ca Mon Sep 17 00:00:00 2001 From: James Bowman Date: Thu, 26 Jan 2017 17:38:56 -0800 Subject: [PATCH 3/7] Update package.json to lock dependency versions. --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 8875d61..c0e2982 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,13 @@ "version": "0.0.1", "private": true, "dependencies": { - "ejs": "latest", - "http": "latest", - "aws-sdk": "latest", - "express": "latest", - "body-parser": "latest", - "querystring": "latest", - "aws-xray-sdk": "latest" + "ejs": "2.5.5", + "http": "0.0.0", + "aws-sdk": "2.9.0", + "express": "4.14.0", + "body-parser": "1.16.0", + "querystring": "0.2.0", + "aws-xray-sdk": "1.0.0-beta" }, "scripts": { "start": "node app.js" From 56355c7d3ef8d494621e10efd2df7b4e4caf34a6 Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Fri, 17 Mar 2017 17:24:49 -0700 Subject: [PATCH 4/7] Fix spacing issue in the X-Ray permissions --- iam_policy.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iam_policy.json b/iam_policy.json index bb4472e..c74e433 100644 --- a/iam_policy.json +++ b/iam_policy.json @@ -18,10 +18,10 @@ { "Effect":"Allow", "Action": [ - "xray: PutTraceSegments", - "xray: PutTelemetryRecords" + "xray:PutTraceSegments", + "xray:PutTelemetryRecords" ], "Resource":[ "*" ] } ] -} \ No newline at end of file +} From b4537d4ea476842efeff917245fa6ffdbcec4a88 Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Wed, 19 Apr 2017 14:07:20 -0700 Subject: [PATCH 5/7] Updated aws-xray-sdk to 1.1.0 --- .ebextensions/xray.config | 32 +++---------------- app.js | 67 ++++++++++++++++++++++++++++++++------- package.json | 2 +- 3 files changed, 61 insertions(+), 40 deletions(-) diff --git a/.ebextensions/xray.config b/.ebextensions/xray.config index 741b574..15ad90d 100644 --- a/.ebextensions/xray.config +++ b/.ebextensions/xray.config @@ -1,35 +1,11 @@ -packages: - yum: - jq: [] - -commands: - 01-install-xrayd: - command: /tmp/install-xrayd.sh - ignoreErrors: true +option_settings: + aws:elasticbeanstalk:xray: + XRayEnabled: true files: - "/tmp/install-xrayd.sh" : - mode: "000744" - owner: root - group: root - content: | - #!/bin/bash -x - AWS_REGION=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.AWS_REGION') - curl https://s3.dualstack.${AWS_REGION}.amazonaws.com/aws-xray-assets.${AWS_REGION}/xray-daemon/aws-xray-daemon-1.x.rpm -o /home/ec2-user/aws-xray-daemon-1.x.rpm - yum remove -y xray - yum install -y /home/ec2-user/aws-xray-daemon-1.x.rpm - "/opt/elasticbeanstalk/tasks/taillogs.d/xray-daemon.conf" : mode: "000644" owner: root group: root content: | - /var/log/xray/xray.log - - "/etc/amazon/xray/cfg.yaml" : - mode: "000644" - owner: root - group: root - content: | - Logging: - LogLevel: "info" \ No newline at end of file + /var/log/xray/xray.log \ No newline at end of file diff --git a/app.js b/app.js index a550f98..08a7b0b 100644 --- a/app.js +++ b/app.js @@ -23,32 +23,34 @@ if (cluster.isMaster) { // Code to run if we're in a worker process } else { - var AWS = require('aws-sdk'); - var http = require('http'); + // Include the AWS X-Ray Node.js SDK and set configuration var XRay = require('aws-xray-sdk'); + var AWS = XRay.captureAWS(require('aws-sdk')); + var http = XRay.captureHTTPs(require('http')); var express = require('express'); var bodyParser = require('body-parser'); var queryString = require('querystring'); AWS.config.region = process.env.REGION - XRay.config([XRay.plugins.EC2]); - XRay.captureHTTPs(http); - XRay.setDefaultName('myfrontend-dev'); + XRay.config([XRay.plugins.EC2Plugin, XRay.plugins.ElasticBeanstalkPlugin]); + XRay.middleware.setSamplingRules('sampling-rules.json'); + XRay.middleware.enableDynamicNaming(); var app = express(); - var sns = XRay.captureAWSClient(new AWS.SNS()); - var ddb = XRay.captureAWSClient(new AWS.DynamoDB()); - var ddbTable = process.env.STARTUP_SIGNUP_TABLE; - var snsTopic = process.env.NEW_SIGNUP_TOPIC; + var sns = new AWS.SNS(); + var ddb = new AWS.DynamoDB(); + var ddbTable = process.env.STARTUP_SIGNUP_TABLE; + var snsTopic = process.env.NEW_SIGNUP_TOPIC; + var apiCNAME = process.env.API_CNAME || 'localhost'; app.set('view engine', 'ejs'); app.set('views', __dirname + '/views'); app.use(bodyParser.urlencoded({extended:false})); - app.use(XRay.express.openSegment()); + app.use(XRay.express.openSegment('myfrontend')); app.get('/', function(req, res) { - XRay.captureAsync('Page Render', function(seg) { + XRay.captureAsyncFunc('Page Render', function(seg) { res.render('index', { static_path: 'static', theme: process.env.THEME || 'flatly', @@ -69,7 +71,9 @@ if (cluster.isMaster) { }; var seg = XRay.getSegment(); + seg.addAnnotation('email', req.body.email); seg.addAnnotation('theme', req.body.theme); + seg.addAnnotation('previewAccess', req.body.previewAccess); ddb.putItem({ 'TableName': ddbTable, @@ -100,6 +104,47 @@ if (cluster.isMaster) { }); }); + app.post('/remoteSignup', function(req, res) { + var seg = XRay.getSegment(); + seg.addAnnotation('theme', req.body.theme); + seg.addAnnotation('previewAccess', req.body.previewAccess); + + var reqData = queryString.stringify(req.body); + + var options = { + host: apiCNAME, + port: '80', + path: '/signup', + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Content-Length': Buffer.byteLength(reqData) + } + }; + + // Set up the request + var remoteReq = http.request(options, function(remoteRes) { + var body = ''; + remoteRes.setEncoding('utf8'); + + remoteRes.on('data', function(chunk) { + body += chunk; + }); + + remoteRes.on('end', function() { + res.status(remoteRes.statusCode).send(body); + }); + }); + + remoteReq.on('error', function(err) { + res.status(500).end("Remote error"); + }); + + // post the data + remoteReq.write(reqData); + remoteReq.end(); + }); + app.use(XRay.express.closeSegment()); var port = process.env.PORT || 3000; diff --git a/package.json b/package.json index c0e2982..737efba 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "express": "4.14.0", "body-parser": "1.16.0", "querystring": "0.2.0", - "aws-xray-sdk": "1.0.0-beta" + "aws-xray-sdk": "1.1.0" }, "scripts": { "start": "node app.js" From aee54deecfc17355fb59175fc47e751bd6ac7630 Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Wed, 19 Apr 2017 14:34:28 -0700 Subject: [PATCH 6/7] Adding sampling-rules.json --- .gitignore | 5 +++++ sampling-rules.json | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 sampling-rules.json diff --git a/.gitignore b/.gitignore index 864660f..4651c08 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,8 @@ # Elastic Beanstalk CLI Files .elasticbeanstalk/* + +# Elastic Beanstalk Files +.elasticbeanstalk/* +!.elasticbeanstalk/*.cfg.yml +!.elasticbeanstalk/*.global.yml diff --git a/sampling-rules.json b/sampling-rules.json new file mode 100644 index 0000000..b7f57fd --- /dev/null +++ b/sampling-rules.json @@ -0,0 +1,7 @@ +{ + "version": 1, + "default": { + "fixed_target": 1, + "rate": 1.0 + } +} \ No newline at end of file From bfed3af788d4e440b316d959860f1cc02e551d09 Mon Sep 17 00:00:00 2001 From: William Armiros Date: Thu, 21 May 2020 14:19:43 -0500 Subject: [PATCH 7/7] Updated deps and fixed frontend --- .gitignore | 2 ++ package.json | 5 ++--- views/index.ejs | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 4651c08..a996717 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ .DS_Store +node_modules +package-lock.json # Elastic Beanstalk CLI Files .elasticbeanstalk/* diff --git a/package.json b/package.json index 737efba..780d139 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,11 @@ "private": true, "dependencies": { "ejs": "2.5.5", - "http": "0.0.0", - "aws-sdk": "2.9.0", + "aws-sdk": "2.682.0", "express": "4.14.0", "body-parser": "1.16.0", "querystring": "0.2.0", - "aws-xray-sdk": "1.1.0" + "aws-xray-sdk": "3.0.1" }, "scripts": { "start": "node app.js" diff --git a/views/index.ejs b/views/index.ejs index 1cd08bd..807cbe6 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -121,15 +121,15 @@ var interval = null; function generateSignupRequest() { - $.getJSON('http://uinames.com/api/?ext', function(data) { - $('#status').html("Status: request #" + index + ", signing up " + data.email); + const random = Math.random().toString(36).substring(3); + const data = { name: 'name-' + random, surname: 'surname-' + random, email: 'email-' + random + '@aws-xray-testing.com' }; + $('#status').html("Status: request #" + index + ", signing up " + data.email); $.post( "/signup", { name: data.name + " " + data.surname, email: data.email, theme: "flatly", previewAccess: "Yes" - }); - }); + }); } function generateDuplicateSignupRequest() {