index.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  1. <template>
  2. <div class="system-cache-container">
  3. <div class="flex-row gap-3">
  4. <el-col :span="8" class="marg-b-15">
  5. <el-card class="box-card-height" style="height:auto">
  6. <template #header>
  7. <div class="card-header">
  8. <span>info Keyspace</span>
  9. </div>
  10. </template>
  11. <table cellspacing="0" style="height: 230px;width: 100%">
  12. <tbody v-if="sysInfo.keyspace">
  13. <tr>
  14. <td>
  15. <div class="cell-card">当前数据库key总数: </div>
  16. </td>
  17. <td>
  18. <div class="cell-card">{{ sysInfo.keyspace.db0.keys }}</div>
  19. </td>
  20. </tr>
  21. <tr>
  22. <td>
  23. <div class="cell-card">带有过期时间的key总数: </div>
  24. </td>
  25. <td>
  26. <div class="cell-card">{{ sysInfo.keyspace.db0.expires }}</div>
  27. </td>
  28. </tr>
  29. <tr>
  30. <td>
  31. <div class="cell-card">平均存活时间: </div>
  32. </td>
  33. <td>
  34. <div class="cell-card">{{timeFormat(sysInfo.keyspace.db0.avg_ttl)}}</div>
  35. </td>
  36. </tr>
  37. </tbody>
  38. </table>
  39. </el-card>
  40. </el-col>
  41. <el-col :span="8" class="marg-b-15">
  42. <el-card class="box-card-height" style="height:auto">
  43. <template #header>
  44. <div class="card-header">
  45. <span>客户端信息</span>
  46. </div>
  47. </template>
  48. <table cellspacing="0" style="height: 230px;width: 100%">
  49. <tbody v-if="sysInfo.clients">
  50. <tr>
  51. <td>
  52. <div class="cell-card">当前客户端连接数: </div>
  53. </td>
  54. <td>
  55. <div class="cell-card">{{ sysInfo.clients.connected_clients }}</div>
  56. </td>
  57. </tr>
  58. <tr>
  59. <td>
  60. <div class="cell-card">输出缓冲区中队列对象个数的最大值: </div>
  61. </td>
  62. <td>
  63. <div class="cell-card">{{ sysInfo.clients.client_recent_max_output_buffer }}</div>
  64. </td>
  65. </tr>
  66. <tr>
  67. <td>
  68. <div class="cell-card">输入缓冲区中占用的最大容量:</div>
  69. </td>
  70. <td>
  71. <div class="cell-card">{{ memorySizeFormat(sysInfo.clients.client_recent_max_input_buffer) }}</div>
  72. </td>
  73. </tr>
  74. <tr>
  75. <td>
  76. <div class="cell-card">等待阻塞命令的客户端数量:</div>
  77. </td>
  78. <td>
  79. <div class="cell-card">{{ sysInfo.clients.blocked_clients }}</div>
  80. </td>
  81. </tr>
  82. </tbody>
  83. </table>
  84. <!-- <div style="height: 250px" ref="chartsWarningRef4"></div> -->
  85. </el-card>
  86. </el-col>
  87. <el-col :span="8" class="marg-b-15">
  88. <el-card class="box-card-height" style="height:auto">
  89. <template #header>
  90. <div class="card-header">
  91. <span>CPU 信息</span>
  92. </div>
  93. </template>
  94. <table cellspacing="0" style="height: 230px;width: 100%">
  95. <tbody v-if="sysInfo.cpu">
  96. <tr>
  97. <td>
  98. <div class="cell-card" title="Redis主进程在内核态所占用的CPU时钟总和">主进程内核态占用CPU时钟: </div>
  99. </td>
  100. <td>
  101. <div class="cell-card">{{lengthToFixed2(sysInfo.cpu.used_cpu_sys)}}</div>
  102. </td>
  103. </tr>
  104. <tr>
  105. <td>
  106. <div class="cell-card" title="Redis主进程在用户态所占用的CPU时钟总和">主进程用户态占用CPU时钟: </div>
  107. </td>
  108. <td>
  109. <div class="cell-card">{{ lengthToFixed2(sysInfo.cpu.used_cpu_user) }}</div>
  110. </td>
  111. </tr>
  112. <tr>
  113. <td>
  114. <div class="cell-card" title="Redis子进程在内核态所占用的CPU时钟总和">子进程内核态占用CPU时钟:</div>
  115. </td>
  116. <td>
  117. <div class="cell-card">{{ lengthToFixed2(sysInfo.cpu.used_cpu_sys_children) }}</div>
  118. </td>
  119. </tr>
  120. <tr>
  121. <td>
  122. <div class="cell-card" title="Redis子进程在用户态所占用的CPU时钟总和">子进程用户态占用CPU时钟:</div>
  123. </td>
  124. <td>
  125. <div class="cell-card">{{ lengthToFixed2(sysInfo.cpu.used_cpu_user_children) }}</div>
  126. </td>
  127. </tr>
  128. </tbody>
  129. </table>
  130. <!-- <div style="height: 250px" ref="chartsWarningRef4"></div> -->
  131. </el-card>
  132. </el-col>
  133. </div>
  134. <div class="flex-row gap-3">
  135. <el-col :span="12" class="marg-b-15">
  136. <el-card class="box-card-height" style="height:auto">
  137. <template #header>
  138. <div class="card-header">
  139. <span>服务信息</span>
  140. </div>
  141. </template>
  142. <table cellspacing="0" style="height: 300px;width: 100%">
  143. <tbody v-if="sysInfo.clients">
  144. <tr>
  145. <td>
  146. <div class="cell-card">Redis服务版本: </div>
  147. </td>
  148. <td>
  149. <div class="cell-card">{{ sysInfo.server.redis_version }}</div>
  150. </td>
  151. </tr>
  152. <tr>
  153. <td>
  154. <div class="cell-card">运行模式: </div>
  155. </td>
  156. <td>
  157. <div class="cell-card">{{ sysInfo.server.redis_mode }}</div>
  158. </td>
  159. </tr>
  160. <tr>
  161. <td>
  162. <div class="cell-card">Redis所在机器的操作系统:</div>
  163. </td>
  164. <td>
  165. <div class="cell-card">{{ sysInfo.server.os }}</div>
  166. </td>
  167. </tr>
  168. <tr>
  169. <td>
  170. <div class="cell-card">架构:</div>
  171. </td>
  172. <td>
  173. <div class="cell-card">{{ sysInfo.server.arch_bits }}</div>
  174. </td>
  175. </tr>
  176. <tr>
  177. <td>
  178. <div class="cell-card">Redis所使用的事件处理机制:</div>
  179. </td>
  180. <td>
  181. <div class="cell-card">{{ sysInfo.server.multiplexing_api }}</div>
  182. </td>
  183. </tr>
  184. <tr>
  185. <td>
  186. <div class="cell-card">自Redis服务启动以来,运行的秒数:</div>
  187. </td>
  188. <td>
  189. <div class="cell-card">{{ sysInfo.server.uptime_in_seconds }}</div>
  190. </td>
  191. </tr>
  192. <tr>
  193. <td>
  194. <div class="cell-card">自Redis服务启动以来,运行的天数:</div>
  195. </td>
  196. <td>
  197. <div class="cell-card">{{ sysInfo.server.uptime_in_days }}</div>
  198. </td>
  199. </tr>
  200. <tr>
  201. <td>
  202. <div class="cell-card">serverCron每秒运行次数:</div>
  203. </td>
  204. <td>
  205. <div class="cell-card">{{ sysInfo.server.hz }}</div>
  206. </td>
  207. </tr>
  208. </tbody>
  209. </table>
  210. <!-- <div style="height: 250px" ref="chartsWarningRef5"></div> -->
  211. </el-card>
  212. </el-col>
  213. <el-col :span="12" class="marg-b-15">
  214. <el-card class="box-card-height" style="height:auto">
  215. <template #header>
  216. <div class="card-header">
  217. <span>内存信息</span>
  218. </div>
  219. </template>
  220. <table v-if='sysInfo.memory' cellspacing="0" style="height: 300px;width: 100%">
  221. <tbody>
  222. <tr>
  223. <td>
  224. <div class="cell-card">Redis分配器分配的内存总量: </div>
  225. </td>
  226. <td>
  227. <div class="cell-card">
  228. {{ memorySizeFormat(sysInfo.memory.used_memory) }} -
  229. {{ lengthToFixed2(sysInfo.memory.used_memory/sysInfo.memory.maxmemory)}}%
  230. </div>
  231. </td>
  232. </tr>
  233. <tr>
  234. <td>
  235. <div class="cell-card">以可读的格式返回used_memory: </div>
  236. </td>
  237. <td>
  238. <div class="cell-card">{{ memorySizeFormat(sysInfo.memory.used_memory_human) }}</div>
  239. </td>
  240. </tr>
  241. <tr>
  242. <td>
  243. <div class="cell-card">从操作系统的角度,Redis进程占用的物理内存总量:</div>
  244. </td>
  245. <td>
  246. <div class="cell-card">{{ memorySizeFormat(sysInfo.memory.used_memory_rss) }}</div>
  247. </td>
  248. </tr>
  249. <tr>
  250. <td>
  251. <div class="cell-card">内存使用的最大值:</div>
  252. </td>
  253. <td>
  254. <div class="cell-card">{{ memorySizeFormat(sysInfo.memory.used_memory_peak) }}</div>
  255. </td>
  256. </tr>
  257. <tr>
  258. <td>
  259. <div class="cell-card">以可读的格式返回used_memory_peak:</div>
  260. </td>
  261. <td>
  262. <div class="cell-card">{{ memorySizeFormat(sysInfo.memory.used_memory_peak_human) }}</div>
  263. </td>
  264. </tr>
  265. <tr>
  266. <td>
  267. <div class="cell-card">Lua引擎所消耗的内存大小:</div>
  268. </td>
  269. <td>
  270. <div class="cell-card">{{ memorySizeFormat(sysInfo.memory.used_memory_lua) }}</div>
  271. </td>
  272. </tr>
  273. <tr>
  274. <td>
  275. <div class="cell-card">内存碎片率:</div>
  276. </td>
  277. <td>
  278. <div class="cell-card">{{ sysInfo.memory.mem_fragmentation_ratio }}</div>
  279. </td>
  280. </tr>
  281. <tr>
  282. <td>
  283. <div class="cell-card">Redis所使用的内存分配器:</div>
  284. </td>
  285. <td>
  286. <div class="cell-card">{{ sysInfo.memory.mem_allocator }}</div>
  287. </td>
  288. </tr>
  289. </tbody>
  290. </table>
  291. <!-- <div style="height: 250px" ref="chartsWarningRef6"></div> -->
  292. </el-card>
  293. </el-col>
  294. </div>
  295. <div class="flex-row gap-3">
  296. <el-col :xs="24" :sm="24" :md="24" class="marg-b-15">
  297. <el-card class="box-card-height" style="height:auto">
  298. <template #header>
  299. <div class="card-header">
  300. <span>基础统计信息</span>
  301. </div>
  302. </template>
  303. <div class="flex-row">
  304. <el-form v-if="sysInfo.stats" label-position="right" label-width="160px" class="flex1" style="max-width: 460px">
  305. <el-form-item label="连接过的客户端总数">{{sysInfo.stats.total_connections_received}}</el-form-item>
  306. <el-form-item label="执行过的命令总数">{{sysInfo.stats.total_commands_processed}}</el-form-item>
  307. <el-form-item label="每秒处理命令条数">{{sysInfo.stats.instantaneous_ops_per_sec}}</el-form-item>
  308. <el-form-item label="拒绝的连接个数">{{sysInfo.stats.rejected_connections}}</el-form-item>
  309. <el-form-item label="key数量">{{sysInfo.stats.evicted_keys}}</el-form-item>
  310. </el-form>
  311. <el-form v-if="sysInfo.stats" label-position="right" label-width="160px" class="flex1" style="max-width: 460px">
  312. <el-form-item label="网络总入流量">{{ memorySizeFormat(sysInfo.stats.total_net_input_bytes) }}</el-form-item>
  313. <el-form-item label="网络总出流量">{{memorySizeFormat(sysInfo.stats.total_net_output_bytes)}}</el-form-item>
  314. <el-form-item label="每秒输入量">{{sysInfo.stats.instantaneous_input_kbps}} kb/s</el-form-item>
  315. <el-form-item label="每秒输出量">{{sysInfo.stats.instantaneous_output_kbps}} kb/s</el-form-item>
  316. <el-form-item label="最近fork消耗时间">{{sysInfo.stats.evicted_keys}} μs</el-form-item>
  317. </el-form>
  318. <el-form v-if="sysInfo.stats" label-position="right" label-width="160px" class="flex1" style="max-width: 460px">
  319. <el-form-item label="主从完全同步成功次数">{{sysInfo.stats.sync_full}}</el-form-item>
  320. <el-form-item label="主从部分同步成功次数">{{sysInfo.stats.sync_partial_ok}}</el-form-item>
  321. <el-form-item label="主从部分同步失败次数">{{sysInfo.stats.sync_partial_err}}</el-form-item>
  322. <el-form-item label="正migrate的Redis个数">{{sysInfo.stats.migrate_cached_sockets}} μs</el-form-item>
  323. <el-form-item label="过期的key数量">{{sysInfo.stats.expired_keys}}</el-form-item>
  324. </el-form>
  325. <el-form v-if="sysInfo.stats" label-position="right" label-width="160px" class="flex1" style="max-width: 460px">
  326. <el-form-item label="当前使用中的频道数量">{{sysInfo.stats.pubsub_channels}}</el-form-item>
  327. <el-form-item label="当前使用中的模式数量">{{sysInfo.stats.pubsub_patterns}}</el-form-item>
  328. <el-form-item label="不命中次数">{{sysInfo.stats.keyspace_misses}}</el-form-item>
  329. <el-form-item label="命中次数">{{sysInfo.stats.keyspace_hits}}</el-form-item>
  330. </el-form>
  331. </div>
  332. </el-card>
  333. </el-col>
  334. </div>
  335. </div>
  336. </template>
  337. <script lang="ts">
  338. import { toRefs, reactive, onMounted, getCurrentInstance, defineComponent } from 'vue';
  339. import * as echarts from 'echarts';
  340. import 'echarts-wordcloud';
  341. import dayjs from 'dayjs';
  342. import getOrigin from '/@/utils/origin'
  343. let interval: any = null;
  344. export default defineComponent({
  345. name: 'monitor',
  346. components: {},
  347. setup() {
  348. const { proxy } = getCurrentInstance() as any;
  349. const state: any = reactive({
  350. myCharts: [],
  351. sysInfo: {},
  352. });
  353. let myChart1: any;
  354. let myChart2: any;
  355. let myChart3: any;
  356. let myChart4: any;
  357. let myChart5: any;
  358. let myChart6: any;
  359. // const hostData = reactive({
  360. // "bootTime": "2022-11-24T11:12:13+08:00",
  361. // "hostId": "8be74718-1a53-4208-be22-9c126d891ddd",
  362. // "hostname": "iZ2zee04uvnkmhvglw9oghZ",
  363. // "intranet_ip": "172.17.47.62",
  364. // "kernelArch": "x86_64",
  365. // "kernelVersion": "3.10.0-1127.19.1.el7.x86_64",
  366. // "os": "linux",
  367. // "platform": "centos",
  368. // "platformFamily": "rhel",
  369. // "platformVersion": "7.7.1908",
  370. // "procs": 138,
  371. // "public_ip": "101.200.198.249",
  372. // "uptime": 6393278,
  373. // "virtualizationRole": "guest",
  374. // "virtualizationSystem": ""
  375. // });
  376. // const goInfoData = reactive({
  377. // "goOs": "-", "arch": "-", "goVersion": "-", "goMem": "-", "goName": "-", "goSize": "-", "goVersion": "-", "goroutine": '-', "pwd": "-", "rootPath": "-",
  378. // "runTime": '', "startTime": "-", "intranet_ip": "-"
  379. // });
  380. //
  381. // const stats = reactive({
  382. // "total_connections_received": "-",
  383. // "arch": "-",
  384. // "goVersion": "-",
  385. // "goMem": "-",
  386. // "goName": "-",
  387. // "goSize": "-",
  388. // "goVersion": "-",
  389. // "goroutine": '-',
  390. // "pwd": "-",
  391. // "rootPath": "-",
  392. // "runTime": '',
  393. // "startTime": "-",
  394. // "intranet_ip": "-"
  395. // });
  396. //
  397. // function goInfo(event: { data: any; }) {
  398. // const data = JSON.parse(event.data);
  399. // Object.assign(goInfoData, data);
  400. // }
  401. // function hostInfo(event: { data: any; }) {
  402. // const data = JSON.parse(event.data);
  403. // Object.assign(hostData, data);
  404. // }
  405. const myChart4Data: any = {
  406. name: [],
  407. value: [],
  408. }
  409. const myChart5Data: any = {
  410. name: [],
  411. value: [],
  412. }
  413. const myChart6Data: any = {
  414. name: [],
  415. value: [],
  416. }
  417. const moveOption = {
  418. tooltip: {
  419. trigger: 'axis',
  420. },
  421. grid: {
  422. top: 10,
  423. bottom: 20,
  424. left: 10,
  425. right: 10,
  426. containLabel: true
  427. },
  428. xAxis: {
  429. type: 'category',
  430. splitLine: {
  431. show: false
  432. }
  433. },
  434. yAxis: {
  435. type: 'value',
  436. boundaryGap: [0, '100%'],
  437. splitLine: {
  438. show: false
  439. }
  440. },
  441. series: [
  442. {
  443. name: '使用率',
  444. type: 'line',
  445. showSymbol: false,
  446. data: []
  447. }
  448. ]
  449. };
  450. function setOptChart1(value: number) {
  451. myChart1.setOption({
  452. series: [
  453. {
  454. data: [
  455. {
  456. value: value,
  457. name: '',//cpu
  458. },
  459. ],
  460. },
  461. ],
  462. });
  463. }
  464. function setOptChart2(value: number) {
  465. myChart2.setOption({
  466. series: [
  467. {
  468. data: [
  469. {
  470. value: value,
  471. name: '',//内存
  472. },
  473. ],
  474. },
  475. ],
  476. });
  477. }
  478. function setOptChart3(value: number) {
  479. myChart3.setOption({
  480. series: [
  481. {
  482. data: [
  483. {
  484. value: value,
  485. name: '',//磁盘
  486. },
  487. ],
  488. },
  489. ],
  490. });
  491. }
  492. function setOptChart(myChart: any, myChartData: any, value: number) {
  493. myChartData.name.push(dayjs().format('HH:mm:ss'));
  494. myChartData.value.push(value);
  495. myChart.setOption({
  496. xAxis: {
  497. data: myChartData.name
  498. },
  499. series: [
  500. {
  501. data: myChartData.value
  502. },
  503. ],
  504. });
  505. }
  506. //CPU
  507. const initChartCPU = () => {
  508. myChart1 = echarts.init(proxy.$refs.chartsWarningRef1);
  509. const option = {
  510. tooltip: {
  511. formatter: '{a} <br/>{b} : {c}%',
  512. },
  513. series: [
  514. {
  515. type: 'gauge',
  516. name: 'CPU',
  517. radius: '90%', //修改表盘大小
  518. title: {
  519. show: true, //控制表盘title(今日预计用电量)字体是否显示
  520. fontSize: 12, //控制表盘title(今日预计用电量)字体大小
  521. 'color': 'green', //控制表盘title(今日预计用电量)字体颜色
  522. offsetCenter: [-2, '30%'], //设置表盘title(今日预计用电量)位置
  523. },
  524. axisLine: {
  525. show: true,
  526. lineStyle: {
  527. // 属性lineStyle控制线条样式
  528. color: [
  529. [0.3, '#4dabf7'],
  530. [0.6, '#69db7c'],
  531. [0.8, '#ffa94d'],
  532. [1, '#ff6b6b'],
  533. ],
  534. },
  535. },
  536. splitNumber: 5, //分割线之间的刻度
  537. detail: {
  538. valueAnimation: true,
  539. formatter: '{value}%',
  540. textStyle: {
  541. fontSize: 20,
  542. color: 'red',
  543. },
  544. offsetCenter: ['0', '80%'], //表盘数据(30%)位置
  545. },
  546. // data: [
  547. // {
  548. // value: 15,
  549. // name: 'CPU使用率',
  550. // },
  551. // ],
  552. },
  553. ],
  554. };
  555. myChart1.setOption(option);
  556. state.myCharts.push(myChart1);
  557. };
  558. //内存
  559. const initChartRAM = () => {
  560. myChart2 = echarts.init(proxy.$refs.chartsWarningRef2);
  561. const option = {
  562. tooltip: {
  563. formatter: '{a} <br/>{b} : {c}%',
  564. },
  565. series: [
  566. {
  567. type: 'gauge',
  568. name: '内存',
  569. radius: '90%', //修改表盘大小
  570. title: {
  571. show: true, //控制表盘title(今日预计用电量)字体是否显示
  572. fontSize: 12, //控制表盘title(今日预计用电量)字体大小
  573. 'color': 'green', //控制表盘title(今日预计用电量)字体颜色
  574. offsetCenter: [-2, '30%'], //设置表盘title(今日预计用电量)位置
  575. },
  576. axisLine: {
  577. show: true,
  578. lineStyle: {
  579. // 属性lineStyle控制线条样式
  580. color: [
  581. [0.3, '#4dabf7'],
  582. [0.6, '#69db7c'],
  583. [0.8, '#ffa94d'],
  584. [1, '#ff6b6b'],
  585. ],
  586. },
  587. },
  588. splitNumber: 5, //分割线之间的刻度
  589. detail: {
  590. valueAnimation: true,
  591. formatter: '{value}%',
  592. textStyle: {
  593. fontSize: 20,
  594. color: 'red',
  595. },
  596. offsetCenter: ['0', '80%'], //表盘数据(30%)位置
  597. },
  598. // data: [
  599. // {
  600. // value: 30,
  601. // name: '内存使用率',
  602. // },
  603. // ],
  604. },
  605. ],
  606. };
  607. myChart2.setOption(option);
  608. state.myCharts.push(myChart2);
  609. };
  610. //磁盘
  611. const initChartDISK = () => {
  612. myChart3 = echarts.init(proxy.$refs.chartsWarningRef3);
  613. const option = {
  614. tooltip: {
  615. formatter: '{a} <br/>{b} : {c}%',
  616. },
  617. series: [
  618. {
  619. type: 'gauge',
  620. name: '磁盘',
  621. radius: '90%', //修改表盘大小
  622. title: {
  623. show: true, //控制表盘title(今日预计用电量)字体是否显示
  624. fontSize: 12, //控制表盘title(今日预计用电量)字体大小
  625. 'color': 'green', //控制表盘title(今日预计用电量)字体颜色
  626. offsetCenter: [-2, '30%'], //设置表盘title(今日预计用电量)位置
  627. },
  628. axisLine: {
  629. show: true,
  630. lineStyle: {
  631. // 属性lineStyle控制线条样式
  632. color: [
  633. [0.3, '#4dabf7'],
  634. [0.6, '#69db7c'],
  635. [0.8, '#ffa94d'],
  636. [1, '#ff6b6b'],
  637. ],
  638. },
  639. },
  640. splitNumber: 5, //分割线之间的刻度
  641. detail: {
  642. valueAnimation: true,
  643. formatter: '{value}%',
  644. textStyle: {
  645. fontSize: 20,
  646. color: 'red',
  647. },
  648. offsetCenter: ['0', '80%'], //表盘数据(30%)位置
  649. },
  650. // data: [
  651. // {
  652. // value: 30,
  653. // name: '内存使用率',
  654. // },
  655. // ],
  656. },
  657. ],
  658. };
  659. myChart3.setOption(option);
  660. state.myCharts.push(myChart3);
  661. };
  662. //cpu运行状态
  663. // const initChartCPURun = () => {
  664. // myChart4 = echarts.init(proxy.$refs.chartsWarningRef4);
  665. // myChart4.setOption({ ...moveOption });
  666. // state.myCharts.push(myChart4);
  667. // };
  668. // //内存运行状态
  669. // const initChartRAMRun = () => {
  670. // myChart5 = echarts.init(proxy.$refs.chartsWarningRef5);
  671. // myChart5.setOption({ ...moveOption });
  672. // state.myCharts.push(myChart5);
  673. // };
  674. // //磁盘运行状态
  675. // const initChartDISKRun = () => {
  676. // myChart6 = echarts.init(proxy.$refs.chartsWarningRef6);
  677. // myChart6.setOption({ ...moveOption });
  678. // state.myCharts.push(myChart6);
  679. // };
  680. // 页面加载时
  681. // onMounted(() => {
  682. // initChartCPU();
  683. // initChartRAM();
  684. // initChartDISK();
  685. // initChartCPURun();
  686. // initChartRAMRun();
  687. // initChartDISKRun();
  688. // });
  689. function startWs() {
  690. // ws = null;
  691. // ws = new WebSocket(import.meta.env.VITE_WS_URL + '/monitorServer/ws');
  692. // ws.onopen = () => {};
  693. // ws.onmessage = ({ data: dataStr }) => {
  694. // const data = JSON.parse(dataStr);
  695. // state.sysInfo = data;
  696. // setOptChart1(data.cpuUsed);
  697. // setOptChart2(data.memUsage);
  698. // setOptChart3(data.diskUsedPercent);
  699. // };
  700. const es = new EventSource(getOrigin(import.meta.env.VITE_SERVER_URL + "/subscribe/redisinfo"));
  701. es.addEventListener("stats", statsInfoMsg);
  702. es.addEventListener("clients", clientsInfoMsg);
  703. es.addEventListener("cpu", cpuInfoMsg);
  704. es.addEventListener("server", serverInfoMsg);
  705. es.addEventListener("memory", memoryInfoMsg);
  706. es.addEventListener("keyspace", keyspaceInfoMsg);
  707. }
  708. startWs();
  709. function keyspaceInfoMsg(event: { data: any; }) {
  710. const data = JSON.parse(event.data);
  711. state.sysInfo.keyspace = data
  712. }
  713. function memoryInfoMsg(event: { data: any; }) {
  714. const data = JSON.parse(event.data);
  715. state.sysInfo.memory = data
  716. }
  717. function serverInfoMsg(event: { data: any; }) {
  718. const data = JSON.parse(event.data);
  719. state.sysInfo.server = data
  720. }
  721. function cpuInfoMsg(event: { data: any; }) {
  722. const data = JSON.parse(event.data);
  723. state.sysInfo.cpu = data
  724. }
  725. function statsInfoMsg(event: { data: any; }) {
  726. const data = JSON.parse(event.data);
  727. state.sysInfo.stats = data
  728. }
  729. function clientsInfoMsg(event: { data: any; }) {
  730. const data = JSON.parse(event.data);
  731. state.sysInfo.clients = data
  732. }
  733. return {
  734. ...toRefs(state),
  735. // goInfoData,
  736. // hostData,
  737. // setOptChart1,
  738. // setOptChart2,
  739. // setOptChart3,
  740. // ws,
  741. };
  742. },
  743. unmounted() {
  744. if (interval) {
  745. clearInterval(interval);
  746. interval = null;
  747. }
  748. },
  749. data() {
  750. return {};
  751. },
  752. methods: {
  753. memorySizeFormat(size: any) {
  754. size = parseFloat(size);
  755. let rank = 0;
  756. let rankchar = 'Bytes';
  757. while (size > 1024 && rankchar != 'TB') {
  758. size = size / 1024;
  759. rank++;
  760. if (rank == 1) {
  761. rankchar = 'KB';
  762. } else if (rank == 2) {
  763. rankchar = 'MB';
  764. } else if (rank == 3) {
  765. rankchar = 'GB';
  766. } else if (rank == 4) {
  767. rankchar = 'TB';
  768. }
  769. }
  770. return size.toFixed(2) + ' ' + rankchar;
  771. },
  772. lengthToFixed2(size: any) {
  773. size = parseFloat(size);
  774. return size.toFixed(2);
  775. },
  776. timeFormat(second: any) {
  777. if (!second) return '-'
  778. second = parseFloat(second);
  779. let rank = 0;
  780. let rankchar = '秒';
  781. while ((second > 60 && rankchar != '小时' && rankchar != '天') || (second > 24 && rankchar == '小时')) {
  782. if (rankchar == '小时') {
  783. second = second / 24;
  784. } else {
  785. second = second / 60;
  786. }
  787. rank++;
  788. if (rank == 1) {
  789. rankchar = '分';
  790. } else if (rank == 2) {
  791. rankchar = '小时';
  792. } else if (rank == 3) {
  793. rankchar = '天';
  794. }
  795. }
  796. return second.toFixed(2) + ' ' + rankchar;
  797. },
  798. },
  799. });
  800. </script>
  801. <style scoped lang="scss">
  802. .el-card {
  803. height: 300px;
  804. overflow-y: auto;
  805. }
  806. .marg-b-15 {
  807. margin-bottom: 15px;
  808. }
  809. .cell {
  810. box-sizing: border-box;
  811. overflow: hidden;
  812. text-overflow: ellipsis;
  813. white-space: normal;
  814. word-break: break-all;
  815. line-height: 36px;
  816. padding-left: 10px;
  817. padding-right: 10px;
  818. }
  819. .cell-card {
  820. box-sizing: border-box;
  821. overflow: hidden;
  822. text-overflow: ellipsis;
  823. white-space: normal;
  824. word-break: break-all;
  825. line-height: 36px;
  826. }
  827. .box-card {
  828. min-height: 380px;
  829. }
  830. .box-card-meter {
  831. height: 230px;
  832. min-height: 180px;
  833. }
  834. </style>