counter.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. const { createApp, ref, onMounted, watch, computed } = Vue;
  2. const { createDiscreteApi } = naive;
  3. const { message, dialog } = createDiscreteApi(["message", "dialog"]);
  4. window.message = message;
  5. window.dialog = dialog;
  6. createApp({
  7. setup() {
  8. const servers = ref([]);
  9. const server = ref('');
  10. return {
  11. servers,
  12. server
  13. };
  14. },
  15. methods: {
  16. async getServers() {
  17. this.servers = await axios.get("/system/GetServers").then(function (response) {
  18. return response.data.map(item => { return { label: item, value: item }; });
  19. });
  20. this.server = this.servers.length > 0 ? this.servers[0].value : '';
  21. },
  22. async clearMemory() {
  23. await axios.post("/dashboard/clear-memory");
  24. message.success("操作成功");
  25. },
  26. async refreshMemory() {
  27. await axios.post("/dashboard/refresh-memory");
  28. message.success("操作成功");
  29. }
  30. },
  31. mounted() {
  32. this.getServers();
  33. showLine(this.server);
  34. },
  35. watch: {
  36. server(newVal, oldVal) {
  37. showLine(this.server);
  38. }
  39. },
  40. }).use(naive).mount('#app');
  41. function showSpeed() {
  42. var myChart = echarts.init(document.getElementById("container"));
  43. myChart.setOption({
  44. series: [{
  45. type: 'gauge',
  46. anchor: {
  47. show: true,
  48. showAbove: true,
  49. size: 18,
  50. itemStyle: {
  51. color: '#FAC858'
  52. }
  53. },
  54. pointer: {
  55. icon: 'path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z',
  56. width: 8,
  57. length: '80%',
  58. offsetCenter: [0, '8%']
  59. },
  60. progress: {
  61. show: true,
  62. overlap: true,
  63. roundCap: true
  64. },
  65. axisLine: {
  66. roundCap: true
  67. },
  68. data: [{
  69. value: 0,
  70. name: 'CPU',
  71. title: {
  72. offsetCenter: ['-25%', '80%']
  73. },
  74. detail: {
  75. offsetCenter: ['-25%', '95%']
  76. }
  77. },
  78. {
  79. value: 0,
  80. name: '内存',
  81. title: {
  82. offsetCenter: ['25%', '80%']
  83. },
  84. detail: {
  85. offsetCenter: ['25%', '95%']
  86. }
  87. }, {
  88. value: 0,
  89. name: 'CPU(网站)',
  90. title: {
  91. offsetCenter: ['-75%', '80%']
  92. },
  93. detail: {
  94. offsetCenter: ['-75%', '95%']
  95. }
  96. },
  97. {
  98. value: 0,
  99. name: '内存(网站)',
  100. title: {
  101. offsetCenter: ['75%', '80%']
  102. },
  103. detail: {
  104. offsetCenter: ['75%', '95%']
  105. }
  106. }],
  107. title: {
  108. fontSize: 14
  109. },
  110. detail: {
  111. width: 40,
  112. height: 14,
  113. fontSize: 14,
  114. color: '#fff',
  115. backgroundColor: 'auto',
  116. borderRadius: 3,
  117. formatter: '{value}%'
  118. }
  119. }]
  120. });
  121. return myChart;
  122. }
  123. function showIO(data) {
  124. var myChart = echarts.init(document.getElementById("container-io"));
  125. myChart.setOption({
  126. tooltip: {
  127. trigger: 'axis',
  128. axisPointer: {
  129. animation: false
  130. }
  131. },
  132. dataZoom: [{
  133. type: 'inside',
  134. start: 70,
  135. end: 100,
  136. minValueSpan: 100
  137. }, {
  138. start: 70,
  139. end: 100,
  140. minValueSpan: 100
  141. }],
  142. xAxis: {
  143. type: 'time',
  144. interval: 20000,
  145. axisLabel: {
  146. formatter: function (value) {
  147. var dt = new Date(value);
  148. return dt.getHours() + ":" + dt.getMinutes() + ":" + dt.getSeconds()
  149. }
  150. },
  151. splitLine: {
  152. show: false
  153. }
  154. },
  155. yAxis: [{
  156. name: '磁盘',
  157. type: 'value',
  158. splitLine: {
  159. show: false
  160. }
  161. },
  162. {
  163. name: '网络',
  164. type: 'value',
  165. splitLine: {
  166. show: false
  167. }
  168. }
  169. ],
  170. legend: {
  171. data: ['磁盘读(KBps)', '磁盘写(KBps)', "网络上行(KBps)", "网络下行(KBps)"],
  172. top: 0
  173. },
  174. series: [{
  175. name: '磁盘读(KBps)',
  176. type: 'line',
  177. showSymbol: false,
  178. hoverAnimation: false,
  179. data: data.read
  180. }, {
  181. name: '磁盘写(KBps)',
  182. type: 'line',
  183. showSymbol: false,
  184. hoverAnimation: false,
  185. data: data.write
  186. }, {
  187. name: '网络上行(KBps)',
  188. yAxisIndex: 1,
  189. type: 'line',
  190. showSymbol: false,
  191. hoverAnimation: false,
  192. data: data.up
  193. }, {
  194. name: '网络下行(KBps)',
  195. yAxisIndex: 1,
  196. type: 'line',
  197. showSymbol: false,
  198. hoverAnimation: false,
  199. data: data.down
  200. }]
  201. });
  202. return myChart;
  203. }
  204. function showLine(ip) {
  205. clearInterval(window.counterInterval);
  206. window.fetch("/system/GetCounterHistory?ip=" + ip, {
  207. credentials: 'include',
  208. method: 'GET',
  209. mode: 'cors'
  210. }).then(function (response) {
  211. return response.json();
  212. }).then(function (data) {
  213. var myChart = echarts.init(document.getElementById("container-cpu"));
  214. myChart.setOption({
  215. visualMap: [{
  216. show: false,
  217. type: 'continuous',
  218. seriesIndex: 0
  219. }],
  220. tooltip: {
  221. trigger: 'axis',
  222. axisPointer: {
  223. animation: false
  224. }
  225. },
  226. dataZoom: [{
  227. type: 'inside',
  228. start: 70,
  229. end: 100,
  230. minValueSpan: 100
  231. }, {
  232. start: 70,
  233. end: 100,
  234. minValueSpan: 100
  235. }],
  236. xAxis: {
  237. type: 'time',
  238. interval: 20000,
  239. axisLabel: {
  240. formatter: function (value) {
  241. var dt = new Date(value);
  242. return dt.getHours() + ":" + dt.getMinutes() + ":" + dt.getSeconds()
  243. }
  244. },
  245. splitLine: {
  246. show: false
  247. }
  248. },
  249. yAxis: {
  250. type: 'value',
  251. boundaryGap: [0, '100%'],
  252. splitLine: {
  253. show: false
  254. },
  255. max: 100
  256. },
  257. legend: {
  258. data: ['CPU使用率', '网站CPU使用率', '内存使用率', '网站内存使用率'],
  259. top: 0
  260. },
  261. series: [{
  262. name: 'CPU使用率',
  263. type: 'line',
  264. showSymbol: false,
  265. hoverAnimation: false,
  266. data: data.cpu,
  267. markPoint: {
  268. data: [
  269. { type: 'max', name: '最大值' },
  270. { type: 'min', name: '最小值' }
  271. ]
  272. },
  273. markLine: {
  274. data: [
  275. { type: 'average', name: '平均值' }
  276. ]
  277. }
  278. }, {
  279. name: '网站CPU使用率',
  280. type: 'line',
  281. showSymbol: false,
  282. hoverAnimation: false,
  283. data: data.processCpu
  284. }, {
  285. name: '内存使用率',
  286. type: 'line',
  287. showSymbol: false,
  288. hoverAnimation: false,
  289. data: data.mem,
  290. markPoint: {
  291. data: [
  292. { type: 'max', name: '最大值' },
  293. { type: 'min', name: '最小值' }
  294. ]
  295. },
  296. markLine: {
  297. data: [
  298. { type: 'average', name: '平均值' }
  299. ]
  300. }
  301. }, {
  302. name: '网站内存使用率',
  303. type: 'line',
  304. showSymbol: false,
  305. hoverAnimation: false,
  306. data: data.processMem
  307. }]
  308. });
  309. var rateChart = showSpeed();
  310. var ioChart = showIO(data);
  311. DotNet.invokeMethodAsync('Masuit.MyBlogs.Core', 'GetTotalMemory').then(res => {
  312. window.counterInterval = setInterval(function () {
  313. DotNet.invokeMethodAsync('Masuit.MyBlogs.Core', 'GetCurrentPerformanceCounter').then(item => {
  314. data.cpu.push([item.time, item.cpuLoad.toFixed(2)]);
  315. data.mem.push([item.time, (item.memoryUsage / res * 100).toFixed(2)]);
  316. data.processCpu.push([item.time, item.processCpuLoad.toFixed(2)]);
  317. data.processMem.push([item.time, (item.processMemoryUsage / res * 100).toFixed(2)]);
  318. data.read.push([item.time, item.diskRead.toFixed(2)]);
  319. data.write.push([item.time, item.diskWrite.toFixed(2)]);
  320. data.up.push([item.time, item.upload.toFixed(2)]);
  321. data.down.push([item.time, item.download.toFixed(2)]);
  322. myChart.setOption({
  323. series: [{
  324. data: data.cpu
  325. }, {
  326. data: data.processCpu
  327. }, {
  328. data: data.mem
  329. }, {
  330. data: data.processMem
  331. }]
  332. });
  333. ioChart.setOption({
  334. series: [{
  335. data: data.read
  336. }, {
  337. data: data.write
  338. }, {
  339. data: data.up
  340. }, {
  341. data: data.down
  342. }]
  343. });
  344. let option = rateChart.getOption();
  345. option.series[0].data[0].value = item.cpuLoad.toFixed(2);
  346. option.series[0].data[1].value = (item.memoryUsage / res * 100).toFixed(2);
  347. option.series[0].data[2].value = item.processCpuLoad.toFixed(2);
  348. option.series[0].data[3].value = (item.processMemoryUsage / res * 100).toFixed(2);
  349. rateChart.setOption(option, true);
  350. });
  351. }, 2000);
  352. })
  353. }).catch(function (e) {
  354. console.error(e);
  355. });
  356. }