From 656ccfc9f6fb02502d1605794b09b59c5abcf053 Mon Sep 17 00:00:00 2001 From: zhuyue Date: Sun, 9 Jan 2022 13:28:53 +0800 Subject: [PATCH] refact: Refact Monitor page refact monitor page Change-Id: Ic7ff74641da63c236e27a146b6f1ab712a780f49 --- .eslintrc | 3 +- src/components/PrometheusChart/BaseCard.jsx | 220 ++++++---- src/components/PrometheusChart/ChartCard.jsx | 189 +++++---- .../PrometheusChart/component/BaseContent.jsx | 154 +++++-- .../PrometheusChart/component/Charts.jsx | 146 +++++++ .../PrometheusChart/component/Intervals.jsx | 34 ++ .../PrometheusChart/component/NodeSelect.jsx | 54 --- .../component/TimeRangeSelect.jsx | 181 -------- .../PrometheusChart/component/context.js | 14 + .../component/hooks/useIntervals.jsx | 50 +++ .../component/hooks/useNodeSelect.jsx | 51 +++ .../component/hooks/useRangeSelect.jsx | 94 ++++ .../PrometheusChart/component/index.less | 58 --- .../PrometheusChart/component/styles.less | 8 + .../PrometheusChart/store/BaseMonitorStore.js | 116 ----- .../store/FetchPrometheusStore.js | 131 ------ src/components/PrometheusChart/style.less | 23 +- .../PrometheusChart/utils/fetchNodes.js} | 31 +- src/components/PrometheusChart/utils/index.js | 53 +++ src/components/PrometheusChart/utils/utils.js | 177 ++++---- src/core/index.jsx | 2 + .../containers/OpenstackService/Services.jsx | 2 +- .../containers/OpenstackService/index.jsx | 25 +- .../containers/OpenstackService/index.less | 8 +- .../components/Memcache/Charts.jsx | 151 ------- .../components/Memcache/index.jsx | 104 ++++- .../OtherService/components/Mysql/Charts.jsx | 202 --------- .../OtherService/components/Mysql/index.jsx | 117 ++++- .../components/RabbitMQ/Charts.jsx | 232 ---------- .../components/RabbitMQ/index.jsx | 134 +++++- .../AlertInfo/components/AlertChart.jsx | 55 --- .../Overview/components/AlertInfo/index.jsx | 61 ++- .../components/ClusterMonitor/ClusterCard.jsx | 171 -------- .../ClusterMonitor/ClusterChart.jsx | 65 --- .../StorageClusterCard.jsx | 155 ------- .../StorageClusterChart.jsx | 57 --- .../Overview/components/Tops/TopCard.jsx | 187 -------- .../Overview/components/Tops/index.jsx | 74 ++++ .../monitor/containers/Overview/config.jsx | 400 ++++++++++++++++++ .../monitor/containers/Overview/index.jsx | 95 +++-- .../monitor/containers/Overview/index.less | 1 + .../containers/PhysicalNode/Charts.jsx | 355 ---------------- .../monitor/containers/PhysicalNode/index.jsx | 274 +++++++++++- .../containers/PhysicalNode/index.less | 108 ----- .../containers/StorageCluster/Charts.jsx | 377 ----------------- .../containers/StorageCluster/RenderTabs.jsx | 294 ++++++------- .../containers/StorageCluster/TabTable.jsx | 72 ---- .../containers/StorageCluster/index.jsx | 284 ++++++++++++- .../metricDict.js | 0 src/stores/prometheus/monitor-base.js | 2 +- src/stores/prometheus/openstack-service.js | 4 +- 51 files changed, 2493 insertions(+), 3362 deletions(-) create mode 100644 src/components/PrometheusChart/component/Charts.jsx create mode 100644 src/components/PrometheusChart/component/Intervals.jsx delete mode 100644 src/components/PrometheusChart/component/NodeSelect.jsx delete mode 100644 src/components/PrometheusChart/component/TimeRangeSelect.jsx create mode 100644 src/components/PrometheusChart/component/context.js create mode 100644 src/components/PrometheusChart/component/hooks/useIntervals.jsx create mode 100644 src/components/PrometheusChart/component/hooks/useNodeSelect.jsx create mode 100644 src/components/PrometheusChart/component/hooks/useRangeSelect.jsx delete mode 100644 src/components/PrometheusChart/component/index.less create mode 100644 src/components/PrometheusChart/component/styles.less delete mode 100644 src/components/PrometheusChart/store/BaseMonitorStore.js delete mode 100644 src/components/PrometheusChart/store/FetchPrometheusStore.js rename src/{pages/monitor/containers/OtherService/components/util.js => components/PrometheusChart/utils/fetchNodes.js} (76%) create mode 100644 src/components/PrometheusChart/utils/index.js delete mode 100644 src/pages/monitor/containers/OtherService/components/Memcache/Charts.jsx delete mode 100644 src/pages/monitor/containers/OtherService/components/Mysql/Charts.jsx delete mode 100644 src/pages/monitor/containers/OtherService/components/RabbitMQ/Charts.jsx delete mode 100644 src/pages/monitor/containers/Overview/components/AlertInfo/components/AlertChart.jsx delete mode 100644 src/pages/monitor/containers/Overview/components/ClusterMonitor/ClusterCard.jsx delete mode 100644 src/pages/monitor/containers/Overview/components/ClusterMonitor/ClusterChart.jsx delete mode 100644 src/pages/monitor/containers/Overview/components/StorageClusterMonitor/StorageClusterCard.jsx delete mode 100644 src/pages/monitor/containers/Overview/components/StorageClusterMonitor/StorageClusterChart.jsx delete mode 100644 src/pages/monitor/containers/Overview/components/Tops/TopCard.jsx create mode 100644 src/pages/monitor/containers/Overview/components/Tops/index.jsx create mode 100644 src/pages/monitor/containers/Overview/config.jsx delete mode 100644 src/pages/monitor/containers/PhysicalNode/Charts.jsx delete mode 100644 src/pages/monitor/containers/PhysicalNode/index.less delete mode 100644 src/pages/monitor/containers/StorageCluster/Charts.jsx delete mode 100644 src/pages/monitor/containers/StorageCluster/TabTable.jsx rename src/{components/PrometheusChart => resources}/metricDict.js (100%) diff --git a/.eslintrc b/.eslintrc index 4ef5c4fd..8c66a254 100644 --- a/.eslintrc +++ b/.eslintrc @@ -74,6 +74,7 @@ "globals": { "t": true, "globals": true, - "request": true + "request": true, + "METRICDICT": true } } diff --git a/src/components/PrometheusChart/BaseCard.jsx b/src/components/PrometheusChart/BaseCard.jsx index df5a369e..e28ee604 100644 --- a/src/components/PrometheusChart/BaseCard.jsx +++ b/src/components/PrometheusChart/BaseCard.jsx @@ -1,113 +1,149 @@ -// Copyright 2021 99cloud -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import React, { Component } from 'react'; import { Card, Select } from 'antd'; -import VisibleObserver from 'components/VisibleObserver'; -import PropTypes from 'prop-types'; -import { observer } from 'mobx-react'; -import isEqual from 'react-fast-compare'; -import FetchPrometheusStore from './store/FetchPrometheusStore'; +import React, { createContext, useEffect, useState } from 'react'; +import VisibleObserver from '../VisibleObserver'; +import { createFetchPrometheusClient, createDataHandler } from './utils'; import style from './style.less'; -@observer -class BaseFetch extends Component { - static propTypes = { - constructorParams: PropTypes.shape({ - requestType: PropTypes.oneOf(['current', 'range']).isRequired, - metricKey: PropTypes.string.isRequired, - formatDataFn: PropTypes.func.isRequired, - typeKey: PropTypes.string, - deviceKey: PropTypes.string, - }).isRequired, - params: PropTypes.object, - currentRange: PropTypes.array.isRequired, - interval: PropTypes.number.isRequired, - title: PropTypes.string.isRequired, - extra: PropTypes.func, - renderContent: PropTypes.func.isRequired, - visibleHeight: PropTypes.number, +export const PrometheusContext = createContext({ + data: [], + device: '', + devices: [], +}); + +function getChartData(data, device, devices) { + if (device && devices.length !== 0) { + return data.filter((d) => d.device === device); + } + return data; +} + +const BaseCard = (props) => { + const { + createFetchParams, + handleDataParams, + fetchDataParams, + title, + visibleHeight, + extra, + renderContent, + } = props; + + const [initData, setInitData] = useState([]); + + const [chartData, setChartData] = useState([]); + + const [device, setDevice] = useState(''); + + const [devices, setDevices] = useState([]); + + const [isLoading, setIsLoading] = useState(true); + + const fetchData = createFetchPrometheusClient(createFetchParams); + + const dataHandler = createDataHandler(handleDataParams); + + const passedContext = { + data: chartData, + device, + devices, + modifyKeys: handleDataParams.modifyKeys, }; - static defaultProps = { - // src/pages/monitor/containers/PhysicalNode/index.less:91 - // 为了不在视区范围内的时候,仍然撑开元素。防止出现在视区的时候挤开下面的元素。(由下往上翻) - visibleHeight: 100, + useEffect(() => { + (async () => { + setIsLoading(true); + const data = await fetchData(fetchDataParams); + const { + retData: handledData, + device: newDevice, + devices: newDevices, + } = dataHandler(data); + // save base response + setInitData(handledData); + + // save device information + setDevice(newDevice); + setDevices(newDevices); + + // refresh component + const newChartData = getChartData(handledData, newDevice, newDevices); + setChartData(newChartData); + + // setLoading + setIsLoading(false); + })(); + }, []); + + const handleDeviceChange = (newDevice) => { + setIsLoading(true); + // refresh component + const newChartData = getChartData(initData, newDevice, devices); + setDevice(newDevice); + setChartData(newChartData); + setIsLoading(false); }; - constructor(props) { - super(props); - const { constructorParams } = this.props; + const filterChartData = (filt) => { + setIsLoading(true); + // refresh component + const newChartData = initData.filter(filt); + setChartData(newChartData); + setIsLoading(false); + }; - this.store = new FetchPrometheusStore(constructorParams); - } + const extraRender = ( + <> + {!isLoading && device && devices.length !== 0 && ( + ({ - label: i, - value: i, - }))} - onChange={(e) => this.store.handleDeviceChange.call(this.store, e)} - /> - )} - {extra && extra(this.store)} - - ); - } - - render() { - const { isLoading } = this.store; - const { visibleHeight } = this.props; - return ( + return ( + - {(visible) => (visible ? this.props.renderContent(this.store) : null)} + {(visible) => + visible ? ( + + {(v) => renderContent(v)} + + ) : null + } - ); - } -} + + ); +}; -export default BaseFetch; +BaseCard.defaultProps = { + visibleHeight: 100, +}; + +export default BaseCard; diff --git a/src/components/PrometheusChart/ChartCard.jsx b/src/components/PrometheusChart/ChartCard.jsx index 710fed43..8840732c 100644 --- a/src/components/PrometheusChart/ChartCard.jsx +++ b/src/components/PrometheusChart/ChartCard.jsx @@ -12,63 +12,52 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Chart, Line, Tooltip } from 'bizcharts'; -import BaseCard from 'components/PrometheusChart/BaseCard'; import React from 'react'; -import { ChartType, getXScale } from 'components/PrometheusChart/utils/utils'; +import { merge } from 'lodash'; +import { Button, Modal } from 'antd'; +import { Chart, Line, Tooltip } from 'bizcharts'; +import ArrowsAltOutlined from '@ant-design/icons/ArrowsAltOutlined'; + +import { ChartType, getXScale } from './utils/utils'; import { baseLineProps, baseToolTipProps, multilineProps, -} from 'components/PrometheusChart/utils/baseProps'; -import { toJS } from 'mobx'; -import { observer } from 'mobx-react'; - -import { merge } from 'lodash'; -import ArrowsAltOutlined from '@ant-design/icons/lib/icons/ArrowsAltOutlined'; -import { Button, Modal } from 'antd'; -import BaseContent from 'components/PrometheusChart/component/BaseContent'; +} from './utils/baseProps'; +import BaseCard from './BaseCard'; const ChartCard = (props) => { - const { - constructorParams, - params, - currentRange, - interval, - chartProps, - title, - extra, - isModal = false, - BaseContentConfig = {}, - } = props; + const { chartProps } = props; + const renderContent = (contextValue) => { + const { + height, + scale, + chartType, + toolTipProps = baseToolTipProps, + } = chartProps; - const { - height, - scale, - chartType, - toolTipProps = baseToolTipProps, - } = chartProps; + const { data } = contextValue; - let lineProps; - switch (chartType) { - case ChartType.ONELINE: - case ChartType.ONELINEDEVICES: - lineProps = baseLineProps; - break; - case ChartType.MULTILINE: - case ChartType.MULTILINEDEVICES: - lineProps = multilineProps; - break; - default: - lineProps = baseLineProps; - } + scale.x = merge( + {}, + getXScale(props.fetchDataParams.currentRange), + scale.x || {} + ); - const renderContent = (store) => { - let data = toJS(store.data); - if (store.device) { - data = data.filter((d) => d.device === store.device); + let lineProps; + switch (chartType) { + case ChartType.ONELINE: + case ChartType.ONELINEDEVICES: + lineProps = baseLineProps; + break; + case ChartType.MULTILINE: + case ChartType.MULTILINEDEVICES: + lineProps = multilineProps; + break; + default: + lineProps = baseLineProps; } - scale.x = merge({}, getXScale(props.currentRange), scale.x || {}); + return ( @@ -77,53 +66,81 @@ const ChartCard = (props) => { ); }; - const ModalContent = observer(() => ( -
- ( - { + const { + title, + createFetchParams, + handleDataParams, + fetchDataParams, + isModal = false, + } = props; + let defaultNode = {}; + const { params: fParams = {} } = fetchDataParams; + const { instance, hostname, ...rest } = fParams; + if (fParams) { + if (instance) { + defaultNode.instance = instance; + } else if (hostname) { + defaultNode.hostname = hostname; + } + } + + return ( + <> + {props.extra && props.extra()} + {!isModal && ( +
- )); + + ); + }; return ( ( - <> - {extra && extra(s)} - {!isModal && ( -