BrokersList.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import React from 'react';
  2. import { ClusterName } from 'redux/interfaces';
  3. import BytesFormatted from 'components/common/BytesFormatted/BytesFormatted';
  4. import { NavLink } from 'react-router-dom';
  5. import TableHeaderCell from 'components/common/table/TableHeaderCell/TableHeaderCell';
  6. import { Table } from 'components/common/table/Table/Table.styled';
  7. import PageHeading from 'components/common/PageHeading/PageHeading';
  8. import * as Metrics from 'components/common/Metrics';
  9. import useAppParams from 'lib/hooks/useAppParams';
  10. import useBrokers from 'lib/hooks/useBrokers';
  11. import useClusterStats from 'lib/hooks/useClusterStats';
  12. const BrokersList: React.FC = () => {
  13. const { clusterName } = useAppParams<{ clusterName: ClusterName }>();
  14. const { data: clusterStats } = useClusterStats(clusterName);
  15. const { data: brokers } = useBrokers(clusterName);
  16. if (!clusterStats) return null;
  17. const {
  18. brokerCount,
  19. activeControllers,
  20. onlinePartitionCount,
  21. offlinePartitionCount,
  22. inSyncReplicasCount,
  23. outOfSyncReplicasCount,
  24. underReplicatedPartitionCount,
  25. diskUsage,
  26. version,
  27. } = clusterStats;
  28. const replicas = (inSyncReplicasCount ?? 0) + (outOfSyncReplicasCount ?? 0);
  29. const areAllInSync = inSyncReplicasCount && replicas === inSyncReplicasCount;
  30. const partitionIsOffline = offlinePartitionCount && offlinePartitionCount > 0;
  31. return (
  32. <>
  33. <PageHeading text="Broker" />
  34. <Metrics.Wrapper>
  35. <Metrics.Section title="Uptime">
  36. <Metrics.Indicator label="Total Broker">
  37. {brokerCount}
  38. </Metrics.Indicator>
  39. <Metrics.Indicator label="Active Controllers">
  40. {activeControllers}
  41. </Metrics.Indicator>
  42. <Metrics.Indicator label="Version">{version}</Metrics.Indicator>
  43. </Metrics.Section>
  44. <Metrics.Section title="Partitions">
  45. <Metrics.Indicator
  46. label="Online"
  47. isAlert
  48. alertType={partitionIsOffline ? 'error' : 'success'}
  49. >
  50. {partitionIsOffline ? (
  51. <Metrics.RedText>{onlinePartitionCount}</Metrics.RedText>
  52. ) : (
  53. onlinePartitionCount
  54. )}
  55. <Metrics.LightText>
  56. {' '}
  57. of {(onlinePartitionCount || 0) + (offlinePartitionCount || 0)}
  58. </Metrics.LightText>
  59. </Metrics.Indicator>
  60. <Metrics.Indicator
  61. label="URP"
  62. title="Under replicated partitions"
  63. isAlert
  64. alertType={!underReplicatedPartitionCount ? 'success' : 'error'}
  65. >
  66. {!underReplicatedPartitionCount ? (
  67. <Metrics.LightText>
  68. {underReplicatedPartitionCount}
  69. </Metrics.LightText>
  70. ) : (
  71. <Metrics.RedText>{underReplicatedPartitionCount}</Metrics.RedText>
  72. )}
  73. </Metrics.Indicator>
  74. <Metrics.Indicator
  75. label="In Sync Replicas"
  76. isAlert
  77. alertType={areAllInSync ? 'success' : 'error'}
  78. >
  79. {areAllInSync ? (
  80. replicas
  81. ) : (
  82. <Metrics.RedText>{inSyncReplicasCount}</Metrics.RedText>
  83. )}
  84. <Metrics.LightText> of {replicas}</Metrics.LightText>
  85. </Metrics.Indicator>
  86. <Metrics.Indicator label="Out Of Sync Replicas">
  87. {outOfSyncReplicasCount}
  88. </Metrics.Indicator>
  89. </Metrics.Section>
  90. </Metrics.Wrapper>
  91. <Table isFullwidth>
  92. <thead>
  93. <tr>
  94. <TableHeaderCell title="Broker" />
  95. <TableHeaderCell title="Segment Size" />
  96. <TableHeaderCell title="Segment Count" />
  97. <TableHeaderCell title="Port" />
  98. <TableHeaderCell title="Host" />
  99. </tr>
  100. </thead>
  101. <tbody>
  102. {(!diskUsage || diskUsage.length === 0) && (
  103. <tr>
  104. <td colSpan={10}>Disk usage data not available</td>
  105. </tr>
  106. )}
  107. {diskUsage &&
  108. diskUsage.length !== 0 &&
  109. diskUsage.map(({ brokerId, segmentSize, segmentCount }) => {
  110. const brokerItem = brokers?.find(({ id }) => id === brokerId);
  111. return (
  112. <tr key={brokerId}>
  113. <td>
  114. <NavLink to={`${brokerId}`} role="link">
  115. {brokerId}
  116. </NavLink>
  117. </td>
  118. <td>
  119. <BytesFormatted value={segmentSize} />
  120. </td>
  121. <td>{segmentCount}</td>
  122. <td>{brokerItem?.port}</td>
  123. <td>{brokerItem?.host}</td>
  124. </tr>
  125. );
  126. })}
  127. </tbody>
  128. </Table>
  129. </>
  130. );
  131. };
  132. export default BrokersList;