SystemView.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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: 'fit-content',
  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. minHeight: '100%',
  51. height: 'fit-content',
  52. },
  53. hideChildView: {
  54. top: '1500px',
  55. maxHeight: 0,
  56. },
  57. childCloseBtn: {
  58. border: 0,
  59. backgroundColor: 'white',
  60. width: '100%',
  61. },
  62. }));
  63. const parseJson = (jsonData: any) => {
  64. const nodes: any[] = [];
  65. const childNodes: any[] = [];
  66. const system = {
  67. // qps: Math.random() * 1000,
  68. latency: Math.random() * 1000,
  69. disk: 0,
  70. diskUsage: 0,
  71. memory: 0,
  72. memoryUsage: 0,
  73. };
  74. jsonData?.response?.nodes_info.forEach((node: any) => {
  75. const type = node?.infos?.type;
  76. const has_error = node?.infos?.has_error;
  77. if (has_error) {
  78. return;
  79. }
  80. // coordinator node
  81. if (type?.toLowerCase().includes('coord')) {
  82. nodes.push(node);
  83. // other nodes
  84. } else {
  85. childNodes.push(node);
  86. }
  87. const info = node.infos.hardware_infos;
  88. system.memory += info.memory;
  89. system.memoryUsage += info.memory_usage;
  90. system.disk += info.disk;
  91. system.diskUsage += info.disk_usage;
  92. });
  93. return { nodes, childNodes, system };
  94. };
  95. /**
  96. * Todo: Milvus V2.0.0 Memory data is not ready for now, open it after Milvus ready.
  97. * @returns
  98. */
  99. const SystemView: any = () => {
  100. useNavigationHook(ALL_ROUTER_TYPES.SYSTEM);
  101. // const { t } = useTranslation('systemView');
  102. const classes = getStyles();
  103. const INTERVAL = 10000;
  104. const [data, setData] = useState<{
  105. nodes: any;
  106. childNodes: any;
  107. system: any;
  108. }>({ nodes: [], childNodes: [], system: {} });
  109. const [selectedNode, setNode] = useState<any>();
  110. const [selectedCord, setCord] = useState<any>();
  111. const { nodes, childNodes } = data;
  112. useInterval(async () => {
  113. if (!selectedCord) {
  114. const res = await MilvusHttp.getMetrics();
  115. setData(parseJson(res));
  116. }
  117. }, INTERVAL);
  118. useEffect(() => {
  119. async function fetchData() {
  120. const res = await MilvusHttp.getMetrics();
  121. setData(parseJson(res));
  122. }
  123. fetchData();
  124. }, []);
  125. // let qps = system?.qps || 0;
  126. // const latency = system?.latency || 0;
  127. const childView = useRef<HTMLInputElement>(null);
  128. return (
  129. <div className={classes.root}>
  130. {/* hide cards until metrics api can provide enough data*/}
  131. {/* <div
  132. className={clsx(
  133. classes.cardContainer,
  134. selectedCord && classes.transparent
  135. )}
  136. >
  137. <ProgressCard
  138. title={t('diskTitle')}
  139. usage={system.diskUsage}
  140. total={system.disk}
  141. />
  142. <ProgressCard
  143. title={t('memoryTitle')}
  144. usage={system.memoryUsage}
  145. total={system.memory}
  146. />
  147. <LineChartCard title={t('qpsTitle')} value={qps} />
  148. <LineChartCard title={t('latencyTitle')} value={latency} />
  149. </div> */}
  150. <div className={classes.contentContainer}>
  151. <Topo nodes={nodes} setNode={setNode} setCord={setCord} />
  152. <DataCard node={selectedNode} extend />
  153. </div>
  154. <div
  155. ref={childView}
  156. className={clsx(
  157. classes.childView,
  158. selectedCord ? classes.showChildView : classes.hideChildView
  159. )}
  160. >
  161. {selectedCord && (
  162. <NodeListView
  163. selectedCord={selectedCord}
  164. childNodes={childNodes}
  165. setCord={setCord}
  166. />
  167. )}
  168. </div>
  169. </div>
  170. );
  171. };
  172. export default SystemView;