guest_detail.html 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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. .btn-ability {
  20. margin-right: 16px;
  21. height: 50px;
  22. padding: 8px 50px;
  23. margin-bottom: 30px;
  24. }
  25. .btn-ability-line {
  26. }
  27. </style>
  28. {% endblock head %}
  29. {% block body %}
  30. <script>
  31. var resource_path = window.location.pathname;
  32. var resource_path_array = resource_path.split('/');
  33. var uuid = resource_path_array[resource_path_array.length - 1];
  34. var cpu_chart = null;
  35. var datetime_format_type = 'time';
  36. function format_time(timestamp, i) {
  37. if (datetime_format_type === 'time') {
  38. return new Date(timestamp).format('HH:MM');
  39. } else {
  40. return new Date(timestamp).format('mm-dd');
  41. }
  42. }
  43. function render_cpu_memory_chart(uuid, granularity) {
  44. var url = '/api/performance/cpu_memory/last_hour/' + uuid;
  45. if (granularity === 'hour') {
  46. url = '/api/performance/cpu_memory/last_hour/' + uuid
  47. } else if (granularity === 'six_hours') {
  48. url = '/api/performance/cpu_memory/last_six_hours/' + uuid
  49. } else if (granularity === 'day') {
  50. url = '/api/performance/cpu_memory/last_day/' + uuid
  51. } else {
  52. url = '/api/performance/cpu_memory/last_seven_days/' + uuid
  53. }
  54. $.ajax({
  55. url : url,
  56. type : 'GET',
  57. contentType: "application/json; charset=utf-8",
  58. dataType: 'json',
  59. error : function() {
  60. alter_danger('获取图表数据失败失败!');
  61. },
  62. success : function(data, textStatus, xhr) {
  63. if (data.data.length > 1) {
  64. if ((data.data[data.data.length - 1]['timestamp'] - data.data[0]['timestamp']) >= 86400) {
  65. datetime_format_type = 'date';
  66. }
  67. }
  68. var option = {
  69. color: ['#3BC0FF'],
  70. title: {
  71. text: 'CPU'
  72. },
  73. legend: {
  74. data:['CPU使用率(%)'],
  75. bottom: 5
  76. },
  77. toolbox: {
  78. feature: {
  79. dataZoom: {
  80. yAxisIndex: 'none'
  81. },
  82. magicType: {type: ['line', 'bar']},
  83. saveAsImage: {show: true}
  84. }
  85. },
  86. tooltip: {
  87. show: true,
  88. trigger: 'axis',
  89. formatter: (function (params, ticket, callback) {
  90. var cpu_load = params[0].data[1];
  91. var seriesName = params[0].seriesName;
  92. var marker = params[0].marker;
  93. var datetime = new Date(params[0].data[0]).format('yyyy-mm-dd HH:MM:ss');
  94. if (cpu_load === null) {
  95. cpu_load = '无数据';
  96. }
  97. return datetime + '<br />' + [marker, seriesName, cpu_load].join(' ')
  98. })
  99. },
  100. xAxis: {
  101. type: 'time',
  102. axisTick: {
  103. show: false
  104. },
  105. axisLine: {
  106. lineStyle: {
  107. opacity: 0.1,
  108. color: '#3d4245'
  109. }
  110. },
  111. splitLine: {
  112. show: false
  113. },
  114. axisLabel: {
  115. formatter: format_time
  116. }
  117. },
  118. yAxis: {
  119. min: 0,
  120. max: 'dataMax',
  121. minInterval: 2,
  122. axisTick: {
  123. show: false
  124. },
  125. axisLine: {
  126. lineStyle: {
  127. opacity: 0,
  128. color: '#8c8f91'
  129. }
  130. },
  131. splitLine: {
  132. show: true,
  133. lineStyle: {
  134. width: 1,
  135. opacity: 0.5
  136. }
  137. }
  138. },
  139. series: [{
  140. name: 'CPU使用率(%)',
  141. type: 'line',
  142. showSymbol: false,
  143. smooth: true,
  144. lineStyle: {
  145. normal: {
  146. width: 1
  147. }
  148. },
  149. data: (function () {
  150. var d = [];
  151. $.each(data.data, function(i, ele) {
  152. d.push([
  153. ele['timestamp'] * 1000,
  154. ele['cpu_load']
  155. ])
  156. });
  157. return d;
  158. })()
  159. }]
  160. };
  161. cpu_chart.setOption(option);
  162. }
  163. });
  164. }
  165. $(document).ready(function() {
  166. $('body').addClass('add-transition');
  167. $('.add-page-transition').on('click', function(){
  168. var transAttr = $(this).attr('data-transition');
  169. $('.add-transition').attr('class', 'add-transition');
  170. $('.add-transition').addClass(transAttr);
  171. });
  172. cpu_chart = echarts.init(document.getElementById('cpu_chart'));
  173. render_cpu_memory_chart(uuid, 'six_hours');
  174. });
  175. </script>
  176. <div class="container" style="padding-top: 100px; width: 90%; max-width: 100%;">
  177. <div class="panel">
  178. <div class="panel-body">
  179. <h3 class="title-hero" style="display: inline;">
  180. 虚拟机实例详情
  181. </h3>
  182. <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;">
  183. <span class="glyph-icon icon-separator" style="transform: rotateY(-180deg);">
  184. <i class="glyph-icon icon-level-up"></i>
  185. </span>
  186. <span class="button-content">
  187. 返回虚拟机列表
  188. </span>
  189. </a>
  190. <div class="row">
  191. <div class="col-xs-4">
  192. <table>
  193. <thead>
  194. 实例信息
  195. </thead>
  196. <tbody>
  197. <tr>
  198. <td>
  199. <span>UUID: </span>
  200. <span>
  201. {{ guest_ret.data.uuid }}
  202. </span>
  203. </td>
  204. </tr>
  205. <tr>
  206. <td>
  207. <span>标识: </span>
  208. <span>
  209. {{ guest_ret.data.label }}
  210. </span>
  211. </td>
  212. </tr>
  213. <tr>
  214. <td>
  215. <span>备注: </span>
  216. <span>
  217. {{ guest_ret.data.remark }}
  218. </span>
  219. </td>
  220. </tr>
  221. <tr>
  222. <td>
  223. <span>所在宿主机: </span>
  224. <span>
  225. {{ guest_ret.data.on_host }}
  226. </span>
  227. </td>
  228. </tr>
  229. <tr>
  230. <td>
  231. <span>CPU: </span>
  232. <span>
  233. {{ guest_ret.data.cpu }}
  234. </span>
  235. </td>
  236. </tr>
  237. <tr>
  238. <td>
  239. <span>内存: </span>
  240. <span>
  241. {{ guest_ret.data.memory }}
  242. </span>
  243. </td>
  244. </tr>
  245. <tr>
  246. <td>
  247. <span>IP: </span>
  248. <span>
  249. {{ guest_ret.data.ip }}
  250. </span>
  251. </td>
  252. </tr>
  253. </tbody>
  254. </table>
  255. </div>
  256. <div class="col-xs-8">
  257. <div id="cpu_chart" style="width: 800px;height:280px;"></div>
  258. <div id="traffic_chart" style="width: 600px;height:300px;"></div>
  259. </div>
  260. </div>
  261. </div>
  262. </div>
  263. </div>
  264. {% endblock body %}