SystemView.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. const workingNodes = jsonData?.response?.nodes_info.filter(
  75. (node: any) => node?.infos?.has_error !== true
  76. );
  77. workingNodes.forEach((node: any) => {
  78. const type = node?.infos?.type;
  79. if (node.connected) {
  80. node.connected = node.connected.filter((v: any) =>
  81. workingNodes.find(
  82. (item: any) => v.connected_identifier === item.identifier
  83. )
  84. );
  85. }
  86. // coordinator node
  87. if (type?.toLowerCase().includes('coord')) {
  88. nodes.push(node);
  89. // other nodes
  90. } else {
  91. childNodes.push(node);
  92. }
  93. const info = node.infos.hardware_infos;
  94. system.memory += info.memory;
  95. system.memoryUsage += info.memory_usage;
  96. system.disk += info.disk;
  97. system.diskUsage += info.disk_usage;
  98. });
  99. return { nodes, childNodes, system };
  100. };
  101. /**
  102. * Todo: Milvus V2.0.0 Memory data is not ready for now, open it after Milvus ready.
  103. * @returns
  104. */
  105. const SystemView: any = () => {
  106. useNavigationHook(ALL_ROUTER_TYPES.SYSTEM);
  107. // const { t } = useTranslation('systemView');
  108. const classes = getStyles();
  109. const INTERVAL = 60000;
  110. const [data, setData] = useState<{
  111. nodes: any;
  112. childNodes: any;
  113. system: any;
  114. }>({ nodes: [], childNodes: [], system: {} });
  115. const [selectedNode, setNode] = useState<any>();
  116. const [selectedCord, setCord] = useState<any>();
  117. const { nodes, childNodes } = data;
  118. useInterval(async () => {
  119. if (!selectedCord) {
  120. const res = await MilvusHttp.getMetrics();
  121. setData(parseJson(res));
  122. }
  123. }, INTERVAL);
  124. useEffect(() => {
  125. async function fetchData() {
  126. const res = await MilvusHttp.getMetrics();
  127. setData(parseJson(res));
  128. }
  129. fetchData();
  130. }, []);
  131. // let qps = system?.qps || 0;
  132. // const latency = system?.latency || 0;
  133. const childView = useRef<HTMLInputElement>(null);
  134. return (
  135. <div className={classes.root}>
  136. {/* hide cards until metrics api can provide enough data*/}
  137. {/* <div
  138. className={clsx(
  139. classes.cardContainer,
  140. selectedCord && classes.transparent
  141. )}
  142. >
  143. <ProgressCard
  144. title={t('diskTitle')}
  145. usage={system.diskUsage}
  146. total={system.disk}
  147. />
  148. <ProgressCard
  149. title={t('memoryTitle')}
  150. usage={system.memoryUsage}
  151. total={system.memory}
  152. />
  153. <LineChartCard title={t('qpsTitle')} value={qps} />
  154. <LineChartCard title={t('latencyTitle')} value={latency} />
  155. </div> */}
  156. <div className={classes.contentContainer}>
  157. <Topo
  158. nodes={nodes}
  159. childNodes={childNodes}
  160. setNode={setNode}
  161. setCord={setCord}
  162. />
  163. <DataCard node={selectedNode} extend />
  164. </div>
  165. <div
  166. ref={childView}
  167. className={clsx(
  168. classes.childView,
  169. selectedCord ? classes.showChildView : classes.hideChildView
  170. )}
  171. >
  172. {selectedCord && (
  173. <NodeListView
  174. selectedCord={selectedCord}
  175. childNodes={childNodes}
  176. setCord={setCord}
  177. />
  178. )}
  179. </div>
  180. </div>
  181. );
  182. };
  183. export default SystemView;