updates to cloudant health monitoring (#162)

diff --git a/provider/app.js b/provider/app.js
index 0bfd33d..fc9149d 100644
--- a/provider/app.js
+++ b/provider/app.js
@@ -35,7 +35,7 @@
 var databaseName = dbPrefix + constants.TRIGGER_DB_SUFFIX;
 var redisUrl = process.env.REDIS_URL;
 var monitoringAuth = process.env.MONITORING_AUTH;
-var monitoringInterval = process.env.MONITORING_INTERVAL;
+var monitoringInterval = process.env.MONITORING_INTERVAL || constants.MONITOR_INTERVAL;
 var filterDDName = '_design/' + constants.FILTERS_DESIGN_DOC;
 var viewDDName = '_design/' + constants.VIEWS_DESIGN_DOC;
 
@@ -219,8 +219,8 @@
 
         if (monitoringAuth) {
             setInterval(function () {
-                providerHealth.monitor(monitoringAuth);
-            }, monitoringInterval || constants.MONITOR_INTERVAL);
+                providerHealth.monitor(monitoringAuth, monitoringInterval);
+            }, monitoringInterval);
         }
     })
     .catch(err => {
diff --git a/provider/lib/health.js b/provider/lib/health.js
index eb2832d..b13d6ad 100644
--- a/provider/lib/health.js
+++ b/provider/lib/health.js
@@ -45,7 +45,7 @@
         });
     };
 
-    this.monitor = function(apikey) {
+    this.monitor = function(apikey, monitoringInterval) {
         var method = 'monitor';
 
         var auth = apikey.split(':');
@@ -63,9 +63,6 @@
             var existingTriggerID = `:_:${triggerName}`;
             var existingCanaryID = canaryDocID;
 
-            //delete trigger feed from database
-            healthMonitor.deleteDocFromDB(existingTriggerID, 0);
-
             //delete the trigger
             var uri = utils.uriHost + '/api/v1/namespaces/_/triggers/' + triggerName;
             healthMonitor.deleteTrigger(existingTriggerID, uri, auth, 0);
@@ -89,7 +86,14 @@
         .then(info => {
             logger.info(method, triggerID, info);
             var newTrigger = healthMonitor.createCloudantTrigger(triggerID, apikey);
-            healthMonitor.createDocInDB(triggerID, newTrigger);
+            utils.createTrigger(newTrigger);
+            setTimeout(function () {
+                var canaryDoc = {
+                    isCanaryDoc: true,
+                    host: utils.host
+                };
+                healthMonitor.createDocInDB(canaryDocID, canaryDoc);
+            }, monitoringInterval / 3);
         })
         .catch(err => {
             logger.error(method, triggerID, err);
@@ -114,6 +118,8 @@
             filter: constants.MONITOR_DESIGN_DOC + '/' + constants.DOCS_FOR_MONITOR,
             query_params: {host: utils.host},
             maxTriggers: 1,
+            triggersLeft: 1,
+            since: 'now',
             worker: utils.worker,
             monitor: utils.host
         };
@@ -151,15 +157,6 @@
         utils.db.insert(doc, docID, function (err) {
             if (!err) {
                 logger.info(method, docID, 'was successfully inserted');
-                if (doc.monitor) {
-                    setTimeout(function () {
-                        var canaryDoc = {
-                            isCanaryDoc: true,
-                            host: utils.host
-                        };
-                        healthMonitor.createDocInDB(canaryDocID, canaryDoc);
-                    }, 1000 * 60);
-                }
             }
             else {
                 logger.error(method, docID, err);
diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index 7906c36..3e38e1a 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -73,6 +73,9 @@
 
                 feed.on('confirm', function () {
                     logger.info(method, 'Added cloudant data trigger', dataTrigger.id, 'listening for changes in database', dataTrigger.dbname);
+                    if (utils.isMonitoringTrigger(dataTrigger.monitor, dataTrigger.id)) {
+                        utils.monitorStatus.triggerStarted = "success";
+                    }
                     resolve(dataTrigger.id);
                 });
             });
@@ -100,8 +103,7 @@
             maxTriggers: maxTriggers,
             triggersLeft: maxTriggers,
             filter: newTrigger.filter,
-            query_params: newTrigger.query_params,
-            monitor: newTrigger.monitor
+            query_params: newTrigger.query_params
         };
 
         return trigger;
@@ -157,7 +159,7 @@
     };
 
     // Delete a trigger: stop listening for changes and remove it.
-    this.deleteTrigger = function(triggerIdentifier) {
+    this.deleteTrigger = function(triggerIdentifier, isMonitoringTrigger) {
         var method = 'deleteTrigger';
 
         if (utils.triggers[triggerIdentifier]) {
@@ -167,6 +169,10 @@
 
             delete utils.triggers[triggerIdentifier];
             logger.info(method, 'trigger', triggerIdentifier, 'successfully deleted from memory');
+
+            if (utils.isMonitoringTrigger(isMonitoringTrigger, triggerIdentifier)) {
+                utils.monitorStatus.triggerStopped = "success";
+            }
         }
     };
 
@@ -192,8 +198,13 @@
                 utils.monitorStatus.triggerFired = "success";
             }
             if (dataTrigger.triggersLeft === 0) {
-                utils.disableTrigger(triggerId, undefined, 'Automatically disabled after reaching max triggers');
-                logger.warn(method, 'no more triggers left, disabled', triggerId);
+                if (dataTrigger.monitor) {
+                    utils.deleteTrigger(triggerId, dataTrigger.monitor);
+                }
+                else {
+                    utils.disableTrigger(triggerId, undefined, 'Automatically disabled after reaching max triggers');
+                    logger.warn(method, 'no more triggers left, disabled', triggerId);
+                }
             }
         })
         .catch(err => {
@@ -276,7 +287,7 @@
                     var triggerIdentifier = trigger.id;
                     var doc = trigger.doc;
 
-                    if (!(triggerIdentifier in utils.triggers) && !doc.monitor) {
+                    if (!(triggerIdentifier in utils.triggers)) {
                         //check if trigger still exists in whisk db
                         var triggerObj = utils.parseQName(triggerIdentifier);
                         var host = 'https://' + utils.routerHost + ':' + 443;
@@ -336,20 +347,14 @@
                 if (utils.triggers[triggerIdentifier]) {
                     if (doc.status && doc.status.active === false) {
                         utils.deleteTrigger(triggerIdentifier);
-                        if (utils.isMonitoringTrigger(doc.monitor, triggerIdentifier)) {
-                            utils.monitorStatus.triggerStopped = "success";
-                        }
                     }
                 }
                 else {
                     //ignore changes to disabled triggers
-                    if ((!doc.status || doc.status.active === true) && (!doc.monitor || doc.monitor === utils.host)) {
+                    if (!doc.status || doc.status.active === true) {
                         utils.createTrigger(utils.initTrigger(doc))
                         .then(triggerIdentifier => {
                             logger.info(method, triggerIdentifier, 'created successfully');
-                            if (utils.isMonitoringTrigger(doc.monitor, triggerIdentifier)) {
-                                utils.monitorStatus.triggerStarted = "success";
-                            }
                         })
                         .catch(err => {
                             var message = 'Automatically disabled after receiving exception on create trigger: ' + err;