service_metrics_mapper.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  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. var misc = require('utils/misc');
  19. var stringUtils = require('utils/string_utils');
  20. var previousResponse = [];
  21. App.serviceMetricsMapper = App.QuickDataMapper.create({
  22. model: App.Service,
  23. config: {
  24. id: 'ServiceInfo.service_name',
  25. service_name: 'ServiceInfo.service_name',
  26. work_status: 'ServiceInfo.state',
  27. passive_state: 'ServiceInfo.passive_state',
  28. critical_alerts_count: 'ServiceInfo.critical_alerts_count',
  29. $rand: Math.random(),
  30. $alerts: [ 1, 2, 3 ],
  31. host_components: 'host_components',
  32. tool_tip_content: 'tool_tip_content'
  33. },
  34. hdfsConfig: {
  35. version: 'nameNodeComponent.host_components[0].metrics.dfs.namenode.Version',
  36. name_node_id: 'nameNodeComponent.host_components[0].HostRoles.host_name',
  37. sname_node_id: 'snameNodeComponent.host_components[0].HostRoles.host_name',
  38. active_name_node_id: 'active_name_node_id',
  39. standby_name_node_id: 'standby_name_node_id',
  40. standby_name_node2_id: 'standby_name_node2_id',
  41. journal_nodes: 'journal_nodes',
  42. name_node_start_time: 'nameNodeComponent.host_components[0].metrics.runtime.StartTime',
  43. jvm_memory_heap_used: 'nameNodeComponent.host_components[0].metrics.jvm.HeapMemoryUsed',
  44. jvm_memory_heap_max: 'nameNodeComponent.host_components[0].metrics.jvm.HeapMemoryMax',
  45. decommission_data_nodes: 'decommission_data_nodes',
  46. capacity_used: 'nameNodeComponent.host_components[0].metrics.dfs.FSNamesystem.CapacityUsed',
  47. capacity_total: 'nameNodeComponent.host_components[0].metrics.dfs.FSNamesystem.CapacityTotal',
  48. capacity_remaining: 'nameNodeComponent.host_components[0].metrics.dfs.FSNamesystem.CapacityRemaining',
  49. dfs_total_blocks: 'nameNodeComponent.host_components[0].metrics.dfs.FSNamesystem.BlocksTotal',
  50. dfs_corrupt_blocks: 'nameNodeComponent.host_components[0].metrics.dfs.FSNamesystem.CorruptBlocks',
  51. dfs_missing_blocks: 'nameNodeComponent.host_components[0].metrics.dfs.FSNamesystem.MissingBlocks',
  52. dfs_under_replicated_blocks: 'nameNodeComponent.host_components[0].metrics.dfs.FSNamesystem.UnderReplicatedBlocks',
  53. dfs_total_files: 'nameNodeComponent.host_components[0].metrics.dfs.namenode.TotalFiles',
  54. upgrade_status: 'nameNodeComponent.host_components[0].metrics.dfs.namenode.UpgradeFinalized',
  55. safe_mode_status: 'nameNodeComponent.host_components[0].metrics.dfs.namenode.Safemode',
  56. name_node_cpu: 'nameNodeComponent.host_components[0].metrics.cpu.cpu_wio',
  57. name_node_rpc: 'nameNodeComponent.host_components[0].metrics.rpc.RpcQueueTime_avg_time'
  58. },
  59. yarnConfig: {
  60. version: 'resourceManagerComponent.ServiceComponentInfo.Version',
  61. resource_manager_node_id: 'resourceManagerComponent.host_components[0].HostRoles.host_name',
  62. resource_manager_start_time: 'resourceManagerComponent.ServiceComponentInfo.StartTime',
  63. jvm_memory_heap_used: 'resourceManagerComponent.host_components[0].metrics.jvm.HeapMemoryUsed',
  64. jvm_memory_heap_max: 'resourceManagerComponent.host_components[0].metrics.jvm.HeapMemoryMax',
  65. containers_allocated: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AllocatedContainers',
  66. containers_pending: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.PendingContainers',
  67. containers_reserved: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.ReservedContainers',
  68. apps_submitted: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AppsSubmitted',
  69. apps_running: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AppsRunning',
  70. apps_pending: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AppsPending',
  71. apps_completed: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AppsCompleted',
  72. apps_killed: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AppsKilled',
  73. apps_failed: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AppsFailed',
  74. node_managers_count_active: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.activeNMcount',
  75. //node_managers_count_lost: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.lostNMcount',
  76. node_managers_count_unhealthy: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.unhealthyNMcount',
  77. node_managers_count_rebooted: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.rebootedNMcount',
  78. node_managers_count_decommissioned: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.decommissionedNMcount',
  79. allocated_memory: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AllocatedMB',
  80. available_memory: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AvailableMB',
  81. reserved_memory: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.ReservedMB',
  82. queue: 'resourceManagerComponent.queue'
  83. },
  84. mapReduce2Config: {
  85. version: 'jobHistoryServerComponent.ServiceComponentInfo.Version',
  86. job_history_server_id: 'jobHistoryServerComponent.host_components[0].HostRoles.host_name'
  87. },
  88. mapReduceConfig: {
  89. version: 'jobTrackerComponent.ServiceComponentInfo.Version',
  90. job_history_server_id: 'jobHistoryServerComponent.host_components[0].HostRoles.host_name',
  91. job_tracker_id: 'jobTrackerComponent.host_components[0].HostRoles.host_name',
  92. job_tracker_start_time: 'jobTrackerComponent.ServiceComponentInfo.StartTime',
  93. job_tracker_heap_used: 'jobTrackerComponent.ServiceComponentInfo.HeapMemoryUsed',
  94. job_tracker_heap_max: 'jobTrackerComponent.ServiceComponentInfo.HeapMemoryMax',
  95. alive_trackers: 'alive_trackers',
  96. black_list_trackers: 'black_list_trackers',
  97. gray_list_trackers: 'gray_list_trackers',
  98. map_slots: 'map_slots',
  99. reduce_slots: 'reduce_slots',
  100. jobs_submitted: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.jobs_submitted',
  101. jobs_completed: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.jobs_completed',
  102. jobs_running: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.jobs_running',
  103. map_slots_occupied: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.occupied_map_slots',
  104. map_slots_reserved: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.reserved_map_slots',
  105. reduce_slots_occupied: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.occupied_reduce_slots',
  106. reduce_slots_reserved: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.reserved_reduce_slots',
  107. maps_running: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.running_maps',
  108. maps_waiting: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.waiting_maps',
  109. reduces_running: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.running_reduces',
  110. reduces_waiting: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.waiting_reduces',
  111. trackers_decommissioned: 'jobTrackerComponent.host_components[0].metrics.mapred.jobtracker.trackers_decommissioned',
  112. job_tracker_cpu: 'jobTrackerComponent.host_components[0].metrics.cpu.cpu_wio',
  113. job_tracker_rpc: 'jobTrackerComponent.host_components[0].metrics.rpc.RpcQueueTime_avg_time'
  114. },
  115. hbaseConfig: {
  116. version: 'masterComponent.ServiceComponentInfo.Version',
  117. master_id: 'masterComponent.host_components[0].HostRoles.host_name',
  118. master_start_time: 'masterComponent.ServiceComponentInfo.MasterStartTime',
  119. master_active_time: 'masterComponent.ServiceComponentInfo.MasterActiveTime',
  120. average_load: 'masterComponent.ServiceComponentInfo.AverageLoad',
  121. regions_in_transition: 'regions_in_transition',
  122. revision: 'masterComponent.ServiceComponentInfo.Revision',
  123. heap_memory_used: 'masterComponent.ServiceComponentInfo.HeapMemoryUsed',
  124. heap_memory_max: 'masterComponent.ServiceComponentInfo.HeapMemoryMax'
  125. },
  126. model3: App.HostComponent,
  127. config3: {
  128. id: 'id',
  129. work_status: 'HostRoles.state',
  130. passive_state:'HostRoles.passive_state',
  131. desired_status: 'HostRoles.desired_state',
  132. component_name: 'HostRoles.component_name',
  133. host_id: 'HostRoles.host_name',
  134. stale_configs: 'HostRoles.stale_configs',
  135. display_name_advanced: 'display_name_advanced',
  136. $service_id: 'none' /* will be set outside of parse function */
  137. },
  138. map: function (json, isDefered) {
  139. if (!isDefered && !App.router.get('clusterController.isLoaded')) {
  140. App.router.get('clusterController').deferServiceMetricsLoad(json);
  141. return;
  142. }
  143. console.time('App.serviceMetricsMapper execution time');
  144. if (json.items) {
  145. // Host components
  146. var hostComponents = [];
  147. var services = App.cache['services'];
  148. var previousComponentStatuses = App.cache['previousComponentStatuses'];
  149. var previousComponentPassiveStates = App.cache['previousComponentPassiveStates'];
  150. /**
  151. * services contains constructed service-components structure from components array
  152. */
  153. json.items.forEach(function (component) {
  154. var serviceName = component.ServiceComponentInfo.service_name;
  155. var service = services.findProperty('ServiceInfo.service_name', serviceName);
  156. service.components.push(component);
  157. component.host_components.forEach(function (host_component) {
  158. host_component.id = host_component.HostRoles.component_name + "_" + host_component.HostRoles.host_name;
  159. previousComponentStatuses[host_component.id] = host_component.HostRoles.state;
  160. previousComponentPassiveStates[host_component.id] = host_component.HostRoles.passive_state;
  161. if (host_component.HostRoles.component_name == "HBASE_MASTER") {
  162. this.config3.ha_status = 'metrics.hbase.master.IsActiveMaster';
  163. }
  164. var comp = this.parseIt(host_component, this.config3);
  165. comp.service_id = serviceName;
  166. hostComponents.push(comp);
  167. }, this);
  168. }, this);
  169. this.computeAdditionalRelations(hostComponents, services);
  170. //load master components to model
  171. App.store.loadMany(this.get('model3'), hostComponents);
  172. var result = [];
  173. //parse service metrics from components
  174. services.forEach(function (item) {
  175. var finalJson = [];
  176. var serviceData = App.cache['hostComponentsOnService'][item.ServiceInfo.service_name];
  177. //service can have zero number of host-components
  178. if (serviceData) {
  179. item.host_components = serviceData.host_components;
  180. item.host_components.sort();
  181. }
  182. if (item && item.ServiceInfo && item.ServiceInfo.service_name == "HDFS") {
  183. finalJson = this.hdfsMapper(item);
  184. finalJson.rand = Math.random();
  185. result.push(finalJson);
  186. App.store.load(App.HDFSService, finalJson);
  187. } else if (item && item.ServiceInfo && item.ServiceInfo.service_name == "MAPREDUCE") {
  188. finalJson = this.mapreduceMapper(item);
  189. finalJson.rand = Math.random();
  190. result.push(finalJson);
  191. App.store.load(App.MapReduceService, finalJson);
  192. } else if (item && item.ServiceInfo && item.ServiceInfo.service_name == "HBASE") {
  193. finalJson = this.hbaseMapper(item);
  194. finalJson.rand = Math.random();
  195. result.push(finalJson);
  196. App.store.load(App.HBaseService, finalJson);
  197. } else if (item && item.ServiceInfo && item.ServiceInfo.service_name == "FLUME") {
  198. finalJson = this.flumeMapper(item);
  199. finalJson.rand = Math.random();
  200. result.push(finalJson);
  201. if (finalJson.nodeObjs) {
  202. finalJson.nodeObjs.forEach(function (no) {
  203. App.store.load(App.FlumeNode, no);
  204. });
  205. }
  206. App.store.load(App.FlumeService, finalJson);
  207. } else if (item && item.ServiceInfo && item.ServiceInfo.service_name == "YARN") {
  208. finalJson = this.yarnMapper(item);
  209. finalJson.rand = Math.random();
  210. result.push(finalJson);
  211. App.store.load(App.YARNService, finalJson);
  212. } else if (item && item.ServiceInfo && item.ServiceInfo.service_name == "MAPREDUCE2") {
  213. finalJson = this.mapreduce2Mapper(item);
  214. finalJson.rand = Math.random();
  215. result.push(finalJson);
  216. App.store.load(App.MapReduce2Service, finalJson);
  217. } else {
  218. finalJson = this.parseIt(item, this.config);
  219. finalJson.rand = Math.random();
  220. this.mapQuickLinks(finalJson, item);
  221. result.push(finalJson);
  222. }
  223. }, this);
  224. result = misc.sortByOrder(App.Service.servicesSortOrder, result);
  225. //load services to model
  226. if (previousResponse.length !== result.length) {
  227. App.store.loadMany(this.get('model'), result);
  228. } else {
  229. result.forEach(function (serviceJson) {
  230. var fields = ['passive_state','work_status', 'rand', 'alerts', 'quick_links', 'host_components', 'tool_tip_content', 'critical_alerts_count'];
  231. var service = this.get('model').find(serviceJson.id);
  232. var modifiedData = this.getDiscrepancies(serviceJson, previousResponse.findProperty('id', serviceJson.id), fields);
  233. if (modifiedData.isLoadNeeded) {
  234. App.store.load(this.get('model'), serviceJson);
  235. } else {
  236. for (var property in modifiedData) {
  237. service.set(stringUtils.underScoreToCamelCase(property), modifiedData[property]);
  238. }
  239. }
  240. }, this)
  241. }
  242. previousResponse = result;
  243. }
  244. console.timeEnd('App.serviceMetricsMapper execution time');
  245. },
  246. /**
  247. * compute display name of host-components
  248. * compute tooltip content of services by host-components
  249. * @param hostComponents
  250. * @param services
  251. */
  252. computeAdditionalRelations: function (hostComponents, services) {
  253. var isSecondaryNamenode = hostComponents.findProperty('component_name', 'SECONDARY_NAMENODE');
  254. services.setEach('tool_tip_content', '');
  255. hostComponents.forEach(function (hostComponent) {
  256. var service = services.findProperty('ServiceInfo.service_name', hostComponent.service_id);
  257. if (hostComponent) {
  258. // set advanced nameNode display name for HA, active or standby NameNode
  259. // this is useful on three places: hdfs health status hover tooltip, hdfs service summary and NN component on host detail page
  260. if (hostComponent.component_name === 'NAMENODE' && !isSecondaryNamenode) {
  261. var hdfs = this.hdfsMapper(service);
  262. var hostName = hostComponent.host_id;
  263. var activeNNText = Em.I18n.t('services.service.summary.nameNode.active');
  264. var standbyNNText = Em.I18n.t('services.service.summary.nameNode.standby');
  265. if (hdfs) {
  266. if (hostName == hdfs.active_name_node_id) {
  267. hostComponent.display_name_advanced = activeNNText;
  268. } else if (hostName == hdfs.standby_name_node_id || hostName == hdfs.standby_name_node2_id) {
  269. hostComponent.display_name_advanced = standbyNNText;
  270. } else {
  271. hostComponent.display_name_advanced = null;
  272. }
  273. }
  274. } else if (hostComponent.component_name === 'HBASE_MASTER') {
  275. if (hostComponent.work_status === 'STARTED') {
  276. (hostComponent.ha_status === true || hostComponent.ha_status == 'true') ?
  277. hostComponent.display_name_advanced = this.t('dashboard.services.hbase.masterServer.active') :
  278. hostComponent.display_name_advanced = this.t('dashboard.services.hbase.masterServer.standby');
  279. } else {
  280. hostComponent.display_name_advanced = null;
  281. }
  282. }
  283. if (hostComponent.display_name_advanced) {
  284. service.tool_tip_content += hostComponent.display_name_advanced + " " + App.HostComponentStatus.getTextStatus(hostComponent.work_status) + "<br/>";
  285. } else {
  286. service.tool_tip_content += App.format.role(hostComponent.component_name) + " " + App.HostComponentStatus.getTextStatus(hostComponent.work_status) + "<br/>";
  287. }
  288. }
  289. }, this)
  290. },
  291. /**
  292. * Map quick links to services:OOZIE,GANGLIA,NAGIOS,HUE
  293. * @param finalJson
  294. * @param item
  295. */
  296. mapQuickLinks: function (finalJson, item){
  297. if(!(item && item.ServiceInfo)) return;
  298. var quickLinks = {
  299. OOZIE: [19],
  300. GANGLIA: [20],
  301. NAGIOS: [21],
  302. HUE: [22],
  303. STORM: [31],
  304. FALCON: [32]
  305. };
  306. if (quickLinks[item.ServiceInfo.service_name])
  307. finalJson.quick_links = quickLinks[item.ServiceInfo.service_name];
  308. },
  309. hdfsMapper: function (item) {
  310. var finalConfig = jQuery.extend({}, this.config);
  311. // Change the JSON so that it is easy to map
  312. var hdfsConfig = this.hdfsConfig;
  313. item.components.forEach(function (component) {
  314. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "NAMENODE") {
  315. //enabled HA
  316. if ( component.host_components.length == 2) {
  317. var haState1;
  318. var haState2;
  319. if (component.host_components[1].metrics && component.host_components[1].metrics.dfs) {
  320. haState2 = component.host_components[1].metrics.dfs.FSNamesystem.HAState;
  321. }
  322. if (component.host_components[0].metrics && component.host_components[0].metrics.dfs) {
  323. haState1 = component.host_components[0].metrics.dfs.FSNamesystem.HAState;
  324. }
  325. var active_name_node = [];
  326. var standby_name_nodes = [];
  327. switch (haState1) {
  328. case "active":
  329. active_name_node.push(component.host_components[0].HostRoles.host_name);
  330. break;
  331. case "standby":
  332. standby_name_nodes.push(component.host_components[0].HostRoles.host_name);
  333. break;
  334. }
  335. switch (haState2) {
  336. case "active":
  337. active_name_node.push(component.host_components[1].HostRoles.host_name);
  338. break;
  339. case "standby":
  340. standby_name_nodes.push(component.host_components[1].HostRoles.host_name);
  341. break;
  342. }
  343. item.active_name_node_id = null;
  344. item.standby_name_node_id = null;
  345. item.standby_name_node2_id = null;
  346. switch (active_name_node.length) {
  347. case 1:
  348. item.active_name_node_id = active_name_node[0];
  349. break;
  350. }
  351. switch (standby_name_nodes.length) {
  352. case 1:
  353. item.standby_name_node_id = standby_name_nodes[0];
  354. break;
  355. case 2:
  356. item.standby_name_node_id = standby_name_nodes[0];
  357. item.standby_name_node2_id = standby_name_nodes[1];
  358. break;
  359. }
  360. // important: active nameNode always at host_components[0]; if no active, then any nameNode could work.
  361. if (haState2 == "active") { // change places for all model bind with host_component[0]
  362. var tmp = component.host_components[1];
  363. component.host_components[1] = component.host_components[0];
  364. component.host_components[0] = tmp;
  365. }
  366. }
  367. item.nameNodeComponent = component;
  368. finalConfig = jQuery.extend(finalConfig, hdfsConfig);
  369. // Get the live, dead & decommission nodes from string json
  370. if (component.host_components[0].metrics && component.host_components[0].metrics.dfs && component.host_components[0].metrics.dfs.namenode) {
  371. var decommissionNodesJson = App.parseJSON(component.host_components[0].metrics.dfs.namenode.DecomNodes);
  372. }
  373. item.decommission_data_nodes = [];
  374. for (var dcn in decommissionNodesJson) {
  375. item.decommission_data_nodes.push(dcn);
  376. }
  377. }
  378. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "SECONDARY_NAMENODE") {
  379. item.snameNodeComponent = component;
  380. }
  381. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "JOURNALNODE") {
  382. if (!item.journal_nodes) {
  383. item.journal_nodes = [];
  384. }
  385. if (component.host_components) {
  386. component.host_components.forEach(function (hc) {
  387. item.journal_nodes.push(hc.HostRoles.host_name);
  388. });
  389. }
  390. }
  391. });
  392. // Map
  393. var finalJson = this.parseIt(item, finalConfig);
  394. finalJson.quick_links = [1, 2, 3, 4];
  395. return finalJson;
  396. },
  397. yarnMapper: function (item) {
  398. var result = [];
  399. var self = this;
  400. var finalConfig = jQuery.extend({}, this.config);
  401. // Change the JSON so that it is easy to map
  402. var yarnConfig = this.yarnConfig;
  403. item.components.forEach(function (component) {
  404. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "RESOURCEMANAGER") {
  405. item.resourceManagerComponent = component;
  406. if (component.host_components[0].metrics && component.host_components[0].metrics.yarn) {
  407. var root = component.host_components[0].metrics.yarn.Queue.root;
  408. component.queue = JSON.stringify({
  409. 'root': self.parseObject(root)
  410. });
  411. }
  412. // extend config
  413. finalConfig = jQuery.extend(finalConfig, yarnConfig);
  414. }
  415. });
  416. // Map
  417. var finalJson = this.parseIt(item, finalConfig);
  418. finalJson.quick_links = [ 23, 24, 25, 26 ];
  419. return finalJson;
  420. },
  421. parseObject: function(obj) {
  422. var res = {};
  423. for (var p in obj) {
  424. if (obj.hasOwnProperty(p)) {
  425. if (obj[p] instanceof Object) {
  426. res[p] = this.parseObject(obj[p]);
  427. }
  428. }
  429. }
  430. return res;
  431. },
  432. mapreduce2Mapper: function (item) {
  433. var result = [];
  434. var finalConfig = jQuery.extend({}, this.config);
  435. // Change the JSON so that it is easy to map
  436. var mapReduce2Config = this.mapReduce2Config;
  437. item.components.forEach(function (component) {
  438. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "HISTORYSERVER") {
  439. item.jobHistoryServerComponent = component;
  440. finalConfig = jQuery.extend(finalConfig, mapReduce2Config);
  441. }
  442. });
  443. // Map
  444. var finalJson = this.parseIt(item, finalConfig);
  445. finalJson.quick_links = [27, 28, 29, 30];
  446. return finalJson;
  447. },
  448. mapreduceMapper: function (item) {
  449. // Change the JSON so that it is easy to map
  450. var result = [];
  451. var finalConfig = jQuery.extend({}, this.config);
  452. var mapReduceConfig = this.mapReduceConfig;
  453. item.components.forEach(function (component) {
  454. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "JOBTRACKER") {
  455. item.jobTrackerComponent = component;
  456. finalConfig = jQuery.extend(finalConfig, mapReduceConfig);
  457. // Get the live, gray & black nodes from string json
  458. item.map_slots = 0;
  459. item.reduce_slots = 0;
  460. var liveNodesJson = App.parseJSON(component.ServiceComponentInfo.AliveNodes);
  461. var grayNodesJson = App.parseJSON(component.ServiceComponentInfo.GrayListedNodes);
  462. var blackNodesJson = App.parseJSON(component.ServiceComponentInfo.BlackListedNodes);
  463. item.alive_trackers = [];
  464. item.gray_list_trackers = [];
  465. item.black_list_trackers = [];
  466. if (liveNodesJson != null) {
  467. liveNodesJson.forEach(function (nj) {
  468. item.alive_trackers.push(nj.hostname);
  469. if (nj.slots && nj.slots.map_slots)
  470. item.map_slots += nj.slots.map_slots;
  471. if (nj.slots && nj.slots.map_slots_used)
  472. item.map_slots_used += nj.slots.map_slots_used;
  473. if (nj.slots && nj.slots.reduce_slots)
  474. item.reduce_slots += nj.slots.reduce_slots;
  475. if (nj.slots && nj.slots.reduce_slots_used)
  476. item.reduce_slots_used += nj.slots.reduce_slots_used;
  477. });
  478. }
  479. if (grayNodesJson != null) {
  480. grayNodesJson.forEach(function (nj) {
  481. item.gray_list_trackers.push(nj.hostname);
  482. });
  483. }
  484. if (blackNodesJson != null) {
  485. blackNodesJson.forEach(function (nj) {
  486. item.black_list_trackers.push(nj.hostname);
  487. });
  488. }
  489. } else if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "HISTORYSERVER") {
  490. item.jobHistoryServerComponent = component;
  491. finalConfig = jQuery.extend(finalConfig, mapReduceConfig);
  492. }
  493. });
  494. // Map
  495. var finalJson = this.parseIt(item, finalConfig);
  496. finalJson.quick_links = [5, 6, 7, 8, 9, 10, 11, 12];
  497. return finalJson;
  498. },
  499. hbaseMapper: function (item) {
  500. // Change the JSON so that it is easy to map
  501. var finalConfig = jQuery.extend({}, this.config);
  502. var hbaseConfig = this.hbaseConfig;
  503. item.components.forEach(function (component) {
  504. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "HBASE_MASTER") {
  505. item.masterComponent = component;
  506. finalConfig = jQuery.extend(finalConfig, hbaseConfig);
  507. var regionsArray = App.parseJSON(component.ServiceComponentInfo.RegionsInTransition);
  508. //regions_in_transition can have various type of value: null, array or int
  509. if (Array.isArray(regionsArray)) {
  510. item.regions_in_transition = regionsArray.length;
  511. } else {
  512. item.regions_in_transition = regionsArray == null ? 0 : regionsArray;
  513. }
  514. }
  515. });
  516. // Map
  517. var finalJson = this.parseIt(item, finalConfig);
  518. finalJson.average_load = parseFloat(finalJson.average_load).toFixed(2);
  519. finalJson.quick_links = [13, 14, 15, 16, 17, 18];
  520. return finalJson;
  521. },
  522. /**
  523. * Flume is different from other services, in that the important
  524. * data is in customizeable channels. Hence we directly transfer
  525. * data into the JSON object.
  526. */
  527. flumeMapper: function (item) {
  528. var finalConfig = jQuery.extend({}, this.config);
  529. var finalJson = this.parseIt(item, finalConfig);
  530. item.components.forEach(function (component) {
  531. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "FLUME_SERVER") {
  532. if (!finalJson.nodes) {
  533. finalJson.nodes = [];
  534. }
  535. if (!finalJson.nodeObjs) {
  536. finalJson.nodeObjs = [];
  537. }
  538. if (component.host_components) {
  539. component.host_components.forEach(function (hc) {
  540. var fnode = {};
  541. fnode.id = hc.HostRoles.host_name;
  542. fnode.host_id = hc.HostRoles.host_name;
  543. fnode.channels = "";
  544. fnode.sources = "";
  545. fnode.sinks = "";
  546. if (hc.metrics != null && hc.metrics.flume && hc.metrics.flume.flume && hc.metrics.flume.flume) {
  547. if (hc.metrics.flume.flume.CHANNEL) {
  548. for ( var c in hc.metrics.flume.flume.CHANNEL) {
  549. if (fnode.channels.length < 1) {
  550. fnode.channels += c;
  551. } else {
  552. fnode.channels += ("," + c);
  553. }
  554. }
  555. }
  556. if (hc.metrics.flume.flume.SINK) {
  557. for ( var c in hc.metrics.flume.flume.SINK) {
  558. if (fnode.sinks.length < 1) {
  559. fnode.sinks += c;
  560. } else {
  561. fnode.sinks += ("," + c);
  562. }
  563. }
  564. }
  565. if (hc.metrics.flume.flume.SOURCE) {
  566. for ( var c in hc.metrics.flume.flume.SOURCE) {
  567. if (fnode.sources.length < 1) {
  568. fnode.sources += c;
  569. } else {
  570. fnode.sources += ("," + c);
  571. }
  572. }
  573. }
  574. }
  575. finalJson.nodeObjs.push(fnode);
  576. finalJson.nodes.push(hc.HostRoles.host_name);
  577. });
  578. }
  579. }
  580. });
  581. return finalJson;
  582. }
  583. });