import React, { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; import { AppContainer, Button, Divider, Drawer, Form, InputNumber, notification, SingleChart, Space, Spin, Utils } from 'knowdesign'; import Api, { MetricType } from '@src/api/index'; import { getBasicChartConfig, getUnit } from '@src/constants/chartConfig'; import { formatChartData, MetricDefaultChartDataType } from '@src/components/DashboardDragChart/config'; const ExpandPartition = (props: { record: any; onConfirm: () => void }) => { const [global] = AppContainer.useGlobalValue(); const { record, onConfirm } = props; const [form] = Form.useForm(); const routeParams = useParams<{ clusterId: string; }>(); const [expandPartitionsVisible, setExpandPartitionsVisible] = useState(false); const [topicMetricData, setTopicMetricData] = useState(); const [minByteInOut, setMinByteInOut] = useState(0); const [expandToNum, setExpandToNum] = useState(record.partitionNum); const [loading, setLoading] = useState(false); const confirm = () => { const params = { clusterId: Number(routeParams.clusterId), incPartitionNum: form.getFieldValue('incPartitionNum') - record.partitionNum, topicName: record.topicName, }; Utils.post(Api.expandPartitions(), params).then((data) => { if (data === null) { notification.success({ message: '扩分区成功', }); setExpandPartitionsVisible(false); onConfirm && onConfirm(); } else { notification.error({ message: '扩分区失败', }); } }); }; useEffect(() => { if (!expandPartitionsVisible) return; const [startStamp, endStamp] = [Date.now() - 24 * 3600 * 1000, Date.now()]; setLoading(true); const metricParams = { aggType: 'avg', endTime: Math.round(endStamp), metricsNames: ['BytesIn', 'BytesOut'], startTime: Math.round(startStamp), topNu: 0, topics: [record.topicName], }; Utils.post(Api.getTopicsMetrics(Number(routeParams.clusterId)), metricParams).then((data: any) => { const minByteInOut = Math.min( ...data.map((metricItem: any) => Math.min( ...metricItem.metricLines.map((lineItem: any) => Math.min(...lineItem.metricPoints.map((point: any) => Number(point.value)))) ) ) ); const empiricalMinValue = 10 * 1024 * record.partitionNum; const lines = data.map((metric: MetricDefaultChartDataType) => { const child = metric.metricLines[0]; child.name = metric.metricName; return child; }); const formatedData = formatChartData( [ { metricName: 'BytesIn', metricLines: lines, }, ], global?.getMetricDefine || {}, MetricType.Topic, [startStamp, endStamp], 10 * 60 * 1000 ); setMinByteInOut(minByteInOut < empiricalMinValue ? empiricalMinValue : minByteInOut); setTopicMetricData(formatedData[0]); setLoading(false); }); form.setFieldsValue({ incPartitionNum: record.partitionNum, }); }, [expandPartitionsVisible]); const formattedMinBytesInOut = (v: number) => { const [unit, size] = getUnit(v); return `${(v / size).toFixed(2)}${unit}/s`; }; return ( <> } onClose={(_) => { setExpandPartitionsVisible(false); }} >
Topic名称 : {record.topicName}
描述 : {record.description}
{topicMetricData && ( { return data.metricLines.map((line: any) => { return { ...line, areaStyle: { opacity: 0.06, }, lineStyle: { width: 1, }, smooth: 0.25, symbol: 'emptyCircle', symbolSize: 4, emphasis: { disabled: true, }, }; }); }} /> )}
当前分区数:
当前分区数预计最低可支持 {minByteInOut === Infinity ? '-' : formattedMinBytesInOut(minByteInOut)} 的消息写入速率
增加至:
{ setExpandToNum(Number(v)); }} >
扩分区后预计最低可支持{' '} {minByteInOut === Infinity ? '-' : formattedMinBytesInOut(minByteInOut * (expandToNum ? expandToNum / record.partitionNum : 1))}{' '} 的消息写入速率
); }; export default ExpandPartition;