You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2015/08/20 17:23:11 UTC
ambari git commit: AMBARI-12833. Improve alert definitions and alert
definitions summary mappers (onechiporenko)
Repository: ambari
Updated Branches:
refs/heads/branch-2.1 6dea805f6 -> 30b1f29d1
AMBARI-12833. Improve alert definitions and alert definitions summary mappers (onechiporenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/30b1f29d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/30b1f29d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/30b1f29d
Branch: refs/heads/branch-2.1
Commit: 30b1f29d16315d4e3968520df041de500181cad3
Parents: 6dea805
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Thu Aug 20 18:21:12 2015 +0300
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Thu Aug 20 18:21:12 2015 +0300
----------------------------------------------------------------------
.../controllers/global/cluster_controller.js | 2 +
.../main/alert_definitions_controller.js | 22 --------
.../mappers/alert_definition_summary_mapper.js | 56 +++++++++++++++++---
.../app/mappers/alert_definitions_mapper.js | 29 ++++++++--
ambari-web/app/mappers/alert_groups_mapper.js | 1 +
.../app/mappers/alert_instances_mapper.js | 2 +
ambari-web/app/models/service.js | 21 ++++----
.../app/views/main/alert_definitions_view.js | 14 +++--
8 files changed, 102 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/30b1f29d/ambari-web/app/controllers/global/cluster_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/cluster_controller.js b/ambari-web/app/controllers/global/cluster_controller.js
index 8bb4950..b0ae730 100644
--- a/ambari-web/app/controllers/global/cluster_controller.js
+++ b/ambari-web/app/controllers/global/cluster_controller.js
@@ -245,10 +245,12 @@ App.ClusterController = Em.Controller.extend({
});
// alerts loading doesn't affect overall progress
+ console.time('Overall alerts loading time');
updater.updateAlertGroups(function () {
updater.updateAlertDefinitions(function () {
updater.updateAlertDefinitionSummary(function () {
updater.updateUnhealthyAlertInstances(function () {
+ console.timeEnd('Overall alerts loading time');
self.set('isAlertsLoaded', true);
});
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/30b1f29d/ambari-web/app/controllers/main/alert_definitions_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/alert_definitions_controller.js b/ambari-web/app/controllers/main/alert_definitions_controller.js
index e77ee6d..58eecf5 100644
--- a/ambari-web/app/controllers/main/alert_definitions_controller.js
+++ b/ambari-web/app/controllers/main/alert_definitions_controller.js
@@ -78,28 +78,6 @@ App.MainAlertDefinitionsController = Em.ArrayController.extend({
},
/**
- * Calculate critical count for each service, to show up the label on services menu
- * @method getCriticalAlertsCountForService
- * @return {Number}
- */
- getCriticalAlertsCountForService: function (service) {
- return this.get('content').filterProperty('service.serviceName', service).
- invoke('getWithDefault', 'summary.CRITICAL.count', 0).
- reduce(Em.sum, 0);
- },
-
- /**
- * Calculate critical/warning count for each service, to show up the label on services menu
- * @method getCriticalOrWarningAlertsCountForService
- * @return {Number}
- */
- getCriticalOrWarningAlertsCountForService: function (service) {
- return this.get('content').filterProperty('service.serviceName', service).map(function (alertDefinition) {
- return alertDefinition.getWithDefault('summary.CRITICAL.count', 0) + alertDefinition.getWithDefault('summary.WARNING.count', 0);
- }).reduce(Em.sum, 0);
- },
-
- /**
* ========================== alerts popup dialog =========================
*/
http://git-wip-us.apache.org/repos/asf/ambari/blob/30b1f29d/ambari-web/app/mappers/alert_definition_summary_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/alert_definition_summary_mapper.js b/ambari-web/app/mappers/alert_definition_summary_mapper.js
index 20b5ae4..04cec55 100644
--- a/ambari-web/app/mappers/alert_definition_summary_mapper.js
+++ b/ambari-web/app/mappers/alert_definition_summary_mapper.js
@@ -16,16 +16,24 @@
*/
var App = require('app');
+var dataManipulation = require('utils/data_manipulation');
App.alertDefinitionSummaryMapper = App.QuickDataMapper.create({
config: {},
map: function(data) {
+ console.time('App.alertDefinitionSummaryMapper execution time');
+
if (!data.alerts_summary_grouped) return;
var alertDefinitions = App.AlertDefinition.find();
+ var alertDefinitionsMap = {};
+ alertDefinitions.forEach(function (definition) {
+ alertDefinitionsMap[definition.get('id')] = definition;
+ });
+ var summaryMap = {};
data.alerts_summary_grouped.forEach(function(alertDefinitionSummary) {
- var alertDefinition = alertDefinitions.findProperty('id', alertDefinitionSummary.definition_id);
+ var alertDefinition = alertDefinitionsMap[alertDefinitionSummary.definition_id];
if (alertDefinition) {
var summary = {},
timestamp = 0;
@@ -41,19 +49,53 @@ App.alertDefinitionSummaryMapper = App.QuickDataMapper.create({
timestamp = alertDefinitionSummary.summary[status].original_timestamp;
}
});
- alertDefinition.setProperties({
+ summaryMap[alertDefinitionSummary.definition_id] = {
summary: summary,
lastTriggered: parseInt(timestamp)
- });
+ };
}
});
- // clear summary for disabled alert definitions
- alertDefinitions.forEach(function (definition) {
- if (!definition.get('enabled')) {
- definition.set('summary', {});
+ alertDefinitions.forEach(function (d) {
+ var id = d.get('id');
+ alertDefinitionsMap[id].setProperties(summaryMap[id]);
+ if (!alertDefinitionsMap[id].get('enabled')) {
+ // clear summary for disabled alert definitions
+ alertDefinitionsMap[id].set('summary', {});
+ }
+ });
+ // set alertsCount and hasCriticalAlerts for each service
+ var groupedByServiceName = dataManipulation.groupPropertyValues(alertDefinitions, 'service.serviceName');
+ var services = App.Service.find();
+ var servicesMap = {};
+ services.forEach(function (service) {
+ servicesMap[service.get('id')] = service;
+ });
+ Object.keys(groupedByServiceName).forEach(function(serviceName) {
+ var service = servicesMap[serviceName];
+ if (service) {
+ var hasCriticalAlerts = false;
+
+ var alertsCount = groupedByServiceName[serviceName].map(function (alertDefinition) {
+
+ var criticalCount = alertDefinition.getWithDefault('summary.CRITICAL.count', 0);
+ var warningCount = alertDefinition.getWithDefault('summary.WARNING.count', 0);
+
+ if (criticalCount) {
+ hasCriticalAlerts = true;
+ }
+ return criticalCount + warningCount;
+
+ }).reduce(Em.sum, 0);
+
+ service.setProperties({
+ alertsCount: alertsCount,
+ hasCriticalAlerts: hasCriticalAlerts
+ });
}
});
+ console.timeEnd('App.alertDefinitionSummaryMapper execution time');
+
}
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/30b1f29d/ambari-web/app/mappers/alert_definitions_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/alert_definitions_mapper.js b/ambari-web/app/mappers/alert_definitions_mapper.js
index 29c1c97..80d175e 100644
--- a/ambari-web/app/mappers/alert_definitions_mapper.js
+++ b/ambari-web/app/mappers/alert_definitions_mapper.js
@@ -70,8 +70,8 @@ App.alertDefinitionsMapper = App.QuickDataMapper.create({
},
map: function (json) {
+ console.time('App.alertDefinitionsMapper execution time');
if (json && json.items) {
-
var self = this,
alertDefinitions = [],
alertReportDefinitions = [],
@@ -79,9 +79,14 @@ App.alertDefinitionsMapper = App.QuickDataMapper.create({
alertMetricsUriDefinitions = [],
alertGroupsMap = App.cache['previousAlertGroupsMap'],
existingAlertDefinitions = App.AlertDefinition.find(),
+ existingAlertDefinitionsMap = {},
alertDefinitionsToDelete = existingAlertDefinitions.mapProperty('id'),
rawSourceData = {};
+ existingAlertDefinitions.forEach(function (d) {
+ existingAlertDefinitionsMap[d.get('id')] = d;
+ });
+
json.items.forEach(function (item) {
var convertedReportDefinitions = [];
var reporting = item.AlertDefinition.source.reporting;
@@ -116,7 +121,7 @@ App.alertDefinitionsMapper = App.QuickDataMapper.create({
alertDefinition.groups = alertGroupsMap[alertDefinition.id];
}
- var oldAlertDefinition = existingAlertDefinitions.findProperty('id', alertDefinition.id);
+ var oldAlertDefinition = existingAlertDefinitionsMap[alertDefinition.id];
if (oldAlertDefinition) {
// new values will be parsed in the another mapper, so for now just use old values
alertDefinition.summary = oldAlertDefinition.get('summary');
@@ -187,10 +192,12 @@ App.alertDefinitionsMapper = App.QuickDataMapper.create({
App.store.loadMany(this.get('metricsSourceModel'), alertMetricsSourceDefinitions);
this.setMetricsSourcePropertyLists(this.get('metricsSourceModel'), alertMetricsSourceDefinitions);
App.store.loadMany(this.get('metricsUriModel'), alertMetricsUriDefinitions);
+ // this loadMany takes too much time
App.store.loadMany(this.get('model'), alertDefinitions);
this.setAlertDefinitionsRawSourceData(rawSourceData);
App.store.commit();
}
+ console.timeEnd('App.alertDefinitionsMapper execution time');
},
/**
@@ -199,8 +206,15 @@ App.alertDefinitionsMapper = App.QuickDataMapper.create({
* @param data
*/
setMetricsSourcePropertyLists: function (model, data) {
+ var modelsMap = {};
+ model.find().forEach(function (m) {
+ modelsMap[m.get('id')] = m;
+ });
data.forEach(function (record) {
- model.find().findProperty('id', record.id).set('propertyList', record.property_list);
+ var m = modelsMap[record.id];
+ if (m) {
+ m.set('propertyList', record.property_list);
+ }
});
},
@@ -210,9 +224,16 @@ App.alertDefinitionsMapper = App.QuickDataMapper.create({
*/
setAlertDefinitionsRawSourceData: function (rawSourceData) {
var allDefinitions = App.AlertDefinition.find();
+ var allDefinitionsMap = {};
+ allDefinitions.forEach(function(d) {
+ allDefinitionsMap[d.get('id')] = d;
+ });
for (var alertDefinitionId in rawSourceData) {
if (rawSourceData.hasOwnProperty(alertDefinitionId)) {
- allDefinitions.findProperty('id', +alertDefinitionId).set('rawSourceData', rawSourceData[alertDefinitionId]);
+ var m = allDefinitionsMap[+alertDefinitionId];
+ if (m) {
+ m.set('rawSourceData', rawSourceData[alertDefinitionId]);
+ }
}
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/30b1f29d/ambari-web/app/mappers/alert_groups_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/alert_groups_mapper.js b/ambari-web/app/mappers/alert_groups_mapper.js
index fffbd2c..c079c21 100644
--- a/ambari-web/app/mappers/alert_groups_mapper.js
+++ b/ambari-web/app/mappers/alert_groups_mapper.js
@@ -108,6 +108,7 @@ App.alertGroupsMapper = App.QuickDataMapper.create({
App.cache['previousAlertGroupsMap'] = alertDefinitionsGroupsMap;
App.cache['previousAlertGroupsFullMap'] = groupsMap;
App.cache['alertNotificationsGroupsMap'] = alertNotificationsGroupsMap;
+ // initial load takes much more time than others, but it's OK (all data should be saved first time)
App.store.loadMany(this.get('model'), alertGroups);
App.store.commit();
console.timeEnd('App.alertGroupsMapper execution time');
http://git-wip-us.apache.org/repos/asf/ambari/blob/30b1f29d/ambari-web/app/mappers/alert_instances_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/alert_instances_mapper.js b/ambari-web/app/mappers/alert_instances_mapper.js
index eabc9f8..af6804f 100644
--- a/ambari-web/app/mappers/alert_instances_mapper.js
+++ b/ambari-web/app/mappers/alert_instances_mapper.js
@@ -41,6 +41,7 @@ App.alertInstanceMapper = App.QuickDataMapper.create({
},
map: function(json) {
+ console.time('App.alertInstanceMapper execution time');
if (json.items) {
var alertInstances = [];
var model = this.get('model');
@@ -57,6 +58,7 @@ App.alertInstanceMapper = App.QuickDataMapper.create({
}
App.store.loadMany(this.get('model'), alertInstances);
+ console.timeEnd('App.alertInstanceMapper execution time');
}
}
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/30b1f29d/ambari-web/app/models/service.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/service.js b/ambari-web/app/models/service.js
index 564cbae..250f810 100644
--- a/ambari-web/app/models/service.js
+++ b/ambari-web/app/models/service.js
@@ -150,15 +150,18 @@ App.Service = DS.Model.extend({
return this.t('services.service.config.restartService.TooltipMessage').format(hcCount, hostCount, hostsMsg);
}.property('restartRequiredHostsAndComponents'),
- hasCriticalAlerts: function () {
- var controller = App.router.get('mainAlertDefinitionsController');
- return controller.getCriticalAlertsCountForService(this.get('serviceName')) > 0;
- }.property('alertsCount'),
-
- alertsCount: function () {
- var controller = App.router.get('mainAlertDefinitionsController');
- return controller.getCriticalOrWarningAlertsCountForService(this.get('serviceName'));
- }.property('App.router.mainAlertDefinitionsController.content.@each.isCriticalOrWarning')
+ /**
+ * Does service have Critical Alerts
+ * @type {boolean}
+ */
+ hasCriticalAlerts: false,
+
+ /**
+ * Number of the Critical and Warning alerts for current service
+ * @type {number}
+ */
+ alertsCount: 0
+
});
App.Service.Health = {
http://git-wip-us.apache.org/repos/asf/ambari/blob/30b1f29d/ambari-web/app/views/main/alert_definitions_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/alert_definitions_view.js b/ambari-web/app/views/main/alert_definitions_view.js
index e5e81bf..8c52a98 100644
--- a/ambari-web/app/views/main/alert_definitions_view.js
+++ b/ambari-web/app/views/main/alert_definitions_view.js
@@ -25,9 +25,16 @@ App.MainAlertDefinitionsView = App.TableView.extend({
templateName: require('templates/main/alerts'),
- content: function() {
- return this.get('controller.content') ? this.get('controller.content').toArray().sort(App.AlertDefinition.getSortDefinitionsByStatus(true)) : [];
- }.property('controller.content.@each'),
+ content: [],
+
+ contentObs: function () {
+ Em.run.once(this, this.contentObsOnce);
+ }.observes('controller.content.[]'),
+
+ contentObsOnce: function() {
+ var content = this.get('controller.content') ? this.get('controller.content').toArray().sort(App.AlertDefinition.getSortDefinitionsByStatus(true)) : [];
+ this.set('content', content);
+ },
willInsertElement: function () {
if (!this.get('controller.showFilterConditionsFirstLoad')) {
@@ -55,6 +62,7 @@ App.MainAlertDefinitionsView = App.TableView.extend({
var self = this;
Em.run.next(function () {
self.set('isInitialRendering', false);
+ self.contentObsOnce();
self.tooltipsUpdater();
});
},