diff --git a/server/portal_server.js b/server/portal_server.js index f5ec0bcc..9dc2cf01 100644 --- a/server/portal_server.js +++ b/server/portal_server.js @@ -21,10 +21,13 @@ const log = mozlog('portal.server'); const app = express(); -app.engine('handlebars', exphbs({ - defaultLayout: 'main', - partialsDir: 'views/partials/' -})); +app.engine( + 'handlebars', + exphbs({ + defaultLayout: 'main', + partialsDir: 'views/partials/' + }) +); app.set('view engine', 'handlebars'); app.use(helmet()); @@ -32,7 +35,6 @@ app.use(busboy()); app.use(bodyParser.json()); app.use(express.static(path.join(__dirname, '../public'))); - app.get('/', (req, res) => { res.render('index', { shouldRenderAnalytics: notLocalHost, @@ -155,6 +157,10 @@ app.get('/__lbheartbeat__', (req, res) => { res.sendStatus(200); }); +app.get('/__heartbeat__', (req, res) => { + storage.ping().then(() => res.sendStatus(200), () => res.sendStatus(500)); +}); + app.listen(conf.listen_port, () => { log.info('startServer:', `Portal app listening on port ${conf.listen_port}!`); }); diff --git a/server/storage.js b/server/storage.js index 63b1bbdc..9d089fa1 100644 --- a/server/storage.js +++ b/server/storage.js @@ -14,7 +14,8 @@ const log = mozlog('portal.storage'); const redis = require('redis'); const redis_client = redis.createClient({ - host: conf.redis_host + host: conf.redis_host, + connect_timeout: 10000 }); redis_client.on('error', err => { @@ -29,7 +30,8 @@ if (notLocalHost) { get: awsGet, set: awsSet, delete: awsDelete, - forceDelete: awsForceDelete + forceDelete: awsForceDelete, + ping: awsPing }; } else { module.exports = { @@ -39,7 +41,8 @@ if (notLocalHost) { get: localGet, set: localSet, delete: localDelete, - forceDelete: localForceDelete + forceDelete: localForceDelete, + ping: localPing }; } @@ -124,6 +127,14 @@ function localForceDelete(id) { }); } +function localPing() { + return new Promise((resolve, reject) => { + redis_client.ping(err => { + return err ? reject() : resolve(); + }); + }); +} + function awsLength(id) { const params = { Bucket: conf.s3_bucket, @@ -215,3 +226,9 @@ function awsForceDelete(id) { }); }); } + +function awsPing() { + return localPing().then(() => + s3.headBucket({ Bucket: conf.s3_bucket }).promise() + ); +}