SystemView.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import { useState, useEffect, useRef } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { makeStyles, Theme } from '@material-ui/core';
  4. import clsx from 'clsx';
  5. import { useNavigationHook } from '../../hooks/Navigation';
  6. import { ALL_ROUTER_TYPES } from '../../router/Types';
  7. import { MilvusHttp } from '../../http/Milvus';
  8. import { useInterval } from '../../hooks/SystemView';
  9. import Topo from './Topology';
  10. import NodeListView from './NodeListView';
  11. import LineChartCard from './LineChartCard';
  12. import ProgressCard from './ProgressCard';
  13. import DataCard from './DataCard';
  14. const getStyles = makeStyles((theme: Theme) => ({
  15. root: {
  16. fontFamily: 'Roboto',
  17. margin: '14px 40px',
  18. position: 'relative',
  19. height: 'calc(100vh - 80px)',
  20. display: 'flex',
  21. flexDirection: 'column',
  22. },
  23. cardContainer: {
  24. display: 'grid',
  25. gap: '16px',
  26. gridTemplateColumns: 'repeat(4, minmax(300px, 1fr))',
  27. },
  28. transparent: {
  29. opacity: 0,
  30. transition: 'opacity .5s',
  31. },
  32. contentContainer: {
  33. borderRadius: '8px',
  34. boxShadow: '3px 3px 10px rgba(0, 0, 0, 0.05)',
  35. display: 'grid',
  36. gridTemplateColumns: '1fr auto',
  37. marginTop: '14px',
  38. height: '100%',
  39. },
  40. childView: {
  41. height: '100%',
  42. width: '100%',
  43. transition: 'all .25s',
  44. position: 'absolute',
  45. zIndex: 1000,
  46. backgroundColor: 'white',
  47. },
  48. showChildView: {
  49. top: 0,
  50. maxHeight: 'auto',
  51. },
  52. hideChildView: {
  53. top: '1000px',
  54. maxHeight: 0,
  55. },
  56. childCloseBtn: {
  57. border: 0,
  58. backgroundColor: 'white',
  59. width: '100%',
  60. }
  61. }));
  62. const parseJson = (jsonData: any) => {
  63. const nodes: any[] = [];
  64. const childNodes: any[] = [];
  65. const system = {
  66. // qps: Math.random() * 1000,
  67. letency: Math.random() * 1000,
  68. disk: 0,
  69. diskUsage: 0,
  70. memory: 0,
  71. memoryUsage: 0,
  72. }
  73. jsonData?.response?.nodes_info.forEach((node: any) => {
  74. const type = node?.infos?.type;
  75. // coordinator node
  76. if (type.includes("Coord")) {
  77. nodes.push(node);
  78. // other nodes
  79. } else {
  80. childNodes.push(node);
  81. }
  82. const info = node.infos.hardware_infos;
  83. system.memory += info.memory;
  84. system.memoryUsage += info.memory_usage;
  85. system.disk += info.disk;
  86. system.diskUsage += info.disk_usage;
  87. });
  88. return { nodes, childNodes, system };
  89. }
  90. const SystemView: any = () => {
  91. useNavigationHook(ALL_ROUTER_TYPES.SYSTEM);
  92. const { t } = useTranslation('systemView');
  93. const classes = getStyles();
  94. const INTERVAL = 10000;
  95. const [data, setData] = useState<{ nodes: any, childNodes: any, system: any }>({ nodes: [], childNodes: [], system: {} });
  96. const [selectedNode, setNode] = useState<any>();
  97. const [selectedCord, setCord] = useState<any>();
  98. const { nodes, childNodes, system } = data;
  99. useInterval(async () => {
  100. if (!selectedCord) {
  101. const res = await MilvusHttp.getMetrics();
  102. setData(parseJson(res));
  103. }
  104. }, INTERVAL);
  105. useEffect(() => {
  106. async function fetchData() {
  107. const res = await MilvusHttp.getMetrics();
  108. setData(parseJson(res));
  109. }
  110. fetchData();
  111. }, []);
  112. let qps = system?.qps || 0;
  113. const letency = system?.letency || 0;
  114. const childView = useRef<HTMLInputElement>(null);
  115. return (
  116. <div className={classes.root}>
  117. <div className={clsx(classes.cardContainer, selectedCord && classes.transparent)}>
  118. <ProgressCard title={t('diskTitle')} usage={system.diskUsage} total={system.disk} />
  119. <ProgressCard title={t('memoryTitle')} usage={system.memoryUsage} total={system.memory} />
  120. <LineChartCard title={t('qpsTitle')} value={qps} />
  121. <LineChartCard title={t('letencyTitle')} value={letency} />
  122. </div>
  123. <div className={classes.contentContainer}>
  124. <Topo nodes={nodes} setNode={setNode} setCord={setCord} />
  125. <DataCard node={selectedNode} extend />
  126. </div>
  127. <div
  128. ref={childView}
  129. className={clsx(classes.childView,
  130. selectedCord ? classes.showChildView : classes.hideChildView)}
  131. >
  132. {selectedCord && (<NodeListView selectedCord={selectedCord} childNodes={childNodes} setCord={setCord} />)}
  133. </div>
  134. </div >
  135. );
  136. };
  137. export default SystemView;