alert_definitions_mapper.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. See the NOTICE file distributed with this
  4. * work for additional information regarding copyright ownership. The ASF
  5. * licenses this file to you under the Apache License, Version 2.0 (the
  6. * "License"); you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  13. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  14. * License for the specific language governing permissions and limitations under
  15. * the License.
  16. */
  17. var App = require('app');
  18. App.alertDefinitionsMapper = App.QuickDataMapper.create({
  19. model: App.AlertDefinition,
  20. reportModel: App.AlertReportDefinition,
  21. metricsSourceModel: App.AlertMetricsSourceDefinition,
  22. metricsUriModel: App.AlertMetricsUriDefinition,
  23. metricsAmsModel: App.AlertMetricsAmsDefinition,
  24. parameterModel: App.AlertDefinitionParameter,
  25. config: {
  26. id: 'AlertDefinition.id',
  27. name: 'AlertDefinition.name',
  28. description: 'AlertDefinition.description',
  29. label: 'AlertDefinition.label',
  30. service_id: 'AlertDefinition.service_name',
  31. service_name: 'AlertDefinition.service_name',
  32. component_name: 'AlertDefinition.component_name',
  33. enabled: 'AlertDefinition.enabled',
  34. repeat_tolerance_enabled: 'AlertDefinition.repeat_tolerance_enabled',
  35. repeat_tolerance: 'AlertDefinition.repeat_tolerance',
  36. scope: 'AlertDefinition.scope',
  37. interval: 'AlertDefinition.interval',
  38. help_url: 'AlertDefinition.help_url',
  39. type: 'AlertDefinition.source.type',
  40. reporting_key: 'reporting',
  41. reporting_type: 'array',
  42. reporting: {
  43. item: 'id'
  44. },
  45. parameters_key: 'parameters',
  46. parameters_type: 'array',
  47. parameters: {
  48. item: 'id'
  49. }
  50. },
  51. portConfig: {
  52. default_port: 'AlertDefinition.source.default_port',
  53. port_uri: 'AlertDefinition.source.uri'
  54. },
  55. aggregateConfig: {
  56. alert_name: 'AlertDefinition.source.alert_name'
  57. },
  58. scriptConfig: {
  59. location: 'AlertDefinition.source.path'
  60. },
  61. serverConfig: {
  62. },
  63. uriConfig: {
  64. id: 'AlertDefinition.source.uri.id',
  65. http: 'AlertDefinition.source.uri.http',
  66. https: 'AlertDefinition.source.uri.https',
  67. https_property: 'AlertDefinition.source.uri.https_property',
  68. https_property_value: 'AlertDefinition.source.uri.https_property_value',
  69. connection_timeout: 'AlertDefinition.source.uri.connection_timeout'
  70. },
  71. amsConfig: {
  72. id: 'AlertDefinition.source.ams.id',
  73. value: 'AlertDefinition.source.ams.value',
  74. minimal_value: 'AlertDefinition.source.ams.minimum_value',
  75. interval: 'AlertDefinition.source.ams.interval'
  76. },
  77. map: function (json) {
  78. console.time('App.alertDefinitionsMapper execution time');
  79. if (json && json.items) {
  80. var self = this,
  81. parameters = [],
  82. alertDefinitions = [],
  83. alertReportDefinitions = [],
  84. alertMetricsSourceDefinitions = [],
  85. alertMetricsUriDefinitions = [],
  86. alertMetricsAmsDefinitions = [],
  87. alertGroupsMap = App.cache.previousAlertGroupsMap,
  88. existingAlertDefinitions = App.AlertDefinition.find(),
  89. existingAlertDefinitionsMap = existingAlertDefinitions.toArray().toMapByProperty('id'),
  90. alertDefinitionsToDelete = existingAlertDefinitions.mapProperty('id'),
  91. rawSourceData = {};
  92. json.items.forEach(function (item) {
  93. var convertedReportDefinitions = [];
  94. var reporting = item.AlertDefinition.source.reporting;
  95. for (var report in reporting) {
  96. if (reporting.hasOwnProperty(report)) {
  97. if (report === "units") {
  98. convertedReportDefinitions.push({
  99. id: item.AlertDefinition.id + report,
  100. type: report,
  101. text: reporting[report]
  102. });
  103. } else {
  104. convertedReportDefinitions.push({
  105. id: item.AlertDefinition.id + report,
  106. type: report,
  107. text: reporting[report].text,
  108. value: reporting[report].value
  109. });
  110. }
  111. }
  112. }
  113. var convertedParameters = [];
  114. var sourceParameters = item.AlertDefinition.source.parameters;
  115. if (Array.isArray(sourceParameters)) {
  116. sourceParameters.forEach(function (parameter) {
  117. convertedParameters.push({
  118. id: item.AlertDefinition.id + parameter.name,
  119. name: parameter.name,
  120. display_name: parameter.display_name,
  121. units: parameter.units,
  122. value: parameter.value,
  123. description: parameter.description,
  124. type: parameter.type,
  125. threshold: parameter.threshold,
  126. visibility: parameter.visibility
  127. });
  128. });
  129. }
  130. alertReportDefinitions = alertReportDefinitions.concat(convertedReportDefinitions);
  131. parameters = parameters.concat(convertedParameters);
  132. item.reporting = convertedReportDefinitions;
  133. item.parameters = convertedParameters;
  134. rawSourceData[item.AlertDefinition.id] = item.AlertDefinition.source;
  135. item.AlertDefinition.description = item.AlertDefinition.description || '';
  136. var alertDefinition = this.parseIt(item, this.get('config'));
  137. if (alertGroupsMap[alertDefinition.id]) {
  138. alertDefinition.groups = alertGroupsMap[alertDefinition.id];
  139. }
  140. var oldAlertDefinition = existingAlertDefinitionsMap[alertDefinition.id];
  141. if (oldAlertDefinition) {
  142. // new values will be parsed in the another mapper, so for now just use old values
  143. alertDefinition.summary = oldAlertDefinition.get('summary');
  144. alertDefinition.last_triggered = oldAlertDefinition.get('lastTriggered');
  145. alertDefinition.last_triggered_raw = oldAlertDefinition.get('lastTriggeredRaw');
  146. }
  147. alertDefinitionsToDelete = alertDefinitionsToDelete.without(alertDefinition.id);
  148. // map properties dependent on Alert Definition type
  149. switch (item.AlertDefinition.source.type) {
  150. case 'PORT':
  151. alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('portConfig'))));
  152. break;
  153. case 'METRIC':
  154. // map App.AlertMetricsSourceDefinition's
  155. var jmxMetric = item.AlertDefinition.source.jmx;
  156. var gangliaMetric = item.AlertDefinition.source.ganglia;
  157. if (jmxMetric) {
  158. alertDefinition.jmx_id = item.AlertDefinition.id + 'jmx';
  159. alertMetricsSourceDefinitions.push({
  160. id: alertDefinition.jmx_id,
  161. value: jmxMetric.value,
  162. property_list: jmxMetric.property_list
  163. });
  164. }
  165. if (gangliaMetric) {
  166. alertDefinition.ganglia_id = item.AlertDefinition.id + 'ganglia';
  167. alertMetricsSourceDefinitions.push({
  168. id: alertDefinition.ganglia_id,
  169. value: gangliaMetric.value,
  170. property_list: gangliaMetric.property_list
  171. });
  172. }
  173. // map App.AlertMetricsUriDefinition
  174. alertDefinition.uri_id = item.AlertDefinition.id + 'uri';
  175. item.AlertDefinition.source.uri.id = alertDefinition.uri_id;
  176. alertMetricsUriDefinitions.push(this.parseIt(item, this.get('uriConfig')));
  177. alertDefinitions.push(alertDefinition);
  178. break;
  179. case 'WEB':
  180. // map App.AlertMetricsUriDefinition
  181. alertDefinition.uri_id = item.AlertDefinition.id + 'uri';
  182. item.AlertDefinition.source.uri.id = alertDefinition.uri_id;
  183. alertMetricsUriDefinitions.push(this.parseIt(item, this.get('uriConfig')));
  184. alertDefinitions.push(alertDefinition);
  185. break;
  186. case 'AGGREGATE':
  187. alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('aggregateConfig'))));
  188. break;
  189. case 'SCRIPT':
  190. alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('scriptConfig'))));
  191. break;
  192. case 'SERVER':
  193. alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('serverConfig'))));
  194. break;
  195. case 'RECOVERY':
  196. alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('uriConfig'))));
  197. break;
  198. case 'AMS':
  199. // map App.AlertMetricsUriDefinition
  200. alertDefinition.uri_id = item.AlertDefinition.id + 'uri';
  201. alertDefinition.ams_id = item.AlertDefinition.id + 'ams';
  202. item.AlertDefinition.source.uri.id = alertDefinition.uri_id;
  203. item.AlertDefinition.source.ams.id = alertDefinition.ams_id;
  204. alertMetricsUriDefinitions.push(this.parseIt(item, this.get('uriConfig')));
  205. alertMetricsAmsDefinitions.push(this.parseIt(item, this.get('amsConfig')));
  206. alertDefinitions.push(alertDefinition);
  207. break;
  208. default:
  209. console.error('Incorrect Alert Definition type:', item.AlertDefinition);
  210. }
  211. }, this);
  212. alertDefinitionsToDelete.forEach(function(definitionId) {
  213. self.deleteRecord(existingAlertDefinitions.findProperty('id', definitionId));
  214. });
  215. // load all mapped data to model
  216. App.store.loadMany(this.get('reportModel'), alertReportDefinitions);
  217. App.store.loadMany(this.get('parameterModel'), parameters);
  218. App.store.loadMany(this.get('metricsSourceModel'), alertMetricsSourceDefinitions);
  219. this.setMetricsSourcePropertyLists(this.get('metricsSourceModel'), alertMetricsSourceDefinitions);
  220. App.store.loadMany(this.get('metricsUriModel'), alertMetricsUriDefinitions);
  221. App.store.loadMany(this.get('metricsAmsModel'), alertMetricsAmsDefinitions);
  222. // this loadMany takes too much time
  223. App.store.loadMany(this.get('model'), alertDefinitions);
  224. this.setAlertDefinitionsRawSourceData(rawSourceData);
  225. App.store.commit();
  226. }
  227. console.timeEnd('App.alertDefinitionsMapper execution time');
  228. },
  229. /**
  230. * set propertyList properties from <code>data</code> for records in <code>model</code>
  231. * @param model
  232. * @param data
  233. */
  234. setMetricsSourcePropertyLists: function (model, data) {
  235. var modelsMap = model.find().toArray().toMapByProperty('id');
  236. data.forEach(function (record) {
  237. var m = modelsMap[record.id];
  238. if (m) {
  239. m.set('propertyList', record.property_list);
  240. }
  241. });
  242. },
  243. /**
  244. * set rawSourceDate properties for <code>App.AlertDefinition</code> records
  245. * @param rawSourceData
  246. */
  247. setAlertDefinitionsRawSourceData: function (rawSourceData) {
  248. var allDefinitions = App.AlertDefinition.find();
  249. var allDefinitionsMap = allDefinitions.toArray().toMapByProperty('id');
  250. for (var alertDefinitionId in rawSourceData) {
  251. if (rawSourceData.hasOwnProperty(alertDefinitionId)) {
  252. var m = allDefinitionsMap[+alertDefinitionId];
  253. if (m) {
  254. m.set('rawSourceData', rawSourceData[alertDefinitionId]);
  255. }
  256. }
  257. }
  258. }
  259. });