guest_detail.html 40 KB

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