diff options
Diffstat (limited to 'web/gui/src/dashboard.js/alarms.js')
-rw-r--r-- | web/gui/src/dashboard.js/alarms.js | 422 |
1 files changed, 0 insertions, 422 deletions
diff --git a/web/gui/src/dashboard.js/alarms.js b/web/gui/src/dashboard.js/alarms.js deleted file mode 100644 index 82477671..00000000 --- a/web/gui/src/dashboard.js/alarms.js +++ /dev/null @@ -1,422 +0,0 @@ - -// Registry of netdata hosts - -NETDATA.alarms = { - onclick: null, // the callback to handle the click - it will be called with the alarm log entry - chart_div_offset: -50, // give that space above the chart when scrolling to it - chart_div_id_prefix: 'chart_', // the chart DIV IDs have this prefix (they should be NETDATA.name2id(chart.id)) - chart_div_animation_duration: 0,// the duration of the animation while scrolling to a chart - - ms_penalty: 0, // the time penalty of the next alarm - ms_between_notifications: 500, // firefox moves the alarms off-screen (above, outside the top of the screen) - // if alarms are shown faster than: one per 500ms - - update_every: 10000, // the time in ms between alarm checks - - notifications: false, // when true, the browser supports notifications (may not be granted though) - last_notification_id: 0, // the id of the last alarm_log we have raised an alarm for - first_notification_id: 0, // the id of the first alarm_log entry for this session - // this is used to prevent CLEAR notifications for past events - // notifications_shown: [], - - server: null, // the server to connect to for fetching alarms - current: null, // the list of raised alarms - updated in the background - - // a callback function to call every time the list of raised alarms is refreshed - callback: (typeof netdataAlarmsActiveCallback === 'function') ? netdataAlarmsActiveCallback : null, - - // a callback function to call every time a notification is shown - // the return value is used to decide if the notification will be shown - notificationCallback: (typeof netdataAlarmsNotifCallback === 'function') ? netdataAlarmsNotifCallback : null, - - recipients: null, // the list (array) of recipients to show alarms for, or null - - recipientMatches: function (to_string, wanted_array) { - if (typeof wanted_array === 'undefined' || wanted_array === null || Array.isArray(wanted_array) === false) { - return true; - } - - let r = ' ' + to_string.toString() + ' '; - let len = wanted_array.length; - while (len--) { - if (r.indexOf(' ' + wanted_array[len] + ' ') >= 0) { - return true; - } - } - - return false; - }, - - activeForRecipients: function () { - let active = {}; - let data = NETDATA.alarms.current; - - if (typeof data === 'undefined' || data === null) { - return active; - } - - for (let x in data.alarms) { - if (!data.alarms.hasOwnProperty(x)) { - continue; - } - - let alarm = data.alarms[x]; - if ((alarm.status === 'WARNING' || alarm.status === 'CRITICAL') && NETDATA.alarms.recipientMatches(alarm.recipient, NETDATA.alarms.recipients)) { - active[x] = alarm; - } - } - - return active; - }, - - notify: function (entry) { - // console.log('alarm ' + entry.unique_id); - - if (entry.updated) { - // console.log('alarm ' + entry.unique_id + ' has been updated by another alarm'); - return; - } - - let value_string = entry.value_string; - - if (NETDATA.alarms.current !== null) { - // get the current value_string - let t = NETDATA.alarms.current.alarms[entry.chart + '.' + entry.name]; - if (typeof t !== 'undefined' && entry.status === t.status && typeof t.value_string !== 'undefined') { - value_string = t.value_string; - } - } - - let name = entry.name.replace(/_/g, ' '); - let status = entry.status.toLowerCase(); - let title = name + ' = ' + value_string.toString(); - let tag = entry.alarm_id; - let icon = 'images/banner-icon-144x144.png'; - let interaction = false; - let data = entry; - let show = true; - - // console.log('alarm ' + entry.unique_id + ' ' + entry.chart + '.' + entry.name + ' is ' + entry.status); - - switch (entry.status) { - case 'REMOVED': - show = false; - break; - - case 'UNDEFINED': - return; - - case 'UNINITIALIZED': - return; - - case 'CLEAR': - if (entry.unique_id < NETDATA.alarms.first_notification_id) { - // console.log('alarm ' + entry.unique_id + ' is not current'); - return; - } - if (entry.old_status === 'UNINITIALIZED' || entry.old_status === 'UNDEFINED') { - // console.log('alarm' + entry.unique_id + ' switch to CLEAR from ' + entry.old_status); - return; - } - if (entry.no_clear_notification) { - // console.log('alarm' + entry.unique_id + ' is CLEAR but has no_clear_notification flag'); - return; - } - title = name + ' back to normal (' + value_string.toString() + ')'; - icon = 'images/check-mark-2-128-green.png'; - interaction = false; - break; - - case 'WARNING': - if (entry.old_status === 'CRITICAL') { - status = 'demoted to ' + entry.status.toLowerCase(); - } - - icon = 'images/alert-128-orange.png'; - interaction = false; - break; - - case 'CRITICAL': - if (entry.old_status === 'WARNING') { - status = 'escalated to ' + entry.status.toLowerCase(); - } - - icon = 'images/alert-128-red.png'; - interaction = true; - break; - - default: - console.log('invalid alarm status ' + entry.status); - return; - } - - // filter recipients - if (show) { - show = NETDATA.alarms.recipientMatches(entry.recipient, NETDATA.alarms.recipients); - } - - /* - // cleanup old notifications with the same alarm_id as this one - // it does not seem to work on any web browser - so notifications cannot be removed - - let len = NETDATA.alarms.notifications_shown.length; - while (len--) { - let n = NETDATA.alarms.notifications_shown[len]; - if (n.data.alarm_id === entry.alarm_id) { - console.log('removing old alarm ' + n.data.unique_id); - - // close the notification - n.close.bind(n); - - // remove it from the array - NETDATA.alarms.notifications_shown.splice(len, 1); - len = NETDATA.alarms.notifications_shown.length; - } - } - */ - - if (show) { - if (typeof NETDATA.alarms.notificationCallback === 'function') { - show = NETDATA.alarms.notificationCallback(entry); - } - - if (show) { - setTimeout(function () { - // show this notification - // console.log('new notification: ' + title); - let n = new Notification(title, { - body: entry.hostname + ' - ' + entry.chart + ' (' + entry.family + ') - ' + status + ': ' + entry.info, - tag: tag, - requireInteraction: interaction, - icon: NETDATA.serverStatic + icon, - data: data - }); - - n.onclick = function (event) { - event.preventDefault(); - NETDATA.alarms.onclick(event.target.data); - }; - - // console.log(n); - // NETDATA.alarms.notifications_shown.push(n); - // console.log(entry); - }, NETDATA.alarms.ms_penalty); - - NETDATA.alarms.ms_penalty += NETDATA.alarms.ms_between_notifications; - } - } - }, - - scrollToChart: function (chart_id) { - if (typeof chart_id === 'string') { - let offset = $('#' + NETDATA.alarms.chart_div_id_prefix + NETDATA.name2id(chart_id)).offset(); - if (typeof offset !== 'undefined') { - $('html, body').animate({scrollTop: offset.top + NETDATA.alarms.chart_div_offset}, NETDATA.alarms.chart_div_animation_duration); - return true; - } - } - return false; - }, - - scrollToAlarm: function (alarm) { - if (typeof alarm === 'object') { - let ret = NETDATA.alarms.scrollToChart(alarm.chart); - - if (ret && NETDATA.options.page_is_visible === false) { - window.focus(); - } - // alert('netdata dashboard will now scroll to chart: ' + alarm.chart + '\n\nThis alarm opened to bring the browser window in front of the screen. Click on the dashboard to prevent it from appearing again.'); - } - - }, - - notifyAll: function () { - // console.log('FETCHING ALARM LOG'); - NETDATA.alarms.get_log(NETDATA.alarms.last_notification_id, function (data) { - // console.log('ALARM LOG FETCHED'); - - if (data === null || typeof data !== 'object') { - console.log('invalid alarms log response'); - return; - } - - if (data.length === 0) { - console.log('received empty alarm log'); - return; - } - - // console.log('received alarm log of ' + data.length + ' entries, from ' + data[data.length - 1].unique_id.toString() + ' to ' + data[0].unique_id.toString()); - - data.sort(function (a, b) { - if (a.unique_id > b.unique_id) { - return -1; - } - if (a.unique_id < b.unique_id) { - return 1; - } - return 0; - }); - - NETDATA.alarms.ms_penalty = 0; - - let len = data.length; - while (len--) { - if (data[len].unique_id > NETDATA.alarms.last_notification_id) { - NETDATA.alarms.notify(data[len]); - } - //else - // console.log('ignoring alarm (older) with id ' + data[len].unique_id.toString()); - } - - NETDATA.alarms.last_notification_id = data[0].unique_id; - - if (typeof netdataAlarmsRemember === 'undefined' || netdataAlarmsRemember) { - NETDATA.localStorageSet('last_notification_id', NETDATA.alarms.last_notification_id, null); - } - // console.log('last notification id = ' + NETDATA.alarms.last_notification_id); - }) - }, - - check_notifications: function () { - // returns true if we should fire 1+ notifications - - if (NETDATA.alarms.notifications !== true) { - // console.log('web notifications are not available'); - return false; - } - - if (Notification.permission !== 'granted') { - // console.log('web notifications are not granted'); - return false; - } - - if (typeof NETDATA.alarms.current !== 'undefined' && typeof NETDATA.alarms.current.alarms === 'object') { - // console.log('can do alarms: old id = ' + NETDATA.alarms.last_notification_id + ' new id = ' + NETDATA.alarms.current.latest_alarm_log_unique_id); - - if (NETDATA.alarms.current.latest_alarm_log_unique_id > NETDATA.alarms.last_notification_id) { - // console.log('new alarms detected'); - return true; - } - //else console.log('no new alarms'); - } - // else console.log('cannot process alarms'); - - return false; - }, - - get: function (what, callback) { - $.ajax({ - url: NETDATA.alarms.server + '/api/v1/alarms?' + what.toString(), - async: true, - cache: false, - headers: { - 'Cache-Control': 'no-cache, no-store', - 'Pragma': 'no-cache' - }, - xhrFields: {withCredentials: true} // required for the cookie - }) - .done(function (data) { - data = NETDATA.xss.checkOptional('/api/v1/alarms', data /*, '.*\.(calc|calc_parsed|warn|warn_parsed|crit|crit_parsed)$' */); - - if (NETDATA.alarms.first_notification_id === 0 && typeof data.latest_alarm_log_unique_id === 'number') { - NETDATA.alarms.first_notification_id = data.latest_alarm_log_unique_id; - } - - if (typeof callback === 'function') { - return callback(data); - } - }) - .fail(function () { - NETDATA.error(415, NETDATA.alarms.server); - - if (typeof callback === 'function') { - return callback(null); - } - }); - }, - - update_forever: function () { - if (netdataShowAlarms !== true || netdataSnapshotData !== null) { - return; - } - - NETDATA.alarms.get('active', function (data) { - if (data !== null) { - NETDATA.alarms.current = data; - - if (NETDATA.alarms.check_notifications()) { - NETDATA.alarms.notifyAll(); - } - - if (typeof NETDATA.alarms.callback === 'function') { - NETDATA.alarms.callback(data); - } - - // Health monitoring is disabled on this netdata - if (data.status === false) { - return; - } - } - - setTimeout(NETDATA.alarms.update_forever, NETDATA.alarms.update_every); - }); - }, - - get_log: function (last_id, callback) { - // console.log('fetching all log after ' + last_id.toString()); - $.ajax({ - url: NETDATA.alarms.server + '/api/v1/alarm_log?after=' + last_id.toString(), - async: true, - cache: false, - headers: { - 'Cache-Control': 'no-cache, no-store', - 'Pragma': 'no-cache' - }, - xhrFields: {withCredentials: true} // required for the cookie - }) - .done(function (data) { - data = NETDATA.xss.checkOptional('/api/v1/alarm_log', data); - - if (typeof callback === 'function') { - return callback(data); - } - }) - .fail(function () { - NETDATA.error(416, NETDATA.alarms.server); - - if (typeof callback === 'function') { - return callback(null); - } - }); - }, - - init: function () { - NETDATA.alarms.server = NETDATA.fixHost(NETDATA.serverDefault); - - if (typeof netdataAlarmsRemember === 'undefined' || netdataAlarmsRemember) { - NETDATA.alarms.last_notification_id = - NETDATA.localStorageGet('last_notification_id', NETDATA.alarms.last_notification_id, null); - } - - if (NETDATA.alarms.onclick === null) { - NETDATA.alarms.onclick = NETDATA.alarms.scrollToAlarm; - } - - if (typeof netdataAlarmsRecipients !== 'undefined' && Array.isArray(netdataAlarmsRecipients)) { - NETDATA.alarms.recipients = netdataAlarmsRecipients; - } - - if (netdataShowAlarms) { - NETDATA.alarms.update_forever(); - - if ('Notification' in window) { - // console.log('notifications available'); - NETDATA.alarms.notifications = true; - - if (Notification.permission === 'default') { - Notification.requestPermission(); - } - } - } - } -}; |