guest_detail.html 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034
  1. {% extends "layout.html" %}
  2. {% block head %}
  3. {{ super() }}
  4. <style type="text/css">
  5. @media (min-width: 768px) {
  6. .form-horizontal .control-label {
  7. text-align: left;
  8. }
  9. }
  10. label>span {
  11. color: deepskyblue;
  12. }
  13. .btn,
  14. .form-group>div>div,
  15. .form-control {
  16. border-radius: 0;
  17. }
  18. .table {
  19. font-size: 12px;
  20. border-width: 1px;
  21. line-height: 22px;
  22. }
  23. .table > tbody > tr > td {
  24. color: #424547;
  25. }
  26. .table-bordered > tbody > tr {
  27. padding-top: 10px;
  28. padding-bottom: 10px;
  29. }
  30. .table-bordered > thead > tr > th,
  31. .table-bordered > tbody > tr > th,
  32. .table-bordered > tfoot > tr > th,
  33. .table-bordered > thead > tr > td,
  34. .table-bordered > tbody > tr > td,
  35. .table-bordered > tfoot > tr > td {
  36. border-style: solid;
  37. border-width: 1px 0 0 0;
  38. }
  39. .guest-label {
  40. color: #999999;
  41. }
  42. .guest-desc {
  43. color: #333333;
  44. }
  45. </style>
  46. {% endblock head %}
  47. {% block body %}
  48. <script>
  49. var resource_path = window.location.pathname;
  50. var resource_path_array = resource_path.split('/');
  51. var uuid = resource_path_array[resource_path_array.length - 1];
  52. var cpu_chart = null;
  53. var traffic_chart = null;
  54. var memory_chart = null;
  55. var datetime_format_type = 'time';
  56. function format_time(timestamp, i) {
  57. if (datetime_format_type === 'time') {
  58. return new Date(timestamp).format('HH:MM');
  59. } else {
  60. return new Date(timestamp).format('mm-dd');
  61. }
  62. }
  63. function render_cpu_chart(uuid, granularity) {
  64. var url = '/api/performance/cpu_memory/last_hour/' + uuid;
  65. if (granularity === 'hour') {
  66. url = '/api/performance/cpu_memory/last_hour/' + uuid
  67. } else if (granularity === 'six_hours') {
  68. url = '/api/performance/cpu_memory/last_six_hours/' + uuid
  69. } else if (granularity === 'day') {
  70. url = '/api/performance/cpu_memory/last_day/' + uuid
  71. } else {
  72. url = '/api/performance/cpu_memory/last_seven_days/' + uuid
  73. }
  74. $.ajax({
  75. url : url,
  76. type : 'GET',
  77. contentType: "application/json; charset=utf-8",
  78. dataType: 'json',
  79. error : function() {
  80. alter_danger('获取图表数据失败失败!');
  81. },
  82. success : function(data, textStatus, xhr) {
  83. if (data.data.length > 1) {
  84. if ((data.data[data.data.length - 1]['timestamp'] - data.data[0]['timestamp']) >= 86400) {
  85. datetime_format_type = 'date';
  86. }
  87. }
  88. var option = {
  89. color: ['#3BC0FF'],
  90. title: {
  91. text: 'CPU'
  92. },
  93. legend: {
  94. data:['CPU使用率(%)'],
  95. bottom: 5
  96. },
  97. toolbox: {
  98. feature: {
  99. dataZoom: {
  100. yAxisIndex: 'none'
  101. },
  102. magicType: {type: ['line', 'bar']},
  103. saveAsImage: {
  104. show: true,
  105. pixelRatio: 4
  106. }
  107. }
  108. },
  109. tooltip: {
  110. show: true,
  111. trigger: 'axis',
  112. formatter: (function (params, ticket, callback) {
  113. var cpu_load = params[0].data[1];
  114. var seriesName = params[0].seriesName;
  115. var marker = params[0].marker;
  116. var datetime = new Date(params[0].data[0]).format('yyyy-mm-dd HH:MM:ss');
  117. if (cpu_load === null) {
  118. cpu_load = '无数据';
  119. }
  120. return datetime + '<br />' + [marker, seriesName, cpu_load].join(' ')
  121. })
  122. },
  123. xAxis: {
  124. type: 'time',
  125. axisTick: {
  126. show: false
  127. },
  128. axisLine: {
  129. lineStyle: {
  130. opacity: 0.1,
  131. color: '#3d4245'
  132. }
  133. },
  134. splitLine: {
  135. show: false
  136. },
  137. axisLabel: {
  138. formatter: format_time
  139. }
  140. },
  141. yAxis: {
  142. min: 0,
  143. max: 'dataMax',
  144. minInterval: 2,
  145. axisTick: {
  146. show: false
  147. },
  148. axisLine: {
  149. lineStyle: {
  150. opacity: 0,
  151. color: '#8c8f91'
  152. }
  153. },
  154. splitLine: {
  155. show: true,
  156. lineStyle: {
  157. width: 1,
  158. opacity: 0.5
  159. }
  160. }
  161. },
  162. series: [{
  163. name: 'CPU使用率(%)',
  164. type: 'line',
  165. showSymbol: false,
  166. smooth: true,
  167. lineStyle: {
  168. normal: {
  169. width: 1
  170. }
  171. },
  172. data: (function () {
  173. var d = [];
  174. $.each(data.data, function(i, ele) {
  175. d.push([
  176. ele['timestamp'] * 1000,
  177. ele['cpu_load']
  178. ])
  179. });
  180. return d;
  181. })()
  182. }]
  183. };
  184. cpu_chart.setOption(option);
  185. }
  186. });
  187. }
  188. function render_traffic_chart(uuid, granularity) {
  189. var url = '/api/performance/traffic/last_hour/' + uuid;
  190. if (granularity === 'hour') {
  191. url = '/api/performance/traffic/last_hour/' + uuid
  192. } else if (granularity === 'six_hours') {
  193. url = '/api/performance/traffic/last_six_hours/' + uuid
  194. } else if (granularity === 'day') {
  195. url = '/api/performance/traffic/last_day/' + uuid
  196. } else {
  197. url = '/api/performance/traffic/last_seven_days/' + uuid
  198. }
  199. $.ajax({
  200. url : url,
  201. type : 'GET',
  202. contentType: "application/json; charset=utf-8",
  203. dataType: 'json',
  204. error : function() {
  205. alter_danger('获取图表数据失败失败!');
  206. },
  207. success : function(data, textStatus, xhr) {
  208. if (data.data.length > 1) {
  209. if ((data.data[data.data.length - 1]['timestamp'] - data.data[0]['timestamp']) >= 86400) {
  210. datetime_format_type = 'date';
  211. }
  212. }
  213. var option = {
  214. color: ['#3BC0FF', '#FAB406'],
  215. title: {
  216. text: '网络'
  217. },
  218. legend: {
  219. data:['流入(kbps)', '流出(kbps)'],
  220. bottom: 5
  221. },
  222. toolbox: {
  223. feature: {
  224. dataZoom: {
  225. yAxisIndex: 'none'
  226. },
  227. magicType: {type: ['line', 'bar']},
  228. saveAsImage: {
  229. show: true,
  230. pixelRatio: 4
  231. }
  232. }
  233. },
  234. tooltip: {
  235. show: true,
  236. trigger: 'axis',
  237. formatter: (function (params, ticket, callback) {
  238. var inflowSeriesName = params[0].seriesName;
  239. var outflowSeriesName = params[1].seriesName;
  240. var inflow = params[0].data[1];
  241. var outflow = params[1].data[1];
  242. var inflowMarker = params[0].marker;
  243. var outflowMarker = params[1].marker;
  244. var datetime = new Date(params[0].data[0]).format('yyyy-mm-dd HH:MM:ss');
  245. if (inflow === null) {
  246. inflow = '无数据';
  247. }
  248. if (outflow === null) {
  249. outflow = '无数据';
  250. }
  251. return datetime + '<br />' + [inflowMarker, inflowSeriesName, inflow].join(' ') +
  252. '<br />' + [outflowMarker, outflowSeriesName, outflow].join(' ')
  253. })
  254. },
  255. xAxis: {
  256. type: 'time',
  257. axisTick: {
  258. show: false
  259. },
  260. axisLine: {
  261. lineStyle: {
  262. opacity: 0.1,
  263. color: '#3d4245'
  264. }
  265. },
  266. splitLine: {
  267. show: false
  268. },
  269. axisLabel: {
  270. formatter: format_time
  271. }
  272. },
  273. yAxis: {
  274. min: 0,
  275. max: 'dataMax',
  276. minInterval: 2,
  277. axisTick: {
  278. show: false
  279. },
  280. axisLine: {
  281. lineStyle: {
  282. opacity: 0,
  283. color: '#8c8f91'
  284. }
  285. },
  286. splitLine: {
  287. show: true,
  288. lineStyle: {
  289. width: 1,
  290. opacity: 0.5
  291. }
  292. }
  293. },
  294. series: [{
  295. name: '流入(kbps)',
  296. type: 'line',
  297. showSymbol: false,
  298. smooth: true,
  299. lineStyle: {
  300. normal: {
  301. width: 1
  302. }
  303. },
  304. data: (function () {
  305. var d = [];
  306. $.each(data.data, function(i, ele) {
  307. d.push([
  308. ele['timestamp'] * 1000,
  309. ele['rx_bytes'] !== null ? Math.floor(ele['rx_bytes'] / 1000) : null
  310. ])
  311. });
  312. return d;
  313. })()
  314. },{
  315. name: '流出(kbps)',
  316. type: 'line',
  317. showSymbol: false,
  318. smooth: true,
  319. lineStyle: {
  320. normal: {
  321. width: 1
  322. }
  323. },
  324. data: (function () {
  325. var d = [];
  326. $.each(data.data, function(i, ele) {
  327. d.push([
  328. ele['timestamp'] * 1000,
  329. ele['tx_bytes'] !== null ? Math.floor(ele['tx_bytes'] / 1000) : null
  330. ])
  331. });
  332. return d;
  333. })()
  334. }]
  335. };
  336. traffic_chart.setOption(option);
  337. }
  338. });
  339. }
  340. function render_memory_chart(uuid, granularity) {
  341. var url = '/api/performance/cpu_memory/last_hour/' + uuid;
  342. if (granularity === 'hour') {
  343. url = '/api/performance/cpu_memory/last_hour/' + uuid
  344. } else if (granularity === 'six_hours') {
  345. url = '/api/performance/cpu_memory/last_six_hours/' + uuid
  346. } else if (granularity === 'day') {
  347. url = '/api/performance/cpu_memory/last_day/' + uuid
  348. } else {
  349. url = '/api/performance/cpu_memory/last_seven_days/' + uuid
  350. }
  351. $.ajax({
  352. url: url,
  353. type: 'GET',
  354. contentType: "application/json; charset=utf-8",
  355. dataType: 'json',
  356. error: function () {
  357. alter_danger('获取图表数据失败失败!');
  358. },
  359. success: function (data, textStatus, xhr) {
  360. if (data.data.length > 1) {
  361. if ((data.data[data.data.length - 1]['timestamp'] - data.data[0]['timestamp']) >= 86400) {
  362. datetime_format_type = 'date';
  363. }
  364. }
  365. var option = {
  366. color: ['#35CD03'],
  367. title: {
  368. text: '内存'
  369. },
  370. legend: {
  371. data: ['可用量'],
  372. bottom: 5
  373. },
  374. toolbox: {
  375. feature: {
  376. dataZoom: {
  377. yAxisIndex: 'none'
  378. },
  379. magicType: {type: ['line', 'bar']},
  380. saveAsImage: {
  381. show: true,
  382. pixelRatio: 4
  383. }
  384. }
  385. },
  386. tooltip: {
  387. show: true,
  388. trigger: 'axis',
  389. formatter: (function (params, ticket, callback) {
  390. var seriesName = params[0].seriesName;
  391. var free = params[0].data[1];
  392. var marker = params[0].marker;
  393. var datetime = new Date(params[0].data[0]).format('yyyy-mm-dd HH:MM:ss');
  394. if (free === null) {
  395. free = '无数据';
  396. }
  397. return datetime + '<br />' + [marker, seriesName, free].join(' ')
  398. })
  399. },
  400. xAxis: {
  401. type: 'time',
  402. axisTick: {
  403. show: false
  404. },
  405. axisLine: {
  406. lineStyle: {
  407. opacity: 0.1,
  408. color: '#3d4245'
  409. }
  410. },
  411. splitLine: {
  412. show: false
  413. },
  414. axisLabel: {
  415. formatter: format_time
  416. }
  417. },
  418. yAxis: {
  419. min: 0,
  420. max: 'dataMax',
  421. minInterval: 2,
  422. axisTick: {
  423. show: false
  424. },
  425. axisLine: {
  426. lineStyle: {
  427. opacity: 0,
  428. color: '#8c8f91'
  429. }
  430. },
  431. splitLine: {
  432. show: true,
  433. lineStyle: {
  434. width: 1,
  435. opacity: 0.5
  436. }
  437. }
  438. },
  439. series: [{
  440. name: '可用量(GB)',
  441. type: 'line',
  442. showSymbol: false,
  443. smooth: true,
  444. lineStyle: {
  445. normal: {
  446. width: 1
  447. }
  448. },
  449. areaStyle: {normal: {}},
  450. data: (function () {
  451. var d = [];
  452. $.each(data.data, function (i, ele) {
  453. d.push([
  454. ele['timestamp'] * 1000,
  455. ele['memory_unused'] !== null ? Math.floor(ele['memory_unused'] / 1024) / 1000 : null
  456. ])
  457. });
  458. return d;
  459. })()
  460. }]
  461. };
  462. memory_chart.setOption(option);
  463. }
  464. });
  465. }
  466. function render_disk_throughput_chart(disk_uuid, granularity, dev_id, dev_name) {
  467. var url = '/api/performance/disk_io/last_hour/' + disk_uuid;
  468. if (granularity === 'hour') {
  469. url = '/api/performance/disk_io/last_hour/' + disk_uuid
  470. } else if (granularity === 'six_hours') {
  471. url = '/api/performance/disk_io/last_six_hours/' + disk_uuid
  472. } else if (granularity === 'day') {
  473. url = '/api/performance/disk_io/last_day/' + disk_uuid
  474. } else {
  475. url = '/api/performance/disk_io/last_seven_days/' + disk_uuid
  476. }
  477. $.ajax({
  478. url : url,
  479. type : 'GET',
  480. contentType: "application/json; charset=utf-8",
  481. dataType: 'json',
  482. error : function() {
  483. alter_danger('获取图表数据失败失败!');
  484. },
  485. success : function(data, textStatus, xhr) {
  486. if (data.data.length > 1) {
  487. if ((data.data[data.data.length - 1]['timestamp'] - data.data[0]['timestamp']) >= 86400) {
  488. datetime_format_type = 'date';
  489. }
  490. }
  491. var option = {
  492. color: ['#3BC0FF', '#FAB406'],
  493. title: {
  494. text: '磁盘吞吐量 - ' + dev_name
  495. },
  496. legend: {
  497. data:['读(MBps)', '写(MBps)'],
  498. bottom: 5
  499. },
  500. toolbox: {
  501. feature: {
  502. dataZoom: {
  503. yAxisIndex: 'none'
  504. },
  505. magicType: {type: ['line', 'bar']},
  506. saveAsImage: {
  507. show: true,
  508. pixelRatio: 4
  509. }
  510. }
  511. },
  512. tooltip: {
  513. show: true,
  514. trigger: 'axis',
  515. formatter: (function (params, ticket, callback) {
  516. var readSeriesName = params[0].seriesName;
  517. var writeSeriesName = params[1].seriesName;
  518. var read = params[0].data[1];
  519. var write = params[1].data[1];
  520. var readMarker = params[0].marker;
  521. var writeMarker = params[1].marker;
  522. var datetime = new Date(params[0].data[0]).format('yyyy-mm-dd HH:MM:ss');
  523. if (read === null) {
  524. read = '无数据';
  525. }
  526. if (write === null) {
  527. write = '无数据';
  528. }
  529. return datetime + '<br />' + [readMarker, readSeriesName, read].join(' ') +
  530. '<br />' + [writeMarker, writeSeriesName, write].join(' ')
  531. })
  532. },
  533. xAxis: {
  534. type: 'time',
  535. axisTick: {
  536. show: false
  537. },
  538. axisLine: {
  539. lineStyle: {
  540. opacity: 0.1,
  541. color: '#3d4245'
  542. }
  543. },
  544. splitLine: {
  545. show: false
  546. },
  547. axisLabel: {
  548. formatter: format_time
  549. }
  550. },
  551. yAxis: {
  552. min: 0,
  553. max: 'dataMax',
  554. minInterval: 2,
  555. axisTick: {
  556. show: false
  557. },
  558. axisLine: {
  559. lineStyle: {
  560. opacity: 0,
  561. color: '#8c8f91'
  562. }
  563. },
  564. splitLine: {
  565. show: true,
  566. lineStyle: {
  567. width: 1,
  568. opacity: 0.5
  569. }
  570. }
  571. },
  572. series: [{
  573. name: '读(MBps)',
  574. type: 'line',
  575. showSymbol: false,
  576. smooth: true,
  577. lineStyle: {
  578. normal: {
  579. width: 1
  580. }
  581. },
  582. data: (function () {
  583. var d = [];
  584. $.each(data.data, function(i, ele) {
  585. d.push([
  586. ele['timestamp'] * 1000,
  587. ele['rd_bytes'] !== null ? Math.floor(ele['rd_bytes'] / 1024 / 1024 * 1000) / 1000 : null
  588. ])
  589. });
  590. return d;
  591. })()
  592. },{
  593. name: '写(MBps)',
  594. type: 'line',
  595. showSymbol: false,
  596. smooth: true,
  597. lineStyle: {
  598. normal: {
  599. width: 1
  600. }
  601. },
  602. data: (function () {
  603. var d = [];
  604. $.each(data.data, function(i, ele) {
  605. d.push([
  606. ele['timestamp'] * 1000,
  607. ele['wr_bytes'] !== null ? Math.floor(ele['wr_bytes'] / 1024 / 1024 * 1000) / 1000 : null
  608. ])
  609. });
  610. return d;
  611. })()
  612. }]
  613. };
  614. var disk_chart = echarts.init(document.getElementById(dev_id));
  615. disk_chart.setOption(option);
  616. }
  617. });
  618. }
  619. function render_disk_iops_chart(disk_uuid, granularity, dev_id, dev_name) {
  620. var url = '/api/performance/disk_io/last_hour/' + disk_uuid;
  621. if (granularity === 'hour') {
  622. url = '/api/performance/disk_io/last_hour/' + disk_uuid
  623. } else if (granularity === 'six_hours') {
  624. url = '/api/performance/disk_io/last_six_hours/' + disk_uuid
  625. } else if (granularity === 'day') {
  626. url = '/api/performance/disk_io/last_day/' + disk_uuid
  627. } else {
  628. url = '/api/performance/disk_io/last_seven_days/' + disk_uuid
  629. }
  630. $.ajax({
  631. url : url,
  632. type : 'GET',
  633. contentType: "application/json; charset=utf-8",
  634. dataType: 'json',
  635. error : function() {
  636. alter_danger('获取图表数据失败失败!');
  637. },
  638. success : function(data, textStatus, xhr) {
  639. if (data.data.length > 1) {
  640. if ((data.data[data.data.length - 1]['timestamp'] - data.data[0]['timestamp']) >= 86400) {
  641. datetime_format_type = 'date';
  642. }
  643. }
  644. var option = {
  645. color: ['#3BC0FF', '#FAB406'],
  646. title: {
  647. text: '磁盘IOPS - ' + dev_name
  648. },
  649. legend: {
  650. data:['读(IOPS)', '写(IOPS)'],
  651. bottom: 5
  652. },
  653. toolbox: {
  654. feature: {
  655. dataZoom: {
  656. yAxisIndex: 'none'
  657. },
  658. magicType: {type: ['line', 'bar']},
  659. saveAsImage: {
  660. show: true,
  661. pixelRatio: 4
  662. }
  663. }
  664. },
  665. tooltip: {
  666. show: true,
  667. trigger: 'axis',
  668. formatter: (function (params, ticket, callback) {
  669. var readSeriesName = params[0].seriesName;
  670. var writeSeriesName = params[1].seriesName;
  671. var read = params[0].data[1];
  672. var write = params[1].data[1];
  673. var readMarker = params[0].marker;
  674. var writeMarker = params[1].marker;
  675. var datetime = new Date(params[0].data[0]).format('yyyy-mm-dd HH:MM:ss');
  676. if (read === null) {
  677. read = '无数据';
  678. }
  679. if (write === null) {
  680. write = '无数据';
  681. }
  682. return datetime + '<br />' + [readMarker, readSeriesName, read].join(' ') +
  683. '<br />' + [writeMarker, writeSeriesName, write].join(' ')
  684. })
  685. },
  686. xAxis: {
  687. type: 'time',
  688. axisTick: {
  689. show: false
  690. },
  691. axisLine: {
  692. lineStyle: {
  693. opacity: 0.1,
  694. color: '#3d4245'
  695. }
  696. },
  697. splitLine: {
  698. show: false
  699. },
  700. axisLabel: {
  701. formatter: format_time
  702. }
  703. },
  704. yAxis: {
  705. min: 0,
  706. max: 'dataMax',
  707. minInterval: 2,
  708. axisTick: {
  709. show: false
  710. },
  711. axisLine: {
  712. lineStyle: {
  713. opacity: 0,
  714. color: '#8c8f91'
  715. }
  716. },
  717. splitLine: {
  718. show: true,
  719. lineStyle: {
  720. width: 1,
  721. opacity: 0.5
  722. }
  723. }
  724. },
  725. series: [{
  726. name: '读(IOPS)',
  727. type: 'line',
  728. showSymbol: false,
  729. smooth: true,
  730. lineStyle: {
  731. normal: {
  732. width: 1
  733. }
  734. },
  735. data: (function () {
  736. var d = [];
  737. $.each(data.data, function(i, ele) {
  738. d.push([
  739. ele['timestamp'] * 1000,
  740. ele['rd_req'] !== null ? ele['rd_req'] : null
  741. ])
  742. });
  743. return d;
  744. })()
  745. },{
  746. name: '写(IOPS)',
  747. type: 'line',
  748. showSymbol: false,
  749. smooth: true,
  750. lineStyle: {
  751. normal: {
  752. width: 1
  753. }
  754. },
  755. data: (function () {
  756. var d = [];
  757. $.each(data.data, function(i, ele) {
  758. d.push([
  759. ele['timestamp'] * 1000,
  760. ele['wr_req'] !== null ? ele['wr_req'] : null
  761. ])
  762. });
  763. return d;
  764. })()
  765. }]
  766. };
  767. var disk_chart = echarts.init(document.getElementById(dev_id));
  768. disk_chart.setOption(option);
  769. }
  770. });
  771. }
  772. function render_disks_chart(uuid, granularity) {
  773. var dev_table = [];
  774. for (var i = 1; i <= 26; i++) {
  775. dev_table.push('vd' + String.fromCharCode(0x60+i));
  776. }
  777. var disks = [];
  778. var url = '/api/disks?filter=guest_uuid:in:' + uuid;
  779. $.ajax({
  780. url: url,
  781. type: 'GET',
  782. contentType: "application/json; charset=utf-8",
  783. dataType: 'json',
  784. error: function () {
  785. alter_danger('获取图表数据失败失败!');
  786. },
  787. success: function (data, textStatus, xhr) {
  788. $('#disks_chart').empty();
  789. $.each(data.data, function(i, ele) {
  790. var dev_name = dev_table[ele['sequence']];
  791. var dev_id_throughput = 'throughput_' + dev_table[ele['sequence']];
  792. var dev_id_iops = 'iops_' + dev_table[ele['sequence']];
  793. var disk_uuid = ele['uuid'];
  794. $('#disks_chart').append($('<div id=' + dev_id_throughput +' style="width: 800px;height:280px;"></div>'));
  795. render_disk_throughput_chart(disk_uuid, granularity, dev_id_throughput, dev_name);
  796. $('#disks_chart').append($('<div id=' + dev_id_iops +' style="width: 800px;height:280px;"></div>'));
  797. render_disk_iops_chart(disk_uuid, granularity, dev_id_iops, dev_name);
  798. });
  799. }
  800. });
  801. }
  802. $(document).ready(function() {
  803. $('body').addClass('add-transition');
  804. $('.add-page-transition').on('click', function(){
  805. var transAttr = $(this).attr('data-transition');
  806. $('.add-transition').attr('class', 'add-transition');
  807. $('.add-transition').addClass(transAttr);
  808. });
  809. cpu_chart = echarts.init(document.getElementById('cpu_chart'));
  810. traffic_chart = echarts.init(document.getElementById('traffic_chart'));
  811. // memory_chart = echarts.init(document.getElementById('memory_chart'));
  812. render_cpu_chart(uuid, 'hour');
  813. render_traffic_chart(uuid, 'hour');
  814. render_disks_chart(uuid, 'hour')
  815. // render_memory_chart(uuid, 'hour');
  816. });
  817. function refresh_render_with_specify_granularity(granularity) {
  818. render_cpu_chart(uuid, granularity);
  819. render_traffic_chart(uuid, granularity);
  820. render_disks_chart(uuid, granularity)
  821. }
  822. </script>
  823. <div class="container" style="padding-top: 100px; width: 90%; max-width: 100%;">
  824. <div class="panel">
  825. <div class="panel-body">
  826. <a href="javascript:history.go(-1)" class="btn btn-xs btn-default add-page-transition" data-transition="pt-page-moveFromLeft-init" style="margin-bottom: 4px; margin-left: 10px;">
  827. <span class="glyph-icon icon-separator" style="transform: rotateY(-180deg);">
  828. <i class="glyph-icon icon-level-up"></i>
  829. </span>
  830. <span class="button-content">
  831. 返回
  832. </span>
  833. </a>
  834. <div class="row" style="margin-top: 10px;">
  835. <div class="col-xs-4">
  836. <div style="background: #F5f6FA; border: 1px solid #e1e6eb; padding: 10px; font-size: 14px; width: 100%;">
  837. <span>
  838. 实例信息
  839. </span>
  840. </div>
  841. <table class="table table-bordered">
  842. <tbody>
  843. <tr>
  844. <td>
  845. <span class="guest-label">UUID:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  846. <span class="guest-desc">
  847. {{ guest_ret.data.uuid }}
  848. </span>
  849. </td>
  850. </tr>
  851. <tr>
  852. <td>
  853. <span class="guest-label">标识:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  854. <span class="guest-desc">
  855. {{ guest_ret.data.label }}
  856. </span>
  857. </td>
  858. </tr>
  859. <tr>
  860. <td>
  861. <span class="guest-label">名称:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  862. <span class="guest-desc">
  863. {{ guest_ret.data.remark }}
  864. </span>
  865. </td>
  866. </tr>
  867. <tr>
  868. <td>
  869. <span class="guest-label">状态:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  870. <span class="guest-desc">
  871. {{ format_guest_status(guest_ret.data.status)|safe }}
  872. </span>
  873. </td>
  874. </tr>
  875. <tr>
  876. <td>
  877. <span class="guest-label">CPU:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  878. <span class="guest-desc">
  879. {{ guest_ret.data.cpu }} 核
  880. </span>
  881. </td>
  882. </tr>
  883. <tr>
  884. <td>
  885. <span class="guest-label">内存:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  886. <span class="guest-desc">
  887. {{ guest_ret.data.memory }} GB
  888. </span>
  889. </td>
  890. </tr>
  891. <tr>
  892. <td>
  893. <span class="guest-label">操作系统:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  894. <span class="guest-desc">
  895. {{ os_template_ret.data.label }}
  896. </span>&nbsp;&nbsp;&nbsp;&nbsp;
  897. <span class="{{ os_template_ret.data.icon }}"></span>
  898. </td>
  899. </tr>
  900. <tr>
  901. <td>
  902. <span class="guest-label">IP:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  903. <span class="guest-desc">
  904. {{ guest_ret.data.ip }}
  905. </span>
  906. </td>
  907. </tr>
  908. <tr>
  909. <td>
  910. <span class="guest-label">密码:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  911. <span class="guest-desc">
  912. {{ guest_ret.data.password }}
  913. </span>
  914. </td>
  915. </tr>
  916. <tr>
  917. <td>
  918. <span class="guest-label">所在宿主机:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  919. <span class="guest-desc">
  920. {{ guest_ret.data.on_host }}
  921. </span>
  922. </td>
  923. </tr>
  924. <tr>
  925. <td>
  926. <span class="guest-label">VNC 端口:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  927. <span class="guest-desc">
  928. {{ guest_ret.data.vnc_port }}
  929. </span>
  930. </td>
  931. </tr>
  932. <tr>
  933. <td>
  934. <span class="guest-label">VNC 密码:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  935. <span class="guest-desc">
  936. {{ guest_ret.data.vnc_password }}
  937. </span>
  938. </td>
  939. </tr>
  940. <tr>
  941. <td>
  942. <span class="guest-label">创建时间:&nbsp;&nbsp;&nbsp;&nbsp;</span>
  943. <span class="guest-desc">
  944. {{ format_datetime_by_tus(guest_ret.data.create_time) }}
  945. </span>
  946. </td>
  947. </tr>
  948. </tbody>
  949. </table>
  950. </div>
  951. <div class="col-xs-8">
  952. <div class="row" style="margin-bottom: 20px;">
  953. <div class="col-xs-8"></div>
  954. <div class="col-xs-4">
  955. <div class="btn-group btn-group-justified btn-group-xs">
  956. <a class="btn btn-default" role="button" onclick="refresh_render_with_specify_granularity('hour');">1小时</a>
  957. <a class="btn btn-default" role="button" onclick="refresh_render_with_specify_granularity('six_hours');">6小时</a>
  958. <a class="btn btn-default" role="button" onclick="refresh_render_with_specify_granularity('day');">1天</a>
  959. <a class="btn btn-default" role="button" onclick="refresh_render_with_specify_granularity('seven_days');">7天</a>
  960. </div>
  961. </div>
  962. </div>
  963. <div>
  964. <div id="cpu_chart" style="width: 800px;height:280px;"></div>
  965. <div id="traffic_chart" style="width: 800px;height:280px;"></div>
  966. </div>
  967. <!--<div id="memory_chart" style="width: 800px;height:280px;"></div>-->
  968. <div id="disks_chart"></div>
  969. </div>
  970. </div>
  971. </div>
  972. </div>
  973. </div>
  974. {% endblock body %}