Overview.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import React from 'react';
  2. import { Topic, TopicDetails } from 'generated-sources';
  3. import { ClusterName, TopicName } from 'redux/interfaces';
  4. import Dropdown from 'components/common/Dropdown/Dropdown';
  5. import DropdownItem from 'components/common/Dropdown/DropdownItem';
  6. import ClusterContext from 'components/contexts/ClusterContext';
  7. import BytesFormatted from 'components/common/BytesFormatted/BytesFormatted';
  8. import { Table } from 'components/common/table/Table/Table.styled';
  9. import TableHeaderCell from 'components/common/table/TableHeaderCell/TableHeaderCell';
  10. import VerticalElipsisIcon from 'components/common/Icons/VerticalElipsisIcon';
  11. import * as Metrics from 'components/common/Metrics';
  12. import TagStyled from 'components/common/Tag/Tag.styled';
  13. interface Props extends Topic, TopicDetails {
  14. clusterName: ClusterName;
  15. topicName: TopicName;
  16. clearTopicMessages(
  17. clusterName: ClusterName,
  18. topicName: TopicName,
  19. partitions?: number[]
  20. ): void;
  21. }
  22. const Overview: React.FC<Props> = ({
  23. partitions,
  24. underReplicatedPartitions,
  25. inSyncReplicas,
  26. replicas,
  27. partitionCount,
  28. internal,
  29. replicationFactor,
  30. segmentSize,
  31. segmentCount,
  32. clusterName,
  33. topicName,
  34. cleanUpPolicy,
  35. clearTopicMessages,
  36. }) => {
  37. const { isReadOnly } = React.useContext(ClusterContext);
  38. return (
  39. <>
  40. <Metrics.Wrapper>
  41. <Metrics.Section>
  42. <Metrics.Indicator label="Partitions">
  43. {partitionCount}
  44. </Metrics.Indicator>
  45. <Metrics.Indicator label="Replication Factor">
  46. {replicationFactor}
  47. </Metrics.Indicator>
  48. <Metrics.Indicator
  49. label="URP"
  50. title="Under replicated partitions"
  51. isAlert
  52. >
  53. <Metrics.RedText>{underReplicatedPartitions}</Metrics.RedText>
  54. </Metrics.Indicator>
  55. <Metrics.Indicator
  56. label="In Sync Replicas"
  57. isAlert
  58. alertType={inSyncReplicas === replicas ? 'success' : 'error'}
  59. >
  60. {inSyncReplicas && replicas && inSyncReplicas < replicas ? (
  61. <Metrics.RedText>{inSyncReplicas}</Metrics.RedText>
  62. ) : (
  63. inSyncReplicas
  64. )}
  65. <Metrics.LightText> of {replicas}</Metrics.LightText>
  66. </Metrics.Indicator>
  67. <Metrics.Indicator label="Type">
  68. <TagStyled color="gray">
  69. {internal ? 'Internal' : 'External'}
  70. </TagStyled>
  71. </Metrics.Indicator>
  72. <Metrics.Indicator label="Segment Size" title="">
  73. <BytesFormatted value={segmentSize} />
  74. </Metrics.Indicator>
  75. <Metrics.Indicator label="Segment Count">
  76. {segmentCount}
  77. </Metrics.Indicator>
  78. <Metrics.Indicator label="Clean Up Policy">
  79. <TagStyled color="gray">{cleanUpPolicy || 'Unknown'}</TagStyled>
  80. </Metrics.Indicator>
  81. </Metrics.Section>
  82. </Metrics.Wrapper>
  83. <div>
  84. <Table isFullwidth>
  85. <thead>
  86. <tr>
  87. <TableHeaderCell title="Partition ID" />
  88. <TableHeaderCell title="Broker Leader" />
  89. <TableHeaderCell title="Min Offset" />
  90. <TableHeaderCell title="Max Offset" />
  91. <TableHeaderCell title=" " />
  92. </tr>
  93. </thead>
  94. <tbody>
  95. {partitions?.map(({ partition, leader, offsetMin, offsetMax }) => (
  96. <tr key={`partition-list-item-key-${partition}`}>
  97. <td>{partition}</td>
  98. <td>{leader}</td>
  99. <td>{offsetMin}</td>
  100. <td>{offsetMax}</td>
  101. <td style={{ width: '5%' }}>
  102. {!internal && !isReadOnly ? (
  103. <Dropdown label={<VerticalElipsisIcon />} right>
  104. <DropdownItem
  105. onClick={() =>
  106. clearTopicMessages(clusterName, topicName, [
  107. partition,
  108. ])
  109. }
  110. >
  111. <Metrics.RedText>Clear Messages</Metrics.RedText>
  112. </DropdownItem>
  113. </Dropdown>
  114. ) : null}
  115. </td>
  116. </tr>
  117. ))}
  118. {partitions?.length === 0 && (
  119. <tr>
  120. <td colSpan={10}>No Partitions found</td>
  121. </tr>
  122. )}
  123. </tbody>
  124. </Table>
  125. </div>
  126. </>
  127. );
  128. };
  129. export default Overview;